From b6a95f9970305c8883a27f6bd4e3ed85f43ee519 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 14:08:06 -0400 Subject: [PATCH 01/73] PoC Smart Escrows (#5340) * wasmedge in unittest * add WashVM.h and cpp * accountID comparison (vector) working * json decode tx and ledger object with two buffers working * wasm return a buffer working * add a failure test case to P2P3 * host function return ledger sqn * instruction gas and host function gas * basics * add scaffold * add amendment check * working PoC * get test working * fix clang-format * prototype #2 * p2p3 * [WIP] P4 * P5 * add calculateBaseFee * add FinishFunction preflight checks (+ tests) * additional reserve for sfFinishFunction * higher fees for EscrowFinish * rename amendment to SmartEscrow * make fee voting changes, add basic tests * clean up * clean up * clean up * more cleanup * add subscribe tests * add more tests * undo formatting * undo formatting * remove bad comment * more debugging statements * fix clang-format * fix rebase issues * fix more rebase issues * more rebase fixes * add source code for wasm * respond to comments * add const --------- Co-authored-by: Peng Wang --- CMakeLists.txt | 1 + cfg/rippled-example.cfg | 24 + cmake/RippledCore.cmake | 1 + conanfile.py | 3 + include/xrpl/protocol/Feature.h | 2 +- include/xrpl/protocol/Fees.h | 3 + include/xrpl/protocol/Indexes.h | 6 + include/xrpl/protocol/TER.h | 1 + include/xrpl/protocol/detail/features.macro | 2 +- .../xrpl/protocol/detail/ledger_entries.macro | 7 + include/xrpl/protocol/detail/sfields.macro | 5 +- .../xrpl/protocol/detail/transactions.macro | 8 +- include/xrpl/protocol/jss.h | 2 + src/libxrpl/protocol/STValidation.cpp | 3 + src/libxrpl/protocol/TER.cpp | 1 + src/test/app/Escrow_test.cpp | 368 +- src/test/app/FeeVote_test.cpp | 41 +- src/test/app/PseudoTx_test.cpp | 8 +- src/test/app/Wasm_test.cpp | 4752 +++++++++++++++++ src/test/jtx/TestHelpers.h | 27 + src/test/jtx/impl/envconfig.cpp | 2 + src/test/rpc/Subscribe_test.cpp | 20 +- src/xrpld/app/ledger/Ledger.cpp | 42 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 78 +- src/xrpld/app/misc/NetworkOPs.cpp | 37 + src/xrpld/app/misc/WasmVM.cpp | 592 ++ src/xrpld/app/misc/WasmVM.h | 97 + src/xrpld/app/tx/detail/Change.cpp | 17 + src/xrpld/app/tx/detail/Escrow.cpp | 177 +- src/xrpld/app/tx/detail/Escrow.h | 3 + src/xrpld/app/tx/detail/Transactor.cpp | 37 +- src/xrpld/core/Config.h | 6 + src/xrpld/core/detail/Config.cpp | 4 + 33 files changed, 6338 insertions(+), 39 deletions(-) create mode 100644 src/test/app/Wasm_test.cpp create mode 100644 src/xrpld/app/misc/WasmVM.cpp create mode 100644 src/xrpld/app/misc/WasmVM.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 03dba51d0c5..28cfd2322a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) +find_package(wasmedge REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index ee9fdbd2744..d465994a6b9 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1248,6 +1248,30 @@ # Example: # owner_reserve = 2000000 # 2 XRP # +# extension_compute_limit = +# +# The extension compute limit is the maximum amount of gas that can be +# consumed by a single transaction. The gas limit is used to prevent +# transactions from consuming too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 2000000 # 2 million gas +# +# extension_size_limit = +# +# The extension size limit is the maximum size of a WASM extension in +# bytes. The size limit is used to prevent extensions from consuming +# too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 2000000 # 2 million gas +# #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index fc0576872a5..d4ff75434ea 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,6 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> + wasmedge::wasmedge ) include(add_module) diff --git a/conanfile.py b/conanfile.py index d4513068fb5..ec39608d3fd 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,6 +2,7 @@ from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout import re + class Xrpl(ConanFile): name = 'xrpl' @@ -32,6 +33,7 @@ class Xrpl(ConanFile): 'soci/4.0.3', 'xxhash/0.8.2', 'zlib/1.3.1', + 'wasmedge/0.14.1', ] tool_requires = [ @@ -125,6 +127,7 @@ def layout(self): self.folders.generators = 'build/generators' generators = 'CMakeDeps' + def generate(self): tc = CMakeToolchain(self) tc.variables['tests'] = self.options.tests diff --git a/include/xrpl/protocol/Feature.h b/include/xrpl/protocol/Feature.h index 1c476df617f..b6477baa02d 100644 --- a/include/xrpl/protocol/Feature.h +++ b/include/xrpl/protocol/Feature.h @@ -80,7 +80,7 @@ namespace detail { // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 88; +static constexpr std::size_t numFeatures = 89; /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index 4393f1a1d9c..a89bd4e4863 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -34,6 +34,9 @@ struct Fees XRPAmount base{0}; // Reference tx cost (drops) XRPAmount reserve{0}; // Reserve base (drops) XRPAmount increment{0}; // Reserve increment (drops) + std::uint32_t extensionComputeLimit{ + 0}; // Extension compute limit (instructions) + std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/Indexes.h b/include/xrpl/protocol/Indexes.h index bbed5395927..a7c184e81c7 100644 --- a/include/xrpl/protocol/Indexes.h +++ b/include/xrpl/protocol/Indexes.h @@ -230,6 +230,12 @@ page(Keylet const& root, std::uint64_t index = 0) noexcept Keylet escrow(AccountID const& src, std::uint32_t seq) noexcept; +inline Keylet +escrow(uint256 const& key) noexcept +{ + return {ltESCROW, key}; +} + /** A PaymentChannel */ Keylet payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept; diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 317e9c2c978..01bf4669aa7 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -344,6 +344,7 @@ enum TECcodes : TERUnderlyingType { tecARRAY_TOO_LARGE = 191, tecLOCKED = 192, tecBAD_CREDENTIALS = 193, + tecWASM_REJECTED = 194, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 7b120c0b8d2..103dc34243f 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -29,7 +29,7 @@ // If you add an amendment here, then do not forget to increment `numFeatures` // in include/xrpl/protocol/Feature.h. -// Check flags in Credential transactions +XRPL_FEATURE(SmartEscrow, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (FrozenLPTokenTransfer, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(DeepFreeze, Supported::yes, VoteBehavior::DefaultNo) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 5a652baf4f7..2d4a3453eaa 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -315,6 +315,11 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + + // New fields + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, })) @@ -344,6 +349,8 @@ LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({ {sfCondition, soeOPTIONAL}, {sfCancelAfter, soeOPTIONAL}, {sfFinishAfter, soeOPTIONAL}, + {sfFinishFunction, soeOPTIONAL}, + {sfData, soeOPTIONAL}, {sfSourceTag, soeOPTIONAL}, {sfDestinationTag, soeOPTIONAL}, {sfOwnerNode, soeREQUIRED}, diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 3217bab9134..42a706c4de1 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -112,6 +112,8 @@ TYPED_SFIELD(sfEmitGeneration, UINT32, 46) TYPED_SFIELD(sfVoteWeight, UINT32, 48) TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) +TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 52) +TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 53) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) @@ -223,7 +225,7 @@ TYPED_SFIELD(sfBaseFeeDrops, AMOUNT, 22) TYPED_SFIELD(sfReserveBaseDrops, AMOUNT, 23) TYPED_SFIELD(sfReserveIncrementDrops, AMOUNT, 24) -// currency amount (AMM) +// currency amount (more) TYPED_SFIELD(sfLPTokenOut, AMOUNT, 25) TYPED_SFIELD(sfLPTokenIn, AMOUNT, 26) TYPED_SFIELD(sfEPrice, AMOUNT, 27) @@ -265,6 +267,7 @@ TYPED_SFIELD(sfAssetClass, VL, 28) TYPED_SFIELD(sfProvider, VL, 29) TYPED_SFIELD(sfMPTokenMetadata, VL, 30) TYPED_SFIELD(sfCredentialType, VL, 31) +TYPED_SFIELD(sfFinishFunction, VL, 32) // account (common) TYPED_SFIELD(sfAccount, ACCOUNT, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index dd3ac42325d..19c31d439b5 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -42,12 +42,14 @@ TRANSACTION(ttPAYMENT, 0, Payment, ({ /** This transaction type creates an escrow object. */ TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, ({ - {sfDestination, soeREQUIRED}, {sfAmount, soeREQUIRED}, + {sfDestination, soeREQUIRED}, + {sfDestinationTag, soeOPTIONAL}, {sfCondition, soeOPTIONAL}, {sfCancelAfter, soeOPTIONAL}, {sfFinishAfter, soeOPTIONAL}, - {sfDestinationTag, soeOPTIONAL}, + {sfFinishFunction, soeOPTIONAL}, + {sfData, soeOPTIONAL}, })) /** This transaction type completes an existing escrow. */ @@ -488,6 +490,8 @@ TRANSACTION(ttFEE, 101, SetFee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index 483b69a962f..fa34cf800b7 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -265,6 +265,8 @@ JSS(expected_date_UTC); // out: any (warnings) JSS(expected_ledger_size); // out: TxQ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info +JSS(extension_compute); // out: NetworkOps +JSS(extension_size); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 16f0c288796..f14fce43219 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -66,6 +66,9 @@ STValidation::validationFormat() {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + // featureSmartEscrow + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, }; // clang-format on diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 815b27c0018..dc0bdb4a591 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -117,6 +117,7 @@ transResults() MAKE_ERROR(tecARRAY_TOO_LARGE, "Array is too large."), MAKE_ERROR(tecLOCKED, "Fund is locked."), MAKE_ERROR(tecBAD_CREDENTIALS, "Bad credentials."), + MAKE_ERROR(tecWASM_REJECTED, "The custom WASM code that was run rejected your transaction."), MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."), MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 714fc7734d9..123b6548358 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1519,7 +1519,7 @@ struct Escrow_test : public beast::unit_test::suite Account const alice{"alice"}; Account const bob{"bob"}; Account const carol{"carol"}; - Account const dillon{"dillon "}; + Account const dillon{"dillon"}; Account const zelda{"zelda"}; const char credType[] = "abcde"; @@ -1656,6 +1656,370 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testFinishFunctionPreflight() + { + testcase("Test preflight checks involving FinishFunction"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::get_ledger_sqn() >= 5} + // } + static auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + + { + // featureSmartEscrow disabled + Env env(*this, supported_amendments() - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + auto escrowCreate = escrow(alice, carol, XRP(1000)); + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temDISABLED)); + env.close(); + } + + Env env(*this); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow(alice, carol, XRP(1000)); + + // Success situations + { + // FinishFunction + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + Condition + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + condition(cb1), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + condition(cb1), + finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + + // Failure situations (i.e. all other combinations) + { + // only FinishFunction + env(escrowCreate, + finish_function(wasmHex), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + Condition + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction 0 length + env(escrowCreate, + finish_function(""), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + // { + // // FinishFunction > max length + // std::string longWasmHex = "00"; + // // TODO: fix to use the config setting + // // TODO: make this test more efficient + // // uncomment when that's done + // for (int i = 0; i < 4294967295; i++) + // { + // longWasmHex += "11"; + // } + // env(escrowCreate, + // finish_function(longWasmHex), + // cancel_time(env.now() + 100s), + // fee(txnFees), + // ter(temMALFORMED)); + // env.close(); + // } + } + + void + testFinishFunction() + { + testcase("PoC escrow function"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::get_ledger_sqn() >= 5} + // } + static auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + + { + // basic FinishFunction situation + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + Condition + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // no fulfillment provided, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function fails + env(finish(carol, alice, seq), + condition(cb1), + fulfillment(fb1), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + // no fulfillment provided, function succeeds + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // wrong fulfillment provided, function succeeds + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb2), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function succeeds, tx succeeds + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb1), + fee(txnFees), + ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + FinishAfter + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + auto const ts = env.now() + 97s; + env(escrowCreate, + finish_function(wasmHex), + finish_time(ts), + cancel_time(env.now() + 1000s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(finish(carol, alice, seq), + fee(txnFees + 1), + ter(tecNO_PERMISSION)); + env.close(); + // finish time hasn't passed, function succeeds + for (; env.now() < ts; env.close()) + env(finish(carol, alice, seq), + fee(txnFees + 2), + ter(tecNO_PERMISSION)); + + env(finish(carol, alice, seq), + fee(txnFees + 1), + ter(tesSUCCESS)); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + FinishAfter #2 + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 2s), + cancel_time(env.now() + 100s), + fee(txnFees)); + // Don't close the ledger here + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecNO_PERMISSION)); + env.close(); + + // finish time has passed, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + // finish time has passed, function succeeds, tx succeeds + env(finish(carol, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + } + void run() override { @@ -1671,6 +2035,8 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(); testEscrowWithTickets(); testCredentials(); + testFinishFunctionPreflight(); + testFinishFunction(); } }; diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 289ce2a713e..a49dbb0bcaf 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -37,36 +37,56 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } { Section config; config.append( {"reference_fee = 50", "account_reserve = 1234567", - "owner_reserve = 1234"}); + "owner_reserve = 1234", + "extension_compute_limit = 100", + "extension_size_limit = 200"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); + BEAST_EXPECT(setup.extension_compute_limit == 100); + BEAST_EXPECT(setup.extension_size_limit == 200); } { Section config; config.append( {"reference_fee = blah", "account_reserve = yada", - "owner_reserve = foo"}); + "owner_reserve = foo", + "extension_compute_limit = bar", + "extension_size_limit = baz"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } { Section config; config.append( {"reference_fee = -50", "account_reserve = -1234567", - "owner_reserve = -1234"}); + "owner_reserve = -1234", + "extension_compute_limit = -100", + "extension_size_limit = -200"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -74,6 +94,11 @@ class FeeVote_test : public beast::unit_test::suite setup.account_reserve == static_cast(-1234567)); BEAST_EXPECT( setup.owner_reserve == static_cast(-1234)); + BEAST_EXPECT( + setup.extension_compute_limit == + static_cast(-100)); + BEAST_EXPECT( + setup.extension_size_limit == static_cast(-200)); } { const auto big64 = std::to_string( @@ -84,12 +109,20 @@ class FeeVote_test : public beast::unit_test::suite config.append( {"reference_fee = " + big64, "account_reserve = " + big64, - "owner_reserve = " + big64}); + "owner_reserve = " + big64, + "extension_compute_limit = " + big64, + "extension_size_limit = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index a04316cbd7b..55622e49237 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -48,6 +48,11 @@ struct PseudoTx_test : public beast::unit_test::suite obj[sfReserveIncrement] = 0; obj[sfReferenceFeeUnits] = 0; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = 0; + obj[sfExtensionSizeLimit] = 0; + } })); res.emplace_back(STTx(ttAMENDMENT, [&](auto& obj) { @@ -114,9 +119,10 @@ struct PseudoTx_test : public beast::unit_test::suite { using namespace test::jtx; FeatureBitset const all{supported_amendments()}; - FeatureBitset const xrpFees{featureXRPFees}; + testPrevented(all - featureXRPFees - featureSmartEscrow); testPrevented(all - featureXRPFees); + testPrevented(all - featureSmartEscrow); testPrevented(all); testAllowed(); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp new file mode 100644 index 00000000000..31e8007c72c --- /dev/null +++ b/src/test/app/Wasm_test.cpp @@ -0,0 +1,4752 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +#include + +#include + +namespace ripple { +namespace test { + +/* Host function body definition. */ +WasmEdge_Result +Add(void* Data, + const WasmEdge_CallingFrameContext* CallFrameCxt, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + int32_t Val1 = WasmEdge_ValueGetI32(In[0]); + int32_t Val2 = WasmEdge_ValueGetI32(In[1]); + // printf("Host function \"Add\": %d + %d\n", Val1, Val2); + Out[0] = WasmEdge_ValueGenI32(Val1 + Val2); + return WasmEdge_Result_Success; +} + +void +invokeAdd() +{ + /* Create the VM context. */ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + // clang-format off + /* The WASM module buffer. */ + uint8_t WASM[] = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + + /* Create the module instance. */ + WasmEdge_String ExportName = WasmEdge_StringCreateByCString("extern"); + WasmEdge_ModuleInstanceContext* HostModCxt = + WasmEdge_ModuleInstanceCreate(ExportName); + WasmEdge_ValType ParamList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(ParamList, 2, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate(HostFType, Add, NULL, 0); + WasmEdge_FunctionTypeDelete(HostFType); + WasmEdge_String HostFuncName = WasmEdge_StringCreateByCString("func-add"); + WasmEdge_ModuleInstanceAddFunction(HostModCxt, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostModCxt); + + /* The parameters and returns arrays. */ + WasmEdge_Value Params[2] = { + WasmEdge_ValueGenI32(1234), WasmEdge_ValueGenI32(5678)}; + WasmEdge_Value Returns[1]; + /* Function name. */ + WasmEdge_String FuncName = WasmEdge_StringCreateByCString("addTwo"); + /* Run the WASM function from buffer. */ + WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( + VMCxt, WASM, sizeof(WASM), FuncName, Params, 2, Returns, 1); + + if (WasmEdge_ResultOK(Res)) + { + // printf("invokeAdd get the result: %d\n", + // WasmEdge_ValueGetI32(Returns[0])); + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); + } + + /* Resources deallocations. */ + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(FuncName); + WasmEdge_ModuleInstanceDelete(HostModCxt); +} + +struct Wasm_test : public beast::unit_test::suite +{ + void + testWasmtimeLib() + { + testcase("wasmtime lib test"); + invokeAdd(); + BEAST_EXPECT(true); + } + + void + testEscrowWasmP0() + { + testcase("escrow wasm P0 test"); + auto wasmHex = + "0061736d0100000001090260017f017f6000000305040001010004050170010101" + "05030100100609017f01418080c0000b071802066d656d6f727902000b6d6f636b" + "5f657363726f7700030a25040800200041056f450b02000b0e0010818080800010" + "81808080000b08002000100010020b0072046e616d650011106d6f636b5f657363" + "726f772e7761736d014404000b6d6f636b5f657363726f77010564756d6d790211" + "5f5f7761736d5f63616c6c5f64746f7273031a6d6f636b5f657363726f772e636f" + "6d6d616e645f6578706f7274071201000f5f5f737461636b5f706f696e74657200" + "c0010970726f64756365727302086c616e67756167650204527573740003433131" + "000c70726f6365737365642d62790205727573746325312e38332e302d6e696768" + "746c79202863326637346333663920323032342d30392d30392905636c616e675f" + "31382e312e322d776173692d73646b202868747470733a2f2f6769746875622e63" + "6f6d2f6c6c766d2f6c6c766d2d70726f6a65637420323661316436363031643732" + "376139366634333031643064383634376235613432373630616530632900560f74" + "61726765745f6665617475726573052b0b62756c6b2d6d656d6f72792b0a6d756c" + "746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e" + "63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + auto re = runEscrowWasm(wasm, funcName, 15); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + + re = runEscrowWasm(wasm, funcName, 11); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + + void + testBadWasm() + { + testcase("bad wasm test"); + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + auto re = runEscrowWasm(wasm, funcName, 15); + BEAST_EXPECT(re.error()); + } + + void + testEscrowWasmP1() + { + testcase("escrow wasm P1 test"); + auto wasmHex = + "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" + "00030c0b01010200000000000003000405017001030305030100110619037f0141" + "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" + "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" + "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" + "200010012200450d0120000f0b230041206b220024002000410036021820004101" + "36020c200041b480c00036020820004204370210200041086a41d080c000100500" + "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" + "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" + "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" + "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" + "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" + "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" + "0245044041002100410021010c040b4100210020054100411920074101766b2007" + "411f461b7421044100210103400240200228020441787122062005490d00200620" + "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" + "021422062000200620022004411d764104716a41106a2802002202471b20002006" + "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" + "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" + "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" + "000b20012000410372360204200020016a220020002802044101723602040c060b" + "024041022000742203410020036b72200120007471682206410374220041a483c0" + "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" + "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" + "360204200120056a2206200020056b2204410172360204200020016a2004360200" + "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" + "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" + "200220057236020020000c010b20002802080b2102200020033602082002200336" + "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" + "043602000c050b200068410274419482c0006a280200220128020441787120056b" + "2103200121020240034002400240200128021022000d00200128021422000d0020" + "022802182107024002402002200228020c22004604402002411441102002280214" + "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" + "013602080c010b200241146a200241106a20001b21040340200421062001220041" + "146a200041106a200028021422011b210420004114411020011b6a28020022010d" + "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" + "28020047044020074110411420072802102002461b6a20003602002000450d040c" + "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" + "77713602000c030b200028020441787120056b22012003200120034922011b2103" + "2000200220011b2102200021010c010b0b20002007360218200228021022010440" + "20002001360210200120003602180b20022802142201450d002000200136021420" + "0120003602180b02400240200341104f044020022005410372360204200220056a" + "22062003410172360204200320066a200336020041b485c0002802002204450d01" + "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" + "2205410120044103767422047145044041ac85c000200420057236020020000c01" + "0b20002802080b2104200020013602082004200136020c2001200036020c200120" + "043602080c010b2002200320056a2200410372360204200020026a220020002802" + "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" + "41086a0f0b20002001724504404100210141022007742200410020006b72200871" + "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" + "20012000280204417871220420056b220620034922071b21082000280210220245" + "0440200028021421020b20012008200420054922001b210120032006200320071b" + "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" + "200020056b4f710d0020012802182107024002402001200128020c220046044020" + "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" + "2202200036020c200020023602080c010b200141146a200141106a20001b210403" + "40200421062002220041146a200041106a200028021422021b2104200041144110" + "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" + "28021c410274419482c0006a220228020047044020074110411420072802102001" + "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" + "b085c000280200417e200128021c77713602000c010b2000200736021820012802" + "102202044020002002360210200220003602180b20012802142202450d00200020" + "02360214200220003602180b0240200341104f0440200120054103723602042001" + "20056a22022003410172360204200220036a200336020020034180024f04402002" + "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" + "410120034103767422037145044041ac85c000200320047236020020000c010b20" + "002802080b2103200020023602082003200236020c2002200036020c2002200336" + "02080c010b2001200320056a2200410372360204200020016a2200200028020441" + "01723602040b0c010b024002400240024002400240200541b485c0002802002201" + "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" + "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" + "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" + "02002201200020002001491b3602000240024041c085c000280200220304404194" + "83c0002100034020002802002201200028020422066a2002460d02200028020822" + "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" + "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" + "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" + "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" + "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" + "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" + "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" + "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" + "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" + "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" + "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" + "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" + "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" + "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" + "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" + "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" + "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" + "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" + "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" + "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" + "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" + "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" + "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" + "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" + "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" + "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" + "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" + "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" + "85c000200441286b220036020020022000410172360204200020026a4128360204" + "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" + "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" + "20046a2101419483c0002100024002400340200120002802002206470440200028" + "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" + "0028020022014f04402003200120002802046a2206490d010b200028020821000c" + "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" + "0172360204200020026a412836020441cc85c00041808080013602002003200641" + "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" + "002109200141106a419c83c00029020037020020012009370208419883c0002004" + "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" + "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" + "012003460d0720012001280204417e713602042003200120036b22004101723602" + "042001200036020020004180024f04402003200010070c080b200041f8017141a4" + "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" + "ac85c000200020027236020020010c010b20012802080b21002001200336020820" + "00200336020c2003200136020c200320003602080c070b20002002360200200020" + "0028020420046a360204200220054103723602042006410f6a41787141086b2201" + "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" + "460d04200128020422054103714101460440200120054178712200100820002001" + "6a22012802042105200020036a21030b20012005417e7136020420042003410172" + "360204200320046a200336020020034180024f04402004200310070c060b200341" + "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" + "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" + "043602082003200436020c2004200036020c200420033602080c050b41b885c000" + "200020056b220136020041c085c00041c085c000280200220020056a2202360200" + "2002200141017236020420002005410372360204200041086a21000c060b41bc85" + "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" + "85c000410036020020002001410372360204200020016a22012001280204410172" + "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" + "2002410172360204200020016a2002360200200020054103723602040b20004108" + "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" + "71220141086b220236020041b885c00041b885c00028020020046a220320002001" + "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" + "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" + "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" + "0041b485c00041b485c00028020020036a22003602002004200041017236020420" + "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" + "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" + "20056a22023602002002200141017236020420002005410372360204200041086a" + "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" + "402007410020076b41037122026a21062002044020072103418080c00021050340" + "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" + "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" + "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" + "6b411871210820052802002105034020062005200c762004280200220520087472" + "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" + "20022104034020062004280200360200200441046a2104200641046a2206200349" + "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" + "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" + "4122460440200021032007210241002105412221080240034020032d0000220920" + "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" + "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" + "0b000bd20601047f0240200041046b280200220241787122034104410820024103" + "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" + "0041046b280200220341787122006a21020240024020034101710d002003410271" + "450d012001280200220320006a2100200120036b220141bc85c000280200460440" + "20022802044103714103470d0141b485c000200036020020022002280204417e71" + "36020420012000410172360204200220003602000c020b2001200310080b024002" + "4002400240024020022802042203410271450440200241c085c000280200460d02" + "200241bc85c000280200460d0320022003417871220210082001200020026a2200" + "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" + "0020003602000c060b20022003417e713602042001200041017236020420002001" + "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" + "c00028020041016b220036020020000d04419c83c0002802002200044003402001" + "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" + "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" + "003602002001200041017236020441bc85c000280200200146044041b485c00041" + "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" + "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" + "00210103402002200128020022054f04402002200520012802046a490d040b2001" + "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" + "20006a220036020020012000410172360204200020016a20003602000c020b2000" + "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" + "007145044041ac85c000200020037236020020020c010b20022802080b21002002" + "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" + "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" + "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" + "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" + "7f230041206b220224002002410036021020024101360204200242043702082002" + "412e36021c200220003602182002200241186a360200200220011005000ba40201" + "037f230041206b22022400200241106a2203200041106a29020037030020024108" + "6a2204200041086a290200370300200241013b011c200220013602182002200029" + "0200370300230041206b2200240020022802182101200041106a20032902003703" + "00200041086a20042902003703002000200236021c200020013602182000200229" + "020037030041002102230041106b22012400200028020c21030240024002400240" + "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" + "2802042102200328020021030c010b20014180808080783602002001200036020c" + "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" + "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" + "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" + "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" + "2002410274419482c0006a21044101200274220341b085c0002802007145044020" + "042000360200200020043602182000200036020c2000200036020841b085c00041" + "b085c0002802002003723602000f0b024002402001200428020022032802044178" + "71460440200321020c010b20014100411920024101766b2002411f461b74210503" + "4020032005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c200220" + "00360208200041003602182000200236020c200020013602080f0b200420003602" + "00200020033602182000200036020c200020003602080bf10201047f200028020c" + "21020240024020014180024f044020002802182103024002402000200246044020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" + "2201200236020c200220013602080c010b200041146a200041106a20021b210403" + "40200421052001220241146a200241106a200228021422011b2104200241144110" + "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" + "0274419482c0006a220128020047044020034110411420032802102000461b6a20" + "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" + "280200417e200028021c77713602000c020b200028020822002002470440200020" + "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" + "77713602000f0b2002200336021820002802102201044020022001360210200120" + "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" + "017f230041106b22032400419082c000419082c000280200220441016a36020002" + "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" + "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" + "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" + "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" + "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" + "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" + "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" + "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" + "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" + "64006000100029000000a804000009000000617373657274696f6e206661696c65" + "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" + "6765010452757374000c70726f6365737365642d62790105727573746325312e38" + "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" + "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("check_accountID"); + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + std::vector data(str.begin(), str.end()); + auto re = runEscrowWasm(wasm, funcName, data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; + std::vector data(str.begin(), str.end()); + auto re = runEscrowWasm(wasm, funcName, data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + } + + void + testEscrowWasmP2P3() + { + testcase("escrow wasm P2 & P3 test"); + auto wasmHex = + "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" + "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" + "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" + "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" + "616004030305060001070808080809040702000000040403030304030500020306" + "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" + "0903020201020200000405000203030402020205100b0303000005030101010104" + "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" + "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" + "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" + "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" + "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" + "360228200320023602242003200136022020034180013a002c2003410036021c20" + "03428080808010370214200341c8006a200341146a108180808000024002400240" + "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" + "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" + "2903483703300240024020032802282202200328022422064f0d00200328022021" + "070340200720026a2d000041776a220141174b0d02410120017441938080047145" + "0d022006200241016a2202470d000b200320063602280b20002003290330370300" + "200041106a2004290300370300200041086a200529030037030020032802142202" + "450d04200328021820021082808080000c040b20032002360228200341086a2007" + "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" + "200328020c21012003280208210641141084808080002202450d01200220063602" + "0c2002411636020020002002360204200041063a00002002200136021020034130" + "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" + "032802142202450d00200328021820021082808080000b200341e0006a24808080" + "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" + "210302400240024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f0006a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" + "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" + "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241386a200320052005200441016a220420052004491b" + "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" + "84808080002207450d1f2007200836020c20074105360200200720043602100c08" + "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" + "c080001a200228024c21042002280248210841141084808080002207450d1e2007" + "200836020c20074107360200200720043602100c070b20022902dc02210e200228" + "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228024421042002280240210841141084808080002207450d1c2007200836020c" + "20074115360200200720043602100c050b200241b0016a20011081808080000240" + "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" + "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" + "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" + "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" + "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" + "000120042007360204200441106a2003290300370300200441036a20052d00003a" + "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" + "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" + "0000200420083602100c180b200628020021030b200241306a2003200520052004" + "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" + "042002280230210841141084808080002207450d172007200836020c2007410236" + "0200200720043602100b200241d8026a109180808000024020022802d802220445" + "0d002009200441186c1082808080000b200128020c210320012802142104200128" + "0210210541062106410121090b200120012d001841016a3a001802400240200420" + "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" + "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" + "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28021421082002280210210541141084808080002204450d1d200441163602000c" + "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" + "41776a220841174b0d024101200874419380800471450d022001200441016a2204" + "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" + "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" + "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" + "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" + "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" + "210541141084808080002204450d1a200441153602000c040b200241206a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228022421082002280220210541141084808080002204450d1920044116360200" + "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" + "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" + "001a200228021c21082002280218210541141084808080002204450d1620044102" + "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" + "01200220073602b401200220063a00b001024020090d00200241063a0078200220" + "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" + "200241c8016a1092808080000c110b200241086a20032005200520042005200449" + "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" + "1084808080002204450d142004200136020c200441183602002000200436020420" + "0041063a0000200420083602100c130b200141003602082001200441016a360214" + "200241b0016a2006200110938080800020022802b40121080240024020022802b0" + "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" + "948080800020022d00784106460d1320002002290378370300200041106a200241" + "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" + "150b41002101024020044100480d00024020040d0041012101410021050c030b41" + "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" + "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" + "086a220320012008200410df808080003602002002200536027c200241033a0078" + "2002200436028401200041106a200241f8006a41106a290300370300200041086a" + "2003290300370300200020022903783703000c120b2001200441016a3602142002" + "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" + "20024190016a109680808000024020022d00784106460d00200020022903783703" + "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" + "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" + "200020043602040c120b2000200228029801360204200041063a00000c110b0240" + "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" + "14200141bb80c0800041031086808080002204450d02200041063a000020002004" + "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" + "0a490d042002200320052005200441016a220420052004491b1083808080004100" + "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" + "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" + "200241003a007820002002290378370300200041086a200241f8006a41086a2903" + "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" + "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" + "00200020043602040c0e0b20024181023b01782000200229037837030020004108" + "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" + "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" + "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" + "02290378370300200041086a200241f8006a41086a290300370300200041106a20" + "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" + "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" + "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" + "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" + "21070c070b20022802d401220441003602082004200428021441016a3602142002" + "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" + "460d06200241d8026a200720022802b801109880808000024020022802d8022204" + "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" + "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" + "41003602dc01200220053602e002200220083602dc02200220043602d802200241" + "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" + "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" + "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" + "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" + "024020022d00b101450d0020022802d40122044100360208200420042802144101" + "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" + "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" + "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" + "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" + "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" + "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" + "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" + "290300220f370300200220022903b00122103703d802200541106a200e37020020" + "0541086a200f3702002005201037020020024180026a41086a200c290200370300" + "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" + "186a280200360200200220022902b00137038002200220033602a4022002200736" + "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" + "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" + "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" + "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" + "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" + "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" + "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" + "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" + "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" + "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" + "200820041082808080000b200241dc016a109b808080000b41062106410121090b" + "200120012d001841016a3a0018200128020c210302400240024020012802142204" + "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" + "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" + "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" + "21040c050b200241e8006a200320052005200441016a220420052004491b108380" + "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" + "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" + "200441016a220436021420052004470d000b200521040b200241e0006a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28026421082002280260210541141084808080002204450d072004200536020c20" + "044103360200200420083602100c010b200241d8006a200320052005200441016a" + "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" + "280258210541141084808080002204450d062004200536020c2004411636020020" + "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" + "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" + "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" + "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" + "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" + "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" + "80000c010b200241d0006a200320052005200420052004491b1083808080004100" + "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" + "0d042004200136020c2004411836020020002004360204200041063a0000200420" + "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" + "200041063a0000200020043602040c010b20002002290378370300200041106a20" + "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" + "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" + "002202417871220341044108200241037122021b20016a490d0002402002450d00" + "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" + "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" + "0301057f02400240024002400240024020022003490d0041012104410021052003" + "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" + "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" + "418a94a8d000736b20077241808182847871418081828478460d00034020062001" + "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" + "034109490d0103400240024020074108480d004180828408200120076a22064178" + "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" + "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" + "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" + "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" + "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" + "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" + "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" + "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" + "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" + "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" + "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" + "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" + "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" + "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" + "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" + "0041002100410021060c040b4100210020024100411920054101766b2005411f46" + "1b74210741002106034002402001220128020441787122082002490d0020082002" + "6b220820034f0d00200821032001210620080d004100210320012106200121000c" + "060b200128021422082000200820012007411d764104716a41106a280200220147" + "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" + "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" + "0022032802082206460d002006200236020c200220063602080c010b4100200141" + "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" + "0204410172360204200341086a0f0b024002402000200374410220037422004100" + "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" + "0022002802082207460d002007200636020c200620073602080c010b4100200141" + "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" + "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" + "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" + "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" + "d2c08000200621010c010b200628020821010b200620033602082001200336020c" + "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" + "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" + "787120026b2103200621010240024003400240200628021022000d002006280214" + "22000d0020012802182105024002400240200128020c22002001470d0020014114" + "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" + "0036020c200020063602080c010b200141146a200141106a20001b210703402007" + "21082006220041146a200041106a200028021422061b210720004114411020061b" + "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" + "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" + "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" + "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" + "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" + "360218024020012802102206450d0020002006360210200620003602180b200128" + "02142206450d0020002006360214200620003602180b0240024002402003411049" + "0d0020012002410372360204200120026a22022003410172360204200220036a20" + "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" + "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" + "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" + "0b200620003602082007200036020c2000200636020c200020073602080c010b20" + "01200320026a2200410372360204200120006a220020002802044101723602040c" + "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" + "4020002006720d004100210641022005742200410020006b722004712200450d03" + "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" + "280204417871220120026b220820034922051b2104200120024921072008200320" + "051b21080240200028021022010d00200028021421010b2006200420071b210620" + "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" + "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" + "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" + "410021000c020b20062802082201200036020c200020013602080c010b20064114" + "6a200641106a20001b21070340200721082001220041146a200041106a20002802" + "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" + "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" + "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" + "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" + "c080000c010b20002005360218024020062802102201450d002000200136021020" + "0120003602180b20062802142201450d0020002001360214200120003602180b02" + "40024020034110490d0020062002410372360204200620026a2200200341017236" + "0204200020036a200336020002402003418002490d002000200310d7808080000c" + "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" + "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" + "200228020821030b200220003602082003200036020c2000200236020c20002003" + "3602080c010b2006200320026a2200410372360204200620006a22002000280204" + "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" + "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" + "200241af80046a220641107640002203417f4622070d0720034110742201450d07" + "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" + "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" + "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" + "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" + "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" + "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" + "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" + "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" + "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" + "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" + "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" + "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" + "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" + "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" + "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" + "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" + "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" + "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" + "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" + "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" + "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" + "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" + "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" + "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" + "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" + "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" + "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" + "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" + "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" + "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" + "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" + "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" + "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" + "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" + "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" + "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" + "003602f0d2c0800020012000410172360204200120006a41283602044100418080" + "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" + "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" + "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" + "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" + "02402000280200220620034b0d002003200620002802046a2206490d020b200028" + "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" + "800020012000410172360204200120006a412836020441004180808001360284d3" + "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" + "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" + "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" + "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" + "200041046a22002006490d000b20072003460d0720072007280204417e71360204" + "2003200720036b22004101723602042007200036020002402000418002490d0020" + "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" + "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" + "c08000200621000c010b200628020821000b200620033602082000200336020c20" + "03200636020c200320003602080c070b200020013602002000200028020420086a" + "360204200120024103723602042007410f6a41787141786a2206200120026a2200" + "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" + "200628020422024103714101470d0020062002417871220210a880808000200220" + "036a2103200620026a220628020421020b20062002417e71360204200020034101" + "72360204200020036a200336020002402003418002490d002000200310d7808080" + "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" + "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" + "010b200228020821030b200220003602082003200036020c2000200236020c2000" + "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" + "8000220020026a22063602f8d2c080002006200341017236020420002002410372" + "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" + "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" + "410372360204200320006a220020002802044101723602040c010b410020063602" + "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" + "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" + "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" + "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" + "d2c0800020062001410172360204200020036a4128360204410041808080013602" + "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" + "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" + "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" + "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" + "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" + "0020026a22063602f8d2c080002006200341017236020420002002410372360204" + "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" + "02000b200041046a109b808080000c020b20002802042201450d01200028020820" + "011082808080000f0b200041046a10918080800020002802042201450d00200028" + "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" + "80808080002000280214220420002802102205200420054b1b2106200028020c21" + "0702400240024002400340024020020d00410021040c050b20062004460d012000" + "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" + "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" + "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" + "8080002204450d01200441093602000c020b200320072005200610838080800041" + "002d00c0cfc080001a200328020421012003280200210241141084808080002204" + "450d00200441053602000c010b000b2004200236020c200420013602100b200341" + "106a24808080800020040b970202027f027e23808080800041106b220424808080" + "8000024002400240024002400240024002402001280214220520012802104f0d00" + "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" + "020b2002450d02420121060c050b20042001200220034100108880808000200428" + "02000d020c030b200420012002200341001089808080002004280200450d022000" + "2004280204360208200042033703000c040b420021060240420020037d22074200" + "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" + "020b20002004280204360208200042033703000c020b2004290308210342002106" + "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" + "23808080800041106b220524808080800020012001280214220641016a22073602" + "140240024002402007200128021022084f0d00200720086b2109200128020c210a" + "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" + "410a490d00024020060d002005200a20082008200741016a220720082007491b10" + "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" + "808080002207450d072007200c36020c2007410d36020020002007360204200041" + "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" + "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" + "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" + "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" + "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" + "20002001200220032007108b808080000c010b200541086a200128020c20082008" + "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" + "0c21062005280208210c41141084808080002207450d012007200c36020c200741" + "053602002000200736020420004101360200200720063602100b200541106a2480" + "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" + "0620012001280214220741016a220836021402402008200128021022094f0d0041" + "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" + "2001200741026a22083602140b200128020c210a02400240024002400240024002" + "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" + "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" + "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" + "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" + "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" + "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" + "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" + "042007200836020c20074105360200200020073602042000410136020020072001" + "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" + "020421012005280200210841141084808080002207450d032007200836020c2007" + "410d3602002000200736020420004101360200200720013602100c040b20042008" + "6a2207411f7541808080807873200720084100482007200448731b21070b200020" + "01200220032007108b808080000c020b2000200120022003502006108c80808000" + "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" + "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" + "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" + "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" + "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" + "22052480808080002003ba2106024002400240024002400240024020042004411f" + "7522077320076b220741b502490d0003402006440000000000000000610d062004" + "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" + "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" + "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" + "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" + "84808080002204450d022004200136020c2004410e360200200020043602042004" + "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" + "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" + "28020c21072005280208210141141084808080002204450d012004200136020c20" + "04410e36020020002004360204200420073602100b410121040c020b000b200020" + "0620069a20021b390308410021040b20002004360200200541106a248080808000" + "0b840201027f23808080800041106b220524808080800002400240024002402004" + "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" + "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" + "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" + "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" + "1084808080002204450d002004200336020c2004410e3602002000200436020420" + "042001360210410121040c020b000b200044000000000000000044000000000000" + "008020021b390308410021040b20002004360200200541106a2480808080000b95" + "0502067f017e23808080800041306b2203248080808000200128020c2104024002" + "40024002400240024020012802142205200128021022064f0d002001200541016a" + "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" + "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" + "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" + "21072003280218210441141084808080002201450d022001200436020c20014105" + "3602002000200136020820004203370300200120073602100c040b200341086a20" + "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" + "1a200328020c21072003280208210441141084808080002201450d012001200436" + "020c2001410d3602002000200136020820004203370300200120073602100c030b" + "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" + "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" + "01450d012001200436020c2001410d360200200020013602082000420337030020" + "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" + "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" + "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" + "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" + "0b0b200341206a200120022009108e808080000240024020032802200d00200020" + "032b0328390308420021090c010b20002003280224360208420321090b20002009" + "3703000c020b000b20002001200220091087808080000b200341306a2480808080" + "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" + "0641016a2107200520066b2108200128020c20066a210541002104034002402005" + "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" + "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" + "200720046a3602142008200441016a2204470d000b200821040b20002001200220" + "032004108b808080000f0b200020012002200320041088808080000bc80101047f" + "23808080800041206b2202248080808000024002400240200028020c450d002000" + "21010c010b200241106a41086a2203200041086a28020036020020022000290200" + "370310200241086a200128020c2001280210200128021410838080800041002d00" + "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" + "200120022903103702002001200536020c20012004360210200141086a20032802" + "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "014108411810d480808000024020012802082200418180808078460d0020002001" + "28020c109580808000000b200141106a2480808080000b950101027f0240200028" + "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" + "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" + "0041046a28020020021082808080000c010b200010918080800020002802002202" + "450d00200041046a280200200241186c1082808080000b200041186a2100200141" + "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" + "01020b20002802082201450d01200028020420011082808080000c010b20002d00" + "044103470d00200028020822012802002102024020012802042203280200220445" + "0d002002200411808080800080808080000b024020032802042203450d00200220" + "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" + "097f017e23808080800041306b2203248080808000024002400240024002400240" + "0240024002400340024002402001280208220420012802042205460d0002400240" + "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" + "00460d0120074120490d012006200441016a22086a21094100200520086b417871" + "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" + "800020012802042105200128020821070c040b200741086a2107200b41086a2109" + "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" + "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" + "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" + "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" + "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" + "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" + "1084808080002207450d052007200936020c200741043602002000200736020420" + "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" + "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" + "024020094122470d002002280208450d0520072004490d072002200b20046a2007" + "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" + "0204200228020810ca8080800020032802282207450d032000200328022c360208" + "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" + "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" + "450d052007200936020c2007411036020020002007360204200041023602002007" + "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" + "80002001200741016a2209360208024020092005490d00200341206a200b200520" + "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" + "1084808080002207450d06200741043602000c090b2001200741026a2204360208" + "02400240024002400240024002400240024002400240200b20096a2d0000220741" + "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" + "00470d020240200228020822072002280200470d00200210cb808080000b200220" + "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" + "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" + "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" + "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" + "22072002280200470d00200210cb808080000b2002200741016a36020820022802" + "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" + "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" + "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" + "02200741016a360208200228020420076a41083a0000410021070c050b02402002" + "28020822072002280200470d00200210cb808080000b2002200741016a36020820" + "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" + "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" + "0000410021070c030b0240200228020822072002280200470d00200210cb808080" + "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" + "40200228020822072002280200470d00200210cb808080000b2002200741016a36" + "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" + "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" + "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" + "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" + "40024020032802282207450d002000200328022c3602084100210b0c010b410221" + "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" + "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" + "200936020c2007200b3602100b20004102360200200020073602040b200341306a" + "2480808080000b7901027f410021030240024020024100480d00024020020d0041" + "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" + "040d01410121030b20032002109580808000000b20042001200210df8080800021" + "012000200236020c2000200136020820002003360204200041033a00000b100002" + "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" + "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" + "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" + "370308200041023a0000200020012903083703100f0b200041023a000020002001" + "290308220337031020002003423f883703080bb40701077f23808080800041306b" + "22022480808080002001280200220328020c210402400240024002402003280214" + "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" + "174b0d024101200874419380800471450d022003200541016a2205360214200620" + "05470d000b200621050b41012108200241286a200420062006200541016a220520" + "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" + "210341141084808080002205450d022005200336020c2005410336020020002005" + "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" + "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" + "20053602140240200520064f0d00034002400240024002400240200420056a2d00" + "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" + "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" + "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" + "0c21062002280208210341141084808080002205450d092005200336020c200541" + "1136020020002005360204200520063602100c080b200041013a0001410021080c" + "070b41012108200241186a200420062006200541016a220520062005491b108380" + "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" + "80002205450d072005200336020c20054115360200200020053602042005200636" + "02100c060b2003200541016a220536021420062005470d000b200621050b410121" + "08200241106a200420062006200541016a220520062005491b1083808080004100" + "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" + "0d042005200336020c2005410536020020002005360204200520063602100c030b" + "41002108200141003a0004024020074122460d002002200420062006200541016a" + "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" + "280200210641141084808080002205450d042005200636020c2005411136020020" + "002005360204200520083602100c020b200041013a00010c020b200241206a2004" + "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" + "21082002280220210641141084808080002205450d022005200636020c20054108" + "36020020002005360204200520083602100b410121080b200020083a0000200241" + "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" + "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" + "8080800022040d01410121030b20032002109580808000000b20042001200210df" + "8080800021012000200236020820002001360204200020033602000bdc0201067f" + "23808080800041106b22022480808080002001280200220328020c210402400240" + "02400240024020032802142201200341106a28020022054f0d000340200420016a" + "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" + "41016a220136021420052001470d000b200521010b200241086a20042005200520" + "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" + "21072002280208210541141084808080002201450d03200141033602000c010b02" + "402006413a470d002003200141016a360214200020031081808080000c020b2002" + "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" + "001a200228020421072002280200210541141084808080002201450d0220014106" + "3602000b2001200536020c20002001360204200041063a0000200120073602100b" + "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" + "042480808080000240024002400240024002400240024002400240024002400240" + "20012802002205450d002002280208210620022802042107200128020421080240" + "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" + "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" + "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" + "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" + "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" + "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" + "2002290204220fa721092002280200220b418080808078470d03200921050c010b" + "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" + "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" + "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" + "028c02200142808080801037020420012009360200200920032903003703002009" + "41086a200341086a290300370300200941106a200341106a2903003703000c010b" + "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" + "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" + "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" + "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" + "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" + "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" + "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" + "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" + "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" + "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" + "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" + "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" + "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" + "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" + "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" + "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" + "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" + "200420042903880137026020042005360208200420063602782008280200220d41" + "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" + "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" + "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" + "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" + "370300200b2003290300370300200b41086a200341086a290300370300200d200e" + "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" + "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" + "246a200441dc006a41186a28020036020020042010370234200420073602302004" + "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" + "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" + "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" + "210d200b2f019203410b490d02200641016a210602400240024002400240024002" + "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" + "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" + "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" + "36027820044188016a200441f8006a10c18080800020042802b001410520044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" + "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" + "2105200d418080808078460d032004200d3602302008200441086a412410df8080" + "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" + "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" + "41003b019203200d410036028802200b41003b019003200b200d36028802200120" + "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" + "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" + "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" + "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" + "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" + "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" + "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" + "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" + "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" + "6a200941106a220d290300370300200041086a200941086a220b29030037030020" + "092003290300370300200b200341086a290300370300200d200341106a29030037" + "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" + "80808080004100210241002103024020002802002204450d002001200436021820" + "014100360214200120043602082001410036020420012000280204220336021c20" + "01200336020c20002802082103410121020b200120033602202001200236021020" + "01200236020002400240024003400240024002400240024020030d002001280200" + "450d0820012802082104200128020422030d0141002100200128020c2203450d06" + "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" + "024020024101712203450d0020012802040d0020012802082103200128020c2200" + "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" + "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" + "3702082001200336020441012102200141013602000b2001280208210002402001" + "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" + "20012802242203450d0120012802282100200128022c220520032f019203490d02" + "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" + "2001200436020c20014100360208200120033602040c010b200320044102746a41" + "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" + "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" + "2802002204450d00200028020420041082808080000b0240024002400240200320" + "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" + "20032802042200450d01200328020820001082808080000c010b200341046a1091" + "8080800020032802042200450d002003280208200041186c1082808080000b2001" + "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" + "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" + "03037f017e037f23808080800041f0006b22022480808080004100210302402000" + "2d0000220420012d0000470d00410121030240024002400240024020040e060500" + "01020304050b20002d000120012d00014621030c040b4100210320002903082205" + "2001290308520d030240024002402005a70e03000102000b200029031020012903" + "105121030c050b200029031020012903105121030c040b20002b031020012b0310" + "6121030c030b41002103200028020c2204200128020c470d022000280208200128" + "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" + "0d012001280208210420002802082100200641016a210103402001417f6a220145" + "21032001450d0220002004109c808080002106200441186a2104200041186a2100" + "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" + "6c2002420037026420024100360254200241003602442002410036023020024100" + "36022020022001280208220636025c200220012802042203360258200220063602" + "4c2002200336024820022000280208220636023820022000280204220136023420" + "0220063602282002200136022420022004410020031b3602602002200341004722" + "033602502002200336024020022004410020011b36023c20022001410047220336" + "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" + "80004101210320022802102201450d0120022802142104200241086a2007109d80" + "80800020022802082200450d0141002103200128020822062000280208470d0120" + "0228020c210820012802042000280204200610dc808080000d0120042008109c80" + "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" + "200128022022020d00410021020c010b20012002417f6a36022002400240024020" + "012802004101470d0020012802040d01200128020821030240200128020c220245" + "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" + "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" + "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" + "050c010b03402003280288022205450d03200241016a210220032f019003210420" + "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" + "21060c010b200520034102746a4198036a21030340200328020022064198036a21" + "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" + "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" + "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" + "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" + "001a200010848080800022010d01410121010b20012000109580808000000b2001" + "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" + "108080808000024002400240024020042d00384106460d00200441086a41106a20" + "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" + "29030037030020042004290338370308200441386a200220031080808080002004" + "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" + "0629030037030020042004290338370320200441086a10a0808080002205450d02" + "200441206a10a0808080002206450d0320052006109c808080002105200441206a" + "108580808000200441086a10858080800002402003450d00200220031082808080" + "000b02402001450d00200020011082808080000b200441d0006a24808080800020" + "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" + "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" + "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" + "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" + "004105470d0020002802042202450d002000280208210303402002418c026a2100" + "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" + "0c020b2000280208210120002802042107200641016a2106200541746a21052000" + "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" + "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" + "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" + "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" + "0041c0006b22052480808080002005200136020c20052000360208200520033602" + "14200520023602102005410236021c200541dc82c0800036021820054202370224" + "2005418180808000ad422086200541106aad843703382005418280808000ad4220" + "86200541086aad843703302005200541306a360220200541186a200410a4808080" + "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" + "41206b2200248080808000200041003602182000410136020c200041ac81c08000" + "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" + "23808080800041206b2202248080808000200241106a200041106a290200370300" + "200241086a200041086a290200370300200241013b011c20022001360218200220" + "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" + "6a280200220241787122006a21030240024020024101710d002002410271450d01" + "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" + "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" + "7136020420012000410172360204200320003602000f0b2001200210a880808000" + "0b024002400240024002400240200328020422024102710d00200341002802f8d2" + "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" + "80002001200220006a2200410172360204200120006a2000360200200141002802" + "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" + "2000410172360204200120006a20003602000b2000418002490d022001200010d7" + "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" + "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" + "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" + "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" + "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" + "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" + "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" + "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" + "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" + "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" + "00220241012000410376742200710d00410020022000723602e4d2c08000200321" + "000c010b200328020821000b200320013602082000200136020c2001200336020c" + "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" + "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" + "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" + "0041206b2203248080808000200341003602102003410136020420034204370208" + "2003200136021c200320003602182003200341186a3602002003200210a4808080" + "00000b840601057f0240024002402000417c6a2203280200220441787122054104" + "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" + "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" + "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" + "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" + "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" + "7871220420056a22052001490d042006200410a880808000200520016b22024110" + "490d0120032001200328020041017172410272360200200720016a220120024103" + "72360204200720056a220520052802044101723602042001200210a98080800020" + "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" + "20016a22052002410372360204200620062802044101723602042005200210a980" + "80800020000f0b20032005200328020041017172410272360200200720056a2202" + "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" + "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" + "200720056a2202200228020441017236020441002102410021010c010b20032001" + "200441017172410272360200200720016a22012002410172360204200720056a22" + "05200236020020052005280204417e713602040b410020013602f4d2c080004100" + "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" + "0240200210848080800022050d0041000f0b20052000417c417820032802002201" + "4103711b20014178716a2201200220012002491b10df808080002102200010a580" + "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" + "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" + "410272360200200720016a2202200520016b2205410172360204410020053602f0" + "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" + "4002402001418002490d002000280218210302400240024020022000470d002000" + "41144110200028021422021b6a28020022010d01410021020c020b200028020822" + "01200236020c200220013602080c010b200041146a200041106a20021b21040340" + "200421052001220241146a200241106a200228021422011b210420024114411020" + "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" + "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" + "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" + "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" + "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" + "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d0020022001360214" + "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" + "4101710d002003410271450d012000280200220320016a21010240200020036b22" + "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" + "d2c0800020022002280204417e7136020420002001410172360204200220013602" + "000c020b2000200310a8808080000b024002400240024020022802042203410271" + "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" + "03417871220310a8808080002000200320016a2201410172360204200020016a20" + "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" + "2003417e7136020420002001410172360204200020016a20013602000b02402001" + "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" + "0240024041002802e4d2c08000220341012001410376742201710d004100200320" + "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" + "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" + "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" + "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" + "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" + "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" + "7e23808080800041306b2203248080808000200320003602002003200136020420" + "03410236020c200341c485c08000360208200342023702142003418380808000ad" + "4220862204200341046aad84370328200320042003ad843703202003200341206a" + "360210200341086a200210a480808000000b110020003502004101200110ad8080" + "80000b7902017f017e23808080800041306b220324808080800020032001360204" + "200320003602002003410236020c200341c882c080003602082003420237021420" + "03418380808000ad42208622042003ad8437032820032004200341046aad843703" + "202003200341206a360210200341086a200210a480808000000bec0203027f017e" + "037f23808080800041306b2203248080808000412721040240024020004290ce00" + "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" + "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" + "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" + "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" + "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" + "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" + "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" + "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" + "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" + "23808080800041206b220124808080800020002802182102200141106a20004110" + "6a290200370300200141086a200041086a2902003703002001200036021c200120" + "0236021820012000290200370300200110d880808000000bcb0501077f02400240" + "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" + "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" + "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" + "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" + "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" + "28021422012000280218220920082002200310b080808000450d0041010f0b2001" + "20042005200928020c11818080800080808080000f0b0240024002400240200028" + "0204220120064b0d00200028021422012000280218220920082002200310b08080" + "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" + "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" + "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" + "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" + "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" + "00202000200736021041000f0b200120042005200928020c118180808000808080" + "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" + "020b20072101410021070c010b20074101762101200741016a41017621070b2001" + "41016a210120002802102106200028021821092000280214210a02400340200141" + "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" + "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" + "020c11818080800080808080000d00410021010340024020072001470d00200720" + "07490f0b200141016a2101200a200620092802101182808080008080808000450d" + "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" + "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" + "200020032004200128020c11818080800080808080000b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c200341e485c08000360208200342023702142003418380808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" + "200028020022040d002003410171450d010b02402003410171450d00200120026a" + "210502400240200028020c22060d0041002107200121080c010b41002107410021" + "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" + "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" + "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" + "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" + "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" + "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" + "2007200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a02402002" + "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" + "0641002103024020012007460d004100210302402009417c4b0d00410021034100" + "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" + "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" + "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" + "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" + "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" + "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" + "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" + "41002108024020054104490d002004200d41f007716a2109410021082004210303" + "40200328020c2207417f7341077620074106767241818284087120032802082207" + "417f7341077620074106767241818284087120032802042207417f734107762007" + "4106767241818284087120032802002207417f7341077620074106767241818284" + "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" + "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" + "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" + "4107762003410676724181828408712103200c4101460d0220082802042207417f" + "7341077620074106767241818284087120036a2103200c4102460d022008280208" + "2208417f7341077620084106767241818284087120036a21030c020b024020020d" + "00410021060c030b2002410371210802400240200241044f0d0041002106410021" + "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" + "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" + "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" + "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" + "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" + "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" + "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" + "024020002d00200e0402000102020b20052103410021050c010b20054101762103" + "200541016a41017621050b200341016a2103200028021021092000280218210820" + "00280214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c118180" + "80800080808080000f0b0240200720012002200828020c11818080800080808080" + "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" + "016a21032007200920082802101182808080008080808000450d000b2003417f6a" + "2005490b140020012000280200200028020410b2808080000b1c00200028020020" + "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" + "306b2203248080808000200341033a002c2003412036021c410021042003410036" + "02282003200136022420032000360220200341003602142003410036020c024002" + "40024002400240200228021022050d00200228020c2200450d0120022802082101" + "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" + "0240200041046a2802002207450d00200328022020002802002007200328022428" + "020c11818080800080808080000d040b20012802002003410c6a20012802041182" + "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" + "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" + "41016a210420022802082109200228020021004100210603400240200041046a28" + "02002201450d00200328022020002802002001200328022428020c118180808000" + "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" + "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" + "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" + "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" + "02102003200b36020c200141046a280200210702400240024020012802000e0301" + "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" + "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" + "2802002003410c6a200128020411828080800080808080000d02200041086a2100" + "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" + "0020044103746a22012802002001280204200328022428020c1181808080008080" + "808000450d010b410121010c010b410021010b200341306a24808080800020010b" + "d70201057f2380808080004180016b220224808080800002400240024002402001" + "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" + "030b41ff00210303402002200322046a22052000410f712203413072200341d700" + "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" + "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" + "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" + "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" + "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" + "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" + "20024180016a24808080800020000b7902017f017e23808080800041306b220324" + "808080800020032000360200200320013602042003410236020c2003419886c080" + "00360208200342023702142003418380808000ad4220862204200341046aad8437" + "0328200320042003ad843703202003200341206a360210200341086a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" + "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" + "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" + "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" + "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" + "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" + "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" + "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" + "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" + "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" + "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" + "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" + "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" + "0010a280808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641a888c0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541b089c080003602302005420537023c20054182" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418480808000ad422086200541286aad843703582005418580808000ad42" + "2086200541246aad843703502005418380808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541f089c080003602302005420337023c2005" + "418280808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418380808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541d088c080003602302005420437023c2005418280" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" + "000d00200128021441d881c080004102200128021828020c118180808000808080" + "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111828080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111828080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11818080800080808080000d010b2004412720011182808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410de808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" + "400240024041c8031084808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" + "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "df80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" + "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" + "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" + "00200028020021002002410036022c2002428080808010370224200241033a0050" + "200241203602402002410036024c200241c0a0c080003602482002410036023820" + "0241003602302002200241246a3602440240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002400240" + "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" + "1314151617180b024002400240024020002d00040e0400010203000b2002200028" + "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" + "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" + "2900e4ccc08000370000200241143602602002200336025c200241143602582002" + "410336026c200241ccccc08000360268200242023702742002418680808000ad42" + "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" + "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" + "8080002103024020022802582204450d00200228025c20041082808080000b2003" + "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" + "013702742002418280808000ad422086200241086aad8437035820022003410274" + "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" + "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" + "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" + "0c190b20002802082203280200200241306a200328020428021011828080800080" + "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" + "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" + "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" + "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" + "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" + "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" + "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" + "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" + "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" + "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" + "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" + "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" + "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" + "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" + "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" + "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" + "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" + "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" + "6a200241246a41086a280200360200200220022902243703582002418380808000" + "36027c2002418380808000360274200241888080800036026c2002410436020c20" + "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" + "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" + "280218200241086a10b5808080002100024020022802582201450d00200228025c" + "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" + "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" + "00280204200028020810b2808080000b4b01017f02402000280200200028020822" + "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" + "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" + "8080800041106b2202248080808000200028020821032000280204210441012105" + "024020012802142206412220012802182207280210220811828080800080808080" + "000d000240024020030d0041002103410021000c010b410021094100210a200421" + "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" + "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" + "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" + "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" + "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" + "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" + "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" + "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" + "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" + "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" + "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" + "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" + "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" + "0d010240024020022d0004418001470d0020062002280208200811828080800080" + "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" + "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" + "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" + "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" + "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" + "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" + "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" + "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" + "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" + "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" + "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" + "200728020c11818080800080808080000d00200641222008118280808000808080" + "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" + "05200128021828020c11818080800080808080000b1e01017f0240200028020022" + "01450d00200028020420011082808080000b0b5301047f02402000280208220120" + "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" + "200441dc00460d0120044120490d012000200141016a220136020820022001470d" + "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" + "0210cf80808000200028020821030b200028020420036a2001200210df80808000" + "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" + "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" + "20026b21074100210503400240024002400240200220056a2d00002208c0220941" + "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" + "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" + "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" + "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" + "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" + "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" + "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" + "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" + "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" + "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" + "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" + "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" + "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" + "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" + "0520042802082108024041141084808080002203450d002003200836020c200341" + "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" + "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" + "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" + "41106a2480808080000b5901017f23808080800041106b22012480808080002001" + "41086a2000200028020041014101410110d4808080000240200128020822004181" + "80808078460d002000200128020c109580808000000b200141106a248080808000" + "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" + "8080000240024020022f01140d0002400240024002400240024020022f01162203" + "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" + "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" + "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" + "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" + "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" + "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" + "2205418080046a210302402001280200200128020822006b41034b0d0020012000" + "410410cf80808000200128020821000b2001200041046a36020820012802042000" + "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" + "002005410676413f71418001723a000220002003410c76413f71418001723a0001" + "410021000c070b200220002802002000280204200028020810838080800041002d" + "00c0cfc080001a200228020421012002280200210341141084808080002200450d" + "042000200336020c20004114360200200020013602100c060b200241086a200028" + "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" + "21012002280208210341141084808080002200450d032000200336020c20004114" + "360200200020013602100c050b200241173602142000200241146a10d080808000" + "21000c040b200241173602142000200241146a10d08080800021000c030b024002" + "4002402003418001490d0002402001280200200128020822046b41034b0d002001" + "2004410410cf80808000200128020821040b200128020420046a21002003418010" + "4f0d0120034106764140722106410221050c020b02402001280208220020012802" + "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" + "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" + "60722106410321050b200020063a00002001200420056a360208200020056a417f" + "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" + "206a24808080800020000b910301057f23808080800041106b2202248080808000" + "02400240024002402001280204220320012802082204490d000240200320046b41" + "034b0d0020012003360208200241086a2001280200200320031083808080004100" + "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" + "0d022001200436020c2001410436020020002001360204200120033602100c030b" + "2001200441046a220536020802402001280200220620046a22012d000141017441" + "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" + "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" + "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" + "001a200228020421032002280200210441141084808080002201450d0220012004" + "36020c2001410c36020020002001360204200120033602100c030b200020013b01" + "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" + "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" + "022480808080000240024002402001280208220320012802042204490d00200241" + "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" + "032002280208210441141084808080002201450d022001200436020c2001410436" + "02002000200136020420012003360210410121010c010b2000200128020020036a" + "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" + "5601017f23808080800041106b2203248080808000200341086a20002001200241" + "01410110d480808000024020032802082202418180808078460d00200220032802" + "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" + "106b2202248080808000200241086a200028020020002802042000280208108380" + "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" + "8080800022000d00000b2000200436020c20002001290200370200200020033602" + "10200041086a200141086a280200360200200241106a24808080800020000b1f00" + "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" + "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" + "00200320016a3602080b200241106a24808080800041000b820101017f02400240" + "024002402003280204450d000240200328020822040d002002450d0341002d00c0" + "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" + "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" + "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" + "8080800041206b2206248080808000024002400240200220036a220320024f0d00" + "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" + "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" + "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" + "20080d00410021020c010b2006200820056c36021c200620012802043602142004" + "21020b20062002360218200641086a20042009200641146a10d380808000024020" + "062802080d00200628020c21022001200736020020012002360204418180808078" + "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" + "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" + "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" + "017120024101746b413e6a21020b200042003702102000200236021c2002410274" + "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" + "00360200200020033602182000200036020c20002000360208410041002802e8d2" + "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" + "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" + "03034020042003411d764104716a41106a22052802002202450d02200341017421" + "032002210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b20052000" + "360200200020043602182000200036020c200020003602080b0b00200010d98080" + "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" + "024002400240024020002802040e020001020b20020d0141012102410021030c02" + "0b20020d00200028020022022802042103200228020021020c010b200141808080" + "80783602002001200036020c2001418980808000200028021c22002d001c20002d" + "001d10da80808000000b20012003360204200120023602002001418a8080800020" + "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" + "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" + "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" + "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" + "086a200020011183808080008080808000000b410041003a0094d3c08000200245" + "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" + "02402002450d000240034020002d0000220420012d00002205470d01200041016a" + "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" + "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" + "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" + "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" + "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" + "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" + "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" + "280200210803402005417c6a220520082003742001280200220820027672360200" + "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" + "210103402005417c6a220520012802003602002001417c6a210120042005490d00" + "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" + "036a210502402003450d0020002104200121080340200420082d00003a00002008" + "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" + "6a210402400240200120036a2206410371450d0020074101480d01200641037422" + "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" + "21080340200520082002762001280200220820037472360200200141046a210120" + "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" + "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" + "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" + "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" + "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" + "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" + "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" + "00410020006b41037122046a210502402004450d00200021032001210603402003" + "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" + "01480d012009410374220641187121022009417c71220a41046a2101410020066b" + "4118712104200a2802002106034020052006200276200128020022062004747236" + "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" + "092101034020052001280200360200200141046a2101200541046a22052003490d" + "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" + "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" + "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" + "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" + "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" + "0a000000150000004b000000450010000a000000160000004b0000004163636f75" + "6e7400450010000a0000001700000033000000450010000a000000180000003300" + "00006361706163697479206f766572666c6f770000009800100011000000616c6c" + "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" + "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" + "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" + "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" + "686520696e6465782069732000150110002000000035011000120000003a200000" + "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" + "7273006c0110001300000066000000170000003078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230323132" + "323233323432353236323732383239333033313332333333343335333633373338" + "333934303431343234333434343534363437343834393530353135323533353435" + "353536353735383539363036313632363336343635363636373638363937303731" + "373237333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939636f72652f7372632f66" + "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" + "000000a40900001a00000072616e676520737461727420696e64657820206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" + "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" + "10000000a202100022000000736c69636520696e64657820737461727473206174" + "202062757420656e64732061742000f4021000160000000a0310000d0000000101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000020202020202" + "020202020202020202020202020202020202020202020202030303030303030303" + "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" + "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" + "000e0000003b041000040000003f041000100000004f0410000100000062797465" + "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" + "7420697320696e7369646520202862797465732029206f66206000700410000b00" + "00007b04100026000000a104100008000000a9041000060000004f041000010000" + "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" + "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" + "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" + "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" + "002c0510001d0000000a0000002b00000000060101030104020507070208080902" + "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" + "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" + "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" + "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" + "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" + "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" + "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" + "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" + "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" + "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" + "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" + "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" + "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" + "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" + "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" + "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" + "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" + "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" + "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" + "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" + "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" + "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" + "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" + "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" + "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" + "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" + "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" + "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" + "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" + "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" + "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" + "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" + "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" + "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" + "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" + "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" + "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" + "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" + "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" + "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" + "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" + "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" + "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" + "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" + "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" + "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" + "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" + "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" + "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" + "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" + "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" + "0239010405010204011402160601013a0101020104080107030a021e013b010101" + "0c01090128010301370101030503010407020b021d013a01020102010301050207" + "020b021c02390201010204080109010a021d014801040102030101080151010207" + "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" + "0202021902040310040d01020206010f01000300031d021e021e02400201070801" + "020b09012d030101750222017603040209010603db0202013a0101070101010102" + "08060a0201301f310430070101050128090c022004020201033801010203010103" + "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" + "04010a200250020001030104011902050197021a120d012608190b2e0330010204" + "020227014306020202020c0108012f01330101030202050201012a020801ee0102" + "01040100010010101000020001e201950500030102050428030401a50200040002" + "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" + "090a0402015f0302010102060102019d010308150239020101010116010e070305" + "c308020301011701510102060101020101020102eb010204060201021b02550802" + "0101026a0101010206010165030204010500090102f5010a020101040190040202" + "0401200a280602040801090602032e0d010200070106010152160207010201027a" + "06030101020107010148020301010100020b023405050101010001060f00053b07" + "00013f0451010002002e0217000101030405080802071e0494030037043208010e" + "011605010f000701110207010201056401a00700013d04000400076d07006080f0" + "002f72757374632f63326637346333663932386165623530336631356234653965" + "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" + "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" + "0e10006000000071010000360000002f72757374632f6332663734633366393238" + "61656235303366313562346539656635373738653737663330353862382f6c6962" + "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" + "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" + "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" + "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" + "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" + "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" + "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" + "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" + "00181d10005f00000058020000300000000d0000000c000000040000000e000000" + "0f00000010000000000000000000000001000000110000006120446973706c6179" + "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" + "20756e65787065637465646c792f72757374632f63326637346333663932386165" + "6235303366313562346539656635373738653737663330353862382f6c69627261" + "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" + "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" + "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" + "207768696c652070617273696e67206120737472696e67454f46207768696c6520" + "70617273696e6720612076616c7565657870656374656420603a60657870656374" + "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" + "78706563746564206964656e7465787065637465642076616c7565657870656374" + "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" + "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" + "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" + "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" + "206120737472696e676b6579206d757374206265206120737472696e67696e7661" + "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" + "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" + "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" + "6164696e6720737572726f6761746520696e206865782065736361706574726169" + "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" + "70656374656420656e64206f662068657820657363617065726563757273696f6e" + "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" + "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" + "4826100001000000000000000000f03f0000000000002440000000000000594000" + "00000000408f40000000000088c34000000000006af8400000000080842e410000" + "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" + "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" + "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" + "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" + "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" + "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" + "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" + "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" + "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" + "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" + "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" + "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" + "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" + "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" + "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" + "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" + "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" + "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" + "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" + "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" + "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" + "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" + "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" + "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" + "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" + "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" + "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" + "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" + "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" + "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" + "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" + "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" + "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" + "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" + "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" + "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" + "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" + "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" + "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" + "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" + "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" + "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" + "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" + "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" + "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" + "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" + "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" + "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" + "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" + "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" + "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" + "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" + "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" + "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" + "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" + "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" + "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" + "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" + "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" + "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" + "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" + "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" + "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" + "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" + "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" + "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" + "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" + "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" + "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" + "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" + "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" + "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" + "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" + "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" + "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" + "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" + "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" + "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" + "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" + "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" + "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" + "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" + "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" + "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" + "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" + "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" + "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" + "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" + "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" + "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" + "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" + "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" + "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" + "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" + "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" + "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" + "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" + "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" + "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" + "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" + "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" + "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" + "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" + "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" + "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" + "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" + "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" + "64656466696c6520746f6f206c617267657265736f757263652062757379657865" + "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" + "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" + "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" + "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" + "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" + "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" + "0048261000010000006f7065726174696f6e207375636365737366756c10000000" + "1100000012000000100000001000000013000000120000000d0000000e00000015" + "0000000c0000000b00000015000000150000000f0000000e000000130000002600" + "00003800000019000000170000000c000000090000000a00000010000000170000" + "00190000000e0000000d00000014000000080000001b0000000e00000010000000" + "16000000150000000b000000160000000d0000000b000000130000005023100060" + "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" + "1000f8231000042410000f24100024241000392410004824100056241000692410" + "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" + "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" + "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" + "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" + "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" + "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" + "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" + "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" + "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" + "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" + "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" + "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" + "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" + "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" + "243137683533326265333033376461316237656445064a5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" + "70617273655f6964656e743137683663353964643731393635353139313045074b" + "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" + "4c54245224475424313270617273655f6e756d6265723137683738336134316134" + "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" + "73657269616c697a6572244c54245224475424313370617273655f646563696d61" + "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" + "70617273655f6578706f6e656e7431376833366464376462643233653461346562" + "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" + "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" + "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" + "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" + "346636345f66726f6d5f7061727473313768633863316239626161613836666637" + "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" + "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" + "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" + "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" + "24313670617273655f616e795f6e756d6265723137683931643533303465356139" + "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" + "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" + "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" + "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" + "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" + "61775f7665633139526177566563244c54245424432441244754243867726f775f" + "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" + "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" + "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" + "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" + "62653863353535633862636433353545143c5f5a4e357365726465326465375669" + "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" + "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" + "68616e646c655f6572726f72313768393762376462643066373264643738384516" + "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" + "35766973697431376838366238393638313662613130613765451781015f5a4e37" + "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" + "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" + "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" + "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" + "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" + "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" + "244754243976697369745f73747231376835356436653830653061376366383938" + "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" + "6363657373244c5424522447542424753230246173247532302473657264652e2e" + "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" + "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" + "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" + "4c54244b24432456244324412447542436696e7365727431376834643164623464" + "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" + "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" + "244b244324562443244124475424247532302461732475323024636f72652e2e6f" + "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" + "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" + "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" + "702e2e5061727469616c4571244754243265713137683162323138393234373831" + "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" + "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" + "475424247532302461732475323024636f72652e2e697465722e2e747261697473" + "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" + "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" + "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" + "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" + "6e646578244754243130696e6465785f696e746f31376864333238633634636161" + "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" + "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" + "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" + "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" + "63617061636974795f6f766572666c6f7731376834393964343832613965643537" + "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" + "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" + "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" + "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" + "70616e69636b696e673570616e6963313768303465656239313764643933633232" + "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" + "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" + "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" + "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "244754243133646973706f73655f6368756e6b3137683665306363636434353836" + "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" + "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" + "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" + "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" + "2475323024666f7224753230247533322447542433666d74313768626633653032" + "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" + "70616e69635f626f756e64735f636865636b313768336436623861613463383034" + "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" + "363431376864353231666136656636613036373261452e11727573745f62656769" + "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" + "327061645f696e74656772616c3137686334656130376130626331333536633445" + "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" + "656772616c313277726974655f7072656669783137686139613433323830623630" + "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" + "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" + "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" + "706164313768343736396165333839333734636335314533495f5a4e34345f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" + "706c61792447542433666d74313768376666346430623836303963323437324534" + "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" + "2e666d742e2e44656275672447542433666d743137683361366261613162623437" + "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" + "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" + "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" + "3024666f7224753230247533322447542433666d74313768353533393862313635" + "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" + "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" + "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" + "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" + "6275675f657874313768656366613566303431373437393039384539345f5a4e34" + "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" + "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" + "6963655f6572726f725f6661696c31376862303364323439386438646362363433" + "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" + "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" + "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" + "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" + "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" + "656275672447542433666d7431376865613566643964626339343936626665453e" + "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" + "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" + "30246933322447542433666d743137686365643930633761363339633031646445" + "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" + "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" + "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" + "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" + "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" + "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" + "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" + "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" + "3130696e736572745f666974313768633861306366353339656666303131314541" + "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" + "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" + "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" + "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" + "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" + "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" + "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768343032353764366634326532" + "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" + "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" + "61792447542433666d74313768636534323236616131663732366331634544615f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" + "74655f73747231376835393964396535373839343664643938452e31393245575f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768623637326562313939633335643138364546555f5a4e35335f244c542463" + "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768663761653238353562323439" + "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" + "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" + "313768376236353738393966393837353963624548475f5a4e313073657264655f" + "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" + "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" + "616c6c6f63337665633136566563244c5424542443244124475424313765787465" + "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" + "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" + "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" + "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" + "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" + "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" + "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" + "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" + "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" + "6f64655f6865785f65736361706531376834376265353936383535663830346461" + "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" + "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" + "63377261775f7665633230526177566563496e6e6572244c542441244754243772" + "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" + "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" + "3472656164356572726f7231376865663535323764333333633963323666455130" + "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" + "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" + "666d742e2e577269746524475424313077726974655f6368617231376832313433" + "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" + "766563313166696e6973685f67726f773137683533383539626133383962373164" + "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" + "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" + "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" + "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" + "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" + "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" + "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" + "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" + "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" + "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" + "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" + "75376424247537642431376865313761333937376638396331313738455a3b5f5a" + "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" + "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" + "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" + "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" + "61735f73747231376865623366373232643232346534326638455c066d656d636d" + "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" + "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" + "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" + "2e726f6461746100550970726f64756365727302086c616e677561676501045275" + "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" + "6768746c79202863326637346333663920323032342d30392d30392900490f7461" + "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::string escrow_tx_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; + + std::vector escrow_tx_json_data( + escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasm( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasm( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + } + + void + testEscrowWasmP4() + { + testcase("escrow wasm P4 test"); + auto wasmHex = + "0061736d0100000001791160037f7f7f017f60027f7f017f60017f0060027f7f00" + "60037e7f7f017f60037f7f7f0060067f7f7f7f7f7f017f60017f017f60047f7f7f" + "7f017f60057f7f7f7f7f0060000060057f7f7f7f7f017f60077f7f7f7f7f7f7f01" + "7f60047f7f7f7f0060067f7f7f7f7f7f0060047f7f7f7e0060057f7f7f7e7f0003" + "7c7b01010301040506010202020202010102050001000103010007070303080500" + "090201020a03020500030305020b05050101010001010a0505050c090901010105" + "0903010101030d0d0502050d01030301010d0e020a0a02030101020a0d0d000101" + "0a030302020d03030205050003030f0f1010101009030000000004050170011e1e" + "05030100110619037f01418080c0000b7f004184e0c0000b7f004190e0c0000b07" + "5106066d656d6f7279020008616c6c6f6361746500180a6465616c6c6f63617465" + "001b11636f6d706172655f6163636f756e744944001c0a5f5f646174615f656e64" + "03010b5f5f686561705f6261736503020923010041010b1d210307122f30433134" + "3c3d443e59626708110e500d160942585a5e5f600a9188037b6601017f23808080" + "800041106b220224808080800002400240200028020c450d00200021010c010b20" + "0241086a200041086a280200360200200220002902003703002001200210818080" + "80002101200041141082808080000b200241106a24808080800020010b8c010103" + "7f23808080800041106b2202248080808000200241086a200028020c2000280210" + "200028021410c78080800041002d00e0dbc080001a200228020c21032002280208" + "21040240411410998080800022000d00000b2000200436020c2000200129020037" + "020020002003360210200041086a200141086a280200360200200241106a248080" + "80800020000b7001027f024002402000417c6a2802002202417871220341044108" + "200241037122021b20016a490d0002402002450d002003200141276a4b0d020b20" + "0010a5808080000f0b419db8c08000412e41ccb8c0800010a680808000000b41dc" + "b8c08000412e418cb9c0800010a680808000000be90201057f2380808080004180" + "016b22022480808080000240024002400240200128021c22034110710d00200341" + "20710d0120003100004101200110848080800021000c030b20002d0000210041ff" + "00210303402002200322046a22052000410f712203413072200341d7006a200341" + "0a491b3a00002004417f6a2103200041ff017122064104762100200641104f0d00" + "0c020b0b20002d0000210041ff00210303402002200322046a22052000410f7122" + "03413072200341376a2003410a491b3a00002004417f6a2103200041ff01712206" + "4104762100200641104f0d000b02402004418101490d002004418001419887c080" + "00108580808000000b2001410141a887c0800041022005418101200441016a6b10" + "868080800021000c010b02402004418101490d002004418001419887c080001085" + "80808000000b2001410141a887c0800041022005418101200441016a6b10868080" + "800021000b20024180016a24808080800020000bec0203027f017e037f23808080" + "800041306b2203248080808000412721040240024020004290ce005a0d00200021" + "050c010b412721040340200341096a20046a2206417c6a20004290ce0080220542" + "f0b1037e20007ca7220741ffff037141e4006e220841017441aa87c080006a2f00" + "003b00002006417e6a2008419c7f6c20076a41ffff037141017441aa87c080006a" + "2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22046a" + "2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441aa" + "87c080006a2f00003b00000b024002402006410a490d00200341096a2004417e6a" + "22046a200641017441aa87c080006a2f00003b00000c010b200341096a2004417f" + "6a22046a20064130723a00000b2002200141014100200341096a20046a41272004" + "6b1086808080002104200341306a24808080800020040b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c2003419c8ac08000360208200342023702142003418180808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bcb0501077f0240024020010d00200541016a2106" + "200028021c2107412d21080c010b412b418080c400200028021c22074101712201" + "1b2108200120056a21060b0240024020074104710d00410021020c010b02400240" + "20030d00410021090c010b02402003410371220a0d000c010b4100210920022101" + "0340200920012c000041bf7f4a6a2109200141016a2101200a417f6a220a0d000b" + "0b200920066a21060b024020002802000d00024020002802142201200028021822" + "0920082002200310ac80808000450d0041010f0b200120042005200928020c1180" + "8080800080808080000f0b02400240024002402000280204220120064b0d002000" + "28021422012000280218220920082002200310ac80808000450d0141010f0b2007" + "410871450d01200028021021072000413036021020002d0020210b4101210c2000" + "41013a0020200028021422092000280218220a20082002200310ac808080000d02" + "200120066b41016a2101024003402001417f6a2201450d0120094130200a280210" + "1181808080008080808000450d000b41010f0b0240200920042005200a28020c11" + "80808080008080808000450d0041010f0b2000200b3a0020200020073602104100" + "0f0b200120042005200928020c1180808080008080808000210c0c010b20012006" + "6b210702400240024020002d002022010e0402000100020b20072101410021070c" + "010b20074101762101200741016a41017621070b200141016a2101200028021021" + "06200028021821092000280214210a024003402001417f6a2201450d01200a2006" + "20092802101181808080008080808000450d000b41010f0b4101210c200a200920" + "082002200310ac808080000d00200a20042005200928020c118080808000808080" + "80000d00410021010340024020072001470d0020072007490f0b200141016a2101" + "200a200620092802101181808080008080808000450d000b2001417f6a2007490f" + "0b200c0be70201057f2380808080004180016b2202248080808000024002400240" + "0240200128021c22034110710d0020034120710d01200035020041012001108480" + "80800021000c030b2000280200210041ff00210303402002200322046a22052000" + "410f712203413072200341d7006a2003410a491b3a00002004417f6a2103200041" + "10492106200041047621002006450d000c020b0b2000280200210041ff00210303" + "402002200322046a22052000410f712203413072200341376a2003410a491b3a00" + "002004417f6a210320004110492106200041047621002006450d000b0240200441" + "8101490d002004418001419887c08000108580808000000b2001410141a887c080" + "0041022005418101200441016a6b10868080800021000c010b0240200441810149" + "0d002004418001419887c08000108580808000000b2001410141a887c080004102" + "2005418101200441016a6b10868080800021000b20024180016a24808080800020" + "000b1e01017f024020002802002201450d00200028020420011082808080000b0b" + "970101047f024002400240200028020022002802000e020001020b200028020822" + "01450d01200028020420011082808080000c010b20002d00044103470d00200028" + "0208220128020021020240200128020422032802002204450d0020022004118280" + "80800080808080000b024020032802042203450d00200220031082808080000b20" + "01410c1082808080000b200041141082808080000b6801017f0240024002400240" + "20002d00000e050303030102000b200041046a108b808080000c020b2000280204" + "2201450d01200028020820011082808080000f0b200041046a108c808080002000" + "2802042201450d002000280208200141186c1082808080000f0b0be30501067f23" + "808080800041306b22012480808080004100210241002103024020002802002204" + "450d00200120043602182001410036021420012004360208200141003602042001" + "2000280204220336021c2001200336020c20002802082103410121020b20012003" + "360220200120023602102001200236020002400240024003400240024002400240" + "024020030d002001280200450d0820012802082104200128020422030d01410021" + "00200128020c2203450d06034020042802980321042003417f6a22030d000c070b" + "0b20012003417f6a360220024020024101712203450d0020012802040d00200128" + "02082103200128020c2200450d03034020032802980321032000417f6a22000d00" + "0c040b0b2003450d01200128020421030c030b200421000c050b41a8acc0800010" + "a080808000000b200142003702082001200336020441012102200141013602000b" + "200128020821000240200128020c220520032f019203490d000240034020014124" + "6a2003200010bf8080800020012802242203450d0120012802282100200128022c" + "220520032f019203490d020c000b0b4188a5c0800010a080808000000b20054101" + "6a21040240024020000d002001200436020c20014100360208200120033602040c" + "010b200320044102746a4198036a21040340200428020022064198036a21042000" + "417f6a22000d000b20014200370208200120063602042003450d040b0240200320" + "05410c6c6a418c026a22002802002204450d00200028020420041082808080000b" + "02400240024002402003200541186c6a22032d00000e050303030102000b200341" + "046a108b808080000c020b20032802042200450d01200328020820001082808080" + "000c010b200341046a108c8080800020032802042200450d002003280208200041" + "186c1082808080000b200128022021030c000b0b200421030b0340200141246a20" + "03200010bf8080800020012802242203450d01200128022821000c000b0b200141" + "306a2480808080000b950101027f024020002802082201450d0020002802044104" + "6a2100034002400240024002402000417c6a2d00000e050303030102000b200010" + "8b808080000c020b20002802002202450d01200041046a28020020021082808080" + "000c010b2000108c8080800020002802002202450d00200041046a280200200241" + "186c1082808080000b200041186a21002001417f6a22010d000b0b0b2200200128" + "021441d4a6c080004105200128021828020c11808080800080808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "002000108f808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110908080" + "8000200028020821030b200028020420036a2002410c6a200110fa808080001a20" + "00200320016a3602080b200241106a24808080800041000b5901017f2380808080" + "0041106b2201248080808000200141086a2000200028020041014101410110d280" + "808000024020012802082200418180808078460d002000200128020c109a808080" + "00000b200141106a2480808080000b5601017f23808080800041106b2203248080" + "808000200341086a2000200120024101410110d280808000024020032802082202" + "418180808078460d002002200328020c109a80808000000b200341106a24808080" + "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" + "109080808000200028020821030b200028020420036a2001200210fa808080001a" + "2000200320026a36020841000b1400200120002802042000280208109380808000" + "0bc20b010b7f200028020821030240024002400240200028020022040d00200341" + "0171450d010b02402003410171450d00200120026a210502400240200028020c22" + "060d0041002107200121080c010b41002107410021092001210803402008220320" + "05460d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21080c" + "010b200341046a21080b200820036b20076a21072006200941016a2209470d000b" + "0b20082005460d00024020082c00002203417f4a0d0020034160491a0b02400240" + "2007450d000240200720024f0d00200120076a2c000041bf7f4a0d01410021030c" + "020b20072002460d00410021030c010b200121030b2007200220031b2102200320" + "0120031b21010b024020040d00200028021420012002200028021828020c118080" + "80800080808080000f0b2000280204210a024020024110490d0020022001200141" + "036a417c7122076b22096a220b4103712104410021064100210302402001200746" + "0d004100210302402009417c4b0d00410021034100210503402003200120056a22" + "082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841026a2c000041bf7f" + "4a6a200841036a2c000041bf7f4a6a2103200541046a22050d000b0b2001210803" + "40200320082c000041bf7f4a6a2103200841016a2108200941016a22090d000b0b" + "02402004450d002007200b417c716a22082c000041bf7f4a210620044101460d00" + "200620082c000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a" + "21060b200b4102762105200620036a21060340200721042005450d04200541c001" + "200541c001491b220b410371210c200b410274210d41002108024020054104490d" + "002004200d41f007716a210941002108200421030340200328020c2207417f7341" + "077620074106767241818284087120032802082207417f73410776200741067672" + "41818284087120032802042207417f734107762007410676724181828408712003" + "2802002207417f7341077620074106767241818284087120086a6a6a6a21082003" + "41106a22032009470d000b0b2005200b6b21052004200d6a2107200841087641ff" + "81fc0771200841ff81fc07716a418180046c41107620066a2106200c450d000b20" + "04200b41fc01714102746a22082802002203417f73410776200341067672418182" + "8408712103200c4101460d0220082802042207417f734107762007410676724181" + "8284087120036a2103200c4102460d0220082802082208417f7341077620084106" + "767241818284087120036a21030c020b024020020d00410021060c030b20024103" + "71210802400240200241044f0d0041002106410021090c010b4100210620012103" + "2002410c71220921070340200620032c000041bf7f4a6a200341016a2c000041bf" + "7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a21062003" + "41046a21032007417c6a22070d000b0b2008450d02200120096a21030340200620" + "032c000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11808080800080808080000f0b2003410876" + "41ff811c71200341ff81fc07716a418180046c41107620066a21060b0240024020" + "0a20064d0d00200a20066b21054100210302400240024020002d00200e04020001" + "02020b20052103410021050c010b20054101762103200541016a41017621050b20" + "0341016a210320002802102109200028021821082000280214210703402003417f" + "6a2203450d022007200920082802101181808080008080808000450d000b41010f" + "0b200028021420012002200028021828020c11808080800080808080000f0b0240" + "200720012002200828020c1180808080008080808000450d0041010f0b41002103" + "0340024020052003470d0020052005490f0b200341016a21032007200920082802" + "101181808080008080808000450d000b2003417f6a2005490b890503037f017e03" + "7f23808080800041f0006b220224808080800041002103024020002d0000220420" + "012d0000470d00410121030240024002400240024020040e06050001020304050b" + "20002d000120012d00014621030c040b4100210320002903082205200129030852" + "0d030240024002402005a70e03000102000b200029031020012903105121030c05" + "0b200029031020012903105121030c040b20002b031020012b03106121030c030b" + "41002103200028020c2204200128020c470d0220002802082001280208200410f7" + "808080004521030c020b41002103200028020c2206200128020c470d0120012802" + "08210420002802082100200641016a210103402001417f6a22014521032001450d" + "02200020041094808080002106200441186a2104200041186a210020060d000c02" + "0b0b41002103200028020c2204200128020c470d002002410036026c2002420037" + "026420024100360254200241003602442002410036023020024100360220200220" + "01280208220636025c2002200128020422033602582002200636024c2002200336" + "024820022000280208220636023820022000280204220136023420022006360228" + "2002200136022420022004410020031b3602602002200341004722033602502002" + "200336024020022004410020011b36023c20022001410047220336022c20022003" + "36021c200241c0006a21070340200241106a2002411c6a10958080800041012103" + "20022802102201450d0120022802142104200241086a2007109580808000200228" + "02082200450d0141002103200128020822062000280208470d01200228020c2108" + "20012802042000280204200610f7808080000d01200420081094808080000d000b" + "0b200241f0006a24808080800020030bed0201057f024002400240200128022022" + "020d00410021020c010b20012002417f6a36022002400240024020012802004101" + "470d0020012802040d01200128020821030240200128020c2202450d0003402003" + "2802980321032002417f6a22020d000b0b20014200370208200120033602042001" + "41013602000c020b41c8acc0800010a080808000000b200128020421030b200128" + "0208210202400240200128020c220420032f0192034f0d00200321050c010b0340" + "2003280288022205450d03200241016a210220032f019003210420052103200420" + "052f0192034f0d000b0b200441016a21030240024020020d00200521060c010b20" + "0520034102746a4198036a21030340200328020022064198036a21032002417f6a" + "22020d000b410021030b2001200336020c20014100360208200120063602042005" + "200441186c6a210320052004410c6c6a418c026a21020b20002003360204200020" + "023602000f0b41b8acc0800010a080808000000bae0301057f2380808080004110" + "6b220224808080800041012103024020012802142204419f81c08000410d200128" + "0218220528020c220611808080800080808080000d00024020012d001c4104710d" + "00200441f886c080004103200611808080800080808080000d01200441ac81c080" + "004104200611808080800080808080000d012004418bc2c0800041022006118080" + "80800080808080000d01200420002d0000410274220141dc83c080006a28020020" + "0141c883c080006a280200200611808080800080808080000d012004418187c080" + "0041022006118080808000808080800021030c010b200441fb86c0800041032006" + "11808080800080808080000d002002200536020420022004360200410121032002" + "41013a000f20022002410f6a360208200241ac81c0800041041097808080000d00" + "2002418bc2c0800041021097808080000d00200220002d0000410274220141dc83" + "c080006a280200200141c883c080006a2802001097808080000d00410121032002" + "41fe86c0800041021097808080000d002004418087c08000410120061180808080" + "00808080800021030b200241106a24808080800020030bdf04010c7f2001417f6a" + "210320002802042104200028020021052000280208210641002107410021084100" + "21094100210a02400340200a4101710d0102400240200920024b0d000340200120" + "096a210a0240024002400240200220096b220b41074b0d0020022009470d012002" + "21090c050b02400240200a41036a417c71220c200a6b220d450d00410021000340" + "200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b41786a" + "220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a94" + "a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b2000" + "727141808182847871418081828478470d02200c41086a210c200d41086a220d20" + "0e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b20004101" + "6a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a20" + "0d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a46" + "0d01200b200041016a2200470d000b200221090c030b2000200d6a21000b200020" + "096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d004100" + "210a2009210d200921000c030b200920024d0d000b0b20082002460d024101210a" + "2008210d200221000b0240024020062d0000450d00200541f486c0800041042004" + "28020c11808080800080808080000d010b200020086b210b4100210c0240200020" + "08460d00200320006a2d0000410a46210c0b200120086a21002006200c3a000020" + "0d210820052000200b200428020c1180808080008080808000450d010b0b410121" + "070b20070b4901017f410021010240024020004100480d00024020000d00410121" + "010c020b41002d00e0dbc080001a200010998080800022010d01410121010b2001" + "2000109a80808000000b20010bcb2502087f017e02400240024002400240024002" + "400240200041f501490d0041002101200041cdff7b4f0d052000410b6a22014178" + "71210241002802c4dfc080002203450d04411f21040240200041f4ffff074b0d00" + "2002410620014108766722006b7641017120004101746b413e6a21040b41002002" + "6b21010240200441027441a8dcc080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b742107410021060340" + "02402005220528020441787122082002490d00200820026b220820014f0d002008" + "21012005210620080d004100210120052106200521000c040b2005280214220820" + "00200820052007411d764104716a41106a2802002205471b200020081b21002007" + "41017421072005450d020c000b0b024041002802c0dfc08000220541102000410b" + "6a41f803712000410b491b22024103762201762200410371450d00024002402000" + "417f7341017120016a2207410374220041b8ddc080006a2201200041c0ddc08000" + "6a28020022022802082206460d002006200136020c200120063602080c010b4100" + "2005417e200777713602c0dfc080000b20022000410372360204200220006a2200" + "2000280204410172360204200241086a0f0b200241002802c8dfc080004d0d0302" + "400240024020000d0041002802c4dfc080002200450d0620006841027441a8dcc0" + "80006a280200220628020441787120026b21012006210503400240200628021022" + "000d00200628021422000d0020052802182104024002400240200528020c220020" + "05470d00200541144110200528021422001b6a28020022060d01410021000c020b" + "20052802082206200036020c200020063602080c010b200541146a200541106a20" + "001b21070340200721082006220041146a200041106a200028021422061b210720" + "004114411020061b6a28020022060d000b200841003602000b2004450d04024020" + "0528021c41027441a8dcc080006a22062802002005460d00200441104114200428" + "02102005461b6a20003602002000450d050c040b2006200036020020000d034100" + "41002802c4dfc08000417e200528021c77713602c4dfc080000c040b2000280204" + "41787120026b22062001200620014922061b21012000200520061b210520002106" + "0c000b0b02400240200020017441022001742200410020006b7271682208410374" + "220141b8ddc080006a2206200141c0ddc080006a28020022002802082207460d00" + "2007200636020c200620073602080c010b41002005417e200877713602c0dfc080" + "000b20002002410372360204200020026a2207200120026b220641017236020420" + "0020016a2006360200024041002802c8dfc080002205450d00200541787141b8dd" + "c080006a210141002802d0dfc0800021020240024041002802c0dfc08000220841" + "012005410376742205710d00410020082005723602c0dfc08000200121050c010b" + "200128020821050b200120023602082005200236020c2002200136020c20022005" + "3602080b410020073602d0dfc08000410020063602c8dfc08000200041086a0f0b" + "20002004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b02400240024020" + "014110490d0020052002410372360204200520026a220220014101723602042002" + "20016a200136020041002802c8dfc080002207450d01200741787141b8ddc08000" + "6a210641002802d0dfc0800021000240024041002802c0dfc08000220841012007" + "410376742207710d00410020082007723602c0dfc08000200621070c010b200628" + "020821070b200620003602082007200036020c2000200636020c20002007360208" + "0c010b2005200120026a2200410372360204200520006a22002000280204410172" + "3602040c010b410020023602d0dfc08000410020013602c8dfc080000b20054108" + "6a0f0b024020002006720d004100210641022004742200410020006b7220037122" + "00450d0320006841027441a8dcc080006a28020021000b2000450d010b03402000" + "20062000280204417871220520026b220820014922041b21032005200249210720" + "08200120041b21080240200028021022050d00200028021421050b200620032007" + "1b21062001200820071b21012005210020050d000b0b2006450d00024041002802" + "c8dfc0800022002002490d002001200020026b4f0d010b20062802182104024002" + "400240200628020c22002006470d00200641144110200628021422001b6a280200" + "22050d01410021000c020b20062802082205200036020c200020053602080c010b" + "200641146a200641106a20001b21070340200721082005220041146a200041106a" + "200028021422051b210720004114411020051b6a28020022050d000b2008410036" + "02000b2004450d030240200628021c41027441a8dcc080006a2205280200200646" + "0d0020044110411420042802102006461b6a20003602002000450d040c030b2005" + "200036020020000d02410041002802c4dfc08000417e200628021c77713602c4df" + "c080000c030b02400240024002400240024041002802c8dfc08000220020024f0d" + "00024041002802ccdfc08000220020024b0d0041002101200241af80046a220641" + "107640002200417f4622070d0720004110742205450d07410041002802d8dfc080" + "00410020064180807c7120071b22086a22003602d8dfc08000410041002802dcdf" + "c0800022012000200120004b1b3602dcdfc0800002400240024041002802d4dfc0" + "80002201450d0041a8ddc080002100034020002802002206200028020422076a20" + "05460d02200028020822000d000c030b0b0240024041002802e4dfc08000220045" + "0d00200020054d0d010b410020053602e4dfc080000b410041ff1f3602e8dfc080" + "00410020083602acddc08000410020053602a8ddc08000410041b8ddc080003602" + "c4ddc08000410041c0ddc080003602ccddc08000410041b8ddc080003602c0ddc0" + "8000410041c8ddc080003602d4ddc08000410041c0ddc080003602c8ddc0800041" + "0041d0ddc080003602dcddc08000410041c8ddc080003602d0ddc08000410041d8" + "ddc080003602e4ddc08000410041d0ddc080003602d8ddc08000410041e0ddc080" + "003602ecddc08000410041d8ddc080003602e0ddc08000410041e8ddc080003602" + "f4ddc08000410041e0ddc080003602e8ddc08000410041f0ddc080003602fcddc0" + "8000410041e8ddc080003602f0ddc08000410041003602b4ddc08000410041f8dd" + "c08000360284dec08000410041f0ddc080003602f8ddc08000410041f8ddc08000" + "360280dec0800041004180dec0800036028cdec0800041004180dec08000360288" + "dec0800041004188dec08000360294dec0800041004188dec08000360290dec080" + "0041004190dec0800036029cdec0800041004190dec08000360298dec080004100" + "4198dec080003602a4dec0800041004198dec080003602a0dec08000410041a0de" + "c080003602acdec08000410041a0dec080003602a8dec08000410041a8dec08000" + "3602b4dec08000410041a8dec080003602b0dec08000410041b0dec080003602bc" + "dec08000410041b0dec080003602b8dec08000410041b8dec080003602c4dec080" + "00410041c0dec080003602ccdec08000410041b8dec080003602c0dec080004100" + "41c8dec080003602d4dec08000410041c0dec080003602c8dec08000410041d0de" + "c080003602dcdec08000410041c8dec080003602d0dec08000410041d8dec08000" + "3602e4dec08000410041d0dec080003602d8dec08000410041e0dec080003602ec" + "dec08000410041d8dec080003602e0dec08000410041e8dec080003602f4dec080" + "00410041e0dec080003602e8dec08000410041f0dec080003602fcdec080004100" + "41e8dec080003602f0dec08000410041f8dec08000360284dfc08000410041f0de" + "c080003602f8dec0800041004180dfc0800036028cdfc08000410041f8dec08000" + "360280dfc0800041004188dfc08000360294dfc0800041004180dfc08000360288" + "dfc0800041004190dfc0800036029cdfc0800041004188dfc08000360290dfc080" + "0041004198dfc080003602a4dfc0800041004190dfc08000360298dfc080004100" + "41a0dfc080003602acdfc0800041004198dfc080003602a0dfc08000410041a8df" + "c080003602b4dfc08000410041a0dfc080003602a8dfc08000410041b0dfc08000" + "3602bcdfc08000410041a8dfc080003602b0dfc08000410020053602d4dfc08000" + "410041b0dfc080003602b8dfc080004100200841586a22003602ccdfc080002005" + "2000410172360204200520006a4128360204410041808080013602e0dfc080000c" + "080b200120054f0d00200620014b0d00200028020c450d030b410041002802e4df" + "c080002200200520002005491b3602e4dfc08000200520086a210641a8ddc08000" + "21000240024002400340200028020022072006460d01200028020822000d000c02" + "0b0b200028020c450d010b41a8ddc0800021000240034002402000280200220620" + "014b0d002001200620002802046a2206490d020b200028020821000c000b0b4100" + "20053602d4dfc080004100200841586a22003602ccdfc080002005200041017236" + "0204200520006a4128360204410041808080013602e0dfc080002001200641606a" + "41787141786a22002000200141106a491b2207411b36020441002902a8ddc08000" + "2109200741106a41002902b0ddc0800037020020072009370208410020083602ac" + "ddc08000410020053602a8ddc080004100200741086a3602b0ddc0800041004100" + "3602b4ddc080002007411c6a2100034020004107360200200041046a2200200649" + "0d000b20072001460d0720072007280204417e713602042001200720016b220041" + "01723602042007200036020002402000418002490d002001200010e3808080000c" + "080b200041f8017141b8ddc080006a21060240024041002802c0dfc08000220541" + "012000410376742200710d00410020052000723602c0dfc08000200621000c010b" + "200628020821000b200620013602082000200136020c2001200636020c20012000" + "3602080c070b200020053602002000200028020420086a36020420052002410372" + "3602042007410f6a41787141786a2201200520026a22006b2102200141002802d4" + "dfc08000460d03200141002802d0dfc08000460d04024020012802042206410371" + "4101470d0020012006417871220610a880808000200620026a2102200120066a22" + "0128020421060b20012006417e7136020420002002410172360204200020026a20" + "0236020002402002418002490d002000200210e3808080000c060b200241f80171" + "41b8ddc080006a21010240024041002802c0dfc080002206410120024103767422" + "02710d00410020062002723602c0dfc08000200121020c010b200128020821020b" + "200120003602082002200036020c2000200136020c200020023602080c050b4100" + "200020026b22013602ccdfc08000410041002802d4dfc08000220020026a220636" + "02d4dfc080002006200141017236020420002002410372360204200041086a2101" + "0c060b41002802d0dfc08000210102400240200020026b2206410f4b0d00410041" + "003602d0dfc08000410041003602c8dfc080002001200041037236020420012000" + "6a220020002802044101723602040c010b410020063602c8dfc080004100200120" + "026a22053602d0dfc0800020052006410172360204200120006a20063602002001" + "20024103723602040b200141086a0f0b2000200720086a360204410041002802d4" + "dfc080002200410f6a417871220141786a22063602d4dfc080004100200020016b" + "41002802ccdfc0800020086a22016a41086a22053602ccdfc08000200620054101" + "72360204200020016a4128360204410041808080013602e0dfc080000c030b4100" + "20003602d4dfc08000410041002802ccdfc0800020026a22023602ccdfc0800020" + "0020024101723602040c010b410020003602d0dfc08000410041002802c8dfc080" + "0020026a22023602c8dfc0800020002002410172360204200020026a2002360200" + "0b200541086a0f0b4100210141002802ccdfc08000220020024d0d004100200020" + "026b22013602ccdfc08000410041002802d4dfc08000220020026a22063602d4df" + "c080002006200141017236020420002002410372360204200041086a0f0b20010f" + "0b20002004360218024020062802102205450d0020002005360210200520003602" + "180b20062802142205450d0020002005360214200520003602180b024002402001" + "4110490d0020062002410372360204200620026a22002001410172360204200020" + "016a200136020002402001418002490d002000200110e3808080000c020b200141" + "f8017141b8ddc080006a21020240024041002802c0dfc080002205410120014103" + "76742201710d00410020052001723602c0dfc08000200221010c010b2002280208" + "21010b200220003602082001200036020c2000200236020c200020013602080c01" + "0b2006200120026a2200410372360204200620006a220020002802044101723602" + "040b200641086a0b1000024020000d0010a3808080000b000b140002402001450d" + "00200020011082808080000b0ba20b03087f017e017f2380808080004190016b22" + "04248080808000200441e8006a20002001109d8080800002400240024002400240" + "024002400240024002400240024020042d00684106460d00200441106a200441e8" + "006a41106a2205290300370300200441086a200441e8006a41086a220629030037" + "030020042004290368370300200441e8006a20022003109d8080800020042d0068" + "4106460d01200441186a41106a2005290300370300200441186a41086a20062903" + "003703002004200429036837031841dc81c0800041072004109e80808000220745" + "0d0241dc81c080004107200441186a109e808080002208450d03418482c0800041" + "04200441186a109e808080002206450d0420062d00004103462205450d05410021" + "092006280208410020051b210502400240200628020c220a0e020c00010b410121" + "0920052d000041556a0e030b080b080b20052d0000412b470d06200541016a2105" + "200a410a492106200a417f6a2209210a20060d070c080b2004200428026c36024c" + "41b880c08000412b200441cc006a41e480c0800041bc81c08000109f8080800000" + "0b2004200428026c36024c41b880c08000412b200441cc006a41e480c0800041cc" + "81c08000109f80808000000b41e481c0800010a080808000000b41f481c0800010" + "a080808000000b418882c0800010a080808000000b419882c0800010a080808000" + "000b200a2109200a41094f0d010b41002106034020052d000041506a220a41094b" + "0d02200541016a2105200a2006410a6c6a21062009417f6a22090d000c040b0b41" + "0021060340200a450d0320052d000041506a220b41094b0d01410221092006ad42" + "0a7e220c422088a74100470d02200541016a2105200a417f6a210a200b200ca722" + "0d6a2206200d4f0d000c020b0b410121090b200420093a006841b880c08000412b" + "200441e8006a41a880c0800041a882c08000109f80808000000b20042006360230" + "02400240200720081094808080000d00200441003a00370c010b20042006417f6a" + "220536023002402005450d00200441003a00370c010b200441013a00370b200441" + "0336026c200441d482c08000360268200442023702742004418180808000360258" + "20044182808080003602502004200441cc006a3602702004200441306a36025420" + "04200441376a36024c200441e8006a10a28080800041002d00e0dbc080001a0240" + "02400240024041091099808080002205450d00200520042d00373a000020044100" + "360254200442808080801037024c200441033a0088012004412036027820044100" + "360284012004418080c08000360280012004410036027020044100360268200420" + "0441cc006a36027c20043502304101200441e8006a1084808080000d0120044138" + "6a41086a200441cc006a41086a2802003602002004200429024c37033841002d00" + "e0dbc080001a200428023c210641041099808080002209450d0220092006360000" + "2005200636000120042004280240220a36024841002d00e0dbc080001a20044104" + "3602444104109980808000220b450d032005200a360005200b200a360000200441" + "05360250200441a083c0800036024c200442043702582004418180808000360284" + "01200441818080800036027c200441838080800036027420044184808080003602" + "6c200420063602642004200441e8006a3602542004200441c8006a360280012004" + "200441c4006a3602782004200441e4006a3602702004200441386a360268200441" + "cc006a10a280808000200b41041082808080002009410410828080800020044118" + "6a108a808080002004108a8080800002402003450d00200220031082808080000b" + "02402001450d00200020011082808080000b20044190016a24808080800020050f" + "0b41014109109a80808000000b41c0a5c080004137200441e4006a419880c08000" + "41c4a6c08000109f80808000000b41014104109a80808000000b41014104109a80" + "808000000bea0301057f23808080800041e0006b22032480808080002003410036" + "0228200320023602242003200136022020034180013a002c2003410036021c2003" + "428080808010370214200341c8006a200341146a10e88080800002400240024002" + "4020032d00484106460d00200341306a41106a2204200341c8006a41106a290300" + "370300200341306a41086a2205200341c8006a41086a2903003703002003200329" + "03483703300240024020032802282202200328022422064f0d0020032802202107" + "0340200720026a2d000041776a220141174b0d024101200174419380800471450d" + "022006200241016a2202470d000b200320063602280b2000200329033037030020" + "0041106a2004290300370300200041086a20052903003703002003280214220245" + "0d04200328021820021082808080000c040b20032002360228200341086a200720" + "062006200241016a220220062002491b10c78080800041002d00e0dbc080001a20" + "0328020c21012003280208210641141099808080002202450d012002200636020c" + "2002411636020020002002360204200041063a000020022001360210200341306a" + "108a808080000c020b2000200328024c360204200041063a00000c010b000b2003" + "2802142202450d00200328021820021082808080000b200341e0006a2480808080" + "000be60101077f41002103024020022d00004105470d0020022802042204450d00" + "2002280208210503402004418c026a210220042f0192032206410c6c2107417f21" + "08024002400340024020070d00200621080c020b20022802082103200228020421" + "09200841016a2108200741746a21072002410c6a2102417f200020092001200320" + "012003491b10f7808080002209200120036b20091b220341004720034100481b22" + "034101460d000b200341ff0171450d010b024020050d0041000f0b2005417f6a21" + "05200420084102746a4198036a28020021040c010b0b2004200841186c6a21030b" + "20030b8f0101017f23808080800041c0006b22052480808080002005200136020c" + "2005200036020820052003360214200520023602102005410236021c200541e486" + "c08000360218200542023702242005418580808000ad422086200541106aad8437" + "03382005418680808000ad422086200541086aad843703302005200541306a3602" + "20200541186a200410a480808000000b130041ec84c08000412b200010a6808080" + "00000b11002000350200410120011084808080000bbe0604017f017e037f017e23" + "808080800041c0006b22012480808080002001410636020c200141b0c2c0800036" + "0208024041002d0090dcc080004103460d0010db808080000b0240024002400240" + "024041002903f8dfc0800022024200520d0002404100280280e0c0800022030d00" + "10d5808080004100280280e0c0800021030b20032003280200220441016a360200" + "2004417f4c0d012003450d02200320032802002204417f6a360200200329030821" + "0220044101470d00200310d6808080000b024002400240200241002903e8dbc080" + "00510d0041002d00f4dbc08000210441012103410041013a00f4dbc08000200120" + "043a00182004450d012001420037023420014281808080c00037022c200141d8c3" + "c08000360228200141186a200141286a10d780808000000b024041002802f0dbc0" + "80002203417f460d00200341016a21030c020b41b8c4c08000412641fcc4c08000" + "10b780808000000b410020023703e8dbc080000b410020033602f0dbc080002001" + "41e8dbc0800036021041042103200141043a00182001200141106a360220200141" + "186a41dcb7c08000200010b280808000210020012d001821040240024020000d00" + "420021024117200441ff0171764101710d01200128021c22032802002100024020" + "0341046a28020022042802002205450d002000200511828080800080808080000b" + "024020042802042204450d00200020041082808080000b2003410c108280808000" + "410421030c010b200441ff01714104460d032001290318220642807e8321022006" + "a721030b200128021022002000280208417f6a2204360208024020040d00200041" + "003a000c200042003703000b200341ff01714104470d03200141c0006a24808080" + "80000f0b000b419cb9c0800041de004190bac0800010b780808000000b20014100" + "3602382001410136022c200141a0c3c0800036022820014204370230200141286a" + "41a8c3c0800010a480808000000b200120022003ad42ff01838437031020014102" + "36022c20014190c2c08000360228200142023702342001418780808000ad422086" + "200141106aad843703202001418680808000ad422086200141086aad8437031820" + "01200141186a360230200141286a41a0c2c0800010a480808000000b4701017f23" + "808080800041206b2200248080808000200041003602182000410136020c200041" + "8484c0800036020820004204370210200041086a41a084c0800010a48080800000" + "0b5601017f23808080800041206b2202248080808000200241106a200041106a29" + "0200370300200241086a200041086a290200370300200241013b011c2002200136" + "021820022000290200370300200210ab80808000000bbe0601057f200041786a22" + "012000417c6a280200220241787122006a21030240024020024101710d00200241" + "0271450d012001280200220220006a21000240200120026b220141002802d0dfc0" + "8000470d0020032802044103714103470d01410020003602c8dfc0800020032003" + "280204417e7136020420012000410172360204200320003602000f0b2001200210" + "a8808080000b024002400240024002400240200328020422024102710d00200341" + "002802d4dfc08000460d02200341002802d0dfc08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a200036020020" + "0141002802d0dfc08000470d01410020003602c8dfc080000f0b20032002417e71" + "36020420012000410172360204200120006a20003602000b2000418002490d0220" + "01200010e38080800041002101410041002802e8dfc08000417f6a22003602e8df" + "c0800020000d04024041002802b0ddc080002200450d0041002101034020014101" + "6a2101200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602e8dfc0" + "80000f0b410020013602d4dfc08000410041002802ccdfc0800020006a22003602" + "ccdfc08000200120004101723602040240200141002802d0dfc08000470d004100" + "41003602c8dfc08000410041003602d0dfc080000b200041002802e0dfc0800022" + "044d0d0341002802d4dfc080002200450d034100210241002802ccdfc080002205" + "4129490d0241a8ddc080002101034002402001280200220320004b0d0020002003" + "20012802046a490d040b200128020821010c000b0b410020013602d0dfc0800041" + "0041002802c8dfc0800020006a22003602c8dfc080002001200041017236020420" + "0120006a20003602000f0b200041f8017141b8ddc080006a210302400240410028" + "02c0dfc08000220241012000410376742200710d00410020022000723602c0dfc0" + "8000200321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802b0ddc080002201450d00410021" + "020340200241016a2102200128020822010d000b0b4100200241ff1f200241ff1f" + "4b1b3602e8dfc08000200520044d0d004100417f3602e0dfc080000b0b4d01017f" + "23808080800041206b220324808080800020034100360210200341013602042003" + "42043702082003200136021c200320003602182003200341186a36020020032002" + "10a480808000000b840601057f0240024002402000417c6a220328020022044178" + "71220541044108200441037122061b20016a490d0002402006450d002005200141" + "276a4b0d020b41102002410b6a4178712002410b491b210102400240024020060d" + "002001418002490d0120052001410472490d01200520016b418180084f0d010c02" + "0b200041786a220720056a21060240024002400240200520014f0d002006410028" + "02d4dfc08000460d03200641002802d0dfc08000460d0220062802042204410271" + "0d042004417871220420056a22052001490d042006200410a88080800020052001" + "6b22024110490d0120032001200328020041017172410272360200200720016a22" + "012002410372360204200720056a220520052802044101723602042001200210a9" + "8080800020000f0b200520016b2202410f4d0d0420032001200441017172410272" + "360200200720016a22052002410372360204200620062802044101723602042005" + "200210a98080800020000f0b200320052003280200410171724102723602002007" + "20056a2202200228020441017236020420000f0b41002802c8dfc0800020056a22" + "052001490d0102400240200520016b2202410f4b0d002003200441017120057241" + "0272360200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236020420" + "0720056a2205200236020020052005280204417e713602040b410020013602d0df" + "c08000410020023602c8dfc0800020000f0b41002802ccdfc0800020056a220520" + "014b0d040b0240200210998080800022050d0041000f0b20052000417c41782003" + "28020022014103711b20014178716a2201200220012002491b10fa808080002102" + "200010a580808000200221000b20000f0b419db8c08000412e41ccb8c0800010a6" + "80808000000b41dcb8c08000412e418cb9c0800010a680808000000b2003200120" + "0441017172410272360200200720016a2202200520016b22054101723602044100" + "20053602ccdfc08000410020023602d4dfc0800020000b820301047f200028020c" + "21020240024002402001418002490d002000280218210302400240024020022000" + "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" + "002802082201200236020c200220013602080c010b200041146a200041106a2002" + "1b21040340200421052001220241146a200241106a200228021422011b21042002" + "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" + "28021c41027441a8dcc080006a22012802002000460d0020034110411420032802" + "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" + "002802c4dfc08000417e200028021c77713602c4dfc080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b410041002802c0dfc0" + "8000417e200141037677713602c0dfc080000f0b20022003360218024020002802" + "102201450d0020022001360210200120023602180b20002802142201450d002002" + "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" + "28020422034101710d002003410271450d012000280200220320016a2101024020" + "0020036b220041002802d0dfc08000470d0020022802044103714103470d014100" + "20013602c8dfc0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a8808080000b02400240024002402002280204" + "22034102710d00200241002802d4dfc08000460d02200241002802d0dfc0800046" + "0d0320022003417871220310a8808080002000200320016a220141017236020420" + "0020016a2001360200200041002802d0dfc08000470d01410020013602c8dfc080" + "000f0b20022003417e7136020420002001410172360204200020016a2001360200" + "0b02402001418002490d002000200110e3808080000f0b200141f8017141b8ddc0" + "80006a21020240024041002802c0dfc08000220341012001410376742201710d00" + "410020032001723602c0dfc08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602d4" + "dfc08000410041002802ccdfc0800020016a22013602ccdfc08000200020014101" + "72360204200041002802d0dfc08000470d01410041003602c8dfc0800041004100" + "3602d0dfc080000f0b410020003602d0dfc08000410041002802c8dfc080002001" + "6a22013602c8dfc0800020002001410172360204200020016a20013602000f0b0b" + "7902017f017e23808080800041306b220324808080800020032001360204200320" + "003602002003410236020c200341cc85c080003602082003420237021420034181" + "80808000ad42208622042003ad8437032820032004200341046aad843703202003" + "200341206a360210200341086a200210a480808000000b5d01027f238080808000" + "41206b220124808080800020002802182102200141106a200041106a2902003703" + "00200141086a200041086a2902003703002001200036021c200120023602182001" + "2000290200370300200110e480808000000b490002402002418080c400460d0020" + "00200220012802101181808080008080808000450d0041010f0b024020030d0041" + "000f0b200020032004200128020c11808080800080808080000b7902017f017e23" + "808080800041306b22032480808080002003200036020020032001360204200341" + "0236020c200341bc8ac08000360208200342023702142003418180808000ad4220" + "862204200341046aad84370328200320042003ad843703202003200341206a3602" + "10200341086a200210a480808000000b820302017f017e23808080800041f0006b" + "2203248080808000200341ccb7c0800036020c20032000360208200341ccb7c080" + "00360214200320013602102003410236021c200341dc85c0800036021802402002" + "2802000d002003410336025c2003419086c0800036025820034203370264200341" + "8580808000ad4220862204200341106aad8437034820032004200341086aad8437" + "03402003418680808000ad422086200341186aad843703382003200341386a3602" + "60200341d8006a4184c4c0800010a480808000000b200341206a41106a20024110" + "6a290200370300200341206a41086a200241086a29020037030020032002290200" + "3703202003410436025c200341c486c08000360258200342043702642003418580" + "808000ad4220862204200341106aad8437035020032004200341086aad84370348" + "2003418880808000ad422086200341206aad843703402003418680808000ad4220" + "86200341186aad843703382003200341386a360260200341d8006a4184c4c08000" + "10a480808000000b1c0020002802002001200028020428020c1181808080008080" + "8080000b14002001200028020020002802041093808080000b1400200128021420" + "01280218200010b2808080000bbf05010a7f23808080800041306b220324808080" + "8000200341033a002c2003412036021c4100210420034100360228200320013602" + "2420032000360220200341003602142003410036020c0240024002400240024020" + "0228021022050d00200228020c2200450d01200228020821012000410374210620" + "00417f6a41ffffffff017141016a21042002280200210003400240200041046a28" + "02002207450d00200328022020002802002007200328022428020c118080808000" + "80808080000d040b20012802002003410c6a200128020411818080800080808080" + "000d03200141086a2101200041086a2100200641786a22060d000c020b0b200228" + "02142201450d00200141057421082001417f6a41ffffff3f7141016a2104200228" + "02082109200228020021004100210603400240200041046a2802002201450d0020" + "0328022020002802002001200328022428020c11808080800080808080000d030b" + "2003200520066a220141106a28020036021c20032001411c6a2d00003a002c2003" + "200141186a2802003602282001410c6a28020021074100210a4100210b02400240" + "0240200141086a2802000e03010002010b2007410374210c4100210b2009200c6a" + "220c2802040d01200c28020021070b4101210b0b200320073602102003200b3602" + "0c200141046a280200210702400240024020012802000e03010002010b20074103" + "74210b2009200b6a220b2802040d01200b28020021070b4101210a0b2003200736" + "02182003200a3602142009200141146a2802004103746a22012802002003410c6a" + "200128020411818080800080808080000d02200041086a21002008200641206a22" + "06470d000b0b200420022802044f0d012003280220200228020020044103746a22" + "012802002001280204200328022428020c1180808080008080808000450d010b41" + "0121010c010b410021010b200341306a24808080800020010bd70201057f238080" + "8080004180016b22022480808080000240024002400240200128021c2203411071" + "0d0020034120710d012000ad4101200110848080800021000c030b41ff00210303" + "402002200322046a22052000410f712203413072200341d7006a2003410a491b3a" + "00002004417f6a210320004110492106200041047621002006450d000c020b0b41" + "ff00210303402002200322046a22052000410f712203413072200341376a200341" + "0a491b3a00002004417f6a210320004110492106200041047621002006450d000b" + "02402004418101490d002004418001419887c08000108580808000000b20014101" + "41a887c0800041022005418101200441016a6b10868080800021000c010b024020" + "04418101490d002004418001419887c08000108580808000000b2001410141a887" + "c0800041022005418101200441016a6b10868080800021000b20024180016a2480" + "8080800020000b2200200128021441c284c08000410e200128021828020c118080" + "80800080808080000b6001017f23808080800041306b2200248080808000200041" + "0136020c200041e484c08000360208200042013702142000418980808000ad4220" + "862000412f6aad843703202000200041206a360210200041086a41e8c1c0800010" + "a480808000000b7902017f017e23808080800041306b2203248080808000200320" + "00360200200320013602042003410236020c200341f08ac0800036020820034202" + "3702142003418180808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b6a0101" + "7f23808080800041306b22032480808080002003200136020c2003200036020820" + "034101360214200341f0bac080003602102003420137021c2003418680808000ad" + "422086200341086aad843703282003200341286a360218200341106a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441809b" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41809bc080006a280200410b7420024b1b22042004410272220420044102744180" + "9bc080006a280200410b7420024b1b2204200441016a2204200441027441809bc0" + "80006a280200410b7420024b1b2204200441016a2204200441027441809bc08000" + "6a280200410b7420024b1b220441027441809bc080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441809bc080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441fc9ac080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241849cc080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641b284c080006a2d" + "00003a000b20032001410476410f7141b284c080006a2d00003a000f2003200141" + "0876410f7141b284c080006a2d00003a000e20032001410c76410f7141b284c080" + "006a2d00003a000d20032001411076410f7141b284c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141b284c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b2004412141e09ac0800010aa80808000000b200541d70541" + "f09ac0800010aa80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141c48fc08000412c419c90c0800041c40141" + "e091c0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141a295c08000412841f295c080" + "0041a002419298c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641b284c080006a2d00003a001720032001410476410f71" + "41b284c080006a2d00003a001b20032001410876410f7141b284c080006a2d0000" + "3a001a20032001410c76410f7141b284c080006a2d00003a001920032001411076" + "410f7141b284c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141b284c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41b48fc0800010b680808000000b200c200441b48fc0800010ad" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41a48fc080" + "0010a080808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641808dc0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541888ec080003602302005420537023c20054186" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418a80808000ad422086200541286aad843703582005418b80808000ad42" + "2086200541246aad843703502005418180808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541c88ec080003602302005420337023c2005" + "418680808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418180808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541a88dc080003602302005420437023c2005418680" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418180808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "200641f48ec0800010b680808000000b200410a080808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b3808080" + "000d00200128021441b084c080004102200128021828020c118080808000808080" + "80000d002000280204200110b38080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111818080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111818080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11808080800080808080000d010b2004412720011181808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f7620011084808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10f9808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10f9808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410f9808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00e0dbc080001a200128020022032f01920321040240024002" + "400240024041c8031099808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10fa8080" + "80001a20052003200b41186c6a200841186c10fa80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "fa80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810fa80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41a0a4c0800010ad80808000000b41e8a3c0800041284190a4c0800010a68080" + "8000000b2008410c41b0a4c0800010ad80808000000b41e8a3c0800041284190a4" + "c0800010a680808000000b900801017f23808080800041f0006b22022480808080" + "0020002802002100200241003602482002428080808010370240200241033a006c" + "2002412036025c2002410036026820024198a5c080003602642002410036025420" + "02410036024c2002200241c0006a36026002400240024002400240024002400240" + "024002400240024002400240024002400240024002400240024002400240024002" + "400240024020002802000e191718000102030405060708090a0b0c0d0e0f101112" + "13141516170b200241c0006a41d9a6c0800041181091808080000d190c180b2002" + "41c0006a41f1a6c08000411b1091808080000d180c170b200241c0006a418ca7c0" + "8000411a1091808080000d170c160b200241c0006a41a6a7c08000411910918080" + "80000d160c150b200241c0006a41bfa7c08000410c1091808080000d150c140b20" + "0241c0006a41cba7c0800041131091808080000d140c130b200241c0006a41dea7" + "c0800041131091808080000d130c120b200241c0006a41f1a7c08000410e109180" + "8080000d120c110b200241c0006a41ffa7c08000410e1091808080000d110c100b" + "200241c0006a418da8c08000410c1091808080000d100c0f0b200241c0006a4199" + "a8c08000410e1091808080000d0f0c0e0b200241c0006a41a7a8c08000410e1091" + "808080000d0e0c0d0b200241c0006a41b5a8c0800041131091808080000d0d0c0c" + "0b200241c0006a41c8a8c08000411a1091808080000d0c0c0b0b200241c0006a41" + "e2a8c08000413e1091808080000d0b0c0a0b200241c0006a41a0a9c08000411410" + "91808080000d0a0c090b200241c0006a41b4a9c0800041341091808080000d090c" + "080b200241c0006a41e8a9c08000412c1091808080000d080c070b200241c0006a" + "4194aac0800041241091808080000d070c060b200241c0006a41b8aac08000410e" + "1091808080000d060c050b200241c0006a41c6aac0800041131091808080000d05" + "0c040b200241c0006a41d9aac08000411c1091808080000d040c030b200241c000" + "6a41f5aac0800041181091808080000d030c020b200241c0006a20002802042000" + "280208109180808000450d010c020b200041046a200241cc006a10c3808080000d" + "010b200241306a41086a200241c0006a41086a2802003602002002200229024037" + "0330200241818080800036022c20024181808080003602242002418c8080800036" + "021c20024104360204200241a8abc080003602002002420337020c200220004110" + "6a36022820022000410c6a3602202002200241306a3602182002200241186a3602" + "0820012802142001280218200210b2808080002100024020022802302201450d00" + "200228023420011082808080000b200241f0006a24808080800020000f0b41c0a5" + "c080004137200241186a41b0a5c0800041c4a6c08000109f80808000000be50301" + "017f23808080800041c0006b220224808080800002400240024002400240024020" + "002d00000e0400010203000b2002200028020436020441002d00e0dbc080001a41" + "141099808080002200450d04200041106a410028009cc5c0800036000020004108" + "6a4100290094c5c080003700002000410029008cc5c08000370000200241143602" + "102002200036020c200241143602082002410336022c200241bcc1c08000360228" + "200242023702342002418d80808000ad422086200241046aad843703202002418e" + "80808000ad422086200241086aad843703182002200241186a3602302001280214" + "2001280218200241286a10b280808000210020022802082201450d03200228020c" + "20011082808080000c030b20002d000121002002410136022c200241f0bac08000" + "360228200242013702342002418680808000ad422086200241186aad8437030820" + "022000410274220041e0c5c080006a28020036021c200220004184c7c080006a28" + "02003602182002200241086a36023020012802142001280218200241286a10b280" + "80800021000c020b20012000280204220028020020002802041093808080002100" + "0c010b200028020422002802002001200028020428021011818080800080808080" + "0021000b200241c0006a24808080800020000f0b000bd507010d7f238080808000" + "41106b220224808080800020002802082103200028020421044101210502402001" + "2802142206412220012802182207280210220811818080800080808080000d0002" + "40024020030d0041002103410021000c010b410021094100210a2004210b200321" + "0c024002400340200b200c6a210d4100210002400340200b20006a220e2d000022" + "0141817f6a41ff017141a101490d0120014122460d01200141dc00460d01200c20" + "0041016a2200470d000b200a200c6a210a0c030b02400240200e2c00002201417f" + "4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71210b2001" + "411f71210c02402001415f4b0d00200c410674200b722101200e41026a210b0c01" + "0b200b410674200e2d0002413f7172210b0240200141704f0d00200b200c410c74" + "722101200e41036a210b0c010b200b410674200e2d0003413f7172200c41127441" + "8080f00071722101200e41046a210b0b2000200a6a2100200241046a2001418180" + "0410b8808080000240024020022d0004418001460d0020022d000f20022d000e6b" + "41ff01714101460d0020002009490d0302402009450d000240200920034f0d0020" + "0420096a2c000041bf7f4a0d010c050b20092003470d040b02402000450d000240" + "200020034f0d00200420006a2c000041bf7f4c0d050c010b20002003470d040b20" + "06200420096a200020096b200728020c220e11808080800080808080000d010240" + "024020022d0004418001470d002006200228020820081181808080008080808000" + "450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b200e1180" + "8080800080808080000d020b0240024020014180014f0d004101210e0c010b0240" + "20014180104f0d004102210e0c010b41034104200141808004491b210e0b200e20" + "006a21090b0240024020014180014f0d00410121010c010b024020014180104f0d" + "00410221010c010b41034104200141808004491b21010b200120006a210a200d20" + "0b6b220c0d010c030b0b410121050c030b2004200320092000419089c0800010ba" + "80808000000b02402009200a4b0d004100210002402009450d000240200920034f" + "0d0020092100200420096a2c000041bf7f4c0d020c010b2003210020092003470d" + "010b0240200a0d00410021030c020b0240200a20034f0d00200021092004200a6a" + "2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b2004200320" + "09200a41a089c0800010ba80808000000b2006200420006a200320006b20072802" + "0c11808080800080808080000d0020064122200811818080800080808080002105" + "0b200241106a24808080800020050b870102017c017e0240024002402001280200" + "0e03000102000b20004202370308200020012b0308220239031020002002bd42ff" + "ffffffffffffffff00834280808080808080f8ff00534101743a00000f0b200042" + "00370308200041023a0000200020012903083703100f0b200041023a0000200020" + "01290308220337031020002003423f883703080be411020b7f027e238080808000" + "41c0016b2204248080808000024002400240024002400240024002400240024002" + "400240024020012802002205450d00200228020821062002280204210720012802" + "042108024003402005418c026a210920052f019203220a410c6c210b417f210c02" + "40024003400240200b0d00200a210c0c020b2009280208210d2009280204210e20" + "0c41016a210c200b41746a210b2009410c6a2109417f2007200e2006200d200620" + "0d491b10f780808000220e2006200d6b200e1b220d410047200d4100481b220d41" + "01460d000b200d41ff0171450d010b2008450d022008417f6a21082005200c4102" + "746a4198036a28020021050c010b0b20022802002209450d0c2007200910828080" + "80000c0c0b2002290204220fa721092002280200220b418080808078470d032009" + "21050c010b2002290204220fa721052002280200220d418080808078470d010b20" + "01210c0c090b41002d00e0dbc080001a4198031099808080002209450d02200941" + "013b01920320094100360288022009200f422088a7ad4220862005ad8437039002" + "2009200d36028c0220014280808080103702042001200936020020092003290300" + "370300200941086a200341086a290300370300200941106a200341106a29030037" + "03000c010b200f422088a7ad4220862009ad84210f024002400240024002402005" + "2f0192032209410b490d00200441086a21084104210d200c4105490d03200c210d" + "200c417b6a0e020302010b2005418c026a220e200c410c6c6a210d02400240200c" + "41016a220620094d0d00200d200f370204200d200b3602000c010b200e2006410c" + "6c6a200d2009200c6b220e410c6c10f9808080001a200d200f370204200d200b36" + "02002005200641186c6a2005200c41186c6a200e41186c10f9808080001a0b2005" + "200c41186c6a220d41106a200341106a290300370300200d200329030037030020" + "0d41086a200341086a2903003703002005200941016a3b0192030c030b200c4179" + "6a210c200441f8006a21084106210d0c010b4100210c200441f8006a2108410521" + "0d0b41002d00e0dbc080001a4198031099808080002209450d02200941003b0192" + "0320094100360288022009200d417f7320052f01920322076a22063b0192032004" + "4188016a41086a2005200d41186c6a220e41086a29030037030020044188016a41" + "106a200e41106a2903003703002004200e290300370388012006410c4f0d032007" + "200d41016a220e6b2006470d042005418c026a2202200d410c6c6a220729020421" + "10200728020021072009418c026a2002200e410c6c6a2006410c6c10fa80808000" + "1a20092005200e41186c6a200641186c10fa8080800021062005200d3b01920320" + "0441dc006a410c6a20044190016a290300370200200441f0006a20044198016a29" + "030037020020042004290388013702602004200536020820042006360278200828" + "0200220d418c026a200c410c6c6a210602400240200d2f019203220e200c4b0d00" + "2006200f3702042006200b3602000c010b2006410c6a2006200e200c6b2208410c" + "6c10f9808080001a2006200f3702042006200b360200200d200c41186c6a220b41" + "186a200b200841186c10f9808080001a0b200d200c41186c6a220b41106a200341" + "106a290300370300200b2003290300370300200b41086a200341086a2903003703" + "00200d200e41016a3b0192032007418080808078460d00200441c4006a200441dc" + "006a41086a290200370200200441cc006a200441dc006a41106a29020037020020" + "0441306a41246a200441dc006a41186a2802003602002004201037023420042007" + "3602302004200429025c37023c024002400240200528028802220b0d004100210c" + "0c010b200441306a4104722108200441b8016a210220044188016a410472210720" + "0441b0016a2103200441c0006a210e4100210c4100210603402006200c470d0820" + "052f019003210d200b2f019203410b490d02200641016a21060240024002400240" + "024002400240200d4105490d00200d417b6a0e020203010b200441043602800120" + "04200636027c2004200b3602782003210b0c040b20044106360280012004200636" + "027c2004200b360278200d41796a210d0c020b2004410536028001200420063602" + "7c2004200b36027820044188016a200441f8006a10c18080800020042802b00141" + "05200441306a200e200910c080808000200428028801210d200441086a20074124" + "10fa808080001a0c030b20044105360280012004200636027c2004200b36027841" + "00210d0b2002210b0b20044188016a200441f8006a10c180808000200b28020020" + "0d200441306a200e200910c080808000200428028801210d200441086a20074124" + "10fa808080001a0b20042802bc01210c20042802b801210920042802b401210620" + "042802b0012105200d418080808078460d032004200d3602302008200441086a41" + "2410fa808080001a200528028802220b0d000b0b2001280200220b450d0741002d" + "00e0dbc080001a2001280204210641c803109980808000220d450d03200d200b36" + "029803200d41003b019203200d410036028802200b41003b019003200b200d3602" + "88022001200641016a3602042001200d3602002006200c470d08200d2004290330" + "37028c02200d41013b019203200d2004290340370300200d200936029c03200d41" + "94026a200441306a41086a280200360200200d41086a200441c8006a2903003703" + "00200d41106a200441d0006a2903003703002009200d36028802200941013b0190" + "030c010b200b200d200441306a200e200910c0808080000b200120012802084101" + "6a3602080b200041063a00000c070b000b2006410b41a0a4c0800010ad80808000" + "000b41e8a3c0800041284190a4c0800010a680808000000b41c0a4c08000413541" + "f8a4c0800010a680808000000b41bca2c0800010a080808000000b41a7a3c08000" + "413041d8a3c0800010a680808000000b20002005200c41186c6a22092903003703" + "00200041106a200941106a220d290300370300200041086a200941086a220b2903" + "0037030020092003290300370300200b200341086a290300370300200d20034110" + "6a2903003703000b200441c0016a2480808080000be60301057f02400240024002" + "400240024020022003490d00410121044100210520034101480d04200120036a21" + "060240200341034b0d000340200620014d0d062006417f6a22062d0000410a470d" + "000c050b0b024041808284082006417c6a2800002207418a94a8d000736b200772" + "41808182847871418081828478460d000340200620014d0d062006417f6a22062d" + "0000410a470d000c050b0b200320064103716b210720034109490d010340024002" + "4020074108480d004180828408200120076a220641786a2802002208418a94a8d0" + "00736b20087241808182847871418081828478460d010b200120076a21060c040b" + "200741786a210741808284082006417c6a2802002208418a94a8d000736b200872" + "41808182847871418081828478460d000c030b0b2003200241b8adc0800010ad80" + "808000000b200120076a21060340200620014d0d032006417f6a22062d0000410a" + "470d000c020b0b0340200620014d0d022006417f6a22062d0000410a470d000b0b" + "200620016b41016a220520024b0d010b0240200120056a20014d0d004100210620" + "0521070340200620012d0000410a466a2106200141016a21012007417f6a22070d" + "000b200641016a21040b200020043602002000200320056b3602040f0b20052002" + "41c8adc0800010ad80808000000b9b0d02097f017e23808080800041306b220324" + "808080800002400240024002400240024002400240024003400240024020012802" + "08220420012802042205460d00024002400240200420054f0d0020012802002206" + "20046a2d000022074122460d01200741dc00460d0120074120490d012006200441" + "016a22086a21094100200520086b417871220a6b210703402009210b024020070d" + "002001200a20086a360208200110c9808080002001280204210520012802082107" + "0c040b200741086a2107200b41086a2109200b290000220c42a2c48891a2c48891" + "228542fffdfbf7efdfbfff7e7c200c42e0bffffefdfbf7ef5f7c84200c42dcb8f1" + "e2c58b97aedc008542fffdfbf7efdfbfff7e7c84200c427f858342808182848890" + "a0c0807f83220c500d000b2001200b20066b200c7aa74103766a22073602080c02" + "0b2004200541d8adc0800010aa808080000c080b200421070b20072005470d0120" + "0521040b200341086a20012802002004200410c78080800041002d00e0dbc08000" + "1a200328020c210b2003280208210941141099808080002207450d052007200936" + "020c2007410436020020002007360204200041023602002007200b3602100c0a0b" + "024020072005490d002007200541e8adc0800010aa80808000000b024020012802" + "00220b20076a2d0000220941dc00460d00024020094122470d002002280208450d" + "0520072004490d072002200b20046a200720046b10ca808080004101210b200120" + "0741016a360208200341286a20012002280204200228020810cb80808000200328" + "02282207450d032000200328022c3602080c040b2001200741016a220736020820" + "0341106a200b2005200710c78080800041002d00e0dbc080001a2003280214210b" + "2003280210210941141099808080002207450d052007200936020c200741103602" + "0020002007360204200041023602002007200b3602100c0a0b024020072004490d" + "002002200b20046a200720046b10ca808080002001200741016a22093602080240" + "20092005490d00200341206a200b2005200910c78080800041002d00e0dbc08000" + "1a2003280224210b2003280220210941141099808080002207450d062007410436" + "02000c090b2001200741026a220436020802400240024002400240024002400240" + "024002400240200b20096a2d0000220741ed004a0d000240200741e1004a0d0020" + "074122460d032007412f460d04200741dc00470d02024020022802082207200228" + "0200470d002002108f808080000b2002200741016a360208200228020420076a41" + "dc003a0000410021070c0b0b2007419e7f6a0e050401010105010b200741927f6a" + "0e080500000006000708000b200341186a200b2005200410c78080800041002d00" + "e0dbc080001a200328021c210b2003280218210941141099808080002207450d0e" + "2007410c3602000c110b0240200228020822072002280200470d002002108f8080" + "80000b2002200741016a360208200228020420076a41223a0000410021070c070b" + "0240200228020822072002280200470d002002108f808080000b2002200741016a" + "360208200228020420076a412f3a0000410021070c060b02402002280208220720" + "02280200470d002002108f808080000b2002200741016a36020820022802042007" + "6a41083a0000410021070c050b0240200228020822072002280200470d00200210" + "8f808080000b2002200741016a360208200228020420076a410c3a000041002107" + "0c040b0240200228020822072002280200470d002002108f808080000b20022007" + "41016a360208200228020420076a410a3a0000410021070c030b02402002280208" + "22072002280200470d002002108f808080000b2002200741016a36020820022802" + "0420076a410d3a0000410021070c020b0240200228020822072002280200470d00" + "2002108f808080000b2002200741016a360208200228020420076a41093a000041" + "0021070c010b2001200210cc8080800021070b2007450d010c090b0b2004200741" + "98aec0800010b680808000000b4102210b200328022c21070b2000200b36020020" + "0020073602040c060b20072004490d022001200741016a360208200341286a2001" + "200b20046a200720046b10cb808080000240024020032802282207450d00200020" + "0328022c3602084100210b0c010b4102210b200328022c21070b2000200b360200" + "200020073602040c050b000b2004200741f8adc0800010b680808000000b200420" + "074188aec0800010b680808000000b2007200936020c2007200b3602100b200041" + "02360200200020073602040b200341306a2480808080000b5301047f0240200028" + "02082201200028020422024f0d00200028020021030340200320016a2d00002204" + "4122460d01200441dc00460d0120044120490d012000200141016a220136020820" + "022001470d000b0b0b4901017f02402000280200200028020822036b20024f0d00" + "200020032002109080808000200028020821030b200028020420036a2001200210" + "fa808080001a2000200320026a3602080bb10501077f23808080800041106b2204" + "24808080800002402003450d004100200341796a2205200520034b1b2106200241" + "036a417c7120026b21074100210503400240024002400240200220056a2d000022" + "08c022094100480d00200720056b4103710d01200520064f0d020340200220056a" + "2208280204200828020072418081828478710d03200541086a22052006490d000c" + "030b0b0240024002400240024002400240200841808bc080006a2d0000417e6a0e" + "03000102050b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c" + "050b200541016a220a20034f0d032002200a6a2c0000210a02400240200841e001" + "460d00200841ed01460d012009411f6a41ff0171410c490d032009417e71416e47" + "0d05200a4140480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d" + "030c020b200541016a220a20034f0d022002200a6a2c0000210a02400240024002" + "40200841907e6a0e050100000002000b2009410f6a41ff017141024b0d05200a41" + "40480d020c050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d03" + "0b200541026a220820034f0d02200220086a2c000041bf7f4a0d02200541036a22" + "0520034f0d02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b2005" + "41026a220520034f0d00200220056a2c000041bf7f4c0d010b200441086a200128" + "02002001280204200128020810c7808080004100210241002d00e0dbc080001a20" + "0428020c210520042802082108024041141099808080002203450d002003200836" + "020c2003410f360200200320053602100c060b000b200541016a21050c020b2005" + "41016a21050c010b200520034f0d000340200220056a2c00004100480d01200320" + "0541016a2205470d000c030b0b20052003490d000b0b2000200236020020002003" + "360204200441106a2480808080000be20601057f23808080800041206b22022480" + "80808000200241146a200010cd808080000240024020022f01140d000240024002" + "4002400240024020022f011622034180f803714180b803460d0020034180c8006a" + "41ffff03714180f803490d04200241146a200010ce8080800020022d00140d0620" + "022d0015210420002000280208220541016a360208200441dc00470d0320024114" + "6a200010ce8080800020022d00140d0620022d001521042000200541026a360208" + "200441f500470d02200241146a200010cd8080800020022f01140d0620022f0116" + "22044180c0006a41ffff03714180f803490d0120034180d0006a41ffff0371410a" + "7420044180c8006a41ffff0371722205418080046a210302402001280200200128" + "020822006b41034b0d00200120004104109080808000200128020821000b200120" + "0041046a360208200128020420006a2200200341127641f001723a000020004103" + "6a2004413f71418001723a000020002005410676413f71418001723a0002200020" + "03410c76413f71418001723a0001410021000c070b200220002802002000280204" + "200028020810c78080800041002d00e0dbc080001a200228020421012002280200" + "210341141099808080002200450d042000200336020c2000411436020020002001" + "3602100c060b200241086a20002802002000280204200028020810c78080800041" + "002d00e0dbc080001a200228020c21012002280208210341141099808080002200" + "450d032000200336020c20004114360200200020013602100c050b200241173602" + "142000200241146a10cf8080800021000c040b200241173602142000200241146a" + "10cf8080800021000c030b0240024002402003418001490d000240200128020020" + "0128020822046b41034b0d00200120044104109080808000200128020821040b20" + "0128020420046a210020034180104f0d0120034106764140722106410221050c02" + "0b0240200128020822002001280200470d002001108f808080000b200120004101" + "6a360208200128020420006a20033a0000410021000c040b20002003410676413f" + "71418001723a00012003410c764160722106410321050b200020063a0000200120" + "0420056a360208200020056a417f6a2003413f71418001723a0000410021000c02" + "0b000b200228021821000b200241206a24808080800020000b910301057f238080" + "80800041106b220224808080800002400240024002402001280204220320012802" + "082204490d000240200320046b41034b0d0020012003360208200241086a200128" + "02002003200310c78080800041002d00e0dbc080001a200228020c210320022802" + "08210441141099808080002201450d022001200436020c20014104360200200020" + "01360204200120033602100c030b2001200441046a220536020802402001280200" + "220620046a22012d000141017441b8aec080006a2f010020012d000041017441b8" + "b2c080006a2f010072c141087420012d000241017441b8b2c080006a2e01007220" + "012d000341017441b8aec080006a2e0100722201417f4a0d002002200620032005" + "10c78080800041002d00e0dbc080001a2002280204210320022802002104411410" + "99808080002201450d022001200436020c2001410c360200200020013602042001" + "20033602100c030b200020013b0102410021010c030b2004200341a8aec0800010" + "85808080000b000b410121010b200020013b0100200241106a2480808080000bb2" + "0101037f23808080800041106b2202248080808000024002400240200128020822" + "0320012802042204490d00200241086a20012802002004200310c7808080004100" + "2d00e0dbc080001a200228020c2103200228020821044114109980808000220145" + "0d022001200436020c200141043602002000200136020420012003360210410121" + "010c010b2000200128020020036a2d00003a0001410021010b200020013a000020" + "0241106a2480808080000f0b000b8c0101037f23808080800041106b2202248080" + "808000200241086a20002802002000280204200028020810c78080800041002d00" + "e0dbc080001a200228020c2103200228020821040240411410998080800022000d" + "00000b2000200436020c2000200129020037020020002003360210200041086a20" + "0141086a280200360200200241106a24808080800020000b1f0002402001280204" + "0e020000000b200041b8b6c08000200110b2808080000b820101017f0240024002" + "4002402003280204450d000240200328020822040d002002450d0341002d00e0db" + "c080001a0c020b20032802002004200210a78080800021030c030b2002450d0141" + "002d00e0dbc080001a0b200210998080800021030c010b200121030b2000200236" + "020820002003200120031b36020420002003453602000b9f0202047f017e238080" + "80800041206b2206248080808000024002400240200220036a220320024f0d0041" + "0021020c010b41002102200420056a417f6a410020046b71ad4108410420054101" + "461b22072001280200220841017422092003200920034b1b2203200720034b1b22" + "07ad7e220a422088a70d00200aa7220941808080807820046b4b0d010240024020" + "080d00410021020c010b2006200820056c36021c20062001280204360214200421" + "020b20062002360218200641086a20042009200641146a10d18080800002402006" + "2802080d00200628020c2102200120073602002001200236020441818080807821" + "020c010b20062802102103200628020c21020c010b0b2000200336020420002002" + "360200200641206a2480808080000b5901017f23808080800041106b2201248080" + "808000200141086a2000200028020041014108411810d280808000024020012802" + "082200418180808078460d002000200128020c109a80808000000b200141106a24" + "80808080000b4701017f23808080800041206b2200248080808000200041003602" + "182000410136020c200041d8bac0800036020820004204370210200041086a41e0" + "bac0800010a480808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d00e0dbc080001a02400240024041201099808080002201450d" + "0020014102360210200142818080801037030041002903a0dcc080002102034020" + "02427f510d024100200242017c220341002903a0dcc08000220420042002512205" + "1b3703a0dcc08000200421022005450d000b410020033703f8dfc0800020012003" + "3703084100280280e0c08000450d02200041003602182000410136020c200041e0" + "b6c0800036020820004204370210200041086a41b8b7c0800010a4808080000b00" + "0b10d480808000000b41002001360280e0c08000200041206a2480808080000b5b" + "01027f024020002802104101470d002000280214220141003a0000200028021822" + "02450d00200120021082808080000b02402000417f460d00200020002802042201" + "417f6a36020420014101470d00200041201082808080000b0b3a01017f23808080" + "800041106b2202248080808000200241c8b7c0800036020c200220003602082002" + "41086a2002410c6a200110ae80808000000b3000024020002802002d00000d0020" + "01418589c0800041051093808080000f0b2001418a89c080004104109380808000" + "0b14002001200028020420002802081093808080000b7001037f20002802042101" + "0240024020002d0000220041044b0d0020004103470d010b200128020021000240" + "200141046a28020022022802002203450d00200020031182808080008080808000" + "0b024020022802042202450d00200020021082808080000b2001410c1082808080" + "000b0bf10101027f23808080800041206b22002480808080000240024002400240" + "41002d0090dcc080000e0400000301000b410041023a0090dcc0800041002d00e0" + "dbc080001a4180081099808080002201450d01410041033a0090dcc08000410020" + "01360280dcc08000410042808080808080013703f8dbc08000410042003703e8db" + "c08000410041003a0088dcc0800041004100360284dcc08000410041003a00f4db" + "c08000410041003602f0dbc080000b200041206a2480808080000f0b000b200041" + "003602182000410136020c200041d8c5c080003602082000420437021020004108" + "6a41a8c4c0800010a480808000000bb708010a7f23808080800041206b22042480" + "808080000240024002400240024020012802100d002001417f3602102003410020" + "03200241036a417c7120026b22056b41077120032005491b22066b210720032006" + "490d0102402006450d0002400240200220036a2208417f6a22092d0000410a470d" + "002006417f6a21060c010b200220076a220a2009460d0102402008417e6a22092d" + "0000410a470d002006417e6a21060c010b200a2009460d0102402008417d6a2209" + "2d0000410a470d002006417d6a21060c010b200a2009460d0102402008417c6a22" + "092d0000410a470d002006417c6a21060c010b200a2009460d0102402008417b6a" + "22092d0000410a470d002006417b6a21060c010b200a2009460d0102402008417a" + "6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240200841" + "796a22092d0000410a470d00200641796a21060c010b200a2009460d0120064178" + "7221060b200620076a41016a21060c040b20052003200320054b1b210b41002006" + "6b21082002417c6a210c2006417f7320026a210a02400340200a21052008210620" + "072209200b4d0d01200641786a2108200541786a210a4180828408200220094178" + "6a22076a280200220d418a94a8d000736b200d724180828408200c20096a280200" + "220d418a94a8d000736b200d727141808182847871418081828478460d000b0b20" + "0920034b0d0202400340200320066a450d012006417f6a2106200520036a210920" + "05417f6a210520092d0000410a470d000b200320066a41016a21060c040b024002" + "402001411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b0240" + "200128021420066b20034b0d002000200141146a2002200310dd808080000c050b" + "200128021820066a2002200310fa808080001a200041043a00002001411c6a2006" + "20036a3602000c040b10b580808000000b2007200341c889c08000108580808000" + "000b2009200341d889c0800010ad80808000000b0240200320064f0d0020044100" + "3602182004410136020c200441a8bbc0800036020820044204370210200441086a" + "41b0bbc0800010a480808000000b02402001411c6a2802002205450d0002400240" + "200128021420056b20064d0d00200141186a28020020056a2002200610fa808080" + "001a2001411c6a200520066a22053602000c010b200441086a200141146a200220" + "0610dd80808000024020042d00084104460d00200020042903083702000c030b20" + "01411c6a28020021050b2005450d00200141003a00202001411c6a41003602000b" + "200220066a210502402001280214200320066b22064b0d002000200141146a2005" + "200610dd808080000c010b200141186a2802002005200610fa808080001a200041" + "043a00002001411c6a20063602000b2001200128021041016a360210200441206a" + "2480808080000b7101027f20012802002104024020012802082205450d00200420" + "056b20034f0d004100210520014100360208200141003a000c0b0240200420034d" + "0d00200128020420056a2002200310fa808080001a200041043a00002001200520" + "036a3602080f0b20004204370200200141003a000c0bc90103027f017e027f2380" + "8080800041106b2203248080808000200341086a20002802082802002001200210" + "dc80808000024020032d000822024104460d002000280204210420032903082105" + "0240024020002d0000220141044b0d0020014103470d010b200428020021010240" + "200441046a28020022062802002207450d00200120071182808080008080808000" + "0b024020062802042206450d00200120061082808080000b2004410c1082808080" + "000b200020053702000b200341106a24808080800020024104470b9c0303027f01" + "7e037f23808080800041106b220224808080800020024100360204024002400240" + "02402001418001490d002001418010490d012001418080044f0d0220022001413f" + "71418001723a000620022001410c7641e001723a000420022001410676413f7141" + "8001723a0005410321010c030b200220013a0004410121010c020b20022001413f" + "71418001723a00052002200141067641c001723a0004410221010c010b20022001" + "413f71418001723a00072002200141127641f001723a000420022001410676413f" + "71418001723a000620022001410c76413f71418001723a0005410421010b200241" + "086a2000280208280200200241046a200110dc80808000024020022d0008220141" + "04460d0020002802042103200229030821040240024020002d0000220541044b0d" + "0020054103470d010b200328020021050240200341046a28020022062802002207" + "450d002005200711828080800080808080000b024020062802042206450d002005" + "20061082808080000b2003410c1082808080000b200020043702000b200241106a" + "24808080800020014104470b1200200041dcb7c08000200110b2808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b0d00" + "2001410620014108766722026b7641017120024101746b413e6a21020b20004200" + "3702102000200236021c200241027441a8dcc080006a2103024041002802c4dfc0" + "800041012002742204710d0020032000360200200020033602182000200036020c" + "20002000360208410041002802c4dfc080002004723602c4dfc080000f0b024002" + "400240200328020022042802044178712001470d00200421020c010b2001410041" + "1920024101766b2002411f461b742103034020042003411d764104716a41106a22" + "052802002202450d02200341017421032002210420022802044178712001470d00" + "0b0b20022802082203200036020c20022000360208200041003602182000200236" + "020c200020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080b0b00200010e580808000000bb50101037f23808080800041106b" + "2201248080808000200028020c2102024002400240024020002802040e02000102" + "0b20020d0141012102410021030c020b20020d0020002802002202280204210320" + "0228020021020c010b20014180808080783602002001200036020c2001418f8080" + "8000200028021c22002d001c20002d001d10e680808000000b2001200336020420" + "0120023602002001419080808000200028021c22002d001c20002d001d10e68080" + "8000000b990101027f23808080800041106b22042480808080004100410028029c" + "dcc08000220541016a36029cdcc08000024020054100480d000240024041002d00" + "f0dfc080000d00410041002802ecdfc0800041016a3602ecdfc080004100280298" + "dcc08000417f4a0d010c020b200441086a20002001118380808000808080800000" + "0b410041003a00f0dfc080002002450d0010e180808000000b000b0c0020002001" + "2902003703000bf726020c7f017e2380808080004190036b220224808080800020" + "0128020c2103024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f8006a200320052005200441016a220420" + "052004491b10c78080800041002d00e0dbc080001a200228027c21082002280278" + "2101411410998080800022040d010c190b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602b002200242808080" + "8080013702a80241082109200420054f0d02200241b8016a41086a210a200241b8" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241c0006a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802442104200228024021084114" + "1099808080002206450d1d2006200836020c20064105360200200620043602100c" + "080b200241d0006a200320052005200420052004491b10c78080800041002d00e0" + "dbc080001a200228025421042002280250210841141099808080002206450d1c20" + "06200836020c20064107360200200620043602100c070b20022902ac02210e2002" + "2802a802210641042107410021090c070b200741dd00470d00200241c8006a2003" + "20052005200441016a220420052004491b10c78080800041002d00e0dbc080001a" + "200228024c21042002280248210841141099808080002206450d1a200620083602" + "0c20064115360200200620043602100c050b200241b8016a200110e88080800002" + "4020022d00b80122084106470d0020022802bc0121060c050b200241ec016a4102" + "6a2205200b41026a2d00003a0000200241d8016a41086a2203200a41086a290300" + "3703002002200b2f00003b01ec012002200a2903003703d80120022802bc012107" + "0240200c20022802a802470d00200241a8026a10d3808080000b20022802ac0222" + "09200c41186c6a220420022903d801370308200420083a0000200420022f01ec01" + "3b000120042007360204200441106a2003290300370300200441036a20052d0000" + "3a00002002200c41016a220c3602b0024100210d20012802142204200128021022" + "054f0d020c000b0b2004200136020c200441053602002000200436020420004106" + "3a0000200420083602100c160b200628020021030b200241386a20032005200520" + "0441016a220420052004491b10c78080800041002d00e0dbc080001a200228023c" + "21042002280238210841141099808080002206450d152006200836020c20064102" + "360200200620043602100b200241a8026a108c80808000024020022802a8022204" + "450d002009200441186c1082808080000b200128020c2103200128021421042001" + "280210210541062107410121090b200120012d001841016a3a0018024002402004" + "20054f0d0003400240024002400240024002400240200320046a2d00002208410c" + "4a0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c" + "060b20084120460d052008412c460d01200841dd00460d020b200241186a200320" + "052005200441016a220420052004491b10c78080800041002d00e0dbc080001a20" + "0228021c21082002280218210541141099808080002204450d1b20044116360200" + "0c070b2001200441016a2204360214200420054f0d020340200320046a2d000022" + "0c41776a220841174b0d024101200874419380800471450d022001200441016a22" + "0436021420052004470d000b200521040c020b2001200441016a3602142002200e" + "3703c001200220063602bc01200220073a00b80102402009450d00410621072002" + "41063a00800120022006360284010c160b20024180016a41106a200241b8016a41" + "106a29030037030020024180016a41086a200241b8016a41086a29030037030020" + "0220022903b801220e37038001200ea721070c150b200c41dd00470d0020024130" + "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" + "80001a200228023421082002280230210541141099808080002204450d18200441" + "153602000c040b200241286a200320052005200441016a220420052004491b10c7" + "8080800041002d00e0dbc080001a200228022c2108200228022821054114109980" + "8080002204450d17200441163602000c030b2001200441016a2204360214200520" + "04470d000b200521040b200241206a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802242108200228022021054114" + "1099808080002204450d14200441023602000b2004200536020c20042008360210" + "200220043602d0012002200e3703c001200220063602bc01200220073a00b80102" + "4020090d0041062107200241063a0080012002200436028401200241b8016a108a" + "808080000c100b41062107200241063a0080012002200636028401200410e98080" + "80000c0f0b200241106a200320052005200420052004491b10c78080800041002d" + "00e0dbc080001a200228021421082002280210210141141099808080002204450d" + "122004200136020c2004411836020020002004360204200041063a000020042008" + "3602100c110b200141003602082001200441016a360214200241b8016a20062001" + "10c88080800020022802bc0121080240024020022802b80122054102460d002002" + "2802c0012104024020050d0020024180016a2008200410ea8080800020022d0080" + "014106460d112000200229038001370300200041106a20024180016a41106a2903" + "00370300200041086a20024180016a41086a2903003703000c130b410021010240" + "20044100480d00024020040d0041012101410021050c030b41002d00e0dbc08000" + "1a20042105200410998080800022010d02410121010b20012004109a8080800000" + "0b200041063a0000200020083602040c110b20024180016a41086a220320012008" + "200410fa808080003602002002200536028401200241033a008001200220043602" + "8c01200041106a20024180016a41106a290300370300200041086a200329030037" + "030020002002290380013703000c100b2001200441016a36021420024198016a20" + "01410010eb8080800002402002290398014203510d0020024180016a2002419801" + "6a10c580808000024020022d0080014106460d0020002002290380013703002000" + "41106a20024180016a41106a290300370300200041086a20024180016a41086a29" + "03003703000c110b20022802840120011080808080002104200041063a00002000" + "20043602040c100b200020022802a001360204200041063a00000c0f0b02402007" + "41f3004a0d00200741e600460d04200741ee00470d012001200441016a36021420" + "0141d0dbc08000410310ec808080002204450d02200041063a0000200020043602" + "040c0f0b200741f400460d02200741fb00460d040b200741506a41ff0171410a49" + "0d04200241086a200320052005200441016a220420052004491b10c78080800041" + "002d00e0dbc080001a200228020c21082002280208210541141099808080002204" + "450d0e2004200536020c2004410a3602002004200836021020022004360284010c" + "0b0b200241003a0080012000200229038001370300200041086a20024180016a41" + "086a290300370300200041106a20024180016a41106a2903003703000c0c0b2001" + "200441016a3602140240200141d3dbc08000410310ec808080002204450d002000" + "41063a0000200020043602040c0c0b20024181023b018001200020022903800137" + "0300200041086a20024180016a41086a290300370300200041106a20024180016a" + "41106a2903003703000c0b0b2001200441016a3602140240200141d6dbc0800041" + "0410ec808080002204450d00200041063a0000200020043602040c0b0b20024101" + "3b0180012000200229038001370300200041086a20024180016a41086a29030037" + "0300200041106a20024180016a41106a2903003703000c0a0b200120012d001841" + "7f6a22083a0018200441016a2104200841ff0171450d0520012004360214200220" + "013602f001200241013a00f401200241f8016a200241f0016a10ed808080004100" + "210d410021064100210c024002400240024020022802f80122044180808080786a" + "0e020200010b20022802fc0121060c060b20022902fc01210e2002410036028c02" + "20024100360284022002200e3702ac02200220043602a80220024190026a200241" + "f0016a10ee8080800020022d0090024106460d03200241b8016a20024184026a20" + "0241a8026a20024190026a10c680808000024020022d00b8014106460d00200241" + "b8016a108a808080000b200241a8026a41046a2104200241b8016a41046a210802" + "400340200241ec026a200241f0016a10ed80808000024020022802ec0222054180" + "808080786a0e020204000b20022902f002210e20022802f0022103200241f8026a" + "200241f0016a10ee80808000024020022d00f8024106470d0020022802fc022106" + "2005450d07200320051082808080000c070b200820022903f80237020020084110" + "6a200241f8026a41106a290300370200200841086a200241f8026a41086a290300" + "370200200241a8026a41086a200241b8016a41086a290200370300200241a8026a" + "41106a200241b8016a41106a290200370300200241a8026a41186a200241b8016a" + "41186a280200360200200220022902b8013703a802200220053602c4022002200e" + "3e02c8022002200e4220883e02cc02200241d0026a41106a200441106a29020037" + "0300200241d0026a41086a200441086a290200370300200220042902003703d002" + "200241b8016a20024184026a200241c4026a200241d0026a10c68080800020022d" + "00b8014106460d00200241b8016a108a808080000c000b0b200228028402210620" + "02280288022109200228028c02210c0b410521070c050b20022802f00221060c02" + "0b200241a8016a2001410110eb80808000024020022903a8014203510d00200241" + "80016a200241a8016a10c580808000024020022d0080014106460d002000200229" + "038001370300200041106a20024180016a41106a290300370300200041086a2002" + "4180016a41086a2903003703000c0a0b2002280284012001108080808000210420" + "0041063a0000200020043602040c090b200020022802b001360204200041063a00" + "000c080b20022802940221062004450d00200ea720041082808080000b20024184" + "026a108b808080000b410621074101210d0b200120012d001841016a3a00182001" + "28020c21030240024020012802142204200128021022054f0d0003400240024002" + "4002400240200320046a2d00002208410c4a0d00200841776a4102490d040c010b" + "02402008411f4a0d002008410d470d010c040b20084120460d032008412c460d01" + "200841fd00460d020b200241e0006a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802642108200228026021054114" + "1099808080002204450d0b200441163602000c050b200241f0006a200320052005" + "200441016a220420052004491b10c78080800041002d00e0dbc080001a20022802" + "7421082002280270210541141099808080002204450d0a200441153602000c040b" + "2001200441016a3602140240200d450d0041062107200241063a00800120022006" + "360284010c060b200220073a008001200220022f00a8023b0081012002200c3602" + "8c01200220093602880120022006360284012002200241aa026a2d00003a008301" + "0c050b2001200441016a220436021420052004470d000b200521040b200241e800" + "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" + "80001a200228026c21082002280268210541141099808080002204450d06200441" + "033602000b2004200536020c20042008360210200220073a00b801200220022f00" + "a8023b00b901200220043602d0012002200c3602c401200220093602c001200220" + "063602bc012002200241aa026a2d00003a00bb010240200d0d0041062107200241" + "063a0080012002200436028401200241b8016a108a808080000c020b4106210720" + "0241063a0080012002200636028401200410e9808080000c010b200241d8006a20" + "0320052005200420052004491b10c78080800041002d00e0dbc080001a20022802" + "5c21082002280258210141141099808080002204450d042004200136020c200441" + "1836020020002004360204200041063a0000200420083602100c030b200741ff01" + "714106470d010b20022802840120011080808080002104200041063a0000200020" + "043602040c010b2000200229038001370300200041106a20024180016a41106a29" + "0300370300200041086a20024180016a41086a2903003703000b20024190036a24" + "80808080000f0b000b920101047f02400240024020002802000e020001020b2000" + "2802082201450d01200028020420011082808080000c010b20002d00044103470d" + "002000280208220128020021020240200128020422032802002204450d00200220" + "0411828080800080808080000b024020032802042203450d002002200310828080" + "80000b2001410c1082808080000b200041141082808080000b7901027f41002103" + "0240024020024100480d00024020020d0041002103410121040c020b41002d00e0" + "dbc080001a20022103200210998080800022040d01410121030b20032002109a80" + "808000000b20042001200210fa8080800021012000200236020c20002001360208" + "20002003360204200041033a00000b950502067f017e23808080800041306b2203" + "248080808000200128020c21040240024002400240024002402001280214220520" + "0128021022064f0d002001200541016a2207360214200420056a2d000022084130" + "470d020240200720064f0d00200420076a2d000041506a41ff0171410a490d020b" + "200020012002420010ef808080000c050b200341186a20042006200510c7808080" + "0041002d00e0dbc080001a200328021c2107200328021821044114109980808000" + "2201450d022001200436020c200141053602002000200136020820004203370300" + "200120073602100c040b200341086a200420062006200541026a22012006200149" + "1b10c78080800041002d00e0dbc080001a200328020c2107200328020821044114" + "1099808080002201450d012001200436020c2001410d3602002000200136020820" + "004203370300200120073602100c030b02402008414f6a41ff01714109490d0020" + "0341106a20042006200710c78080800041002d00e0dbc080001a20032802142107" + "2003280210210441141099808080002201450d012001200436020c2001410d3602" + "002000200136020820004203370300200120073602100c030b200841506aad42ff" + "01832109200720064f0d010340200420076a2d000041506a220541ff0171220841" + "0a4f0d020240024020094299b3e6cc99b3e6cc19540d0020094299b3e6cc99b3e6" + "cc19520d01200841054b0d010b2001200741016a22073602142009420a7e2005ad" + "42ff01837c210920062007470d010c030b0b200341206a20012002200910f08080" + "80000240024020032802200d00200020032b0328390308420021090c010b200020" + "03280224360208420321090b200020093703000c020b000b200020012002200910" + "ef808080000b200341306a2480808080000ba20201087f23808080800041106b22" + "032480808080002000280214220420002802102205200420054b1b210620002802" + "0c210702400240024002400340024020020d00410021040c050b20062004460d01" + "2000200441016a22083602142002417f6a2102200720046a210920012d0000210a" + "20082104200141016a2101200a20092d0000460d000b200341086a200720052008" + "10c78080800041002d00e0dbc080001a200328020c210120032802082102411410" + "99808080002204450d01200441093602000c020b200320072005200610c7808080" + "0041002d00e0dbc080001a20032802042101200328020021024114109980808000" + "2204450d00200441053602000c010b000b2004200236020c200420013602100b20" + "0341106a24808080800020040bae0201047f23808080800041106b220224808080" + "8000200241046a200110f680808000024002400240024020022d00040d00024020" + "022d00050d0020004180808080783602000c040b41002103200128020022014100" + "3602082001200128021441016a360214200241046a2001410c6a200110c8808080" + "002002280208210420022802044102460d010240200228020c22014100480d0002" + "4020010d0041012103410021050c040b41002d00e0dbc080001a20012105200110" + "998080800022030d03410121030b20032001109a80808000000b20002002280208" + "36020420004181808080783602000c020b20004181808080783602002000200436" + "02040c010b20032004200110fa8080800021042000200136020820002004360204" + "200020053602000b200241106a2480808080000bdc0201067f2380808080004110" + "6b22022480808080002001280200220328020c2104024002400240024002402003" + "2802142201200341106a28020022054f0d000340200420016a2d0000220641776a" + "220741174b0d024101200774419380800471450d022003200141016a2201360214" + "20052001470d000b200521010b200241086a200420052005200141016a22012005" + "2001491b10c78080800041002d00e0dbc080001a200228020c2107200228020821" + "0541141099808080002201450d03200141033602000c010b02402006413a470d00" + "2003200141016a3602142000200310e8808080000c020b20022004200520052001" + "41016a220120052001491b10c78080800041002d00e0dbc080001a200228020421" + "072002280200210541141099808080002201450d02200141063602000b20012005" + "36020c20002001360204200041063a0000200120073602100b200241106a248080" + "8080000f0b000b970202027f027e23808080800041106b22042480808080000240" + "02400240024002400240024002402001280214220520012802104f0d0020012802" + "0c20056a2d00002205412e460d01200541c500460d02200541e500460d020b2002" + "450d02420121060c050b2004200120022003410010f18080800020042802000d02" + "0c030b2004200120022003410010f2808080002004280200450d02200020042802" + "04360208200042033703000c040b420021060240420020037d22074200590d0042" + "022106200721030c030b2003babd428080808080808080807f8421030c020b2000" + "2004280204360208200042033703000c020b20042903082103420021060b200020" + "03370308200020063703000b200441106a2480808080000bbd0101057f41002104" + "0240024020012802102205200128021422064d0d00200641016a2107200520066b" + "2108200128020c20066a21054100210403400240200520046a2d0000220641506a" + "41ff0171410a490d002006412e460d030240200641c500460d00200641e500470d" + "030b2000200120022003200410f2808080000f0b2001200720046a360214200820" + "0441016a2204470d000b200821040b2000200120022003200410f3808080000f0b" + "2000200120022003200410f1808080000bfa0301097f23808080800041106b2205" + "24808080800020012001280214220641016a220736021402400240024020072001" + "28021022084f0d00200720086b2109200128020c210a4100210602400240034002" + "40200a20076a2d0000220b41506a220c41ff0171220d410a490d00024020060d00" + "2005200a20082008200741016a220720082007491b10c78080800041002d00e0db" + "c080001a200528020421062005280200210c41141099808080002207450d072007" + "200c36020c2007410d360200200020073602042000410136020020072006360210" + "0c060b200620046a2107200b41207241e500470d032000200120022003200710f2" + "808080000c050b024020034298b3e6cc99b3e6cc19580d0020034299b3e6cc99b3" + "e6cc19520d02200d41054b0d020b2001200741016a22073602142006417f6a2106" + "2003420a7e200cad42ff01837c210320072008470d000b200920046a21070c010b" + "2000200120022003200620046a10f4808080000c020b2000200120022003200710" + "f3808080000c010b200541086a200128020c20082008200641026a220720082007" + "491b10c78080800041002d00e0dbc080001a200528020c21062005280208210c41" + "141099808080002207450d012007200c36020c2007410536020020002007360204" + "20004101360200200720063602100b200541106a2480808080000f0b000bb80401" + "077f23808080800041106b22052480808080004101210620012001280214220741" + "016a220836021402402008200128021022094f0d00410121060240024020012802" + "0c20086a2d000041556a0e03010200020b410021060b2001200741026a22083602" + "140b200128020c210a0240024002400240024002400240200820094f0d00200120" + "0841016a2207360214200a20086a2d000041506a41ff01712208410a4f0d010240" + "200720094f0d000340200a20076a2d000041506a41ff0171220b410a4f0d012001" + "200741016a22073602140240200841cb99b3e6004c0d00200841cc99b3e600470d" + "07200b41074b0d070b2008410a6c200b6a210820092007470d000b0b20060d0220" + "0420086b2207411f75418080808078732007200841004a2007200448731b21070c" + "030b200541086a200a2009200810c78080800041002d00e0dbc080001a20052802" + "0c21012005280208210841141099808080002207450d042007200836020c200741" + "053602002000200736020420004101360200200720013602100c050b2005200a20" + "09200710c78080800041002d00e0dbc080001a2005280204210120052802002108" + "41141099808080002207450d032007200836020c2007410d360200200020073602" + "0420004101360200200720013602100c040b200420086a2207411f754180808080" + "7873200720084100482007200448731b21070b2000200120022003200710f38080" + "80000c020b200020012002200350200610f5808080000c010b000b200541106a24" + "80808080000b9f0304017f017c017f017c23808080800041106b22052480808080" + "002003ba2106024002400240024002400240024020042004411f7522077320076b" + "220741b502490d0003402006440000000000000000610d062004417f4a0d022006" + "44a0c8eb85f3cce17fa32106200441b4026a22042004411f7522077320076b2207" + "41b4024b0d000b0b200741037441a8c8c080006a2b030021082004417f4a0d0120" + "062008a321060c040b2005200128020c2001280210200128021410c78080800041" + "002d00e0dbc080001a200528020421072005280200210141141099808080002204" + "450d022004200136020c2004410e36020020002004360204200420073602100c01" + "0b20062008a222069944000000000000f07f620d02200541086a200128020c2001" + "280210200128021410c78080800041002d00e0dbc080001a200528020c21072005" + "280208210141141099808080002204450d012004200136020c2004410e36020020" + "002004360204200420073602100b410121040c020b000b2000200620069a20021b" + "390308410021040b20002004360200200541106a2480808080000b7f01047f0240" + "024020012802142205200128021022064f0d00200128020c210702400340200720" + "056a2d0000220841506a41ff017141094b0d012001200541016a22053602142006" + "2005470d000c020b0b200841207241e500460d010b2000200120022003200410f3" + "808080000f0b2000200120022003200410f2808080000b840201027f2380808080" + "0041106b220524808080800002400240024002402004450d002003450d010b2001" + "2802142204200128021022034f0d01200128020c21060340200620046a2d000041" + "506a41ff0171410a4f0d022001200441016a220436021420032004470d000c020b" + "0b200541086a200128020c2001280210200128021410c78080800041002d00e0db" + "c080001a200528020c210120052802082103024041141099808080002204450d00" + "2004200336020c2004410e3602002000200436020420042001360210410121040c" + "020b000b200044000000000000000044000000000000008020021b390308410021" + "040b20002004360200200541106a2480808080000bb40701077f23808080800041" + "306b22022480808080002001280200220328020c21040240024002400240200328" + "02142205200341106a28020022064f0d000340200420056a2d0000220741776a22" + "0841174b0d024101200874419380800471450d022003200541016a220536021420" + "062005470d000b200621050b41012108200241286a200420062006200541016a22" + "0520062005491b10c78080800041002d00e0dbc080001a200228022c2106200228" + "0228210341141099808080002205450d022005200336020c200541033602002000" + "2005360204200520063602100c010b0240200741fd00470d004100210820004100" + "3a00010c010b02400240024020012d00040d00200541016a21052007412c470d01" + "200320053602140240200520064f0d00034002400240024002400240200420056a" + "2d00002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e0304" + "0102000b2008410d460d03200841fd00460d020b41012108200241086a20042006" + "2006200541016a220520062005491b10c78080800041002d00e0dbc080001a2002" + "28020c21062002280208210341141099808080002205450d092005200336020c20" + "05411136020020002005360204200520063602100c080b200041013a0001410021" + "080c070b41012108200241186a200420062006200541016a220520062005491b10" + "c78080800041002d00e0dbc080001a200228021c21062002280218210341141099" + "808080002205450d072005200336020c2005411536020020002005360204200520" + "063602100c060b2003200541016a220536021420062005470d000b200621050b41" + "012108200241106a200420062006200541016a220520062005491b10c780808000" + "41002d00e0dbc080001a2002280214210620022802102103411410998080800022" + "05450d042005200336020c2005410536020020002005360204200520063602100c" + "030b41002108200141003a0004024020074122460d002002200420062006200541" + "016a220520062005491b10c78080800041002d00e0dbc080001a20022802042108" + "2002280200210641141099808080002205450d042005200636020c200541113602" + "0020002005360204200520083602100c020b200041013a00010c020b200241206a" + "200420062006200520062005491b10c78080800041002d00e0dbc080001a200228" + "022421082002280220210641141099808080002205450d022005200636020c2005" + "410836020020002005360204200520083602100b410121080b200020083a000020" + "0241306a2480808080000f0b000b4a01037f4100210302402002450d0002400340" + "20002d0000220420012d00002205470d01200041016a2100200141016a21012002" + "417f6a2202450d020c000b0b200420056b21030b20030bac0501087f0240024002" + "400240200020016b20024f0d00200120026a2103200020026a2104024020024110" + "4f0d00200021050c030b2004417c7121054100200441037122066b210702402006" + "450d00200120026a417f6a210803402004417f6a220420082d00003a0000200841" + "7f6a210820052004490d000b0b2005200220066b2209417c7122066b2104024020" + "0320076a2207410371450d0020064101480d022007410374220841187121022007" + "417c71220a417c6a2101410020086b4118712103200a280200210803402005417c" + "6a2205200820037420012802002208200276723602002001417c6a210120042005" + "490d000c030b0b20064101480d01200920016a417c6a210103402005417c6a2205" + "20012802003602002001417c6a210120042005490d000c020b0b02400240200241" + "104f0d00200021040c010b2000410020006b41037122036a210502402003450d00" + "20002104200121080340200420082d00003a0000200841016a2108200441016a22" + "042005490d000b0b2005200220036b2209417c7122076a21040240024020012003" + "6a2206410371450d0020074101480d012006410374220841187121022006417c71" + "220a41046a2101410020086b4118712103200a2802002108034020052008200276" + "2001280200220820037472360200200141046a2101200541046a22052004490d00" + "0c020b0b20074101480d0020062101034020052001280200360200200141046a21" + "01200541046a22052004490d000b0b20094103712102200620076a21010b200245" + "0d02200420026a21050340200420012d00003a0000200141016a2101200441016a" + "22042005490d000c030b0b20094103712201450d012007410020066b6a21032004" + "20016b21050b2003417f6a210103402004417f6a220420012d00003a0000200141" + "7f6a210120052004490d000b0b20000b0e0020002001200210f8808080000bc102" + "01087f02400240200241104f0d00200021030c010b2000410020006b4103712204" + "6a210502402004450d0020002103200121060340200320062d00003a0000200641" + "016a2106200341016a22032005490d000b0b2005200220046b2207417c7122086a" + "210302400240200120046a2209410371450d0020084101480d0120094103742206" + "41187121022009417c71220a41046a2101410020066b4118712104200a28020021" + "060340200520062002762001280200220620047472360200200141046a21012005" + "41046a22052003490d000c020b0b20084101480d00200921010340200520012802" + "00360200200141046a2101200541046a22052003490d000b0b2007410371210220" + "0920086a21010b02402002450d00200320026a21050340200320012d00003a0000" + "200141016a2101200341016a22032005490d000b0b20000b0be45b0100418080c0" + "000bda5b110000000c000000040000001200000013000000140000000000000000" + "00000001000000150000000000000001000000010000001600000063616c6c6564" + "2060526573756c743a3a756e77726170282960206f6e20616e2060457272602076" + "616c75650017000000040000000400000018000000456d707479496e76616c6964" + "4469676974506f734f766572666c6f774e65674f766572666c6f775a65726f5061" + "727365496e744572726f726b696e647372632f6c69622e72730000b00010000a00" + "0000200000004b000000b00010000a000000210000004b0000004163636f756e74" + "00b00010000a0000002200000033000000b00010000a0000002300000033000000" + "44617461b00010000a0000002500000030000000b00010000a0000002600000024" + "000000b00010000a00000027000000350000007465737420676f6f64203d202c20" + "636f756e746572203d200a000000380110000c000000440110000c000000500110" + "0001000000746573742064617461202c20706f696e746572203d202c20706f696e" + "7465725f7533325f6c656e203d202c206c656e203d2000006c0110000a00000076" + "0110000c0000008201100014000000960110000800000050011000010000000500" + "00000c0000000b0000000b00000004000000740010007900100085001000900010" + "009b0010006361706163697479206f766572666c6f77000000f001100011000000" + "616c6c6f632f7372632f7261775f7665632e72730c021000140000001800000005" + "0000002e2e30313233343536373839616263646566426f72726f774d7574457272" + "6f72616c726561647920626f72726f7765643a200000500210001200000063616c" + "6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65" + "602076616c7565696e646578206f7574206f6620626f756e64733a20746865206c" + "656e20697320206275742074686520696e64657820697320000000970210002000" + "0000b7021000120000003d3d617373657274696f6e20606c656674202072696768" + "7460206661696c65640a20206c6566743a200a2072696768743a200000de021000" + "10000000ee02100017000000050310000900000020726967687460206661696c65" + "643a200a20206c6566743a20000000de0210001000000028031000100000003803" + "100009000000050310000900000001000000000000000b21100002000000202020" + "20207b20207b0a2c0a7d207d636f72652f7372632f666d742f6e756d2e72730000" + "830310001300000066000000170000003078303030313032303330343035303630" + "373038303931303131313231333134313531363137313831393230323132323233" + "323432353236323732383239333033313332333333343335333633373338333934" + "303431343234333434343534363437343834393530353135323533353435353536" + "353735383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738383839" + "3930393139323933393439353936393739383939636f72652f7372632f666d742f" + "6d6f642e727366616c736574727565000072041000130000009b09000026000000" + "7204100013000000a40900001a000000636f72652f7372632f736c6963652f6d65" + "6d6368722e7273b004100018000000830000001e000000b0041000180000009f00" + "00000900000072616e676520737461727420696e64657820206f7574206f662072" + "616e676520666f7220736c696365206f66206c656e67746820e804100012000000" + "fa0410002200000072616e676520656e6420696e646578202c05100010000000fa" + "04100022000000736c69636520696e646578207374617274732061742020627574" + "20656e647320617420004c05100016000000620510000d00000001010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000202020202020202020202" + "020202020202020202020202020202020202020303030303030303030303030303" + "0303040404040400000000000000000000005b2e2e2e5d626567696e203c3d2065" + "6e642028203c3d2029207768656e20736c6963696e67206060850610000e000000" + "93061000040000009706100010000000a7061000010000006279746520696e6465" + "7820206973206e6f742061206368617220626f756e646172793b20697420697320" + "696e7369646520202862797465732029206f66206000c80610000b000000d30610" + "0026000000f9061000080000000107100006000000a70610000100000020697320" + "6f7574206f6620626f756e6473206f6620600000c80610000b0000003007100016" + "000000a706100001000000636f72652f7372632f7374722f6d6f642e7273006007" + "100013000000f00000002c000000636f72652f7372632f756e69636f64652f7072" + "696e7461626c652e7273000000840710001d0000001a0000003600000084071000" + "1d0000000a0000002b000000000601010301040205070702080809020a050b020e" + "041001110212051311140115021702190d1c051d081f0124016a046b02af03b102" + "bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb" + "010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418" + "363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f6465" + "5cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f" + "5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c15" + "1d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a48" + "4a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e" + "227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06" + "240424042808340b4e43813709160a08183b45390363080930160521031b050140" + "38044b052f040a070907402027040c0936033a051a07040c07504937330d33072e" + "080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b42" + "3e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a06" + "0a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937" + "030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d8430" + "10168faa8247a1b98239072a045c06260a460a28051382b05b654b043907114005" + "0b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092" + "604709743c80f60a73087015467a140c140c570919808781470385420f1584501f" + "060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a" + "04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c04" + "0907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81" + "540c1d03090736080e040907090780cb250a840600010305050606020706080709" + "110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c02" + "1f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05fd02fe03ff" + "09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192" + "a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4ba" + "bbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d" + "11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084" + "b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e" + "5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f" + "7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74" + "7596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a5b07080f10" + "272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df0482" + "44081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a" + "500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b" + "0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582" + "b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c04" + "0103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582" + "ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be" + "22740c80d61a81100580df0bf29e033709815c1480b80880cb050a183b030a0638" + "0846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a104" + "81da26070c050580a61081f50701202a064c04808d0480be031b030f0d636f7265" + "2f7372632f756e69636f64652f756e69636f64655f646174612e7273003f0d1000" + "2000000050000000280000003f0d1000200000005c000000160000000003000083" + "042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8" + "602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a1" + "39301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a153" + "00da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a0070000700" + "2d0101010201020101480b30151001650702060202010423011e1b5b0b3a090901" + "18040109010301052b033c082a180120370101010408040103070a021d013a0101" + "010204080109010a021a010202390104020402020303011e0203010b0239010405" + "010204011402160601013a0101020104080107030a021e013b0101010c01090128" + "010301370101030503010407020b021d013a01020102010301050207020b021c02" + "390201010204080109010a021d0148010401020301010801510102070c08620102" + "090b0749021b0101010101370e01050102050b0124090166040106010202021902" + "040310040d01020206010f01000300031d021e021e02400201070801020b09012d" + "030101750222017603040209010603db0202013a010107010101010208060a0201" + "301f310430070101050128090c0220040202010338010102030101033a08020298" + "03010d0107040106010302c6400001c32100038d016020000669020004010a2002" + "50020001030104011902050197021a120d012608190b2e03300102040202270143" + "06020202020c0108012f01330101030202050201012a020801ee01020104010001" + "0010101000020001e201950500030102050428030401a502000400025003460b31" + "047b01360f290102020a033104020207013d03240501083e010c0234090a040201" + "5f0302010102060102019d010308150239020101010116010e070305c308020301" + "011701510102060101020101020102eb010204060201021b025508020101026a01" + "01010206010165030204010500090102f5010a0201010401900402020401200a28" + "0602040801090602032e0d010200070106010152160207010201027a0603010102" + "0107010148020301010100020b023405050101010001060f00053b0700013f0451" + "010002002e0217000101030405080802071e0494030037043208010e011605010f" + "000701110207010201056401a00700013d04000400076d07006080f0002f727573" + "74632f633266373463336639323861656235303366313562346539656635373738" + "653737663330353862382f6c6962726172792f616c6c6f632f7372632f636f6c6c" + "656374696f6e732f62747265652f6d61702f656e7472792e727300db1010006000" + "000071010000360000002f72757374632f63326637346333663932386165623530" + "3366313562346539656635373738653737663330353862382f6c6962726172792f" + "616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e" + "7273617373657274696f6e206661696c65643a20656467652e686569676874203d" + "3d2073656c662e686569676874202d2031004c1110005b000000af020000090000" + "00617373657274696f6e206661696c65643a207372632e6c656e2829203d3d2064" + "73742e6c656e28294c1110005b0000002f070000050000004c1110005b000000af" + "040000230000004c1110005b000000ef04000024000000617373657274696f6e20" + "6661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e" + "686569676874202d20310000004c1110005b000000f003000009000000c8151000" + "5f0000005802000030000000110000000c00000004000000120000001300000014" + "000000000000000000000001000000150000006120446973706c617920696d706c" + "656d656e746174696f6e2072657475726e656420616e206572726f7220756e6578" + "7065637465646c792f72757374632f633266373463336639323861656235303366" + "313562346539656635373738653737663330353862382f6c6962726172792f616c" + "6c6f632f7372632f737472696e672e72730000f71210004b000000060a00000e00" + "00004572726f72454f46207768696c652070617273696e672061206c697374454f" + "46207768696c652070617273696e6720616e206f626a656374454f46207768696c" + "652070617273696e67206120737472696e67454f46207768696c65207061727369" + "6e6720612076616c7565657870656374656420603a60657870656374656420602c" + "60206f7220605d60657870656374656420602c60206f7220607d60657870656374" + "6564206964656e7465787065637465642076616c75656578706563746564206022" + "60696e76616c696420657363617065696e76616c6964206e756d6265726e756d62" + "6572206f7574206f662072616e6765696e76616c696420756e69636f646520636f" + "646520706f696e74636f6e74726f6c2063686172616374657220285c7530303030" + "2d5c75303031462920666f756e64207768696c652070617273696e672061207374" + "72696e676b6579206d757374206265206120737472696e67696e76616c69642076" + "616c75653a206578706563746564206b657920746f2062652061206e756d626572" + "20696e2071756f746573666c6f6174206b6579206d7573742062652066696e6974" + "652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c656164696e67" + "20737572726f6761746520696e2068657820657363617065747261696c696e6720" + "636f6d6d61747261696c696e672063686172616374657273756e65787065637465" + "6420656e64206f662068657820657363617065726563757273696f6e206c696d69" + "742065786365656465644572726f72282c206c696e653a202c20636f6c756d6e3a" + "200000008d1510000600000093151000080000009b1510000a000000b820100001" + "0000002f72757374632f6332663734633366393238616562353033663135623465" + "39656635373738653737663330353862382f6c6962726172792f616c6c6f632f73" + "72632f636f6c6c656374696f6e732f62747265652f6e617669676174652e727300" + "c81510005f000000c600000027000000c81510005f000000160200002f000000c8" + "1510005f000000a1000000240000002f686f6d652f7077616e672f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631" + "376432326262613135303031662f73657264655f6a736f6e2d312e302e3133352f" + "7372632f726561642e727300581610005f000000a001000045000000581610005f" + "000000a50100003d000000581610005f000000ad0100001a000000581610005f00" + "0000fa01000013000000581610005f000000030200003e000000581610005f0000" + "00ff01000033000000581610005f000000090200003a000000581610005f000000" + "6802000019000000ffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffff0000010002000300040005000600070008000900ffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffff0000100020003000400050" + "006000700080009000ffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000f000" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffff110000000c00000004000000120000001300000014000000" + "7265656e7472616e7420696e69740000501b10000e0000002f72757374632f6332" + "663734633366393238616562353033663135623465396566353737386537376633" + "30353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63652e" + "7273000000681b10004d0000002301000042000000000000000000000004000000" + "04000000190000001a0000000c000000040000001b0000001c0000001d0000002f" + "727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c6d61" + "6c6c6f632e7273617373657274696f6e206661696c65643a207073697a65203e3d" + "2073697a65202b206d696e5f6f7665726865616400f41b100029000000a8040000" + "09000000617373657274696f6e206661696c65643a207073697a65203c3d207369" + "7a65202b206d61785f6f766572686561640000f41b100029000000ae0400000d00" + "0000757365206f66207374643a3a7468726561643a3a63757272656e7428292069" + "73206e6f7420706f737369626c6520616674657220746865207468726561642773" + "206c6f63616c206461746120686173206265656e2064657374726f796564737464" + "2f7372632f7468726561642f6d6f642e727300fa1c100015000000f10200001300" + "00006661696c656420746f2067656e657261746520756e69717565207468726561" + "642049443a2062697473706163652065786861757374656400201d100037000000" + "fa1c100015000000c40400000d00000001000000000000007374642f7372632f69" + "6f2f62756666657265642f6c696e657772697465727368696d2e72736d6964203e" + "206c656e00009d1d100009000000781d1000250000000f01000029000000656e74" + "697479206e6f7420666f756e647065726d697373696f6e2064656e696564636f6e" + "6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574686f" + "737420756e726561636861626c656e6574776f726b20756e726561636861626c65" + "636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e65637465646164" + "647265737320696e2075736561646472657373206e6f7420617661696c61626c65" + "6e6574776f726b20646f776e62726f6b656e2070697065656e7469747920616c72" + "65616479206578697374736f7065726174696f6e20776f756c6420626c6f636b6e" + "6f742061206469726563746f727969732061206469726563746f72796469726563" + "746f7279206e6f7420656d707479726561642d6f6e6c792066696c657379737465" + "6d206f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e2073796d6c" + "696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e646c" + "65696e76616c696420696e70757420706172616d65746572696e76616c69642064" + "61746174696d6564206f75747772697465207a65726f6e6f2073746f7261676520" + "73706163657365656b206f6e20756e7365656b61626c652066696c6566696c6573" + "797374656d2071756f746120657863656564656466696c6520746f6f206c617267" + "657265736f75726365206275737965786563757461626c652066696c6520627573" + "79646561646c6f636b63726f73732d646576696365206c696e6b206f722072656e" + "616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e616d65" + "617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e2069" + "6e746572727570746564756e737570706f72746564756e65787065637465642065" + "6e64206f662066696c656f7574206f66206d656d6f72796f74686572206572726f" + "72756e63617465676f72697a6564206572726f7220286f73206572726f72202900" + "00000100000000000000ad2010000b000000b8201000010000007374642f737263" + "2f696f2f737464696f2e727300d4201000130000002c030000140000006661696c" + "6564207072696e74696e6720746f203a20000000f8201000130000000b21100002" + "000000d4201000130000005d040000090000007374646f75747374642f7372632f" + "696f2f6d6f642e72736120666f726d617474696e6720747261697420696d706c65" + "6d656e746174696f6e2072657475726e656420616e206572726f72207768656e20" + "74686520756e6465726c79696e672073747265616d20646964206e6f7400000047" + "211000560000003621100011000000280700001500000063616e6e6f7420726563" + "7572736976656c792061637175697265206d75746578b821100020000000737464" + "2f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e7273" + "e02110002400000014000000090000007374642f7372632f73796e632f6f6e6365" + "2e72731422100014000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465787374642f7372632f73" + "796e632f7265656e7472616e745f6c6f636b2e72735e2210001e00000022010000" + "2d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d6520" + "696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f726d" + "6564207265637572736976656c79a0221000380000001000000011000000120000" + "00100000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e00000013000000260000003800000019" + "000000170000000c000000090000000a0000001000000017000000190000000e00" + "00000d00000014000000080000001b0000000e0000001000000016000000150000" + "000b000000160000000d0000000b00000013000000c01d1000d01d1000e11d1000" + "f31d1000031e1000131e1000261e1000381e1000451e1000531e1000681e100074" + "1e10007f1e1000941e1000a91e1000b81e1000c61e1000d91e1000ff1e1000371f" + "1000501f1000671f1000731f10007c1f1000861f1000961f1000ad1f1000c61f10" + "00d41f1000e11f1000f51f1000fd1f10001820100026201000362010004c201000" + "612010006c201000822010008f2010009a201000000000000000f03f0000000000" + "00244000000000000059400000000000408f40000000000088c34000000000006a" + "f8400000000080842e4100000000d01263410000000084d797410000000065cdcd" + "41000000205fa00242000000e876483742000000a2941a6d42000040e59c30a242" + "0000901ec4bcd64200003426f56b0c430080e03779c3414300a0d8855734764300" + "c84e676dc1ab43003d9160e458e143408cb5781daf154450efe2d6e41a4b4492d5" + "4d06cff08044f64ae1c7022db544b49dd9794378ea449102282c2a8b2045350332" + "b7f4ad54450284fee471d9894581121f2fe727c04521d7e6fae031f445ea8ca039" + "593e294624b00888ef8d5f46176e05b5b5b893469cc94622e3a6c846037cd8ea9b" + "d0fe46824dc77261423347e32079cff91268471b695743b8179e47b1a1162ad3ce" + "d2471d4a9cf487820748a55cc3f129633d48e7191a37fa5d724861a0e0c478f5a6" + "4879c818f6d6b2dc484c7dcf59c6ef11499e5c43f0b76b4649c63354eca5067c49" + "5ca0b4b32784b14973c8a1a031e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0" + "fddd76d261854a307d951447baba4a3e6edd6c6cb4f04acec9148887e1244b41fc" + "196ae9195a4ba93d50e23150904b134de45a3e64c44b57609df14d7df94b6db804" + "6ea1dc2f4c44f3c2e4e4e9634c15b0f31d5ee4984c1b9c70a5751dcf4c91616687" + "6972034df5f93fe9034f384d72f88fe3c4626e4d47fb390ebbfda24d197ac8d129" + "bdd74d9f983a4674ac0d4e649fe4abc88b424e3dc7ddd6ba2e774e0c39958c69fa" + "ac4ea743ddf7811ce24e9194d475a2a3164fb5b949138b4c4c4f11140eecd6af81" + "4f169911a7cc1bb64f5bffd5d0bfa2eb4f99bf85e2b74521507f2f27db25975550" + "5ffbf051effc8a501b9d369315dec050624404f89a15f5507b5505b6015b2a516d" + "55c311e1786051c82a3456199794517a35c1abdfbcc9516cc158cb0b160052c7f1" + "2ebe8e1b345239aeba6d72226952c75929090f6b9f521dd8b965e9a2d352244e28" + "bfa38b0853ad61f2ae8cae3e530c7d57ed172d73534f5cade85df8a75363b3d862" + "75f6dd531e70c75d09ba1254254c39b58b6847542e9f87a2ae427d547dc39425ad" + "49b2545cf4f96e18dce6547371b88a1e931c55e846b316f3db5155a21860dcef52" + "8655ca1e78d3abe7bb553f132b64cb70f1550ed8353dfecc2556124e83cc3d405b" + "56cb10d29f26089156fe94c647304ac5563d3ab859bc9cfa56662413b8f5a13057" + "80ed172673ca6457e0e89def0ffd99578cb1c2f5293ed057ef5d3373b44d04586b" + "35009021613958c54200f469b96f58bb298038e2d3a3582a34a0c6dac8d8583541" + "487811fb0e59c1282debea5c4359f172f8a525347859ad8f760f2f41ae59cc19aa" + "69bde8e2593fa014c4eca2175a4fc819f5a78b4d5a321d30f94877825a7e247c37" + "1b15b75a9e2d5b0562daec5a82fc58437d08225ba33b2f949c8a565b8c0a3bb943" + "2d8c5b97e6c4534a9cc15b3d20b6e85c03f65b4da8e32234842b5c3049ce95a032" + "615c7cdb41bb487f955c5b5212ea1adfca5c79734bd270cb005d5750de064dfe34" + "5d6de49548e03d6a5dc4ae5d2dac66a05d751ab5385780d45d1261e2066da0095e" + "ab7c4d244404405ed6db602d5505745ecc12b978aa06a95e7f57e7165548df5eaf" + "96502e358d135f5bbce4798270485f72eb5d18a38c7e5f27b33aefe517b35ff15f" + "096bdfdde75fedb7cb4557d51d60f4529f8b56a55260b127872eac4e87609df128" + "3a5722bd60029759847635f260c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd" + "35c89161d65c8f2c433ac6610c34b3f7d3c8fb618700d07a845d3162a9008499e5" + "b46562d400e5ff1e229b628420ef5f53f5d062a5e8ea37a8320563cfa2e545527f" + "3a63c185af6b938f706332679b4678b3a463fe40425856e0d9639f6829f7352c10" + "64c6c2f3744337446478b330521445796456e0bc665996af64360c36e0f7bde364" + "438f43d875ad18651473544ed3d84e65ecc7f41084478365e8f931156519b86561" + "787e5abe1fee653d0b8ff8d6d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0" + "bbeedf62c266389d6aea97fbf666864405e57dba2c67d44a23af8ef46167891dec" + "5ab2719667eb24a7f11e0ecc6713770857d3880168d794ca2c08eb35680d3afd37" + "ca656b684844fe629e1fa1685ad5bdfb8567d568b14aad7a67c10a69af4eacace0" + "b840695a62d7d718e77469f13acd0ddf20aa69d644a0688b54e0690c56c842ae69" + "146a8f6b7ad31984496a7306594820e57f6a08a4372d34efb36a0a8d853801ebe8" + "6a4cf0a686c1251f6b305628f49877536bbb6b32317f55886baa067ffdde6abe6b" + "2a646f5ecb02f36b353d0b367ec3276c820c8ec35db45d6cd1c7389aba90926cc6" + "f9c640e934c76c37b8f8902302fd6c23739b3a5621326deb4f42c9aba9666de6e3" + "92bb16549c6d70ce3b358eb4d16d0cc28ac2b121066e8f722d331eaa3b6e9967fc" + "df524a716e7f81fb97e79ca56edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a" + "3a1b456f948306b508627a6f3d122471457db06fcc166dcd969ce46f7f5cc880bc" + "c31970cf397dd0551a507043889c44eb20847054aac3152629b970e994349b6f73" + "ef7011dd00c125a82371561441312f9258716b5991fdbab68e71e3d77ade3432c3" + "71dc8d1916c2fef77153f19f9b72fe2d72d4f643a107bf627289f49489c96e9772" + "ab31faeb7b4acd720b5f7c738d4e0273cd765bd030e2367381547204bd9a6c73d0" + "74c722b6e0a173045279abe358d67386a657961cef0b7414c8f6dd71754174187a" + "7455ced275749e98d1ea8147ab7463ffc232b10ce1743cbf737fdd4f15750baf50" + "dfd4a34a75676d920b65a68075c008774efecfb475f1ca14e2fd03ea75d6fe4cad" + "7e4220768c3ea0581e5354762f4ec8eee5678976bb617a6adfc1bf76157d8ca22b" + "d9f3765a9c2f8b76cf28777083fb2d54035f772632bd9c14629377b07eecc3993a" + "c8775c9ee7344049fe77f9c21021c8ed3278b8f354293aa96778a530aab388939d" + "78675e4a70357cd27801f65ccc421b07798233747f13e23c7931a0a82f4c0d7279" + "3dc8923b9f90a6794d7a770ac734dc7970ac8a66fca0117a8c572d803b09467a6f" + "ad38608a8b7b7a656c237c3637b17a7f472c1b0485e57a5e59f72145e61a7bdb97" + "3a35ebcf507bd23d8902e603857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a" + "9ece85247cf687184642a7597cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8" + "560df97cf8f19066ac502f7d3b971ac06b92637d0a3d21b00677987d4c8c295cc8" + "94ce7db0f79939fd1c037e9c7500883ce4377e039300aa4bdd6d7ee25b404a4faa" + "a27eda72d01ce354d77e908f04e41b2a0d7fbad9826e513a427f299023cae5c876" + "7f3374ac3c1f7bac7fa0c8eb85f3cce17f756c6c727565616c736500c04a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01884a7b003d5f5a4e313073657264" + "655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e31" + "3768386631666565323432343761346639634501435f5a4e313073657264655f6a" + "736f6e3264653231446573657269616c697a6572244c5424522447542435657272" + "6f723137683438663764306565626231623836343145020e5f5f727573745f6465" + "616c6c6f63035b5f5a4e34636f726533666d74336e756d34395f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e44656275672475323024666f72247532" + "302475382447542433666d74313768346234323333323664643863616231354504" + "305f5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "3532316661366566366130363732614505445f5a4e34636f726535736c69636535" + "696e6465783236736c6963655f73746172745f696e6465785f6c656e5f6661696c" + "313768663931613361666538376231643434334506385f5a4e34636f726533666d" + "7439466f726d617474657231327061645f696e74656772616c3137686334656130" + "376130626331333536633445075c5f5a4e34636f726533666d74336e756d35305f" + "244c5424696d706c2475323024636f72652e2e666d742e2e446562756724753230" + "24666f7224753230247533322447542433666d7431376835353339386231363535" + "30643532376545084c5f5a4e34636f726533707472343264726f705f696e5f706c" + "616365244c5424616c6c6f632e2e737472696e672e2e537472696e672447542431" + "37683738323934613239653363373833306445094f5f5a4e34636f726533707472" + "343564726f705f696e5f706c616365244c542473657264655f6a736f6e2e2e6572" + "726f722e2e4572726f722447542431376866383763386436646339616234626335" + "450a4f5f5a4e34636f726533707472343564726f705f696e5f706c616365244c54" + "2473657264655f6a736f6e2e2e76616c75652e2e56616c75652447542431376835" + "333262653330333764613162376564450b81015f5a4e39395f244c5424616c6c6f" + "632e2e636f6c6c656374696f6e732e2e62747265652e2e6d61702e2e4254726565" + "4d6170244c54244b24432456244324412447542424753230246173247532302463" + "6f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031376835" + "346633306630323133646334313362450c645f5a4e37305f244c5424616c6c6f63" + "2e2e7665632e2e566563244c542454244324412447542424753230246173247532" + "3024636f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031" + "376864313538343863353832316334666665450d525f5a4e35335f244c5424636f" + "72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866376165323835356232343964" + "626335450e5f5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" + "475424313077726974655f63686172313768323134333931636238656231353263" + "36450f435f5a4e35616c6c6f63377261775f7665633139526177566563244c5424" + "5424432441244754243867726f775f6f6e65313768363666383634616630346265" + "6432623245105a5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c5424412447542437726573657276653231646f5f72657365727665" + "5f616e645f68616e646c653137683766656665376563326164336435616245115d" + "5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475" + "32302461732475323024636f72652e2e666d742e2e577269746524475424397772" + "6974655f737472313768353939643965353738393436646439384512595f5a4e36" + "305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532302461" + "732475323024636f72652e2e666d742e2e446973706c61792447542433666d7431" + "37686365343232366161316637323663316345132e5f5a4e34636f726533666d74" + "39466f726d61747465723370616431376834373639616533383933373463633531" + "45145d5f5a4e36355f244c542473657264655f6a736f6e2e2e76616c75652e2e56" + "616c7565247532302461732475323024636f72652e2e636d702e2e506172746961" + "6c4571244754243265713137683162323138393234373831393663383045158b01" + "5f5a4e3130385f244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e6274" + "7265652e2e6d61702e2e49746572244c54244b2443245624475424247532302461" + "732475323024636f72652e2e697465722e2e7472616974732e2e6974657261746f" + "722e2e4974657261746f7224475424346e65787431376835363664323036316535" + "6139376461644516615f5a4e36385f244c5424636f72652e2e6e756d2e2e657272" + "6f722e2e5061727365496e744572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863383736363338616561" + "6230633031664517675f5a4e36385f244c5424636f72652e2e666d742e2e627569" + "6c646572732e2e50616441646170746572247532302461732475323024636f7265" + "2e2e666d742e2e5772697465244754243977726974655f73747231376838313862" + "343965376536396132366664451808616c6c6f6361746519435f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542436" + "6d616c6c6f6331376865363539333961346338393763633135451a335f5a4e3561" + "6c6c6f63377261775f766563313268616e646c655f6572726f7231376839376237" + "646264306637326464373838451b0a6465616c6c6f636174651c11636f6d706172" + "655f6163636f756e7449441d325f5a4e313073657264655f6a736f6e3264653130" + "66726f6d5f736c69636531376831316365303837373634633961376230451e5c5f" + "5a4e35355f244c542473747224753230246173247532302473657264655f6a736f" + "6e2e2e76616c75652e2e696e6465782e2e496e646578244754243130696e646578" + "5f696e746f31376864333238633634636161396431376163451f325f5a4e34636f" + "726536726573756c743133756e777261705f6661696c6564313768663839396364" + "303037373637303035314520325f5a4e34636f7265366f7074696f6e3133756e77" + "7261705f6661696c6564313768333535313964653938613737363134664521625f" + "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" + "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" + "7533322447542433666d743137686266336530323238343833653337356145222b" + "5f5a4e3373746432696f35737464696f365f7072696e7431376838316334373231" + "3636303436663066634523385f5a4e35616c6c6f63377261775f76656331376361" + "7061636974795f6f766572666c6f77313768343939643438326139656435373135" + "614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d7431" + "3768363534306363623264356664633361624525415f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243466726565" + "3137683339383334616161616533653839343645262c5f5a4e34636f7265397061" + "6e69636b696e673570616e69633137683034656562393137646439336332323945" + "270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c696e6b" + "5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447" + "54243133646973706f73655f6368756e6b31376836653063636364343538363537" + "343633452a3a5f5a4e34636f72653970616e69636b696e67313870616e69635f62" + "6f756e64735f636865636b31376833643662386161346338303439363632452b11" + "727573745f626567696e5f756e77696e642c465f5a4e34636f726533666d743946" + "6f726d617474657231327061645f696e74656772616c313277726974655f707265" + "66697831376861396134333238306236303036643132452d425f5a4e34636f7265" + "35736c69636535696e6465783234736c6963655f656e645f696e6465785f6c656e" + "5f6661696c31376830383862353665323939626561616166452e3b5f5a4e34636f" + "72653970616e69636b696e6731396173736572745f6661696c65645f696e6e6572" + "31376836663765333235376438346135303432452f475f5a4e34325f244c542424" + "52462454247532302461732475323024636f72652e2e666d742e2e446562756724" + "47542433666d74313768336136626161316262343761643230344530495f5a4e34" + "345f244c54242452462454247532302461732475323024636f72652e2e666d742e" + "2e446973706c61792447542433666d743137683766663464306238363039633234" + "37324531585f5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e" + "7473247532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363861336538653530396361666336344532265f5a4e34" + "636f726533666d7435777269746531376839333535346534626537316632633761" + "45335f5f5a4e34636f726533666d74336e756d35305f244c5424696d706c247532" + "3024636f72652e2e666d742e2e44656275672475323024666f7224753230247533" + "322447542433666d7431376835353339386231363535306435323765452e323534" + "5c5f5a4e36335f244c5424636f72652e2e63656c6c2e2e426f72726f774d757445" + "72726f72247532302461732475323024636f72652e2e666d742e2e446562756724" + "47542433666d74313768313564336433343334626464636363384535395f5a4e34" + "636f72653463656c6c323270616e69635f616c72656164795f626f72726f776564" + "313768333134623532613162633436626665344536405f5a4e34636f726535736c" + "69636535696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "313768353862336536383666653333373030654537325f5a4e34636f7265366f70" + "74696f6e31336578706563745f6661696c65643137686630386139396532643733" + "33366336614538535f5a4e34636f72653463686172376d6574686f647332325f24" + "4c5424696d706c2475323024636861722447542431366573636170655f64656275" + "675f657874313768656366613566303431373437393039384539345f5a4e34636f" + "726537756e69636f6465397072696e7461626c6535636865636b31376836646136" + "346638306663313630633761453a325f5a4e34636f7265337374723136736c6963" + "655f6572726f725f6661696c31376862303364323439386438646362363433453b" + "355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c5f72" + "7431376832616462643139306563313832373933453c645f5a4e37315f244c5424" + "636f72652e2e6f70732e2e72616e67652e2e52616e6765244c5424496478244754" + "24247532302461732475323024636f72652e2e666d742e2e446562756724475424" + "33666d7431376836636632383632303536616535653233453d465f5a4e34315f24" + "4c542463686172247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376865613566643964626339343936626665453e625f" + "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" + "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" + "6933322447542433666d7431376863656439306337613633396330316464453fce" + "015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f64" + "653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e672443244b24" + "432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e" + "6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c2447542432" + "316465616c6c6f636174655f616e645f617363656e643137683538396137326639" + "343233626663656245409a025f5a4e35616c6c6f633131636f6c6c656374696f6e" + "73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e2e63" + "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f646552656624" + "4c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" + "652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e2e63" + "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e" + "496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e45646765244754243130" + "696e736572745f6669743137686338613063663533396566663031313145419202" + "5f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f6465" + "32313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e" + "62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e636f" + "6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4d" + "75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e" + "62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c24475424" + "244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" + "652e2e6d61726b65722e2e4b56244754243573706c697431376864303961343862" + "37613831363331616145425a5f5a4e36315f244c542473657264655f6a736f6e2e" + "2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e666d" + "742e2e44656275672447542433666d743137683430323537643666343265323962" + "37344543595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e4572" + "726f72247532302461732475323024636f72652e2e666d742e2e446973706c6179" + "2447542433666d74313768393032373163376232613663653833394544575f5a4e" + "35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475323024" + "61732475323024636f72652e2e666d742e2e44656275672447542433666d743137" + "686236373265623139396333356431383645453a5f5a4e313073657264655f6a73" + "6f6e32646531325061727365724e756d6265723576697369743137683836623839" + "36383136626131306137654546565f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565336d6170323542547265654d6170244c54244b2443245624" + "4324412447542436696e7365727431376834643164623464613838343264346665" + "4547455f5a4e313073657264655f6a736f6e347265616439536c69636552656164" + "3137706f736974696f6e5f6f665f696e6465783137683236623431383938353234" + "38333239364548695f5a4e37305f244c542473657264655f6a736f6e2e2e726561" + "642e2e536c6963655265616424753230246173247532302473657264655f6a736f" + "6e2e2e726561642e2e52656164244754243970617273655f737472313768616265" + "386335353563386263643335354549475f5a4e313073657264655f6a736f6e3472" + "65616439536c696365526561643139736b69705f746f5f6573636170655f736c6f" + "7731376834373836633665323234666132336632454a465f5a4e35616c6c6f6333" + "7665633136566563244c54245424432441244754243137657874656e645f66726f" + "6d5f736c69636531376864626131346637346638653232366463454b2f5f5a4e31" + "3073657264655f6a736f6e34726561643661735f73747231376866636436626234" + "313731373865366635454c3e5f5a4e313073657264655f6a736f6e347265616432" + "3070617273655f756e69636f64655f657363617065313768393634306663636162" + "64303034613064454d725f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e526561642447542431376465636f64655f6865785f65" + "736361706531376834376265353936383535663830346461454e355f5a4e313073" + "657264655f6a736f6e347265616431317065656b5f6f725f656f66313768373363" + "62313436306531616339386135454f2e5f5a4e313073657264655f6a736f6e3472" + "656164356572726f72313768656635353237643333336339633236664550305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376861333165" + "6164363637646336373865304551325f5a4e35616c6c6f63377261775f76656331" + "3166696e6973685f67726f77313768353338353962613338396237316433354552" + "4b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e6572244c" + "54244124475424313467726f775f616d6f7274697a656431376839386333363466" + "6334356633643132344553435f5a4e35616c6c6f63377261775f76656331395261" + "77566563244c54245424432441244754243867726f775f6f6e6531376866373333" + "3137633566643665626336364554395f5a4e337374643674687265616438546872" + "6561644964336e6577396578686175737465643137683333366266376131343838" + "30343463384555425f5a4e34636f72653463656c6c346f6e636531374f6e636543" + "656c6c244c54245424475424387472795f696e6974313768636536336266323238" + "3531393165373145563e5f5a4e35616c6c6f633473796e633136417263244c5424" + "5424432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394557355f5a4e34636f72653970616e69636b696e6731336173736572" + "745f6661696c6564313768323332363266326333633738623661624558475f5a4e" + "34325f244c54242452462454247532302461732475323024636f72652e2e666d74" + "2e2e44656275672447542433666d74313768653138373433383865303762666532" + "3545595d5f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53747269" + "6e67247532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d7431376863653432323661613166373236633163452e3238335a7a" + "5f5a4e34636f726533707472383864726f705f696e5f706c616365244c54247374" + "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447542424" + "47542431376831363664633631616230333334633165455b495f5a4e3373746434" + "73796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424" + "3130696e697469616c697a6531376837663563353038646139653162303962455c" + "605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e5374646f7574" + "4c6f636b2475323024617324753230247374642e2e696f2e2e5772697465244754" + "243977726974655f616c6c31376832346238323631303436316432353666455d55" + "5f5a4e3373746432696f3862756666657265643962756677726974657231384275" + "66577269746572244c54245724475424313477726974655f616c6c5f636f6c6431" + "376835383462646262616562306662316262455e735f5a4e38305f244c54247374" + "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" + "4c54245424475424247532302461732475323024636f72652e2e666d742e2e5772" + "697465244754243977726974655f73747231376837666163663562633065666364" + "383038455f325f5a4e34636f726533666d74355772697465313077726974655f63" + "686172313768663062336265316563313964653565374560305f5a4e34636f7265" + "33666d743557726974653977726974655f666d7431376866383830386630646630" + "65343531336445610a727573745f70616e696362375f5a4e34636f72653570616e" + "6963313250616e69635061796c6f61643661735f73747231376836313439663134" + "3264396132653032654563505f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c542441244754243138696e736572745f6c61726765" + "5f6368756e6b313768656665383531613237353832646137624564455f5a4e3373" + "746433737973396261636b747261636532365f5f727573745f656e645f73686f72" + "745f6261636b747261636531376834646333646534376432323032316239456558" + "5f5a4e337374643970616e69636b696e673139626567696e5f70616e69635f6861" + "6e646c657232385f24753762242475376224636c6f737572652475376424247537" + "64243137686531376133393737663839633131373845663b5f5a4e337374643970" + "616e69636b696e673230727573745f70616e69635f776974685f686f6f6b313768" + "37373665373963396636353931626535456783015f5a4e39395f244c5424737464" + "2e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e646c65722e" + "2e5374617469635374725061796c6f6164247532302461732475323024636f7265" + "2e2e70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638456888015f5a4e313073657264655f" + "6a736f6e3576616c756532646537375f244c5424696d706c247532302473657264" + "652e2e64652e2e446573657269616c697a652475323024666f7224753230247365" + "7264655f6a736f6e2e2e76616c75652e2e56616c75652447542431316465736572" + "69616c697a65313768333165353137383163383336383735394569535f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "39616234626335452e3331316a3c5f5a4e3573657264653264653756697369746f" + "72313876697369745f626f72726f7765645f737472313768343564373131633837" + "31363863326636456b4f5f5a4e313073657264655f6a736f6e3264653231446573" + "657269616c697a6572244c54245224475424313670617273655f616e795f6e756d" + "62657231376839316435333034653561396363663531456c4a5f5a4e3130736572" + "64655f6a736f6e3264653231446573657269616c697a6572244c54245224475424" + "313170617273655f6964656e743137683663353964643731393635353139313045" + "6d735f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d61704163" + "63657373244c5424522447542424753230246173247532302473657264652e2e64" + "652e2e4d61704163636573732447542431336e6578745f6b65795f736565643137" + "6865363235636133323138363233653036456e755f5a4e37355f244c5424736572" + "64655f6a736f6e2e2e64652e2e4d6170416363657373244c542452244754242475" + "3230246173247532302473657264652e2e64652e2e4d6170416363657373244754" + "2431356e6578745f76616c75655f73656564313768656338353637376538303165" + "39393133456f4b5f5a4e313073657264655f6a736f6e3264653231446573657269" + "616c697a6572244c54245224475424313270617273655f6e756d62657231376837" + "3833613431613462393130646432304570515f5a4e313073657264655f6a736f6e" + "3264653231446573657269616c697a6572244c5424522447542431387061727365" + "5f6c6f6e675f696e74656765723137686438313037386634613331633262653245" + "714c5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a65" + "72244c54245224475424313370617273655f646563696d616c3137683661306333" + "363832326663336530306145724d5f5a4e313073657264655f6a736f6e32646532" + "31446573657269616c697a6572244c54245224475424313470617273655f657870" + "6f6e656e743137683336646437646264323365346134656245734d5f5a4e313073" + "657264655f6a736f6e3264653231446573657269616c697a6572244c5424522447" + "542431346636345f66726f6d5f7061727473313768633863316239626161613836" + "666637334574555f5a4e313073657264655f6a736f6e3264653231446573657269" + "616c697a6572244c54245224475424323270617273655f646563696d616c5f6f76" + "6572666c6f77313768336130306563656466383630313864334575565f5a4e3130" + "73657264655f6a736f6e3264653231446573657269616c697a6572244c54245224" + "475424323370617273655f6578706f6e656e745f6f766572666c6f773137683034" + "3762396637333562616463666138457681015f5a4e37355f244c54247365726465" + "5f6a736f6e2e2e64652e2e4d6170416363657373244c5424522447542424753230" + "246173247532302473657264652e2e64652e2e4d61704163636573732447542431" + "336e6578745f6b65795f7365656431326861735f6e6578745f6b65793137683564" + "61326634303536653538313464394577066d656d636d7078365f5a4e3137636f6d" + "70696c65725f6275696c74696e73336d656d376d656d6d6f766531376863383366" + "3931363866353238616565364579076d656d6d6f76657a066d656d637079071201" + "000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100550970" + "726f64756365727302086c616e6775616765010452757374000c70726f63657373" + "65642d62790105727573746325312e38332e302d6e696768746c79202863326637" + "346333663920323032342d30392d30392900490f7461726765745f666561747572" + "6573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b" + "0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::string escrow_tx_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; + + std::vector escrow_tx_json_data( + escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", + "Data" : "02" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasmP4( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + { + auto reValue = re.value(); + // std::cout << reValue.first << " " << + // reValue.second + // << std::endl; + BEAST_EXPECT(!reValue.first); + BEAST_EXPECT(reValue.second == "1"); + } + } + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", + "Data" : "1" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasmP4( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + { + auto reValue = re.value(); + // std::cout << reValue.first << " " << + // reValue.second + // << std::endl; + BEAST_EXPECT(reValue.first); + BEAST_EXPECT(reValue.second == "0"); + } + } + } + + void + testEscrowWasmP5() + { + testcase("escrow wasm P5 test"); + auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + struct TestLedgerDataProvider : public LedgerDataProvider + { + Env* env; + + public: + TestLedgerDataProvider(Env* env) : env(env) + { + } + + int32_t + get_ledger_sqn() override + { + return (int32_t)env->current()->seq(); + } + }; + Env env{*this}; + TestLedgerDataProvider ledgerDataProvider(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + + env.close(); + env.close(); + env.close(); + env.close(); + + re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + + void + testEscrowWasmP6() + { + testcase("escrow wasm P6 test"); + auto wasmHex = + "0061736d010000000109026000017f60017f0002150108686f73745f6c69620863" + "6f6e7374496e74000003030201010405017001010105030100100619037f014180" + "80c0000b7f00418080c0000b7f00418080c0000b073e05066d656d6f7279020007" + "6c6f6f70696e6700010c6c6f6f70696e675f686f737400020a5f5f646174615f65" + "6e6403010b5f5f686561705f6261736503020a1a0202000b150003401080808080" + "001a2000417f6a22000d000b0b0077046e616d65000e0d7761736d5f6c69622e77" + "61736d014c0300325f5a4e387761736d5f6c696238686f73745f6c696238636f6e" + "7374496e74313768643939653133366665323437376662344501076c6f6f70696e" + "67020c6c6f6f70696e675f686f7374071201000f5f5f737461636b5f706f696e74" + "657200550970726f64756365727302086c616e6775616765010452757374000c70" + "726f6365737365642d62790105727573746325312e38332e302d6e696768746c79" + "202863326637346333663920323032342d30392d30392900490f7461726765745f" + "6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + { + std::string funcName("looping"); + auto re = runEscrowWasm(wasm, funcName, 1000, 500); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re.value().result); + std::cout << re.value().cost << std::endl; + } + } + { + std::string funcName("looping_host"); + auto re = runEscrowWasm(wasm, funcName, 1000, 50); + BEAST_EXPECT(!re.has_value()); + } + } + + void + run() override + { + using namespace test::jtx; + + testWasmtimeLib(); + testEscrowWasmP0(); + testBadWasm(); + testEscrowWasmP1(); + testEscrowWasmP2P3(); + testEscrowWasmP4(); + testEscrowWasmP5(); + testEscrowWasmP6(); + } +}; + +BEAST_DEFINE_TESTSUITE(Wasm, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index d81551aa840..262c6ebeb8f 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -343,6 +343,33 @@ struct fulfillment } }; +struct finish_function +{ +private: + std::string value_; + +public: + explicit finish_function(std::string func) : value_(func) + { + } + + explicit finish_function(Slice const& func) : value_(strHex(func)) + { + } + + template + explicit finish_function(std::array const& f) + : finish_function(makeSlice(f)) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfFinishFunction.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index 1309a523934..fd4949d5a44 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -36,6 +36,8 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); + cfg.FEES.extension_compute_limit = 4294967295; + cfg.FEES.extension_size_limit = 4294967295; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 3f804adda64..662442676f0 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -515,6 +515,22 @@ class Subscribe_test : public beast::unit_test::suite if (jv.isMember(jss::reserve_inc) != isFlagLedger) return false; + if (env.closed()->rules().enabled(featureSmartEscrow)) + { + if (jv.isMember(jss::extension_compute) != isFlagLedger) + return false; + + if (jv.isMember(jss::extension_size) != isFlagLedger) + return false; + } + else + { + if (jv.isMember(jss::extension_compute)) + return false; + + if (jv.isMember(jss::extension_size)) + return false; + } return true; }; @@ -1298,14 +1314,14 @@ class Subscribe_test : public beast::unit_test::suite { using namespace test::jtx; FeatureBitset const all{supported_amendments()}; - FeatureBitset const xrpFees{featureXRPFees}; testServer(); testLedger(); testTransactions_APIv1(); testTransactions_APIv2(); testManifests(); - testValidations(all - xrpFees); + testValidations(all - featureXRPFees - featureSmartEscrow); + testValidations(all - featureSmartEscrow); testValidations(all); testSubErrors(true); testSubErrors(false); diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 90e77c1e3d0..852f73cde14 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -230,6 +230,14 @@ Ledger::Ledger( sle->at(sfReserveIncrement) = *f; sle->at(sfReferenceFeeUnits) = Config::FEE_UNITS_DEPRECATED; } + if (std::find( + amendments.begin(), amendments.end(), featureSmartEscrow) != + amendments.end()) + { + sle->at(sfExtensionComputeLimit) = + config.FEES.extension_compute_limit; + sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + } rawInsert(sle); } @@ -621,6 +629,7 @@ Ledger::setup() { bool oldFees = false; bool newFees = false; + bool extensionFees = false; { auto const baseFee = sle->at(~sfBaseFee); auto const reserveBase = sle->at(~sfReserveBase); @@ -638,6 +647,7 @@ Ledger::setup() auto const reserveBaseXRP = sle->at(~sfReserveBaseDrops); auto const reserveIncrementXRP = sle->at(~sfReserveIncrementDrops); + auto assign = [&ret]( XRPAmount& dest, std::optional const& src) { @@ -654,12 +664,32 @@ Ledger::setup() assign(fees_.increment, reserveIncrementXRP); newFees = baseFeeXRP || reserveBaseXRP || reserveIncrementXRP; } + { + auto const extensionComputeLimit = + sle->at(~sfExtensionComputeLimit); + auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + + auto assign = [](std::uint32_t& dest, + std::optional const& src) { + if (src) + { + dest = src.value(); + } + }; + assign(fees_.extensionComputeLimit, extensionComputeLimit); + assign(fees_.extensionSizeLimit, extensionSizeLimit); + extensionFees = extensionComputeLimit || extensionSizeLimit; + } if (oldFees && newFees) // Should be all of one or the other, but not both ret = false; if (!rules_.enabled(featureXRPFees) && newFees) // Can't populate the new fees before the amendment is enabled ret = false; + if (!rules_.enabled(featureSmartEscrow) && extensionFees) + // Can't populate the extension fees before the amendment is + // enabled + ret = false; } } catch (SHAMapMissingNode const&) @@ -678,15 +708,17 @@ Ledger::setup() void Ledger::defaultFees(Config const& config) { - XRPL_ASSERT( - fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0, - "ripple::Ledger::defaultFees : zero fees"); + assert( + fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) fees_.reserve = config.FEES.account_reserve; - if (fees_.increment == 0) - fees_.increment = config.FEES.owner_reserve; + if (fees_.extensionComputeLimit == 0) + fees_.extensionComputeLimit = config.FEES.extension_compute_limit; + if (fees_.extensionSizeLimit == 0) + fees_.extensionSizeLimit = config.FEES.extension_size_limit; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 95160f398a1..5583b688621 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -29,10 +29,10 @@ namespace ripple { namespace detail { +template class VotableValue { private: - using value_type = XRPAmount; value_type const current_; // The current setting value_type const target_; // The setting we want std::map voteMap_; @@ -67,8 +67,9 @@ class VotableValue getVotes() const; }; -auto -VotableValue::getVotes() const -> std::pair +template +std::pair +VotableValue::getVotes() const { value_type ourVote = current_; int weight = 0; @@ -191,6 +192,32 @@ FeeVoteImpl::doValidation( "reserve increment", sfReserveIncrement); } + if (rules.enabled(featureSmartEscrow)) + { + auto vote = [&v, this]( + auto const current, + std::uint32_t target, + const char* name, + auto const& sfield) { + if (current != target) + { + JLOG(journal_.info()) + << "Voting for " << name << " of " << target; + + v[sfield] = target; + } + }; + vote( + lastFees.extensionComputeLimit, + target_.extension_compute_limit, + "extension compute limit", + sfExtensionComputeLimit); + vote( + lastFees.extensionSizeLimit, + target_.extension_size_limit, + "extension size limit", + sfExtensionSizeLimit); + } } void @@ -213,11 +240,19 @@ FeeVoteImpl::doVoting( detail::VotableValue incReserveVote( lastClosedLedger->fees().increment, target_.owner_reserve); + detail::VotableValue extensionComputeVote( + lastClosedLedger->fees().extensionComputeLimit, + target_.extension_compute_limit); + + detail::VotableValue extensionSizeVote( + lastClosedLedger->fees().extensionSizeLimit, + target_.extension_size_limit); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, SF_AMOUNT const& xrpField) { if (auto const field = ~val->at(~xrpField); field && field->native()) @@ -246,7 +281,7 @@ FeeVoteImpl::doVoting( else { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, auto const& valueField) { if (auto const field = val->at(~valueField)) { @@ -277,6 +312,29 @@ FeeVoteImpl::doVoting( doVote(val, incReserveVote, sfReserveIncrement); } } + if (rules.enabled(featureSmartEscrow)) + { + auto doVote = [](std::shared_ptr const& val, + detail::VotableValue& value, + SF_UINT32 const& extensionField) { + if (auto const field = ~val->at(~extensionField); field) + { + value.addVote(field.value()); + } + else + { + value.noVote(); + } + }; + + for (auto const& val : set) + { + if (!val->isTrusted()) + continue; + doVote(val, extensionComputeVote, sfExtensionComputeLimit); + doVote(val, extensionSizeVote, sfExtensionSizeLimit); + } + } // choose our positions // TODO: Use structured binding once LLVM 16 is the minimum supported @@ -285,11 +343,14 @@ FeeVoteImpl::doVoting( auto const baseFee = baseFeeVote.getVotes(); auto const baseReserve = baseReserveVote.getVotes(); auto const incReserve = incReserveVote.getVotes(); + auto const extensionCompute = extensionComputeVote.getVotes(); + auto const extensionSize = extensionSizeVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position - if (baseFee.second || baseReserve.second || incReserve.second) + if (baseFee.second || baseReserve.second || incReserve.second || + extensionCompute.second || extensionSize.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -317,6 +378,11 @@ FeeVoteImpl::doVoting( incReserveVote.current()); obj[sfReferenceFeeUnits] = Config::FEE_UNITS_DEPRECATED; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = extensionCompute.first; + obj[sfExtensionSizeLimit] = extensionSize.first; + } }); uint256 txID = feeTx.getTransactionID(); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index d46bfa74db6..2b3c38eea4c 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2262,6 +2262,15 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) reserveIncXRP && reserveIncXRP->native()) jvObj[jss::reserve_inc] = reserveIncXRP->xrp().jsonClipped(); + if (auto const extensionComputeLimit = + ~val->at(~sfExtensionComputeLimit); + extensionComputeLimit) + jvObj[jss::extension_compute] = *extensionComputeLimit; + + if (auto const extensionSizeLimit = ~val->at(~sfExtensionSizeLimit); + extensionSizeLimit) + jvObj[jss::extension_size] = *extensionSizeLimit; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2711,12 +2720,21 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::seq] = Json::UInt(lpClosed->info().seq); l[jss::hash] = to_string(lpClosed->info().hash); + bool const smartEscrowEnabled = + m_ledgerMaster.getValidatedLedger()->rules().enabled( + featureSmartEscrow); if (!human) { l[jss::base_fee] = baseFee.jsonClipped(); l[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); l[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); } @@ -2726,6 +2744,12 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::reserve_base_xrp] = lpClosed->fees().accountReserve(0).decimalXRP(); l[jss::reserve_inc_xrp] = lpClosed->fees().increment.decimalXRP(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } if (auto const closeOffset = app_.timeKeeper().closeOffset(); std::abs(closeOffset.count()) >= 60) @@ -2911,6 +2935,13 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().accountReserve(0).jsonClipped(); jvObj[jss::reserve_inc] = lpAccepted->fees().increment.jsonClipped(); + if (lpAccepted->rules().enabled(featureSmartEscrow)) + { + jvObj[jss::extension_compute] = + lpAccepted->fees().extensionComputeLimit; + jvObj[jss::extension_size] = + lpAccepted->fees().extensionSizeLimit; + } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -3947,6 +3978,12 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (lpClosed->rules().enabled(featureSmartEscrow)) + { + jvResult[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } } if ((mMode >= OperatingMode::SYNCING) && !isNeedNetworkLedger()) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp new file mode 100644 index 00000000000..d94135646b0 --- /dev/null +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -0,0 +1,592 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +// WasmVM::WasmVM(beast::Journal j) +// : j_(j) +//{ +// } + +namespace ripple { +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t input) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; + WasmEdge_Value Returns[1]; + WasmEdge_String FuncName = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( + VMCxt, + wasmCode.data(), + wasmCode.size(), + FuncName, + Params, + 1, + Returns, + 1); + + bool ok = WasmEdge_ResultOK(Res); + bool re = false; + if (ok) + { + auto result = WasmEdge_ValueGetI32(Returns[0]); + // printf("Get the result: %d\n", result); + if (result != 0) + re = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(FuncName); + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& accountID) +{ + auto dataLen = (int32_t)accountID.size(); + // printf("accountID size: %d\n", dataLen); + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + WasmEdge_Result allocRes = WasmEdge_VMRunWasmFromBuffer( + VMCxt, + wasmCode.data(), + wasmCode.size(), + allocFunc, + allocParams, + 1, + allocReturns, + 1); + + bool ok = WasmEdge_ResultOK(allocRes); + bool re = false; + if (ok) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("Alloc pointer: %d\n", pointer); + + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, accountID.data(), pointer, dataLen); + + ok = WasmEdge_ResultOK(setRes); + if (ok) + { + // printf("Set data ok\n"); + + WasmEdge_Value params[2] = { + WasmEdge_ValueGenI32(pointer), WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = + WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 2, returns, 1); + + ok = WasmEdge_ResultOK(funcRes); + if (ok) + { + // printf("func ok\n"); + re = (WasmEdge_ValueGetI32(returns[0]) == 1); + } + else + { + printf( + "Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + } + else + { + printf( + "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); + } + } + else + { + printf( + "Alloc error message: %s\n", WasmEdge_ResultGetMessage(allocRes)); + } + + WasmEdge_VMDelete(VMCxt); + // TODO free everything + // WasmEdge_StringDelete(FuncName); + if (ok) + { + // printf("runEscrowWasm ok, result %d\n", re); + return re; + } + else + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { + auto dataLen = (int32_t)data.size(); + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + + WasmEdge_Result allocRes = WasmEdge_VMExecute( + VMCxt, allocFunc, allocParams, 1, allocReturns, 1); + + if (WasmEdge_ResultOK(allocRes)) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("alloc ptr %d, len %d\n", pointer, dataLen); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, data.data(), pointer, dataLen); + if (WasmEdge_ResultOK(setRes)) + { + return pointer; + } + } + + return 0; + }; + + auto tx_ptr = wasmAlloc(escrow_tx_json_data); + auto lo_ptr = wasmAlloc(escrow_lo_json_data); + if (tx_ptr == 0 || lo_ptr == 0) + { + printf("data error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto txLen = (int32_t)escrow_tx_json_data.size(); + auto loLen = (int32_t)escrow_lo_json_data.size(); + + WasmEdge_Value params[4] = { + WasmEdge_ValueGenI32(tx_ptr), + WasmEdge_ValueGenI32(txLen), + WasmEdge_ValueGenI32(lo_ptr), + WasmEdge_ValueGenI32(loLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); + + if (WasmEdge_ResultOK(funcRes)) + { + // printf("func ok\n"); + return WasmEdge_ValueGetI32(returns[0]) == 1; + } + else + { + printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + return Unexpected(tecFAILED_PROCESSING); + } +} + +Expected, TER> +runEscrowWasmP4( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { + auto dataLen = (int32_t)data.size(); + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + + WasmEdge_Result allocRes = WasmEdge_VMExecute( + VMCxt, allocFunc, allocParams, 1, allocReturns, 1); + + if (WasmEdge_ResultOK(allocRes)) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("alloc ptr %d, len %d\n", pointer, dataLen); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, data.data(), pointer, dataLen); + if (WasmEdge_ResultOK(setRes)) + { + return pointer; + } + } + + return 0; + }; + + auto tx_ptr = wasmAlloc(escrow_tx_json_data); + auto lo_ptr = wasmAlloc(escrow_lo_json_data); + if (tx_ptr == 0 || lo_ptr == 0) + { + printf("data error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto txLen = (int32_t)escrow_tx_json_data.size(); + auto loLen = (int32_t)escrow_lo_json_data.size(); + + WasmEdge_Value params[4] = { + WasmEdge_ValueGenI32(tx_ptr), + WasmEdge_ValueGenI32(txLen), + WasmEdge_ValueGenI32(lo_ptr), + WasmEdge_ValueGenI32(loLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); + + if (WasmEdge_ResultOK(funcRes)) + { + auto pointer = WasmEdge_ValueGetI32(returns[0]); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + uint8_t buff[9]; + WasmEdge_Result getRes = + WasmEdge_MemoryInstanceGetData(mi, buff, pointer, 9); + if (!WasmEdge_ResultOK(getRes)) + { + printf( + "re mem get message: %s\n", WasmEdge_ResultGetMessage(getRes)); + return Unexpected(tecFAILED_PROCESSING); + } + auto flag = buff[0]; + + auto leToInt32 = [](const uint8_t* d) -> uint32_t { + uint32_t r = 0; + for (int i = 0; i < 4; ++i) + { + r |= static_cast(d[i]) << (i * 8); + // printf("leToInt32 %d\n", r); + } + return r; + }; + auto ret_pointer = + leToInt32(reinterpret_cast(&buff[1])); + auto ret_len = leToInt32(reinterpret_cast(&buff[5])); + // printf("re flag %d, ptr %d, len %d\n", flag, ret_pointer, + // ret_len); + + std::vector buff2(ret_len); + getRes = WasmEdge_MemoryInstanceGetData( + mi, buff2.data(), ret_pointer, ret_len); + if (!WasmEdge_ResultOK(getRes)) + { + printf( + "re 2 mem get message: %s\n", + WasmEdge_ResultGetMessage(getRes)); + return Unexpected(tecFAILED_PROCESSING); + } + + std::string newData(buff2.begin(), buff2.end()); + + // free + WasmEdge_String freeFunc = WasmEdge_StringCreateByCString("deallocate"); + WasmEdge_Value freeParams[2] = { + WasmEdge_ValueGenI32(ret_pointer), WasmEdge_ValueGenI32(ret_len)}; + WasmEdge_Value freeReturns[0]; + WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + // free pointer too, with len = 9 too + freeParams[0] = WasmEdge_ValueGenI32(pointer); + freeParams[1] = WasmEdge_ValueGenI32(9); + WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + + return std::pair(flag == 1, newData); + } + else + { + printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + return Unexpected(tecFAILED_PROCESSING); + } +} + +WasmEdge_Result +get_ledger_sqn( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + Out[0] = + WasmEdge_ValueGenI32(((LedgerDataProvider*)data)->get_ledger_sqn()); + return WasmEdge_Result_Success; +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + LedgerDataProvider* ledgerDataProvider) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + { // register host function + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate( + HostFType, get_ledger_sqn, ledgerDataProvider, 0); + WasmEdge_FunctionTypeDelete(HostFType); + + WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* HostMod = + WasmEdge_ModuleInstanceCreate(HostName); + WasmEdge_StringDelete(HostName); + + WasmEdge_String HostFuncName = + WasmEdge_StringCreateByCString("get_ledger_sqn"); + WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_Result regRe = + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + if (!WasmEdge_ResultOK(regRe)) + { + printf("host func reg error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + } + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Value funcReturns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); + + bool ok = WasmEdge_ResultOK(funcRes); + bool re = false; + if (ok) + { + auto result = WasmEdge_ValueGetI32(funcReturns[0]); + if (result != 0) + re = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(func); + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +WasmEdge_Result +constInt( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + Out[0] = WasmEdge_ValueGenI32(5); + return WasmEdge_Result_Success; +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t gasLimit, + int32_t input) +{ + WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); + WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); + WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); + + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); + WasmEdge_StatisticsContext* StatCxt = + WasmEdge_VMGetStatisticsContext(VMCxt); + WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); + + { // register host function + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate(HostFType, constInt, nullptr, 100); + WasmEdge_FunctionTypeDelete(HostFType); + + WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* HostMod = + WasmEdge_ModuleInstanceCreate(HostName); + WasmEdge_StringDelete(HostName); + + WasmEdge_String HostFuncName = + WasmEdge_StringCreateByCString("constInt"); + WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_Result regRe = + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + if (!WasmEdge_ResultOK(regRe)) + { + printf("host func reg error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + } + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, Params, 1, NULL, 0); + + bool ok = WasmEdge_ResultOK(funcRes); + EscrowResultP6 re; + if (ok) + { + auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); + re.cost = WasmEdge_StatisticsGetTotalCost(sc); + // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount + re.result = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(func); + // delete other obj allocated + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h new file mode 100644 index 00000000000..37988a97e3a --- /dev/null +++ b/src/xrpld/app/misc/WasmVM.h @@ -0,0 +1,97 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#ifndef RIPPLE_APP_MISC_WASMVM_H_INLCUDED +#define RIPPLE_APP_MISC_WASMVM_H_INLCUDED + +#include +// #include +#include + +#include + +namespace ripple { + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t input); + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& accountID); + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data); + +Expected, TER> +runEscrowWasmP4( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data); + +struct LedgerDataProvider +{ + virtual int32_t + get_ledger_sqn() + { + return 1; + } + + virtual ~LedgerDataProvider() = default; +}; + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + LedgerDataProvider* ledgerDataProvider); + +struct EscrowResultP6 +{ + bool result; + int32_t cost; +}; + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t gasLimit, + int32_t input); + +} // namespace ripple +#endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED + +// class WasmVM final +//{ +// public: +// explicit WasmVM(beast::Journal j); +// ~WasmVM() = default; +// +// private: +// beast::Journal j_; +// }; \ No newline at end of file diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index 45834742c8e..2f5d1c6e317 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -128,6 +128,18 @@ Change::preclaim(PreclaimContext const& ctx) ctx.tx.isFieldPresent(sfReserveIncrementDrops)) return temDISABLED; } + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + !ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + return temMALFORMED; + } + else + { + if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + return temDISABLED; + } return tesSUCCESS; case ttAMENDMENT: case ttUNL_MODIFY: @@ -375,6 +387,11 @@ Change::applyFee() set(feeObject, ctx_.tx, sfReserveBase); set(feeObject, ctx_.tx, sfReserveIncrement); } + if (view().rules().enabled(featureSmartEscrow)) + { + set(feeObject, ctx_.tx, sfExtensionComputeLimit); + set(feeObject, ctx_.tx, sfExtensionSizeLimit); + } view().update(feeObject); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 48b9867d3a0..41b51b295f5 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -97,9 +98,28 @@ EscrowCreate::makeTxConsequences(PreflightContext const& ctx) return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()}; } +XRPAmount +EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount txnFees{Transactor::calculateBaseFee(view, tx)}; + if (tx.isFieldPresent(sfFinishFunction)) + { + // TODO: make this fee increase based on the extra compute run + txnFees += 1000; + } + return txnFees; +} + NotTEC EscrowCreate::preflight(PreflightContext const& ctx) { + if (ctx.tx.isFieldPresent(sfFinishFunction) && + !ctx.rules.enabled(featureSmartEscrow)) + { + JLOG(ctx.j.debug()) << "SmartEscrow not enabled"; + return temDISABLED; + } + if (ctx.rules.enabled(fix1543) && ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; @@ -122,14 +142,23 @@ EscrowCreate::preflight(PreflightContext const& ctx) ctx.tx[sfCancelAfter] <= ctx.tx[sfFinishAfter]) return temBAD_EXPIRATION; + if (ctx.tx.isFieldPresent(sfFinishFunction) && + !ctx.tx.isFieldPresent(sfCancelAfter)) + return temBAD_EXPIRATION; + if (ctx.rules.enabled(fix1571)) { // In the absence of a FinishAfter, the escrow can be finished // immediately, which can be confusing. When creating an escrow, // we want to ensure that either a FinishAfter time is explicitly // specified or a completion condition is attached. - if (!ctx.tx[~sfFinishAfter] && !ctx.tx[~sfCondition]) + if (!ctx.tx[~sfFinishAfter] && !ctx.tx[~sfCondition] && + !ctx.tx[~sfFinishFunction]) + { + JLOG(ctx.j.debug()) << "Must have at least one of FinishAfter, " + "Condition, or FinishFunction."; return temMALFORMED; + } } if (auto const cb = ctx.tx[~sfCondition]) @@ -154,6 +183,19 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temDISABLED; } + if (ctx.tx.isFieldPresent(sfFinishFunction)) + { + auto const code = ctx.tx.getFieldVL(sfFinishFunction); + if (code.size() == 0 || + code.size() > ctx.app.config().FEES.extension_size_limit) + { + JLOG(ctx.j.debug()) + << "EscrowCreate.FinishFunction bad size " << code.size(); + return temMALFORMED; + } + // TODO: add check to ensure this is valid WASM code + } + return preflight2(ctx); } @@ -254,6 +296,8 @@ EscrowCreate::doApply() (*slep)[~sfCancelAfter] = ctx_.tx[~sfCancelAfter]; (*slep)[~sfFinishAfter] = ctx_.tx[~sfFinishAfter]; (*slep)[~sfDestinationTag] = ctx_.tx[~sfDestinationTag]; + (*slep)[~sfFinishFunction] = ctx_.tx[~sfFinishFunction]; + (*slep)[~sfData] = ctx_.tx[~sfData]; ctx_.view().insert(slep); @@ -277,8 +321,13 @@ EscrowCreate::doApply() } // Deduct owner's balance, increment owner count + // TODO: determine actual reserve based on FinishFunction size (*sle)[sfBalance] = (*sle)[sfBalance] - ctx_.tx[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, 1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + ctx_.tx.isFieldPresent(sfFinishFunction) ? 2 : 1, + ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; @@ -323,7 +372,10 @@ EscrowFinish::preflight(PreflightContext const& ctx) // If you specify a condition, then you must also specify // a fulfillment. if (static_cast(cb) != static_cast(fb)) + { + JLOG(ctx.j.debug()) << "Condition != Fulfillment"; return temMALFORMED; + } // Verify the transaction signature. If it doesn't work // then don't do any more work. @@ -367,6 +419,7 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } + // TODO: make this fee increase based on the extra compute run return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -384,6 +437,22 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } +struct EscrowLedgerDataProvider : public LedgerDataProvider +{ + ApplyView& view_; + +public: + EscrowLedgerDataProvider(ApplyView& view) : view_(view) + { + } + + int32_t + get_ledger_sqn() override + { + return (int32_t)view_.seq(); + } +}; + TER EscrowFinish::doApply() { @@ -392,6 +461,13 @@ EscrowFinish::doApply() if (!slep) return tecNO_TARGET; + // Order of processing the release conditions (in order of performance): + // FinishAfter/CancelAfter + // Destination validity (after SmartEscrow is enabled) + // Condition/Fulfillment + // Destination validity (before SmartEscrow is enabled) + // FinishFunction + // If a cancel time is present, a finish operation should only succeed prior // to that time. fix1571 corrects a logic error in the check that would make // a finish only succeed strictly after the cancel time. @@ -401,11 +477,17 @@ EscrowFinish::doApply() // Too soon: can't execute before the finish time if ((*slep)[~sfFinishAfter] && !after(now, (*slep)[sfFinishAfter])) + { + JLOG(j_.debug()) << "Too soon"; return tecNO_PERMISSION; + } // Too late: can't execute after the cancel time if ((*slep)[~sfCancelAfter] && after(now, (*slep)[sfCancelAfter])) + { + JLOG(j_.debug()) << "Too late"; return tecNO_PERMISSION; + } } else { @@ -413,13 +495,35 @@ EscrowFinish::doApply() if ((*slep)[~sfFinishAfter] && ctx_.view().info().parentCloseTime.time_since_epoch().count() <= (*slep)[sfFinishAfter]) + { + JLOG(j_.debug()) << "Too soon?"; return tecNO_PERMISSION; + } // Too late? if ((*slep)[~sfCancelAfter] && ctx_.view().info().parentCloseTime.time_since_epoch().count() <= (*slep)[sfCancelAfter]) + { + JLOG(j_.debug()) << "Too late?"; return tecNO_PERMISSION; + } + } + + AccountID const destID = (*slep)[sfDestination]; + auto const sled = ctx_.view().peek(keylet::account(destID)); + if (ctx_.view().rules().enabled(featureSmartEscrow)) + { + // NOTE: Escrow payments cannot be used to fund accounts. + if (!sled) + return tecNO_DST; + + if (ctx_.view().rules().enabled(featureDepositAuth)) + { + if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + !isTesSuccess(err)) + return err; + } } // Check cryptocondition fulfillment @@ -469,17 +573,56 @@ EscrowFinish::doApply() return tecCRYPTOCONDITION_ERROR; } - // NOTE: Escrow payments cannot be used to fund accounts. - AccountID const destID = (*slep)[sfDestination]; - auto const sled = ctx_.view().peek(keylet::account(destID)); - if (!sled) - return tecNO_DST; + if (!ctx_.view().rules().enabled(featureSmartEscrow)) + { + // NOTE: Escrow payments cannot be used to fund accounts. + if (!sled) + return tecNO_DST; - if (ctx_.view().rules().enabled(featureDepositAuth)) + if (ctx_.view().rules().enabled(featureDepositAuth)) + { + if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + !isTesSuccess(err)) + return err; + } + } + + // Execute custom release function + if ((*slep)[~sfFinishFunction]) { - if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); - !isTesSuccess(err)) - return err; + JLOG(j_.trace()) + << "The escrow has a finish function, running WASM code..."; + // WASM execution + auto const wasmStr = slep->getFieldVL(sfFinishFunction); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("ready"); + + auto const escrowTx = + ctx_.tx.getJson(JsonOptions::none).toStyledString(); + auto const escrowObj = + slep->getJson(JsonOptions::none).toStyledString(); + std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); + std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); + + EscrowLedgerDataProvider ledgerDataProvider(ctx_.view()); + + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + JLOG(j_.trace()) << "Escrow WASM ran"; + if (re.has_value()) + { + auto reValue = re.value(); + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue); + if (!reValue) + { + // ctx_.view().update(slep); + return tecWASM_REJECTED; + } + } + else + { + JLOG(j_.debug()) << "WASM Failure: " + transHuman(re.error()); + return re.error(); + } } AccountID const account = (*slep)[sfAccount]; @@ -512,7 +655,11 @@ EscrowFinish::doApply() // Adjust source owner count auto const sle = ctx_.view().peek(keylet::account(account)); - adjustOwnerCount(ctx_.view(), sle, -1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + slep->isFieldPresent(sfFinishFunction) ? -2 : -1, + ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger @@ -594,7 +741,11 @@ EscrowCancel::doApply() // Transfer amount back to owner, decrement owner count auto const sle = ctx_.view().peek(keylet::account(account)); (*sle)[sfBalance] = (*sle)[sfBalance] + (*slep)[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, -1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + slep->isFieldPresent(sfFinishFunction) ? -2 : -1, + ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger diff --git a/src/xrpld/app/tx/detail/Escrow.h b/src/xrpld/app/tx/detail/Escrow.h index 78acdbee00c..0a74f31b3a4 100644 --- a/src/xrpld/app/tx/detail/Escrow.h +++ b/src/xrpld/app/tx/detail/Escrow.h @@ -36,6 +36,9 @@ class EscrowCreate : public Transactor static TxConsequences makeTxConsequences(PreflightContext const& ctx); + static XRPAmount + calculateBaseFee(ReadView const& view, STTx const& tx); + static NotTEC preflight(PreflightContext const& ctx); diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index 9d3e9e39460..f192126387d 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -831,6 +831,22 @@ removeExpiredCredentials( } } +static void +modifyWasmDataFields( + ApplyView& view, + std::vector> const& wasmObjects, + beast::Journal viewJ) +{ + for (auto const& [index, data] : wasmObjects) + { + if (auto const sle = view.peek(keylet::escrow(index))) + { + sle->setFieldVL(sfData, data); + view.update(sle); + } + } +} + static void removeDeletedTrustLines( ApplyView& view, @@ -973,6 +989,7 @@ Transactor::operator()() else if ( (result == tecOVERSIZE) || (result == tecKILLED) || (result == tecINCOMPLETE) || (result == tecEXPIRED) || + (result == tecWASM_REJECTED) || (isTecClaimHardFail(result, view().flags()))) { JLOG(j_.trace()) << "reapplying because of " << transToken(result); @@ -985,13 +1002,16 @@ Transactor::operator()() std::vector removedTrustLines; std::vector expiredNFTokenOffers; std::vector expiredCredentials; + std::vector> modifiedWasmObjects; bool const doOffers = ((result == tecOVERSIZE) || (result == tecKILLED)); bool const doLines = (result == tecINCOMPLETE); bool const doNFTokenOffers = (result == tecEXPIRED); bool const doCredentials = (result == tecEXPIRED); - if (doOffers || doLines || doNFTokenOffers || doCredentials) + bool const doWasmData = (result == tecWASM_REJECTED); + if (doOffers || doLines || doNFTokenOffers || doCredentials || + doWasmData) { ctx_.visit([doOffers, &removedOffers, @@ -1000,7 +1020,9 @@ Transactor::operator()() doNFTokenOffers, &expiredNFTokenOffers, doCredentials, - &expiredCredentials]( + &expiredCredentials, + doWasmData, + &modifiedWasmObjects]( uint256 const& index, bool isDelete, std::shared_ptr const& before, @@ -1035,6 +1057,13 @@ Transactor::operator()() (before->getType() == ltCREDENTIAL)) expiredCredentials.push_back(index); } + + if (doWasmData && before && after && + (before->getType() == ltESCROW)) + { + modifiedWasmObjects.push_back( + std::make_pair(index, after->getFieldVL(sfData))); + } }); } @@ -1064,6 +1093,10 @@ Transactor::operator()() removeExpiredCredentials( view(), expiredCredentials, ctx_.app.journal("View")); + if (result == tecWASM_REJECTED) + modifyWasmDataFields( + view(), modifiedWasmObjects, ctx_.app.journal("View")); + applied = isTecClaim(result); } diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 4329632b2e2..c0cedcc1a47 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -80,6 +80,12 @@ struct FeeSetup /** The per-owned item reserve requirement in drops. */ XRPAmount owner_reserve{2 * DROPS_PER_XRP}; + /** The compute limit for Feature Extensions. */ + std::uint32_t extension_compute_limit{4294967295}; + + /** The WASM size limit for Feature Extensions. */ + std::uint32_t extension_size_limit{4294967295}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index b6375f1a9b5..6a34b1db91f 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1102,6 +1102,10 @@ setup_FeeVote(Section const& section) setup.account_reserve = temp; if (set(temp, "owner_reserve", section)) setup.owner_reserve = temp; + if (set(temp, "extension_compute_limit", section)) + setup.extension_compute_limit = temp; + if (set(temp, "extension_size_limit", section)) + setup.extension_size_limit = temp; } return setup; } From 911c0466c0d6500830652046ded798a7d1ffcb60 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 16:47:14 -0400 Subject: [PATCH 02/73] Merge develop into ripple/smart-escrow (#5357) * Set version to 2.4.0 * refactor: Remove unused and add missing includes (#5293) The codebase is filled with includes that are unused, and which thus can be removed. At the same time, the files often do not include all headers that contain the definitions used in those files. This change uses clang-format and clang-tidy to clean up the includes, with minor manual intervention to ensure the code compiles on all platforms. * refactor: Calculate numFeatures automatically (#5324) Requiring manual updates of numFeatures is an annoying manual process that is easily forgotten, and leads to frequent merge conflicts. This change takes advantage of the `XRPL_FEATURE` and `XRPL_FIX` macros, and adds a new `XRPL_RETIRE` macro to automatically set `numFeatures`. * refactor: Improve ordering of headers with clang-format (#5343) Removes all manual header groupings from source and header files by leveraging clang-format options. * Rename "deadlock" to "stall" in `LoadManager` (#5341) What the LoadManager class does is stall detection, which is not the same as deadlock detection. In the condition of severe CPU starvation, LoadManager will currently intentionally crash rippled reporting `LogicError: Deadlock detected`. This error message is misleading as the condition being detected is not a deadlock. This change fixes and refactors the code in response. * Adds hub.xrpl-commons.org as a new Bootstrap Cluster (#5263) * fix: Error message for ledger_entry rpc (#5344) Changes the error to `malformedAddress` for `permissioned_domain` in the `ledger_entry` rpc, when the account is not a string. This change makes it more clear to a user what is wrong with their request. * fix: Handle invalid marker parameter in grpc call (#5317) The `end_marker` is used to limit the range of ledger entries to fetch. If `end_marker` is less than `marker`, a crash can occur. This change adds an additional check. * fix: trust line RPC no ripple flag (#5345) The Trustline RPC `no_ripple` flag gets set depending on `lsfDefaultRipple` flag, which is not a flag of a trustline but of the account root. The `lsfDefaultRipple` flag does not provide any insight if this particular trust line has `lsfLowNoRipple` or `lsfHighNoRipple` flag set, so it should not be used here at all. This change simplifies the logic. * refactor: Updates Conan dependencies: RocksDB (#5335) Updates RocksDB to version 9.7.3, the latest version supported in Conan 1.x. A patch for 9.7.4 that fixes a memory leak is included. * fix: Remove null pointer deref, just do abort (#5338) This change removes the existing undefined behavior from `LogicError`, so we can be certain that there will be always a stacktrace. De-referencing a null pointer is an old trick to generate `SIGSEGV`, which would typically also create a stacktrace. However it is also an undefined behaviour and compilers can do something else. A more robust way to create a stacktrace while crashing the program is to use `std::abort`, which we have also used in this location for a long time. If we combine the two, we might not get the expected behaviour - namely, the nullpointer deref followed by `std::abort`, as handled in certain compiler versions may not immediately cause a crash. We have observed stacktrace being wiped instead, and thread put in indeterminate state, then stacktrace created without any useful information. * chore: Add PR number to payload (#5310) This PR adds one more payload field to the libXRPL compatibility check workflow - the PR number itself. * chore: Update link to ripple-binary-codec (#5355) The link to ripple-binary-codec's definitions.json appears to be outdated. The updated link is also documented here: https://xrpl.org/docs/references/protocol/binary-format#definitions-file * Prevent consensus from getting stuck in the establish phase (#5277) - Detects if the consensus process is "stalled". If it is, then we can declare a consensus and end successfully even if we do not have 80% agreement on our proposal. - "Stalled" is defined as: - We have a close time consensus - Each disputed transaction is individually stalled: - It has been in the final "stuck" 95% requirement for at least 2 (avMIN_ROUNDS) "inner rounds" of phaseEstablish, - and either all of the other trusted proposers or this validator, if proposing, have had the same vote(s) for at least 4 (avSTALLED_ROUNDS) "inner rounds", and at least 80% of the validators (including this one, if appropriate) agree about the vote (whether yes or no). - If we have been in the establish phase for more than 10x the previous consensus establish phase's time, then consensus is considered "expired", and we will leave the round, which sends a partial validation (indicating that the node is moving on without validating). Two restrictions avoid prematurely exiting, or having an extended exit in extreme situations. - The 10x time is clamped to be within a range of 15s (ledgerMAX_CONSENSUS) to 120s (ledgerABANDON_CONSENSUS). - If consensus has not had an opportunity to walk through all avalanche states (defined as not going through 8 "inner rounds" of phaseEstablish), then ConsensusState::Expired is treated as ConsensusState::No. - When enough nodes leave the round, any remaining nodes will see they've fallen behind, and move on, too, generally before hitting the timeout. Any validations or partial validations sent during this time will help the consensus process bring the nodes back together. --------- Co-authored-by: Michael Legleux Co-authored-by: Bart Co-authored-by: Ed Hennis Co-authored-by: Bronek Kozicki Co-authored-by: Darius Tumas Co-authored-by: Sergey Kuznetsov Co-authored-by: cyan317 <120398799+cindyyan317@users.noreply.github.com> Co-authored-by: Vlad <129996061+vvysokikh1@users.noreply.github.com> Co-authored-by: Alex Kremer --- .clang-format | 7 +- .github/actions/dependencies/action.yml | 6 +- .github/workflows/libxrpl.yml | 3 +- .github/workflows/macos.yml | 1 - BUILD.md | 4 +- Builds/levelization/results/loops.txt | 4 +- Builds/levelization/results/ordering.txt | 5 +- RELEASENOTES.md | 102 +++++ cfg/rippled-example.cfg | 1 + conanfile.py | 2 +- docs/consensus.md | 2 +- examples/example/src/example.cpp | 4 +- external/rocksdb/conandata.yml | 29 +- external/rocksdb/conanfile.py | 24 +- ...-0001-add-include-cstdint-for-gcc-13.patch | 30 -- .../6.29.5-0002-exclude-thirdparty.patch | 16 - .../patches/9.7.3-0001-memory-leak.patch | 319 ++++++++++++++ .../9.x.x-0001-exclude-thirdparty.patch | 30 ++ include/xrpl/basics/BasicConfig.h | 1 - include/xrpl/basics/Buffer.h | 3 +- include/xrpl/basics/CompressionAlgorithms.h | 4 +- include/xrpl/basics/CountedObject.h | 1 + include/xrpl/basics/Expected.h | 2 - include/xrpl/basics/LocalValue.h | 1 + include/xrpl/basics/Log.h | 2 + include/xrpl/basics/Resolver.h | 4 +- include/xrpl/basics/ResolverAsio.h | 1 + include/xrpl/basics/Slice.h | 1 + include/xrpl/basics/TaggedCache.h | 1 + include/xrpl/basics/UnorderedContainers.h | 1 + include/xrpl/basics/base_uint.h | 3 +- include/xrpl/basics/chrono.h | 5 +- include/xrpl/basics/contract.h | 2 +- include/xrpl/basics/make_SSLContext.h | 1 + .../xrpl/basics/partitioned_unordered_map.h | 1 + include/xrpl/basics/random.h | 2 +- include/xrpl/basics/spinlock.h | 1 + include/xrpl/basics/tagged_integer.h | 2 + include/xrpl/beast/asio/io_latency_probe.h | 1 + .../container/detail/aged_ordered_container.h | 2 + .../detail/aged_unordered_container.h | 2 + .../detail/empty_base_optimization.h | 1 + include/xrpl/beast/core/LexicalCast.h | 1 + include/xrpl/beast/core/List.h | 1 - include/xrpl/beast/hash/hash_append.h | 1 + include/xrpl/beast/hash/xxhasher.h | 1 + include/xrpl/beast/insight/Meter.h | 4 +- include/xrpl/beast/insight/StatsDCollector.h | 1 - include/xrpl/beast/net/IPAddress.h | 2 + include/xrpl/beast/net/IPAddressConversion.h | 2 - include/xrpl/beast/net/IPAddressV4.h | 2 + include/xrpl/beast/net/IPAddressV6.h | 2 + include/xrpl/beast/rfc2616.h | 5 +- include/xrpl/beast/test/yield_to.h | 1 + include/xrpl/beast/unit_test/match.h | 1 + include/xrpl/beast/unit_test/reporter.h | 2 + include/xrpl/beast/unit_test/runner.h | 2 + include/xrpl/beast/unit_test/suite.h | 2 + include/xrpl/beast/unit_test/suite_list.h | 2 + include/xrpl/beast/unit_test/thread.h | 1 + include/xrpl/beast/utility/Journal.h | 1 + include/xrpl/beast/utility/PropertyStream.h | 2 - include/xrpl/beast/utility/rngfill.h | 1 + include/xrpl/beast/utility/temp_dir.h | 1 + include/xrpl/crypto/csprng.h | 2 - include/xrpl/json/Object.h | 1 + include/xrpl/json/Output.h | 1 + include/xrpl/json/Writer.h | 1 + include/xrpl/json/detail/json_assert.h | 1 + include/xrpl/json/json_reader.h | 2 + include/xrpl/json/json_value.h | 1 + include/xrpl/json/json_writer.h | 1 + include/xrpl/protocol/Book.h | 1 + include/xrpl/protocol/Feature.h | 84 ++-- include/xrpl/protocol/FeeUnits.h | 1 + include/xrpl/protocol/HashPrefix.h | 1 + include/xrpl/protocol/IOUAmount.h | 2 + include/xrpl/protocol/KnownFormats.h | 2 + include/xrpl/protocol/MultiApiJson.h | 2 +- include/xrpl/protocol/Protocol.h | 1 + include/xrpl/protocol/Rate.h | 2 + include/xrpl/protocol/SOTemplate.h | 1 + include/xrpl/protocol/STBase.h | 2 + include/xrpl/protocol/STExchange.h | 1 + include/xrpl/protocol/STLedgerEntry.h | 2 +- include/xrpl/protocol/STObject.h | 2 + include/xrpl/protocol/STParsedJSON.h | 1 + include/xrpl/protocol/STPathSet.h | 1 + include/xrpl/protocol/STTx.h | 1 + include/xrpl/protocol/STValidation.h | 4 +- include/xrpl/protocol/SecretKey.h | 1 + include/xrpl/protocol/Seed.h | 1 + include/xrpl/protocol/Serializer.h | 1 + include/xrpl/protocol/Sign.h | 1 + include/xrpl/protocol/SystemParameters.h | 1 + include/xrpl/protocol/TER.h | 8 +- include/xrpl/protocol/TxFlags.h | 4 +- include/xrpl/protocol/TxMeta.h | 2 + include/xrpl/protocol/detail/STVar.h | 5 +- include/xrpl/protocol/detail/features.macro | 22 + include/xrpl/protocol/digest.h | 2 + include/xrpl/protocol/nftPageMask.h | 1 + include/xrpl/resource/ResourceManager.h | 1 + include/xrpl/resource/detail/Logic.h | 1 + include/xrpl/server/Handoff.h | 2 + include/xrpl/server/Port.h | 3 +- include/xrpl/server/Server.h | 1 + include/xrpl/server/Session.h | 2 + include/xrpl/server/SimpleWriter.h | 2 + include/xrpl/server/Writer.h | 1 + include/xrpl/server/detail/BaseHTTPPeer.h | 2 + include/xrpl/server/detail/BasePeer.h | 2 + include/xrpl/server/detail/Door.h | 2 + include/xrpl/server/detail/JSONRPCUtil.h | 1 + include/xrpl/server/detail/PlainHTTPPeer.h | 2 + include/xrpl/server/detail/PlainWSPeer.h | 2 + include/xrpl/server/detail/SSLHTTPPeer.h | 2 + include/xrpl/server/detail/SSLWSPeer.h | 2 + include/xrpl/server/detail/io_list.h | 1 + src/libxrpl/basics/Archive.cpp | 5 + src/libxrpl/basics/BasicConfig.cpp | 13 +- src/libxrpl/basics/CountedObject.cpp | 2 +- src/libxrpl/basics/FileUtilities.cpp | 14 + src/libxrpl/basics/Log.cpp | 12 +- src/libxrpl/basics/Number.cpp | 7 +- src/libxrpl/basics/ResolverAsio.cpp | 16 +- src/libxrpl/basics/StringUtilities.cpp | 21 +- src/libxrpl/basics/UptimeClock.cpp | 4 + src/libxrpl/basics/base64.cpp | 5 +- src/libxrpl/basics/contract.cpp | 17 +- src/libxrpl/basics/make_SSLContext.cpp | 23 +- src/libxrpl/basics/mulDiv.cpp | 5 + src/libxrpl/beast/core/CurrentThreadName.cpp | 4 + src/libxrpl/beast/core/SemanticVersion.cpp | 4 + src/libxrpl/beast/insight/Groups.cpp | 10 + src/libxrpl/beast/insight/Hook.cpp | 1 + src/libxrpl/beast/insight/NullCollector.cpp | 14 + src/libxrpl/beast/insight/StatsDCollector.cpp | 23 +- src/libxrpl/beast/net/IPAddressConversion.cpp | 4 + src/libxrpl/beast/net/IPAddressV4.cpp | 3 - src/libxrpl/beast/net/IPEndpoint.cpp | 12 +- .../beast/utility/{src => }/beast_Journal.cpp | 5 +- .../{src => }/beast_PropertyStream.cpp | 5 +- src/libxrpl/crypto/RFC1751.cpp | 11 +- src/libxrpl/crypto/csprng.cpp | 8 +- src/libxrpl/crypto/secure_erase.cpp | 3 + src/libxrpl/json/JsonPropertyStream.cpp | 2 + src/libxrpl/json/Object.cpp | 6 + src/libxrpl/json/Output.cpp | 3 + src/libxrpl/json/Writer.cpp | 8 + src/libxrpl/json/json_reader.cpp | 5 + src/libxrpl/json/json_value.cpp | 10 +- src/libxrpl/json/json_valueiterator.cpp | 1 + src/libxrpl/json/json_writer.cpp | 7 + src/libxrpl/json/to_string.cpp | 2 + src/libxrpl/protocol/AMMCore.cpp | 13 + src/libxrpl/protocol/AccountID.cpp | 10 +- src/libxrpl/protocol/Asset.cpp | 10 +- src/libxrpl/protocol/Book.cpp | 4 + src/libxrpl/protocol/BuildInfo.cpp | 7 +- src/libxrpl/protocol/ErrorCodes.cpp | 4 + src/libxrpl/protocol/Feature.cpp | 55 +-- src/libxrpl/protocol/IOUAmount.cpp | 10 +- src/libxrpl/protocol/Indexes.cpp | 15 + src/libxrpl/protocol/Issue.cpp | 9 +- src/libxrpl/protocol/Keylet.cpp | 2 + src/libxrpl/protocol/LedgerFormats.cpp | 5 +- src/libxrpl/protocol/LedgerHeader.cpp | 3 + src/libxrpl/protocol/MPTIssue.cpp | 9 + .../protocol/NFTSyntheticSerializer.cpp | 5 + src/libxrpl/protocol/NFTokenID.cpp | 16 + src/libxrpl/protocol/NFTokenOfferID.cpp | 12 + src/libxrpl/protocol/PublicKey.cpp | 18 +- src/libxrpl/protocol/Quality.cpp | 5 + src/libxrpl/protocol/QualityFunction.cpp | 7 +- src/libxrpl/protocol/RPCErr.cpp | 2 + src/libxrpl/protocol/Rate2.cpp | 6 + src/libxrpl/protocol/Rules.cpp | 8 + src/libxrpl/protocol/SField.cpp | 5 +- src/libxrpl/protocol/SOTemplate.cpp | 6 + src/libxrpl/protocol/STAccount.cpp | 12 + src/libxrpl/protocol/STAmount.cpp | 38 +- src/libxrpl/protocol/STArray.cpp | 9 + src/libxrpl/protocol/STBase.cpp | 9 +- src/libxrpl/protocol/STBlob.cpp | 10 +- src/libxrpl/protocol/STCurrency.cpp | 15 +- src/libxrpl/protocol/STInteger.cpp | 12 +- src/libxrpl/protocol/STIssue.cpp | 30 +- src/libxrpl/protocol/STLedgerEntry.cpp | 21 +- src/libxrpl/protocol/STNumber.cpp | 11 +- src/libxrpl/protocol/STObject.cpp | 30 ++ src/libxrpl/protocol/STParsedJSON.cpp | 19 +- src/libxrpl/protocol/STPathSet.cpp | 14 +- src/libxrpl/protocol/STTx.cpp | 37 +- src/libxrpl/protocol/STValidation.cpp | 18 +- src/libxrpl/protocol/STVar.cpp | 12 +- src/libxrpl/protocol/STVector256.cpp | 15 +- src/libxrpl/protocol/STXChainBridge.cpp | 19 +- src/libxrpl/protocol/SecretKey.cpp | 20 +- src/libxrpl/protocol/Seed.cpp | 9 +- src/libxrpl/protocol/Serializer.cpp | 15 +- src/libxrpl/protocol/Sign.cpp | 9 + src/libxrpl/protocol/TER.cpp | 8 +- src/libxrpl/protocol/TxFormats.cpp | 5 +- src/libxrpl/protocol/TxMeta.cpp | 17 +- src/libxrpl/protocol/UintTypes.cpp | 6 +- src/libxrpl/protocol/XChainAttestations.cpp | 17 +- src/libxrpl/protocol/digest.cpp | 4 +- src/libxrpl/protocol/tokens.cpp | 14 +- src/libxrpl/resource/Charge.cpp | 4 + src/libxrpl/resource/Consumer.cpp | 7 + src/libxrpl/resource/Fees.cpp | 1 + src/libxrpl/resource/ResourceManager.cpp | 19 +- src/libxrpl/server/JSONRPCUtil.cpp | 8 +- src/libxrpl/server/Port.cpp | 14 + src/test/app/AMMCalc_test.cpp | 2 + src/test/app/AMMClawback_test.cpp | 8 +- src/test/app/AMMExtended_test.cpp | 9 +- src/test/app/AMM_test.cpp | 14 +- src/test/app/AccountDelete_test.cpp | 1 + src/test/app/AccountTxPaging_test.cpp | 9 +- src/test/app/AmendmentTable_test.cpp | 2 + src/test/app/Check_test.cpp | 1 + src/test/app/Clawback_test.cpp | 6 +- src/test/app/Credentials_test.cpp | 3 +- src/test/app/CrossingLimits_test.cpp | 1 + src/test/app/DID_test.cpp | 5 +- src/test/app/DNS_test.cpp | 2 + src/test/app/DeliverMin_test.cpp | 1 + src/test/app/DepositAuth_test.cpp | 1 + src/test/app/Discrepancy_test.cpp | 1 + src/test/app/Escrow_test.cpp | 2 + src/test/app/FeeVote_test.cpp | 2 +- src/test/app/FixNFTokenPageLinks_test.cpp | 2 + src/test/app/Flow_test.cpp | 4 +- src/test/app/Freeze_test.cpp | 2 + src/test/app/HashRouter_test.cpp | 1 + src/test/app/LedgerHistory_test.cpp | 4 +- src/test/app/LedgerLoad_test.cpp | 2 + src/test/app/LedgerMaster_test.cpp | 2 +- src/test/app/LedgerReplay_test.cpp | 2 + src/test/app/LoadFeeTrack_test.cpp | 1 + src/test/app/MPToken_test.cpp | 1 + src/test/app/Manifest_test.cpp | 4 +- src/test/app/MultiSign_test.cpp | 2 + src/test/app/NFTokenBurn_test.cpp | 2 + src/test/app/NFTokenDir_test.cpp | 2 + src/test/app/NFToken_test.cpp | 2 + src/test/app/NetworkID_test.cpp | 3 +- src/test/app/OfferStream_test.cpp | 1 + src/test/app/Offer_test.cpp | 1 + src/test/app/Oracle_test.cpp | 1 + src/test/app/OversizeMeta_test.cpp | 2 +- src/test/app/Path_test.cpp | 8 +- src/test/app/PayChan_test.cpp | 3 +- src/test/app/PayStrand_test.cpp | 6 +- src/test/app/PermissionedDomains_test.cpp | 6 +- src/test/app/PseudoTx_test.cpp | 4 +- src/test/app/RCLCensorshipDetector_test.cpp | 2 + src/test/app/RCLValidations_test.cpp | 5 +- src/test/app/ReducedOffer_test.cpp | 1 + src/test/app/Regression_test.cpp | 3 +- src/test/app/SHAMapStore_test.cpp | 2 + src/test/app/SetAuth_test.cpp | 1 + src/test/app/SetRegularKey_test.cpp | 2 +- src/test/app/SetTrust_test.cpp | 2 + src/test/app/Taker_test.cpp | 3 +- src/test/app/TheoreticalQuality_test.cpp | 5 +- src/test/app/Ticket_test.cpp | 2 + src/test/app/Transaction_ordering_test.cpp | 2 +- src/test/app/TrustAndBalance_test.cpp | 1 + src/test/app/TxQ_test.cpp | 3 +- src/test/app/ValidatorKeys_test.cpp | 2 + src/test/app/ValidatorList_test.cpp | 2 + src/test/app/ValidatorSite_test.cpp | 13 +- src/test/app/XChain_test.cpp | 15 +- src/test/app/tx/apply_test.cpp | 2 + src/test/basics/Buffer_test.cpp | 1 + src/test/basics/Expected_test.cpp | 1 + src/test/basics/FeeUnits_test.cpp | 1 - src/test/basics/FileUtilities_test.cpp | 1 + src/test/basics/KeyCache_test.cpp | 2 +- src/test/basics/Number_test.cpp | 1 + src/test/basics/PerfLog_test.cpp | 3 +- src/test/basics/Slice_test.cpp | 1 + src/test/basics/TaggedCache_test.cpp | 1 + src/test/basics/base_uint_test.cpp | 3 +- src/test/basics/contract_test.cpp | 1 + src/test/basics/hardened_hash_test.cpp | 3 +- src/test/basics/tagged_integer_test.cpp | 1 + src/test/beast/IPEndpoint_test.cpp | 3 +- src/test/beast/SemanticVersion_test.cpp | 4 +- .../beast/aged_associative_container_test.cpp | 3 +- .../beast/beast_CurrentThreadName_test.cpp | 2 +- src/test/beast/beast_PropertyStream_test.cpp | 4 +- src/test/beast/beast_Zero_test.cpp | 3 +- src/test/beast/beast_abstract_clock_test.cpp | 1 + .../beast/beast_basic_seconds_clock_test.cpp | 3 +- .../beast/beast_io_latency_probe_test.cpp | 6 +- src/test/beast/define_print.cpp | 1 + src/test/conditions/PreimageSha256_test.cpp | 2 + .../consensus/ByzantineFailureSim_test.cpp | 4 +- src/test/consensus/Consensus_test.cpp | 389 +++++++++++++++++- .../DistributedValidatorsSim_test.cpp | 6 +- src/test/consensus/LedgerTiming_test.cpp | 2 + src/test/consensus/LedgerTrie_test.cpp | 5 +- src/test/consensus/NegativeUNL_test.cpp | 3 +- src/test/consensus/ScaleFreeSim_test.cpp | 4 +- src/test/consensus/Validations_test.cpp | 6 +- src/test/core/ClosureCounter_test.cpp | 2 + src/test/core/Config_test.cpp | 4 +- src/test/core/Coroutine_test.cpp | 3 +- src/test/core/CryptoPRNG_test.cpp | 4 +- src/test/core/JobQueue_test.cpp | 2 + src/test/core/SociDB_test.cpp | 4 +- src/test/core/Workers_test.cpp | 4 +- src/test/csf/BasicNetwork_test.cpp | 2 + src/test/csf/CollectorRef.h | 1 + src/test/csf/Digraph_test.cpp | 2 + src/test/csf/Histogram.h | 1 + src/test/csf/Histogram_test.cpp | 1 + src/test/csf/Peer.h | 5 + src/test/csf/PeerGroup.h | 2 + src/test/csf/Proposal.h | 4 +- src/test/csf/Scheduler_test.cpp | 2 +- src/test/csf/SimTime.h | 1 + src/test/csf/TrustGraph.h | 1 + src/test/csf/Tx.h | 6 +- src/test/csf/Validation.h | 2 + src/test/csf/collectors.h | 2 + src/test/csf/events.h | 2 + src/test/csf/impl/Sim.cpp | 1 + src/test/csf/impl/ledgers.cpp | 4 +- src/test/csf/ledgers.h | 5 + src/test/csf/submitters.h | 3 + src/test/csf/timers.h | 2 + src/test/json/Object_test.cpp | 1 + src/test/json/Output_test.cpp | 1 + src/test/json/TestOutputSuite.h | 1 + src/test/json/Writer_test.cpp | 2 +- src/test/json/json_value_test.cpp | 1 - src/test/jtx.h | 1 + src/test/jtx/AMM.h | 2 + src/test/jtx/AMMTest.h | 2 + src/test/jtx/Account.h | 1 + src/test/jtx/CaptureLogs.h | 5 + src/test/jtx/CheckMessageLogs.h | 5 + src/test/jtx/Env.h | 3 + src/test/jtx/Env_test.cpp | 4 +- src/test/jtx/JSONRPCClient.h | 2 + src/test/jtx/JTx.h | 1 + src/test/jtx/ManualTimeKeeper.h | 1 + src/test/jtx/Oracle.h | 1 + src/test/jtx/PathSet.h | 1 + src/test/jtx/TestHelpers.h | 2 + src/test/jtx/TestSuite.h | 1 + src/test/jtx/TrustedPublisherServer.h | 3 + src/test/jtx/WSClient.h | 1 + src/test/jtx/WSClient_test.cpp | 1 + src/test/jtx/amount.h | 2 + src/test/jtx/credentials.h | 7 +- src/test/jtx/delivermin.h | 1 + src/test/jtx/fee.h | 1 + src/test/jtx/flags.h | 1 + src/test/jtx/impl/AMM.cpp | 3 +- src/test/jtx/impl/AMMTest.cpp | 5 +- src/test/jtx/impl/Account.cpp | 1 + src/test/jtx/impl/Env.cpp | 10 +- src/test/jtx/impl/JSONRPCClient.cpp | 4 + src/test/jtx/impl/Oracle.cpp | 4 +- src/test/jtx/impl/TestHelpers.cpp | 2 +- src/test/jtx/impl/WSClient.cpp | 8 +- src/test/jtx/impl/acctdelete.cpp | 1 + src/test/jtx/impl/amount.cpp | 3 +- src/test/jtx/impl/attester.cpp | 1 - src/test/jtx/impl/check.cpp | 1 + src/test/jtx/impl/credentials.cpp | 1 + src/test/jtx/impl/delivermin.cpp | 1 + src/test/jtx/impl/deposit.cpp | 1 + src/test/jtx/impl/did.cpp | 1 + src/test/jtx/impl/envconfig.cpp | 2 +- src/test/jtx/impl/fee.cpp | 1 + src/test/jtx/impl/flags.cpp | 1 + src/test/jtx/impl/jtx_json.cpp | 1 + src/test/jtx/impl/last_ledger_sequence.cpp | 1 - src/test/jtx/impl/ledgerStateFix.cpp | 1 + src/test/jtx/impl/memo.cpp | 2 - src/test/jtx/impl/multisign.cpp | 5 +- src/test/jtx/impl/offer.cpp | 1 + src/test/jtx/impl/paths.cpp | 2 + src/test/jtx/impl/pay.cpp | 1 + src/test/jtx/impl/permissioned_domains.cpp | 1 - src/test/jtx/impl/quality2.cpp | 1 + src/test/jtx/impl/rate.cpp | 2 + src/test/jtx/impl/regkey.cpp | 1 + src/test/jtx/impl/sendmax.cpp | 1 + src/test/jtx/impl/seq.cpp | 1 + src/test/jtx/impl/tag.cpp | 1 - src/test/jtx/impl/ticket.cpp | 1 + src/test/jtx/impl/token.cpp | 1 + src/test/jtx/impl/trust.cpp | 2 + src/test/jtx/impl/txflags.cpp | 1 + src/test/jtx/impl/utility.cpp | 3 +- src/test/jtx/impl/xchain_bridge.cpp | 4 +- src/test/jtx/jtx_json.h | 1 + src/test/jtx/multisign.h | 1 + src/test/jtx/offer.h | 1 + src/test/jtx/owners.h | 3 + src/test/jtx/paths.h | 2 + src/test/jtx/pay.h | 1 + src/test/jtx/permissioned_domains.h | 5 +- src/test/jtx/prop.h | 1 + src/test/jtx/rate.h | 1 + src/test/jtx/regkey.h | 1 + src/test/jtx/require.h | 1 + src/test/jtx/rpc.h | 1 + src/test/jtx/sendmax.h | 1 + src/test/jtx/ter.h | 1 + src/test/jtx/trust.h | 1 + src/test/jtx/utility.h | 3 + src/test/jtx/xchain_bridge.h | 1 + src/test/ledger/BookDirs_test.cpp | 2 + src/test/ledger/Directory_test.cpp | 3 + src/test/ledger/Invariants_test.cpp | 3 +- src/test/ledger/PaymentSandbox_test.cpp | 2 + src/test/ledger/PendingSaves_test.cpp | 1 + src/test/ledger/SkipList_test.cpp | 5 +- src/test/ledger/View_test.cpp | 4 +- src/test/nodestore/Backend_test.cpp | 4 + src/test/nodestore/Basics_test.cpp | 3 +- src/test/nodestore/Database_test.cpp | 2 + src/test/nodestore/TestBase.h | 3 + src/test/nodestore/Timing_test.cpp | 7 +- src/test/nodestore/import_test.cpp | 13 +- src/test/nodestore/varint_test.cpp | 2 + src/test/overlay/ProtocolVersion_test.cpp | 1 + src/test/overlay/cluster_test.cpp | 3 +- src/test/overlay/compression_test.cpp | 5 +- src/test/overlay/handshake_test.cpp | 3 +- src/test/overlay/reduce_relay_test.cpp | 4 + src/test/overlay/short_read_test.cpp | 3 +- src/test/overlay/tx_reduce_relay_test.cpp | 5 +- src/test/peerfinder/Livecache_test.cpp | 4 +- src/test/peerfinder/PeerFinder_test.cpp | 4 +- src/test/protocol/ApiVersion_test.cpp | 1 - src/test/protocol/Hooks_test.cpp | 3 +- src/test/protocol/InnerObjectFormats_test.cpp | 6 +- src/test/protocol/Issue_test.cpp | 1 + src/test/protocol/Memo_test.cpp | 2 +- src/test/protocol/PublicKey_test.cpp | 1 + src/test/protocol/Quality_test.cpp | 1 + src/test/protocol/STAmount_test.cpp | 1 - src/test/protocol/STIssue_test.cpp | 3 +- src/test/protocol/STObject_test.cpp | 1 + src/test/protocol/STTx_test.cpp | 3 +- src/test/protocol/STValidation_test.cpp | 6 +- src/test/protocol/SecretKey_test.cpp | 1 + src/test/protocol/Seed_test.cpp | 2 +- src/test/protocol/SeqProxy_test.cpp | 1 + src/test/resource/Logic_test.cpp | 2 + src/test/rpc/AMMInfo_test.cpp | 2 +- src/test/rpc/AccountCurrencies_test.cpp | 1 + src/test/rpc/AccountInfo_test.cpp | 9 +- src/test/rpc/AccountLines_test.cpp | 6 +- src/test/rpc/AccountObjects_test.cpp | 2 + src/test/rpc/AccountOffers_test.cpp | 1 + src/test/rpc/AccountSet_test.cpp | 2 +- src/test/rpc/AccountTx_test.cpp | 1 + src/test/rpc/AmendmentBlocked_test.cpp | 3 +- src/test/rpc/Book_test.cpp | 2 + src/test/rpc/Connect_test.cpp | 1 + src/test/rpc/DeliveredAmount_test.cpp | 2 +- src/test/rpc/DepositAuthorized_test.cpp | 1 + src/test/rpc/Feature_test.cpp | 2 + src/test/rpc/GRPCTestClientBase.h | 2 + src/test/rpc/GatewayBalances_test.cpp | 2 + src/test/rpc/GetAggregatePrice_test.cpp | 2 + src/test/rpc/GetCounts_test.cpp | 1 + src/test/rpc/Handler_test.cpp | 3 +- src/test/rpc/JSONRPC_test.cpp | 3 +- src/test/rpc/KeyGeneration_test.cpp | 3 + src/test/rpc/LedgerClosed_test.cpp | 1 + src/test/rpc/LedgerData_test.cpp | 1 + src/test/rpc/LedgerHeader_test.cpp | 1 + src/test/rpc/LedgerRPC_test.cpp | 18 +- src/test/rpc/LedgerRequestRPC_test.cpp | 2 + src/test/rpc/ManifestRPC_test.cpp | 2 + src/test/rpc/NoRippleCheck_test.cpp | 4 +- src/test/rpc/NoRipple_test.cpp | 2 + src/test/rpc/OwnerInfo_test.cpp | 1 + src/test/rpc/Peers_test.cpp | 3 + src/test/rpc/RPCCall_test.cpp | 2 + src/test/rpc/RPCHelpers_test.cpp | 1 + src/test/rpc/RPCOverload_test.cpp | 2 + src/test/rpc/RobustTransaction_test.cpp | 2 + src/test/rpc/Roles_test.cpp | 5 +- src/test/rpc/ServerInfo_test.cpp | 2 + src/test/rpc/Simulate_test.cpp | 2 + src/test/rpc/Status_test.cpp | 2 +- src/test/rpc/Subscribe_test.cpp | 3 + src/test/rpc/TransactionEntry_test.cpp | 2 + src/test/rpc/TransactionHistory_test.cpp | 3 + src/test/rpc/Transaction_test.cpp | 2 + src/test/rpc/ValidatorInfo_test.cpp | 2 + src/test/rpc/ValidatorRPC_test.cpp | 4 +- src/test/rpc/Version_test.cpp | 2 + src/test/server/ServerStatus_test.cpp | 4 + src/test/server/Server_test.cpp | 11 +- src/test/shamap/FetchPack_test.cpp | 4 +- src/test/shamap/SHAMapSync_test.cpp | 3 +- src/test/shamap/SHAMap_test.cpp | 2 + src/test/shamap/common.h | 1 + src/test/unit_test/FileDirGuard.h | 2 + src/test/unit_test/multi_runner.h | 2 +- .../app/consensus/RCLCensorshipDetector.h | 2 + src/xrpld/app/consensus/RCLConsensus.cpp | 1 + src/xrpld/app/consensus/RCLConsensus.h | 6 +- src/xrpld/app/consensus/RCLCxLedger.h | 2 +- src/xrpld/app/consensus/RCLCxPeerPos.cpp | 4 +- src/xrpld/app/consensus/RCLCxPeerPos.h | 6 +- src/xrpld/app/consensus/RCLCxTx.h | 3 - src/xrpld/app/consensus/RCLValidations.cpp | 7 +- src/xrpld/app/consensus/RCLValidations.h | 3 +- .../app/ledger/AbstractFetchPackContainer.h | 1 + src/xrpld/app/ledger/AcceptedLedger.cpp | 2 +- src/xrpld/app/ledger/AcceptedLedger.h | 1 - src/xrpld/app/ledger/AcceptedLedgerTx.cpp | 1 + src/xrpld/app/ledger/AcceptedLedgerTx.h | 2 + src/xrpld/app/ledger/BookListeners.cpp | 2 - src/xrpld/app/ledger/BookListeners.h | 1 + src/xrpld/app/ledger/BuildLedger.h | 3 +- src/xrpld/app/ledger/ConsensusTransSetSF.cpp | 2 +- src/xrpld/app/ledger/ConsensusTransSetSF.h | 1 + src/xrpld/app/ledger/InboundLedger.h | 2 + src/xrpld/app/ledger/InboundLedgers.h | 3 +- src/xrpld/app/ledger/InboundTransactions.h | 2 + src/xrpld/app/ledger/Ledger.cpp | 15 +- src/xrpld/app/ledger/Ledger.h | 4 +- src/xrpld/app/ledger/LedgerCleaner.h | 2 +- src/xrpld/app/ledger/LedgerHistory.cpp | 1 + src/xrpld/app/ledger/LedgerHistory.h | 2 +- src/xrpld/app/ledger/LedgerHolder.h | 1 + src/xrpld/app/ledger/LedgerMaster.h | 5 +- src/xrpld/app/ledger/LedgerReplay.h | 2 +- src/xrpld/app/ledger/LedgerReplayTask.h | 1 - src/xrpld/app/ledger/LedgerReplayer.h | 2 +- src/xrpld/app/ledger/LedgerToJson.h | 4 +- src/xrpld/app/ledger/LocalTxs.h | 1 + src/xrpld/app/ledger/OpenLedger.h | 2 + src/xrpld/app/ledger/OrderBookDB.cpp | 1 + src/xrpld/app/ledger/OrderBookDB.h | 1 + src/xrpld/app/ledger/PendingSaves.h | 1 + src/xrpld/app/ledger/TransactionMaster.h | 2 + src/xrpld/app/ledger/detail/BuildLedger.cpp | 2 +- src/xrpld/app/ledger/detail/InboundLedger.cpp | 2 +- .../app/ledger/detail/InboundLedgers.cpp | 2 +- .../app/ledger/detail/InboundTransactions.cpp | 2 + src/xrpld/app/ledger/detail/LedgerCleaner.cpp | 1 + .../app/ledger/detail/LedgerDeltaAcquire.h | 2 +- src/xrpld/app/ledger/detail/LedgerMaster.cpp | 1 + .../ledger/detail/LedgerReplayMsgHandler.cpp | 1 + .../app/ledger/detail/LedgerReplayTask.cpp | 1 - .../app/ledger/detail/LedgerReplayer.cpp | 1 - src/xrpld/app/ledger/detail/LedgerToJson.cpp | 4 +- src/xrpld/app/ledger/detail/LocalTxs.cpp | 2 +- src/xrpld/app/ledger/detail/OpenLedger.cpp | 3 +- .../app/ledger/detail/SkipListAcquire.cpp | 1 - src/xrpld/app/ledger/detail/SkipListAcquire.h | 1 - .../app/ledger/detail/TimeoutCounter.cpp | 2 - src/xrpld/app/ledger/detail/TimeoutCounter.h | 4 +- .../app/ledger/detail/TransactionAcquire.cpp | 2 - .../app/ledger/detail/TransactionAcquire.h | 1 - .../app/ledger/detail/TransactionMaster.cpp | 1 + src/xrpld/app/main/Application.cpp | 8 +- src/xrpld/app/main/Application.h | 5 +- src/xrpld/app/main/BasicApp.cpp | 1 + src/xrpld/app/main/BasicApp.h | 1 + src/xrpld/app/main/CollectorManager.cpp | 1 + src/xrpld/app/main/GRPCServer.cpp | 10 +- src/xrpld/app/main/GRPCServer.h | 5 +- src/xrpld/app/main/LoadManager.cpp | 64 +-- src/xrpld/app/main/LoadManager.h | 26 +- src/xrpld/app/main/Main.cpp | 16 +- src/xrpld/app/main/NodeIdentity.cpp | 1 - src/xrpld/app/main/NodeIdentity.h | 3 +- src/xrpld/app/main/NodeStoreScheduler.cpp | 1 - src/xrpld/app/main/NodeStoreScheduler.h | 1 - src/xrpld/app/misc/AMMHelpers.h | 3 - src/xrpld/app/misc/AMMUtils.h | 2 + src/xrpld/app/misc/AmendmentTable.h | 1 + src/xrpld/app/misc/CredentialHelpers.cpp | 1 + src/xrpld/app/misc/CredentialHelpers.h | 5 +- src/xrpld/app/misc/DeliverMax.h | 3 - src/xrpld/app/misc/FeeVote.h | 3 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 3 +- src/xrpld/app/misc/LoadFeeTrack.h | 3 +- src/xrpld/app/misc/NegativeUNLVote.h | 1 + src/xrpld/app/misc/NetworkOPs.cpp | 34 +- src/xrpld/app/misc/NetworkOPs.h | 5 +- src/xrpld/app/misc/SHAMapStore.h | 2 +- src/xrpld/app/misc/SHAMapStoreImp.cpp | 4 +- src/xrpld/app/misc/SHAMapStoreImp.h | 4 +- src/xrpld/app/misc/TxQ.h | 3 + src/xrpld/app/misc/ValidatorKeys.h | 1 + src/xrpld/app/misc/ValidatorList.h | 6 +- src/xrpld/app/misc/ValidatorSite.h | 3 +- src/xrpld/app/misc/detail/AMMUtils.cpp | 7 +- src/xrpld/app/misc/detail/AccountTxPaging.cpp | 5 +- src/xrpld/app/misc/detail/AccountTxPaging.h | 3 +- src/xrpld/app/misc/detail/AmendmentTable.cpp | 2 + src/xrpld/app/misc/detail/LoadFeeTrack.cpp | 6 +- src/xrpld/app/misc/detail/Manifest.cpp | 1 + src/xrpld/app/misc/detail/Transaction.cpp | 5 +- src/xrpld/app/misc/detail/TxQ.cpp | 3 +- src/xrpld/app/misc/detail/ValidatorKeys.cpp | 4 +- src/xrpld/app/misc/detail/ValidatorList.cpp | 2 + src/xrpld/app/misc/detail/ValidatorSite.cpp | 4 +- src/xrpld/app/misc/detail/Work.h | 4 - src/xrpld/app/misc/detail/WorkBase.h | 3 +- src/xrpld/app/misc/detail/WorkFile.h | 2 +- .../app/misc/detail/{detail => }/WorkSSL.cpp | 0 src/xrpld/app/misc/detail/WorkSSL.h | 2 + src/xrpld/app/paths/AMMLiquidity.h | 2 +- src/xrpld/app/paths/AMMOffer.h | 1 + src/xrpld/app/paths/AccountCurrencies.h | 1 + src/xrpld/app/paths/Credit.cpp | 1 + src/xrpld/app/paths/Credit.h | 1 + src/xrpld/app/paths/Flow.cpp | 6 +- src/xrpld/app/paths/Flow.h | 1 + src/xrpld/app/paths/PathRequest.cpp | 4 +- src/xrpld/app/paths/PathRequest.h | 3 +- src/xrpld/app/paths/PathRequests.cpp | 3 +- src/xrpld/app/paths/PathRequests.h | 2 +- src/xrpld/app/paths/Pathfinder.cpp | 2 +- src/xrpld/app/paths/Pathfinder.h | 1 + src/xrpld/app/paths/RippleCalc.cpp | 1 + src/xrpld/app/paths/RippleCalc.h | 1 + src/xrpld/app/paths/RippleLineCache.cpp | 1 - src/xrpld/app/paths/RippleLineCache.h | 2 +- src/xrpld/app/paths/TrustLine.cpp | 4 +- src/xrpld/app/paths/TrustLine.h | 7 +- src/xrpld/app/paths/detail/AMMLiquidity.cpp | 2 +- src/xrpld/app/paths/detail/AMMOffer.cpp | 5 +- src/xrpld/app/paths/detail/BookStep.cpp | 1 + src/xrpld/app/paths/detail/DirectStep.cpp | 4 +- src/xrpld/app/paths/detail/FlowDebugInfo.h | 1 + src/xrpld/app/paths/detail/PaySteps.cpp | 5 +- src/xrpld/app/paths/detail/StepChecks.h | 1 + src/xrpld/app/paths/detail/Steps.h | 2 + src/xrpld/app/paths/detail/StrandFlow.h | 3 +- .../app/paths/detail/XRPEndpointStep.cpp | 2 +- src/xrpld/app/rdb/RelationalDatabase.h | 4 +- src/xrpld/app/rdb/State.h | 1 + src/xrpld/app/rdb/Wallet.h | 2 - src/xrpld/app/rdb/backend/detail/Node.cpp | 5 +- src/xrpld/app/rdb/backend/detail/Node.h | 4 - .../app/rdb/backend/detail/SQLiteDatabase.cpp | 7 +- src/xrpld/app/rdb/detail/Vacuum.cpp | 1 + src/xrpld/app/rdb/detail/Wallet.cpp | 1 + src/xrpld/app/tx/apply.h | 4 +- src/xrpld/app/tx/applySteps.h | 1 + src/xrpld/app/tx/detail/AMMBid.cpp | 5 +- src/xrpld/app/tx/detail/AMMClawback.cpp | 4 +- src/xrpld/app/tx/detail/AMMCreate.cpp | 5 +- src/xrpld/app/tx/detail/AMMDelete.cpp | 6 +- src/xrpld/app/tx/detail/AMMDeposit.cpp | 7 +- src/xrpld/app/tx/detail/AMMVote.cpp | 6 +- src/xrpld/app/tx/detail/AMMWithdraw.cpp | 7 +- src/xrpld/app/tx/detail/ApplyContext.cpp | 4 +- src/xrpld/app/tx/detail/ApplyContext.h | 3 +- src/xrpld/app/tx/detail/BookTip.cpp | 1 - src/xrpld/app/tx/detail/BookTip.h | 3 +- src/xrpld/app/tx/detail/CancelCheck.cpp | 5 +- src/xrpld/app/tx/detail/CancelOffer.cpp | 1 + src/xrpld/app/tx/detail/CancelOffer.h | 3 +- src/xrpld/app/tx/detail/CashCheck.cpp | 2 +- src/xrpld/app/tx/detail/Change.cpp | 2 + src/xrpld/app/tx/detail/Change.h | 5 - src/xrpld/app/tx/detail/Clawback.cpp | 2 +- src/xrpld/app/tx/detail/CreateCheck.cpp | 4 +- src/xrpld/app/tx/detail/CreateOffer.cpp | 2 +- src/xrpld/app/tx/detail/CreateOffer.h | 1 - src/xrpld/app/tx/detail/CreateTicket.cpp | 3 +- src/xrpld/app/tx/detail/CreateTicket.h | 2 - src/xrpld/app/tx/detail/Credentials.cpp | 4 +- src/xrpld/app/tx/detail/Credentials.h | 5 +- src/xrpld/app/tx/detail/DID.cpp | 3 +- src/xrpld/app/tx/detail/DeleteAccount.cpp | 2 +- src/xrpld/app/tx/detail/DeleteAccount.h | 2 - src/xrpld/app/tx/detail/DeleteOracle.cpp | 2 +- src/xrpld/app/tx/detail/DepositPreauth.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 7 +- src/xrpld/app/tx/detail/InvariantCheck.cpp | 4 +- src/xrpld/app/tx/detail/LedgerStateFix.cpp | 3 +- src/xrpld/app/tx/detail/LedgerStateFix.h | 2 - src/xrpld/app/tx/detail/MPTokenAuthorize.cpp | 1 + .../app/tx/detail/MPTokenIssuanceCreate.cpp | 2 +- .../app/tx/detail/MPTokenIssuanceDestroy.cpp | 3 +- .../app/tx/detail/MPTokenIssuanceSet.cpp | 3 +- .../app/tx/detail/NFTokenAcceptOffer.cpp | 2 +- src/xrpld/app/tx/detail/NFTokenBurn.cpp | 5 +- .../app/tx/detail/NFTokenCancelOffer.cpp | 3 +- .../app/tx/detail/NFTokenCreateOffer.cpp | 3 +- src/xrpld/app/tx/detail/NFTokenMint.cpp | 5 +- src/xrpld/app/tx/detail/NFTokenMint.h | 1 + src/xrpld/app/tx/detail/NFTokenModify.cpp | 4 +- src/xrpld/app/tx/detail/NFTokenUtils.cpp | 3 +- src/xrpld/app/tx/detail/NFTokenUtils.h | 2 +- src/xrpld/app/tx/detail/Offer.h | 3 +- src/xrpld/app/tx/detail/OfferStream.cpp | 1 + src/xrpld/app/tx/detail/OfferStream.h | 2 +- src/xrpld/app/tx/detail/PayChan.cpp | 2 +- src/xrpld/app/tx/detail/Payment.cpp | 2 +- src/xrpld/app/tx/detail/Payment.h | 3 - .../tx/detail/PermissionedDomainDelete.cpp | 1 + .../app/tx/detail/PermissionedDomainDelete.h | 5 +- .../app/tx/detail/PermissionedDomainSet.cpp | 1 + .../app/tx/detail/PermissionedDomainSet.h | 6 +- src/xrpld/app/tx/detail/SetAccount.cpp | 1 + src/xrpld/app/tx/detail/SetAccount.h | 5 +- src/xrpld/app/tx/detail/SetOracle.cpp | 2 +- src/xrpld/app/tx/detail/SetRegularKey.cpp | 1 + src/xrpld/app/tx/detail/SetRegularKey.h | 3 - src/xrpld/app/tx/detail/SetSignerList.cpp | 4 +- src/xrpld/app/tx/detail/SetSignerList.h | 8 +- src/xrpld/app/tx/detail/SetTrust.cpp | 2 +- src/xrpld/app/tx/detail/SetTrust.h | 4 +- src/xrpld/app/tx/detail/SignerEntries.cpp | 2 + src/xrpld/app/tx/detail/SignerEntries.h | 11 +- src/xrpld/app/tx/detail/Taker.cpp | 1 + src/xrpld/app/tx/detail/Taker.h | 3 +- src/xrpld/app/tx/detail/Transactor.cpp | 2 +- src/xrpld/app/tx/detail/Transactor.h | 1 + src/xrpld/app/tx/detail/XChainBridge.cpp | 4 +- src/xrpld/app/tx/detail/XChainBridge.h | 2 +- src/xrpld/app/tx/detail/apply.cpp | 1 + src/xrpld/app/tx/detail/applySteps.cpp | 1 + src/xrpld/conditions/Condition.h | 6 +- src/xrpld/conditions/Fulfillment.h | 2 +- src/xrpld/conditions/detail/Condition.cpp | 4 - src/xrpld/conditions/detail/Fulfillment.cpp | 3 +- src/xrpld/conditions/detail/PreimageSha256.h | 2 + src/xrpld/conditions/detail/error.cpp | 4 +- src/xrpld/conditions/detail/error.h | 1 - src/xrpld/conditions/detail/utils.h | 10 +- src/xrpld/consensus/Consensus.cpp | 37 +- src/xrpld/consensus/Consensus.h | 94 ++++- src/xrpld/consensus/ConsensusParms.h | 127 ++++-- src/xrpld/consensus/ConsensusProposal.h | 3 + src/xrpld/consensus/ConsensusTypes.h | 5 +- src/xrpld/consensus/DisputedTx.h | 103 ++++- src/xrpld/consensus/LedgerTiming.h | 2 +- src/xrpld/consensus/Validations.h | 1 + src/xrpld/core/ClosureCounter.h | 2 +- src/xrpld/core/Config.h | 7 - src/xrpld/core/DatabaseCon.h | 2 + src/xrpld/core/Job.h | 2 +- src/xrpld/core/JobQueue.h | 4 +- src/xrpld/core/JobTypeData.h | 1 + src/xrpld/core/JobTypes.h | 3 +- src/xrpld/core/LoadEvent.h | 1 - src/xrpld/core/LoadMonitor.h | 2 + src/xrpld/core/SociDB.h | 5 +- src/xrpld/core/detail/Config.cpp | 4 +- src/xrpld/core/detail/DatabaseCon.cpp | 1 + src/xrpld/core/detail/Job.cpp | 2 +- src/xrpld/core/detail/JobQueue.cpp | 2 + src/xrpld/core/detail/LoadEvent.cpp | 2 +- src/xrpld/core/detail/LoadMonitor.cpp | 1 + src/xrpld/core/detail/SociDB.cpp | 7 +- src/xrpld/core/detail/Workers.cpp | 1 + src/xrpld/core/detail/Workers.h | 2 + src/xrpld/ledger/ApplyView.h | 1 + src/xrpld/ledger/ApplyViewImpl.h | 1 + src/xrpld/ledger/BookDirs.h | 2 + src/xrpld/ledger/CachedView.h | 4 +- src/xrpld/ledger/Dir.h | 1 + src/xrpld/ledger/OpenView.h | 1 + src/xrpld/ledger/PaymentSandbox.h | 2 + src/xrpld/ledger/RawView.h | 4 +- src/xrpld/ledger/ReadView.h | 7 +- src/xrpld/ledger/View.h | 8 +- src/xrpld/ledger/detail/ApplyStateTable.cpp | 1 + src/xrpld/ledger/detail/ApplyStateTable.h | 2 + src/xrpld/ledger/detail/ApplyView.cpp | 1 + src/xrpld/ledger/detail/ApplyViewBase.cpp | 1 - src/xrpld/ledger/detail/ApplyViewBase.h | 2 +- src/xrpld/ledger/detail/ApplyViewImpl.cpp | 2 - src/xrpld/ledger/detail/BookDirs.cpp | 1 + src/xrpld/ledger/detail/CachedView.cpp | 2 - src/xrpld/ledger/detail/OpenView.cpp | 1 + src/xrpld/ledger/detail/PaymentSandbox.cpp | 3 +- src/xrpld/ledger/detail/RawStateTable.cpp | 1 + src/xrpld/ledger/detail/ReadViewFwdRange.h | 1 - src/xrpld/ledger/detail/View.cpp | 6 +- src/xrpld/net/AutoSocket.h | 1 + src/xrpld/net/HTTPClient.h | 2 + src/xrpld/net/HTTPClientSSLContext.h | 2 + src/xrpld/net/InfoSub.h | 2 +- src/xrpld/net/RPCCall.h | 4 +- src/xrpld/net/RPCSub.h | 1 + src/xrpld/net/RegisterSSLCerts.h | 1 + src/xrpld/net/detail/HTTPClient.cpp | 5 +- src/xrpld/net/detail/InfoSub.cpp | 1 - src/xrpld/net/detail/RPCCall.cpp | 4 +- src/xrpld/net/detail/RPCSub.cpp | 2 + src/xrpld/net/detail/RegisterSSLCerts.cpp | 7 +- src/xrpld/nodestore/Backend.h | 2 +- src/xrpld/nodestore/Database.h | 5 +- src/xrpld/nodestore/Factory.h | 3 + src/xrpld/nodestore/NodeObject.h | 2 +- src/xrpld/nodestore/Scheduler.h | 1 + src/xrpld/nodestore/Types.h | 2 +- src/xrpld/nodestore/backend/MemoryFactory.cpp | 3 + src/xrpld/nodestore/backend/NuDBFactory.cpp | 6 +- src/xrpld/nodestore/backend/NullFactory.cpp | 2 +- .../nodestore/backend/RocksDBFactory.cpp | 8 +- src/xrpld/nodestore/detail/BatchWriter.h | 1 + src/xrpld/nodestore/detail/Database.cpp | 2 + .../nodestore/detail/DatabaseNodeImp.cpp | 1 - src/xrpld/nodestore/detail/DatabaseNodeImp.h | 1 + .../nodestore/detail/DatabaseRotatingImp.cpp | 1 - src/xrpld/nodestore/detail/DecodedBlob.cpp | 2 + src/xrpld/nodestore/detail/EncodedBlob.h | 4 +- src/xrpld/nodestore/detail/NodeObject.cpp | 1 + src/xrpld/nodestore/detail/codec.h | 9 +- src/xrpld/nodestore/detail/varint.h | 3 +- src/xrpld/overlay/Cluster.h | 6 +- src/xrpld/overlay/ClusterNode.h | 1 + src/xrpld/overlay/Compression.h | 1 - src/xrpld/overlay/Message.h | 8 +- src/xrpld/overlay/Overlay.h | 9 +- src/xrpld/overlay/Peer.h | 1 + src/xrpld/overlay/PeerReservationTable.h | 1 - src/xrpld/overlay/PeerSet.h | 5 - src/xrpld/overlay/ReduceRelayCommon.h | 2 +- src/xrpld/overlay/Slot.h | 3 +- src/xrpld/overlay/Squelch.h | 2 +- src/xrpld/overlay/detail/Cluster.cpp | 3 +- src/xrpld/overlay/detail/ConnectAttempt.cpp | 1 + src/xrpld/overlay/detail/ConnectAttempt.h | 1 - src/xrpld/overlay/detail/Handshake.cpp | 3 + src/xrpld/overlay/detail/Handshake.h | 9 +- src/xrpld/overlay/detail/Message.cpp | 1 + src/xrpld/overlay/detail/OverlayImpl.cpp | 6 +- src/xrpld/overlay/detail/OverlayImpl.h | 3 + src/xrpld/overlay/detail/PeerImp.cpp | 1 + src/xrpld/overlay/detail/PeerImp.h | 4 +- .../overlay/detail/PeerReservationTable.cpp | 7 +- src/xrpld/overlay/detail/ProtocolMessage.h | 6 +- src/xrpld/overlay/detail/ProtocolVersion.cpp | 3 + src/xrpld/overlay/detail/ProtocolVersion.h | 1 + src/xrpld/overlay/detail/TrafficCount.h | 1 - src/xrpld/overlay/detail/TxMetrics.cpp | 1 + src/xrpld/overlay/detail/TxMetrics.h | 2 +- src/xrpld/overlay/detail/ZeroCopyStream.h | 2 +- src/xrpld/overlay/make_Overlay.h | 4 +- src/xrpld/peerfinder/PeerfinderManager.h | 2 + src/xrpld/peerfinder/Slot.h | 2 +- src/xrpld/peerfinder/detail/Bootcache.cpp | 1 + src/xrpld/peerfinder/detail/Bootcache.h | 2 + src/xrpld/peerfinder/detail/Checker.h | 5 +- src/xrpld/peerfinder/detail/Counts.h | 3 +- src/xrpld/peerfinder/detail/Handouts.h | 3 +- src/xrpld/peerfinder/detail/Livecache.h | 2 + src/xrpld/peerfinder/detail/Logic.h | 2 +- .../peerfinder/detail/PeerfinderManager.cpp | 4 +- src/xrpld/peerfinder/detail/SlotImp.h | 3 +- src/xrpld/peerfinder/detail/Source.h | 1 + src/xrpld/peerfinder/detail/SourceStrings.h | 1 + src/xrpld/peerfinder/detail/Store.h | 1 + src/xrpld/peerfinder/detail/StoreSqdb.h | 2 - src/xrpld/peerfinder/make_Manager.h | 2 + src/xrpld/perflog/PerfLog.h | 3 + src/xrpld/perflog/detail/PerfLogImp.cpp | 5 +- src/xrpld/perflog/detail/PerfLogImp.h | 8 +- src/xrpld/rpc/CTID.h | 2 +- src/xrpld/rpc/Context.h | 1 - src/xrpld/rpc/GRPCHandlers.h | 2 + src/xrpld/rpc/RPCHandler.h | 2 - src/xrpld/rpc/Role.h | 3 +- src/xrpld/rpc/ServerHandler.h | 3 +- src/xrpld/rpc/detail/DeliveredAmount.cpp | 8 +- src/xrpld/rpc/detail/Handler.cpp | 1 + src/xrpld/rpc/detail/Handler.h | 2 - src/xrpld/rpc/detail/MPTokenIssuanceID.cpp | 5 - src/xrpld/rpc/detail/RPCHandler.cpp | 6 +- src/xrpld/rpc/detail/RPCHelpers.cpp | 2 +- src/xrpld/rpc/detail/RPCHelpers.h | 9 +- src/xrpld/rpc/detail/Role.cpp | 3 +- src/xrpld/rpc/detail/ServerHandler.cpp | 5 +- src/xrpld/rpc/detail/Status.cpp | 1 + src/xrpld/rpc/detail/TransactionSign.cpp | 5 +- src/xrpld/rpc/detail/TransactionSign.h | 1 - src/xrpld/rpc/detail/WSInfoSub.h | 3 +- src/xrpld/rpc/handlers/AMMInfo.cpp | 4 +- src/xrpld/rpc/handlers/AccountChannels.cpp | 4 +- .../rpc/handlers/AccountCurrenciesHandler.cpp | 2 +- src/xrpld/rpc/handlers/AccountInfo.cpp | 3 +- src/xrpld/rpc/handlers/AccountLines.cpp | 10 +- src/xrpld/rpc/handlers/AccountObjects.cpp | 3 +- src/xrpld/rpc/handlers/AccountOffers.cpp | 2 +- src/xrpld/rpc/handlers/AccountTx.cpp | 5 +- src/xrpld/rpc/handlers/BlackList.cpp | 1 + src/xrpld/rpc/handlers/BookOffers.cpp | 1 + src/xrpld/rpc/handlers/CanDelete.cpp | 4 +- src/xrpld/rpc/handlers/Connect.cpp | 1 + src/xrpld/rpc/handlers/ConsensusInfo.cpp | 3 +- src/xrpld/rpc/handlers/DepositAuthorized.cpp | 1 + src/xrpld/rpc/handlers/Feature1.cpp | 2 +- src/xrpld/rpc/handlers/Fee1.cpp | 2 +- src/xrpld/rpc/handlers/FetchInfo.cpp | 3 +- src/xrpld/rpc/handlers/GatewayBalances.cpp | 2 +- src/xrpld/rpc/handlers/GetAggregatePrice.cpp | 1 + src/xrpld/rpc/handlers/GetCounts.cpp | 3 +- src/xrpld/rpc/handlers/GetCounts.h | 3 +- src/xrpld/rpc/handlers/LedgerAccept.cpp | 3 +- .../rpc/handlers/LedgerCleanerHandler.cpp | 1 + src/xrpld/rpc/handlers/LedgerClosed.cpp | 1 + src/xrpld/rpc/handlers/LedgerCurrent.cpp | 2 +- src/xrpld/rpc/handlers/LedgerData.cpp | 22 +- src/xrpld/rpc/handlers/LedgerEntry.cpp | 11 +- src/xrpld/rpc/handlers/LedgerHandler.cpp | 2 +- src/xrpld/rpc/handlers/LedgerHandler.h | 1 + src/xrpld/rpc/handlers/LedgerHeader.cpp | 1 + src/xrpld/rpc/handlers/LedgerRequest.cpp | 8 +- src/xrpld/rpc/handlers/LogLevel.cpp | 2 + src/xrpld/rpc/handlers/LogRotate.cpp | 1 + src/xrpld/rpc/handlers/Manifest.cpp | 2 +- src/xrpld/rpc/handlers/NFTOffers.cpp | 2 +- src/xrpld/rpc/handlers/NoRippleCheck.cpp | 1 + src/xrpld/rpc/handlers/OwnerInfo.cpp | 2 +- src/xrpld/rpc/handlers/PathFind.cpp | 2 +- src/xrpld/rpc/handlers/PayChanClaim.cpp | 5 +- src/xrpld/rpc/handlers/Peers.cpp | 3 +- src/xrpld/rpc/handlers/Ping.cpp | 1 + src/xrpld/rpc/handlers/Print.cpp | 1 + src/xrpld/rpc/handlers/Reservations.cpp | 1 + src/xrpld/rpc/handlers/RipplePathFind.cpp | 1 + src/xrpld/rpc/handlers/ServerInfo.cpp | 3 +- src/xrpld/rpc/handlers/ServerState.cpp | 3 +- src/xrpld/rpc/handlers/SignFor.cpp | 2 +- src/xrpld/rpc/handlers/SignHandler.cpp | 1 + src/xrpld/rpc/handlers/Simulate.cpp | 3 +- src/xrpld/rpc/handlers/Stop.cpp | 3 +- src/xrpld/rpc/handlers/Submit.cpp | 4 +- src/xrpld/rpc/handlers/SubmitMultiSigned.cpp | 2 +- src/xrpld/rpc/handlers/Subscribe.cpp | 1 + src/xrpld/rpc/handlers/TransactionEntry.cpp | 2 +- src/xrpld/rpc/handlers/Tx.cpp | 2 +- src/xrpld/rpc/handlers/TxHistory.cpp | 5 +- src/xrpld/rpc/handlers/TxReduceRelay.cpp | 1 + src/xrpld/rpc/handlers/UnlList.cpp | 2 +- src/xrpld/rpc/handlers/Unsubscribe.cpp | 1 + src/xrpld/rpc/handlers/ValidationCreate.cpp | 2 +- src/xrpld/rpc/handlers/ValidatorInfo.cpp | 1 + src/xrpld/rpc/handlers/ValidatorListSites.cpp | 2 +- src/xrpld/rpc/handlers/Validators.cpp | 2 +- src/xrpld/rpc/handlers/WalletPropose.cpp | 3 +- src/xrpld/shamap/Family.h | 3 +- src/xrpld/shamap/FullBelowCache.h | 1 + src/xrpld/shamap/SHAMap.h | 5 +- src/xrpld/shamap/SHAMapAccountStateLeafNode.h | 2 +- src/xrpld/shamap/SHAMapInnerNode.h | 8 - src/xrpld/shamap/SHAMapItem.h | 1 + src/xrpld/shamap/SHAMapLeafNode.h | 1 - src/xrpld/shamap/SHAMapMissingNode.h | 2 + src/xrpld/shamap/SHAMapNodeID.h | 2 +- src/xrpld/shamap/SHAMapSyncFilter.h | 2 +- src/xrpld/shamap/SHAMapTreeNode.h | 6 +- src/xrpld/shamap/SHAMapTxLeafNode.h | 2 +- src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h | 2 +- src/xrpld/shamap/TreeNodeCache.h | 2 + src/xrpld/shamap/detail/NodeFamily.cpp | 1 + src/xrpld/shamap/detail/SHAMap.cpp | 1 + src/xrpld/shamap/detail/SHAMapDelta.cpp | 1 + src/xrpld/shamap/detail/SHAMapInnerNode.cpp | 5 +- src/xrpld/shamap/detail/SHAMapLeafNode.cpp | 2 - src/xrpld/shamap/detail/SHAMapNodeID.cpp | 2 +- src/xrpld/shamap/detail/SHAMapSync.cpp | 1 + src/xrpld/shamap/detail/SHAMapTreeNode.cpp | 4 +- src/xrpld/shamap/detail/TaggedPointer.h | 1 - src/xrpld/shamap/detail/TaggedPointer.ipp | 6 +- 983 files changed, 3537 insertions(+), 1392 deletions(-) delete mode 100644 external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch delete mode 100644 external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch create mode 100644 external/rocksdb/patches/9.7.3-0001-memory-leak.patch create mode 100644 external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch rename src/libxrpl/beast/utility/{src => }/beast_Journal.cpp (98%) rename src/libxrpl/beast/utility/{src => }/beast_PropertyStream.cpp (99%) rename src/xrpld/app/misc/detail/{detail => }/WorkSSL.cpp (100%) diff --git a/.clang-format b/.clang-format index 1d0f396dd8f..91003968851 100644 --- a/.clang-format +++ b/.clang-format @@ -44,6 +44,7 @@ DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ] +IncludeBlocks: Regroup IncludeCategories: - Regex: '^<(test)/' Priority: 0 @@ -53,8 +54,12 @@ IncludeCategories: Priority: 2 - Regex: '^<(boost)/' Priority: 3 - - Regex: '.*' + - Regex: '^.*/' Priority: 4 + - Regex: '^.*\.h' + Priority: 5 + - Regex: '.*' + Priority: 6 IncludeIsMainRegex: '$' IndentCaseLabels: true IndentFunctionDeclarationAfterType: false diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index d3c67e86685..afce1557d3b 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -14,7 +14,7 @@ runs: run: | conan config set general.revisions_enabled=1 conan export external/snappy snappy/1.1.10@ - conan export external/rocksdb rocksdb/6.29.5@ + conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ - name: add Ripple Conan remote @@ -55,7 +55,3 @@ runs: --options xrpld=True \ --settings build_type=${{ inputs.configuration }} \ .. - - name: upload dependencies to remote - if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success') - shell: bash - run: conan upload --remote ripple '*' --all --parallel --confirm diff --git a/.github/workflows/libxrpl.yml b/.github/workflows/libxrpl.yml index fe4a2c3e220..2834595e3a2 100644 --- a/.github/workflows/libxrpl.yml +++ b/.github/workflows/libxrpl.yml @@ -85,4 +85,5 @@ jobs: run: | gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \ /repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \ - -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" + -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" \ + -F "client_payload[pr]=${{ github.event.pull_request.number }}" diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 36d9f0225a9..566e3550e07 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -73,7 +73,6 @@ jobs: run : | conan profile new default --detect || true conan profile update settings.compiler.cppstd=20 default - conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default - name: build dependencies uses: ./.github/actions/dependencies env: diff --git a/BUILD.md b/BUILD.md index 310c538584d..fd985dce817 100644 --- a/BUILD.md +++ b/BUILD.md @@ -178,9 +178,9 @@ It does not override paths to dependencies when building with Visual Studio. ``` # Conan 1.x - conan export external/rocksdb rocksdb/6.29.5@ + conan export external/rocksdb rocksdb/9.7.3@ # Conan 2.x - conan export --version 6.29.5 external/rocksdb + conan export --version 9.7.3 external/rocksdb ``` Export our [Conan recipe for SOCI](./external/soci). diff --git a/Builds/levelization/results/loops.txt b/Builds/levelization/results/loops.txt index 7c132f5429e..df1d273f93b 100644 --- a/Builds/levelization/results/loops.txt +++ b/Builds/levelization/results/loops.txt @@ -14,10 +14,10 @@ Loop: xrpld.app xrpld.net xrpld.app > xrpld.net Loop: xrpld.app xrpld.overlay - xrpld.overlay == xrpld.app + xrpld.overlay > xrpld.app Loop: xrpld.app xrpld.peerfinder - xrpld.app > xrpld.peerfinder + xrpld.peerfinder ~= xrpld.app Loop: xrpld.app xrpld.rpc xrpld.rpc > xrpld.app diff --git a/Builds/levelization/results/ordering.txt b/Builds/levelization/results/ordering.txt index 681f76dd5db..eca7fc6dc29 100644 --- a/Builds/levelization/results/ordering.txt +++ b/Builds/levelization/results/ordering.txt @@ -6,6 +6,7 @@ libxrpl.protocol > xrpl.basics libxrpl.protocol > xrpl.json libxrpl.protocol > xrpl.protocol libxrpl.resource > xrpl.basics +libxrpl.resource > xrpl.json libxrpl.resource > xrpl.resource libxrpl.server > xrpl.basics libxrpl.server > xrpl.json @@ -42,6 +43,7 @@ test.consensus > xrpl.basics test.consensus > xrpld.app test.consensus > xrpld.consensus test.consensus > xrpld.ledger +test.consensus > xrpl.json test.core > test.jtx test.core > test.toplevel test.core > test.unit_test @@ -58,7 +60,6 @@ test.json > test.jtx test.json > xrpl.json test.jtx > xrpl.basics test.jtx > xrpld.app -test.jtx > xrpld.consensus test.jtx > xrpld.core test.jtx > xrpld.ledger test.jtx > xrpld.net @@ -158,7 +159,6 @@ xrpld.core > xrpl.basics xrpld.core > xrpl.json xrpld.core > xrpl.protocol xrpld.ledger > xrpl.basics -xrpld.ledger > xrpld.core xrpld.ledger > xrpl.json xrpld.ledger > xrpl.protocol xrpld.net > xrpl.basics @@ -183,7 +183,6 @@ xrpld.peerfinder > xrpld.core xrpld.peerfinder > xrpl.protocol xrpld.perflog > xrpl.basics xrpld.perflog > xrpl.json -xrpld.perflog > xrpl.protocol xrpld.rpc > xrpl.basics xrpld.rpc > xrpld.core xrpld.rpc > xrpld.ledger diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5d4d14d503c..6bc7beccc7b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,108 @@ This document contains the release notes for `rippled`, the reference server implementation of the XRP Ledger protocol. To learn more about how to build, run or update a `rippled` server, visit https://xrpl.org/install-rippled.html Have new ideas? Need help with setting up your node? [Please open an issue here](https://github.com/xrplf/rippled/issues/new/choose). +## Full Changelog + +### Amendments + +The following amendments are open for voting with this release: + +- **DynamicNFT (XLS-46)** - Adds the ability to mint mutable `NFToken` objects whose URI can be changed. ([#5048](https://github.com/XRPLF/rippled/pull/5048)) +- **PermissionedDomains (XLS-80)** - Adds Permissioned Domains, which act as part of broader systems on the XRP Ledger to restrict access to satisfy compliance rules. ([#5161](https://github.com/XRPLF/rippled/pull/5161)) +- **DeepFreeze (XLS-77)** - Adds the ability to deep freeze trust lines, enabling token issuers to block the transfer of assets for holders who have been deep frozen. ([#5187](https://github.com/XRPLF/rippled/pull/5187)) +- **fixFrozenLPTokenTransfer** - Prohibits the transfer of LP tokens when the associated liquidity pool contains at least one frozen asset. ([#5227](https://github.com/XRPLF/rippled/pull/5227)) +- **fixInvalidTxFlags** - Adds transaction flag checking for `CredentialCreate`, `CredentialAccept`, and `CredentialDelete` transactions. ([#5250](https://github.com/XRPLF/rippled/pull/5250)) + + +### New Features + +- Added a new `simulate` API method to execute dry runs of transactions and see the simulated metadata. ([#5069](https://github.com/XRPLF/rippled/pull/5069), [#5265](https://github.com/XRPLF/rippled/pull/5265)) +- Added the ability to specify MPTs when defining assets in transactions. ([#5200](https://github.com/XRPLF/rippled/pull/5200)) +- Added a `state` alias for `ripple_state` in the `ledger_entry` API method. Also refactored `LedgerEntry.cpp` to make it easier to read. ([#5199](https://github.com/XRPLF/rippled/pull/5199)) +- Improved UNL security by enabling validators to set a minimum number of UNL publishers to agree on validators. ([#5112](https://github.com/XRPLF/rippled/pull/5112)) +- Updated the XRPL Foundation UNL keys. ([#5289](https://github.com/XRPLF/rippled/pull/5289)) +- Added a new XRPL Foundation subdomain to enable a staged migration without modifying the key for the current UNL list. ([#5326](https://github.com/XRPLF/rippled/pull/5326)) +- Added support to filter ledger entry types by their canonical names in the `ledger`, `ledger_data`, and `account_objects` API methods. ([#5271](https://github.com/XRPLF/rippled/pull/5271)) +- Added detailed logging for each validation and proposal received from the network. ([#5291](https://github.com/XRPLF/rippled/pull/5291)) +- Improved git commit hash lookups when checking the version of a `rippled` debug build. Also added git commit hash info when using the `server_info` API method on an admin connection. ([#5225](https://github.com/XRPLF/rippled/pull/5225)) + + +### Bug fixes + +- Fixed an issue with overlapping data types in the `Expected` class. ([#5218](https://github.com/XRPLF/rippled/pull/5218)) +- Fixed an issue that prevented `rippled` from building on Windows with VS2022. ([#5197](https://github.com/XRPLF/rippled/pull/5197)) +- Fixed `server_definitions` prefixes. ([#5231](https://github.com/XRPLF/rippled/pull/5231)) +- Added missing dependency installations for generic MasOS runners. ([#5233](https://github.com/XRPLF/rippled/pull/5233)) +- Updated deprecated Github actions. ([#5241](https://github.com/XRPLF/rippled/pull/5241)) +- Fixed a failing assert scenario when submitting the `connect` admin RPC. ([#5235](https://github.com/XRPLF/rippled/pull/5235)) +- Fixed the levelization script to ignore single-line comments during dependency analysis. ([#5194](https://github.com/XRPLF/rippled/pull/5194)) +- Fixed the assert name used in `PermissionedDomainDelete`. ([#5245](https://github.com/XRPLF/rippled/pull/5245)) +- Fixed macOS unit tests. ([#5196](https://github.com/XRPLF/rippled/pull/5196)) +- Fixed an issue with validators not accurately reflecting amendment votes. Also added debug logging of amendment votes. ([#5173](https://github.com/XRPLF/rippled/pull/5173), [#5312](https://github.com/XRPLF/rippled/pull/5312)) +- Fixed a potential issue with double-charging fees. ([#5269](https://github.com/XRPLF/rippled/pull/5269)) +- Removed the `new parent hash` assert and replaced it with a log message. ([#5313](https://github.com/XRPLF/rippled/pull/5313)) +- Fixed an issue that prevented previously-failed inbound ledgers to not be acquired if a new trusted proposal arrived. ([#5318](https://github.com/XRPLF/rippled/pull/5318)) + + +### Other Improvements + +- Added unit tests for `AccountID` handling. ([#5174](https://github.com/XRPLF/rippled/pull/5174)) +- Added enforced levelization in `libxrpl` with CMake. ([#5199](https://github.com/XRPLF/rippled/pull/5111)) +- Updated `libxrpl` and all submodules to use the same compiler options. ([#5228](https://github.com/XRPLF/rippled/pull/5228)) +- Added Antithesis instrumentation. ([#5042](https://github.com/XRPLF/rippled/pull/5042), [#5213](https://github.com/XRPLF/rippled/pull/5213)) +- Added `rpcName` to the `LEDGER_ENTRY` macro to help prevent future bugs. ([#5202](https://github.com/XRPLF/rippled/pull/5202)) +- Updated the contribution guidelines to introduce a new workflow that avoids code freezes. Also added scripts that can be used by maintainers in branch management, and a CI job to check that code is consistent across the three main branches: `master`, `release`, and `develop`. ([#5215](https://github.com/XRPLF/rippled/pull/5215)) +- Added unit tests to check for caching issues fixed in `rippled 2.3.0`. ([#5242](https://github.com/XRPLF/rippled/pull/5242)) +- Cleaned up the API changelog. ([#5207](https://github.com/XRPLF/rippled/pull/5207)) +- Improved logs readability. ([#5251](https://github.com/XRPLF/rippled/pull/5251)) +- Updated Visual Studio CI to VS 2022, and added VS Debug builds. ([#5240](https://github.com/XRPLF/rippled/pull/5240)) +- Updated the `secp256k1` library to version 0.6.0. ([#5254](https://github.com/XRPLF/rippled/pull/5254)) +- Changed the `[port_peer]` parameter in `rippled` example config back to `51235`; also added the recommendation to use the default port of `2459` for new deployments. ([#5290](https://github.com/XRPLF/rippled/pull/5290), [#5299](https://github.com/XRPLF/rippled/pull/5299)) +- Improved CI management. ([#5268](https://github.com/XRPLF/rippled/pull/5268)) +- Updated the git commit message rules for contributors. ([#5283](https://github.com/XRPLF/rippled/pull/5283)) +- Fixed unnecessary `setCurrentThreadName` calls. ([#5280](https://github.com/XRPLF/rippled/pull/5280)) +- Added a check to prevent permissioned domains from being created in the event the Permissioned Domains amendement is enabled before the Credentials amendement. ([#5275](https://github.com/XRPLF/rippled/pull/5275)) +- Updated Conan dependencies. ([#5256](https://github.com/XRPLF/rippled/pull/5256)) +- Fixed minor typos in code comments. ([#5279](https://github.com/XRPLF/rippled/pull/5279)) +- Fixed incorrect build instructions. ([#5274](https://github.com/XRPLF/rippled/pull/5274)) +- Refactored `rotateWithLock()` to not hold a lock during callbacks. ([#5276](https://github.com/XRPLF/rippled/pull/5276)) +- Cleaned up debug logging by combining multiple data points into a single message. ([#5302](https://github.com/XRPLF/rippled/pull/5302)) +- Updated build flags to fix performance regressions. ([#5325](https://github.com/XRPLF/rippled/pull/5325)) + + +## Credits + +The following people contributed directly to this release: + +- Aanchal Malhotra +- Bart Thomee <11445373+bthomee@users.noreply.github.com> +- Bronek Kozicki +- code0xff +- Darius Tumas +- David Fuelling +- Donovan Hide +- Ed Hennis +- Elliot Lee +- Javier Romero +- Kenny Lei +- Mark Travis <7728157+mtrippled@users.noreply.github.com> +- Mayukha Vadari +- Michael Legleux +- Oleksandr <115580134+oleks-rip@users.noreply.github.com> +- Qi Zhao +- Ramkumar Srirengaram Gunasegharan +- Shae Wang +- Shawn Xie +- Sophia Xie +- Vijay Khanna Raviraj +- Vladislav Vysokikh +- Xun Zhao + +## Bug Bounties and Responsible Disclosures + +We welcome reviews of the `rippled` code and urge researchers to responsibly disclose any issues they may find. + +To report a bug, please send a detailed report to: # Version 2.3.1 diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index d465994a6b9..7affa212ab9 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -420,6 +420,7 @@ # - r.ripple.com 51235 # - sahyadri.isrdc.in 51235 # - hubs.xrpkuwait.com 51235 +# - hub.xrpl-commons.org 51235 # # Examples: # diff --git a/conanfile.py b/conanfile.py index ec39608d3fd..d49f45903e0 100644 --- a/conanfile.py +++ b/conanfile.py @@ -108,7 +108,7 @@ def requirements(self): if self.options.jemalloc: self.requires('jemalloc/5.3.0') if self.options.rocksdb: - self.requires('rocksdb/6.29.5') + self.requires('rocksdb/9.7.3') exports_sources = ( 'CMakeLists.txt', diff --git a/docs/consensus.md b/docs/consensus.md index 1b0063663a2..4ee5aa70dca 100644 --- a/docs/consensus.md +++ b/docs/consensus.md @@ -558,7 +558,7 @@ struct ConsensusResult ConsensusTimer roundTime; // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn + // will be either Yes or MovedOn or Expired ConsensusState state = ConsensusState::No; }; diff --git a/examples/example/src/example.cpp b/examples/example/src/example.cpp index 7ff07f6ea4d..8c3acdee075 100644 --- a/examples/example/src/example.cpp +++ b/examples/example/src/example.cpp @@ -1,7 +1,7 @@ -#include - #include +#include + int main(int argc, char const** argv) { std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str()); return 0; diff --git a/external/rocksdb/conandata.yml b/external/rocksdb/conandata.yml index 86b42f79f0f..7d7a575d980 100644 --- a/external/rocksdb/conandata.yml +++ b/external/rocksdb/conandata.yml @@ -1,27 +1,12 @@ sources: - "6.29.5": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.29.5.tar.gz" - sha256: "ddbf84791f0980c0bbce3902feb93a2c7006f6f53bfd798926143e31d4d756f0" - "6.27.3": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.27.3.tar.gz" - sha256: "ee29901749b9132692b26f0a6c1d693f47d1a9ed8e3771e60556afe80282bf58" - "6.20.3": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.20.3.tar.gz" - sha256: "c6502c7aae641b7e20fafa6c2b92273d935d2b7b2707135ebd9a67b092169dca" - "8.8.1": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v8.8.1.tar.gz" - sha256: "056c7e21ad8ae36b026ac3b94b9d6e0fcc60e1d937fc80330921e4181be5c36e" + "9.7.3": + url: "https://github.com/facebook/rocksdb/archive/refs/tags/v9.7.3.tar.gz" + sha256: "acfabb989cbfb5b5c4d23214819b059638193ec33dad2d88373c46448d16d38b" patches: - "6.29.5": - - patch_file: "patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch" - patch_description: "Fix build with gcc 13 by including cstdint" - patch_type: "portability" - patch_source: "https://github.com/facebook/rocksdb/pull/11118" - - patch_file: "patches/6.29.5-0002-exclude-thirdparty.patch" + "9.7.3": + - patch_file: "patches/9.x.x-0001-exclude-thirdparty.patch" patch_description: "Do not include thirdparty.inc" patch_type: "portability" - "6.27.3": - - patch_file: "patches/6.27.3-0001-add-include-cstdint-for-gcc-13.patch" - patch_description: "Fix build with gcc 13 by including cstdint" + - patch_file: "patches/9.7.3-0001-memory-leak.patch" + patch_description: "Fix a leak of obsolete blob files left open until DB::Close()" patch_type: "portability" - patch_source: "https://github.com/facebook/rocksdb/pull/11118" diff --git a/external/rocksdb/conanfile.py b/external/rocksdb/conanfile.py index 1c7853d8140..8b85ce1540d 100644 --- a/external/rocksdb/conanfile.py +++ b/external/rocksdb/conanfile.py @@ -15,10 +15,10 @@ class RocksDBConan(ConanFile): name = "rocksdb" - homepage = "https://github.com/facebook/rocksdb" + description = "A library that provides an embeddable, persistent key-value store for fast storage" license = ("GPL-2.0-only", "Apache-2.0") url = "https://github.com/conan-io/conan-center-index" - description = "A library that provides an embeddable, persistent key-value store for fast storage" + homepage = "https://github.com/facebook/rocksdb" topics = ("database", "leveldb", "facebook", "key-value") package_type = "library" settings = "os", "arch", "compiler", "build_type" @@ -58,12 +58,12 @@ def _min_cppstd(self): @property def _compilers_minimum_version(self): return {} if self._min_cppstd == "11" else { - "apple-clang": "10", - "clang": "7", - "gcc": "7", - "msvc": "191", - "Visual Studio": "15", - } + "apple-clang": "10", + "clang": "7", + "gcc": "7", + "msvc": "191", + "Visual Studio": "15", + } def export_sources(self): export_conandata_patches(self) @@ -115,9 +115,9 @@ def validate(self): check_min_vs(self, "191") if self.version == "6.20.3" and \ - self.settings.os == "Linux" and \ - self.settings.compiler == "gcc" and \ - Version(self.settings.compiler.version) < "5": + self.settings.os == "Linux" and \ + self.settings.compiler == "gcc" and \ + Version(self.settings.compiler.version) < "5": raise ConanInvalidConfiguration("Rocksdb 6.20.3 is not compilable with gcc <5.") # See https://github.com/facebook/rocksdb/issues/3522 def source(self): @@ -163,6 +163,8 @@ def generate(self): if self.options.with_jemalloc: deps.set_property("jemalloc", "cmake_file_name", "JeMalloc") deps.set_property("jemalloc", "cmake_target_name", "JeMalloc::JeMalloc") + if self.options.with_zstd: + deps.set_property("zstd", "cmake_target_name", "zstd::zstd") deps.generate() def build(self): diff --git a/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch b/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch deleted file mode 100644 index 05725bf2c9a..00000000000 --- a/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/include/rocksdb/utilities/checkpoint.h -+++ b/include/rocksdb/utilities/checkpoint.h -@@ -8,6 +8,7 @@ - #pragma once - #ifndef ROCKSDB_LITE - -+#include - #include - #include - #include "rocksdb/status.h" ---- a/table/block_based/data_block_hash_index.h -+++ b/table/block_based/data_block_hash_index.h -@@ -5,6 +5,7 @@ - - #pragma once - -+#include - #include - #include - ---- a/util/string_util.h -+++ b/util/string_util.h -@@ -6,6 +6,7 @@ - - #pragma once - -+#include - #include - #include - #include diff --git a/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch b/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch deleted file mode 100644 index fb0dd0c46b4..00000000000 --- a/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index ec59d4491..35577c998 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -101 +100,0 @@ if(MSVC) -- option(WITH_GFLAGS "build with GFlags" OFF) -@@ -103,2 +102,2 @@ if(MSVC) -- include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc) --else() -+endif() -+ -@@ -117 +116 @@ else() -- if(MINGW) -+ if(MINGW OR MSVC) -@@ -183 +181,0 @@ else() --endif() diff --git a/external/rocksdb/patches/9.7.3-0001-memory-leak.patch b/external/rocksdb/patches/9.7.3-0001-memory-leak.patch new file mode 100644 index 00000000000..bb086e6cb21 --- /dev/null +++ b/external/rocksdb/patches/9.7.3-0001-memory-leak.patch @@ -0,0 +1,319 @@ +diff --git a/HISTORY.md b/HISTORY.md +index 36d472229..05ad1a202 100644 +--- a/HISTORY.md ++++ b/HISTORY.md +@@ -1,6 +1,10 @@ + # Rocksdb Change Log + > NOTE: Entries for next release do not go here. Follow instructions in `unreleased_history/README.txt` + ++## 9.7.4 (10/31/2024) ++### Bug Fixes ++* Fix a leak of obsolete blob files left open until DB::Close(). This bug was introduced in version 9.4.0. ++ + ## 9.7.3 (10/16/2024) + ### Behavior Changes + * OPTIONS file to be loaded by remote worker is now preserved so that it does not get purged by the primary host. A similar technique as how we are preserving new SST files from getting purged is used for this. min_options_file_numbers_ is tracked like pending_outputs_ is tracked. +diff --git a/db/blob/blob_file_cache.cc b/db/blob/blob_file_cache.cc +index 5f340aadf..1b9faa238 100644 +--- a/db/blob/blob_file_cache.cc ++++ b/db/blob/blob_file_cache.cc +@@ -42,6 +42,7 @@ Status BlobFileCache::GetBlobFileReader( + assert(blob_file_reader); + assert(blob_file_reader->IsEmpty()); + ++ // NOTE: sharing same Cache with table_cache + const Slice key = GetSliceForKey(&blob_file_number); + + assert(cache_); +@@ -98,4 +99,13 @@ Status BlobFileCache::GetBlobFileReader( + return Status::OK(); + } + ++void BlobFileCache::Evict(uint64_t blob_file_number) { ++ // NOTE: sharing same Cache with table_cache ++ const Slice key = GetSliceForKey(&blob_file_number); ++ ++ assert(cache_); ++ ++ cache_.get()->Erase(key); ++} ++ + } // namespace ROCKSDB_NAMESPACE +diff --git a/db/blob/blob_file_cache.h b/db/blob/blob_file_cache.h +index 740e67ada..6858d012b 100644 +--- a/db/blob/blob_file_cache.h ++++ b/db/blob/blob_file_cache.h +@@ -36,6 +36,15 @@ class BlobFileCache { + uint64_t blob_file_number, + CacheHandleGuard* blob_file_reader); + ++ // Called when a blob file is obsolete to ensure it is removed from the cache ++ // to avoid effectively leaking the open file and assicated memory ++ void Evict(uint64_t blob_file_number); ++ ++ // Used to identify cache entries for blob files (not normally useful) ++ static const Cache::CacheItemHelper* GetHelper() { ++ return CacheInterface::GetBasicHelper(); ++ } ++ + private: + using CacheInterface = + BasicTypedCacheInterface; +diff --git a/db/column_family.h b/db/column_family.h +index e4b7adde8..86637736a 100644 +--- a/db/column_family.h ++++ b/db/column_family.h +@@ -401,6 +401,7 @@ class ColumnFamilyData { + SequenceNumber earliest_seq); + + TableCache* table_cache() const { return table_cache_.get(); } ++ BlobFileCache* blob_file_cache() const { return blob_file_cache_.get(); } + BlobSource* blob_source() const { return blob_source_.get(); } + + // See documentation in compaction_picker.h +diff --git a/db/db_impl/db_impl.cc b/db/db_impl/db_impl.cc +index 261593423..06573ac2e 100644 +--- a/db/db_impl/db_impl.cc ++++ b/db/db_impl/db_impl.cc +@@ -659,8 +659,9 @@ Status DBImpl::CloseHelper() { + // We need to release them before the block cache is destroyed. The block + // cache may be destroyed inside versions_.reset(), when column family data + // list is destroyed, so leaving handles in table cache after +- // versions_.reset() may cause issues. +- // Here we clean all unreferenced handles in table cache. ++ // versions_.reset() may cause issues. Here we clean all unreferenced handles ++ // in table cache, and (for certain builds/conditions) assert that no obsolete ++ // files are hanging around unreferenced (leak) in the table/blob file cache. + // Now we assume all user queries have finished, so only version set itself + // can possibly hold the blocks from block cache. After releasing unreferenced + // handles here, only handles held by version set left and inside +@@ -668,6 +669,9 @@ Status DBImpl::CloseHelper() { + // time a handle is released, we erase it from the cache too. By doing that, + // we can guarantee that after versions_.reset(), table cache is empty + // so the cache can be safely destroyed. ++#ifndef NDEBUG ++ TEST_VerifyNoObsoleteFilesCached(/*db_mutex_already_held=*/true); ++#endif // !NDEBUG + table_cache_->EraseUnRefEntries(); + + for (auto& txn_entry : recovered_transactions_) { +@@ -3227,6 +3231,8 @@ Status DBImpl::MultiGetImpl( + s = Status::Aborted(); + break; + } ++ // This could be a long-running operation ++ ROCKSDB_THREAD_YIELD_HOOK(); + } + + // Post processing (decrement reference counts and record statistics) +diff --git a/db/db_impl/db_impl.h b/db/db_impl/db_impl.h +index 5e4fa310b..ccc0abfa7 100644 +--- a/db/db_impl/db_impl.h ++++ b/db/db_impl/db_impl.h +@@ -1241,9 +1241,14 @@ class DBImpl : public DB { + static Status TEST_ValidateOptions(const DBOptions& db_options) { + return ValidateOptions(db_options); + } +- + #endif // NDEBUG + ++ // In certain configurations, verify that the table/blob file cache only ++ // contains entries for live files, to check for effective leaks of open ++ // files. This can only be called when purging of obsolete files has ++ // "settled," such as during parts of DB Close(). ++ void TEST_VerifyNoObsoleteFilesCached(bool db_mutex_already_held) const; ++ + // persist stats to column family "_persistent_stats" + void PersistStats(); + +diff --git a/db/db_impl/db_impl_debug.cc b/db/db_impl/db_impl_debug.cc +index 790a50d7a..67f5b4aaf 100644 +--- a/db/db_impl/db_impl_debug.cc ++++ b/db/db_impl/db_impl_debug.cc +@@ -9,6 +9,7 @@ + + #ifndef NDEBUG + ++#include "db/blob/blob_file_cache.h" + #include "db/column_family.h" + #include "db/db_impl/db_impl.h" + #include "db/error_handler.h" +@@ -328,5 +329,49 @@ size_t DBImpl::TEST_EstimateInMemoryStatsHistorySize() const { + InstrumentedMutexLock l(&const_cast(this)->stats_history_mutex_); + return EstimateInMemoryStatsHistorySize(); + } ++ ++void DBImpl::TEST_VerifyNoObsoleteFilesCached( ++ bool db_mutex_already_held) const { ++ // This check is somewhat expensive and obscure to make a part of every ++ // unit test in every build variety. Thus, we only enable it for ASAN builds. ++ if (!kMustFreeHeapAllocations) { ++ return; ++ } ++ ++ std::optional l; ++ if (db_mutex_already_held) { ++ mutex_.AssertHeld(); ++ } else { ++ l.emplace(&mutex_); ++ } ++ ++ std::vector live_files; ++ for (auto cfd : *versions_->GetColumnFamilySet()) { ++ if (cfd->IsDropped()) { ++ continue; ++ } ++ // Sneakily add both SST and blob files to the same list ++ cfd->current()->AddLiveFiles(&live_files, &live_files); ++ } ++ std::sort(live_files.begin(), live_files.end()); ++ ++ auto fn = [&live_files](const Slice& key, Cache::ObjectPtr, size_t, ++ const Cache::CacheItemHelper* helper) { ++ if (helper != BlobFileCache::GetHelper()) { ++ // Skip non-blob files for now ++ // FIXME: diagnose and fix the leaks of obsolete SST files revealed in ++ // unit tests. ++ return; ++ } ++ // See TableCache and BlobFileCache ++ assert(key.size() == sizeof(uint64_t)); ++ uint64_t file_number; ++ GetUnaligned(reinterpret_cast(key.data()), &file_number); ++ // Assert file is in sorted live_files ++ assert( ++ std::binary_search(live_files.begin(), live_files.end(), file_number)); ++ }; ++ table_cache_->ApplyToAllEntries(fn, {}); ++} + } // namespace ROCKSDB_NAMESPACE + #endif // NDEBUG +diff --git a/db/db_iter.cc b/db/db_iter.cc +index e02586377..bf4749eb9 100644 +--- a/db/db_iter.cc ++++ b/db/db_iter.cc +@@ -540,6 +540,8 @@ bool DBIter::FindNextUserEntryInternal(bool skipping_saved_key, + } else { + iter_.Next(); + } ++ // This could be a long-running operation due to tombstones, etc. ++ ROCKSDB_THREAD_YIELD_HOOK(); + } while (iter_.Valid()); + + valid_ = false; +diff --git a/db/table_cache.cc b/db/table_cache.cc +index 71fc29c32..8a5be75e8 100644 +--- a/db/table_cache.cc ++++ b/db/table_cache.cc +@@ -164,6 +164,7 @@ Status TableCache::GetTableReader( + } + + Cache::Handle* TableCache::Lookup(Cache* cache, uint64_t file_number) { ++ // NOTE: sharing same Cache with BlobFileCache + Slice key = GetSliceForFileNumber(&file_number); + return cache->Lookup(key); + } +@@ -179,6 +180,7 @@ Status TableCache::FindTable( + size_t max_file_size_for_l0_meta_pin, Temperature file_temperature) { + PERF_TIMER_GUARD_WITH_CLOCK(find_table_nanos, ioptions_.clock); + uint64_t number = file_meta.fd.GetNumber(); ++ // NOTE: sharing same Cache with BlobFileCache + Slice key = GetSliceForFileNumber(&number); + *handle = cache_.Lookup(key); + TEST_SYNC_POINT_CALLBACK("TableCache::FindTable:0", +diff --git a/db/version_builder.cc b/db/version_builder.cc +index ed8ab8214..c98f53f42 100644 +--- a/db/version_builder.cc ++++ b/db/version_builder.cc +@@ -24,6 +24,7 @@ + #include + + #include "cache/cache_reservation_manager.h" ++#include "db/blob/blob_file_cache.h" + #include "db/blob/blob_file_meta.h" + #include "db/dbformat.h" + #include "db/internal_stats.h" +@@ -744,12 +745,9 @@ class VersionBuilder::Rep { + return Status::Corruption("VersionBuilder", oss.str()); + } + +- // Note: we use C++11 for now but in C++14, this could be done in a more +- // elegant way using generalized lambda capture. +- VersionSet* const vs = version_set_; +- const ImmutableCFOptions* const ioptions = ioptions_; +- +- auto deleter = [vs, ioptions](SharedBlobFileMetaData* shared_meta) { ++ auto deleter = [vs = version_set_, ioptions = ioptions_, ++ bc = cfd_ ? cfd_->blob_file_cache() ++ : nullptr](SharedBlobFileMetaData* shared_meta) { + if (vs) { + assert(ioptions); + assert(!ioptions->cf_paths.empty()); +@@ -758,6 +756,9 @@ class VersionBuilder::Rep { + vs->AddObsoleteBlobFile(shared_meta->GetBlobFileNumber(), + ioptions->cf_paths.front().path); + } ++ if (bc) { ++ bc->Evict(shared_meta->GetBlobFileNumber()); ++ } + + delete shared_meta; + }; +@@ -766,7 +767,7 @@ class VersionBuilder::Rep { + blob_file_number, blob_file_addition.GetTotalBlobCount(), + blob_file_addition.GetTotalBlobBytes(), + blob_file_addition.GetChecksumMethod(), +- blob_file_addition.GetChecksumValue(), deleter); ++ blob_file_addition.GetChecksumValue(), std::move(deleter)); + + mutable_blob_file_metas_.emplace( + blob_file_number, MutableBlobFileMetaData(std::move(shared_meta))); +diff --git a/db/version_set.h b/db/version_set.h +index 9336782b1..024f869e7 100644 +--- a/db/version_set.h ++++ b/db/version_set.h +@@ -1514,7 +1514,6 @@ class VersionSet { + void GetLiveFilesMetaData(std::vector* metadata); + + void AddObsoleteBlobFile(uint64_t blob_file_number, std::string path) { +- // TODO: Erase file from BlobFileCache? + obsolete_blob_files_.emplace_back(blob_file_number, std::move(path)); + } + +diff --git a/include/rocksdb/version.h b/include/rocksdb/version.h +index 2a19796b8..0afa2cab1 100644 +--- a/include/rocksdb/version.h ++++ b/include/rocksdb/version.h +@@ -13,7 +13,7 @@ + // minor or major version number planned for release. + #define ROCKSDB_MAJOR 9 + #define ROCKSDB_MINOR 7 +-#define ROCKSDB_PATCH 3 ++#define ROCKSDB_PATCH 4 + + // Do not use these. We made the mistake of declaring macros starting with + // double underscore. Now we have to live with our choice. We'll deprecate these +diff --git a/port/port.h b/port/port.h +index 13aa56d47..141716e5b 100644 +--- a/port/port.h ++++ b/port/port.h +@@ -19,3 +19,19 @@ + #elif defined(OS_WIN) + #include "port/win/port_win.h" + #endif ++ ++#ifdef OS_LINUX ++// A temporary hook into long-running RocksDB threads to support modifying their ++// priority etc. This should become a public API hook once the requirements ++// are better understood. ++extern "C" void RocksDbThreadYield() __attribute__((__weak__)); ++#define ROCKSDB_THREAD_YIELD_HOOK() \ ++ { \ ++ if (RocksDbThreadYield) { \ ++ RocksDbThreadYield(); \ ++ } \ ++ } ++#else ++#define ROCKSDB_THREAD_YIELD_HOOK() \ ++ {} ++#endif diff --git a/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch b/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch new file mode 100644 index 00000000000..7b5858bc1e9 --- /dev/null +++ b/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch @@ -0,0 +1,30 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 93b884d..b715cb6 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -106,14 +106,9 @@ endif() + include(CMakeDependentOption) + + if(MSVC) +- option(WITH_GFLAGS "build with GFlags" OFF) + option(WITH_XPRESS "build with windows built in compression" OFF) +- option(ROCKSDB_SKIP_THIRDPARTY "skip thirdparty.inc" OFF) +- +- if(NOT ROCKSDB_SKIP_THIRDPARTY) +- include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc) +- endif() +-else() ++endif() ++if(TRUE) + if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") + # FreeBSD has jemalloc as default malloc + # but it does not have all the jemalloc files in include/... +@@ -126,7 +121,7 @@ else() + endif() + endif() + +- if(MINGW) ++ if(MSVC OR MINGW) + option(WITH_GFLAGS "build with GFlags" OFF) + else() + option(WITH_GFLAGS "build with GFlags" ON) diff --git a/include/xrpl/basics/BasicConfig.h b/include/xrpl/basics/BasicConfig.h index f7e90c7c9a4..2e3478644e2 100644 --- a/include/xrpl/basics/BasicConfig.h +++ b/include/xrpl/basics/BasicConfig.h @@ -27,7 +27,6 @@ #include #include -#include #include #include #include diff --git a/include/xrpl/basics/Buffer.h b/include/xrpl/basics/Buffer.h index eb7a4571981..b2f11634525 100644 --- a/include/xrpl/basics/Buffer.h +++ b/include/xrpl/basics/Buffer.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { diff --git a/include/xrpl/basics/CompressionAlgorithms.h b/include/xrpl/basics/CompressionAlgorithms.h index 4defd5a4904..19db3568d6b 100644 --- a/include/xrpl/basics/CompressionAlgorithms.h +++ b/include/xrpl/basics/CompressionAlgorithms.h @@ -21,9 +21,11 @@ #define RIPPLED_COMPRESSIONALGORITHMS_H_INCLUDED #include + +#include + #include #include -#include #include #include diff --git a/include/xrpl/basics/CountedObject.h b/include/xrpl/basics/CountedObject.h index 9ea76aa3bd0..ef4b6544d20 100644 --- a/include/xrpl/basics/CountedObject.h +++ b/include/xrpl/basics/CountedObject.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_COUNTEDOBJECT_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/basics/Expected.h b/include/xrpl/basics/Expected.h index ced41b13caa..9abc7c8432b 100644 --- a/include/xrpl/basics/Expected.h +++ b/include/xrpl/basics/Expected.h @@ -24,9 +24,7 @@ #include -#include #include -#include namespace ripple { diff --git a/include/xrpl/basics/LocalValue.h b/include/xrpl/basics/LocalValue.h index 41556f34f29..1f53fab2468 100644 --- a/include/xrpl/basics/LocalValue.h +++ b/include/xrpl/basics/LocalValue.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_LOCALVALUE_H_INCLUDED #include + #include #include diff --git a/include/xrpl/basics/Log.h b/include/xrpl/basics/Log.h index 442270546e6..2506b8ea8dd 100644 --- a/include/xrpl/basics/Log.h +++ b/include/xrpl/basics/Log.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include #include #include diff --git a/include/xrpl/basics/Resolver.h b/include/xrpl/basics/Resolver.h index 6cba352e0a0..2ed32f39bd0 100644 --- a/include/xrpl/basics/Resolver.h +++ b/include/xrpl/basics/Resolver.h @@ -20,11 +20,11 @@ #ifndef RIPPLE_BASICS_RESOLVER_H_INCLUDED #define RIPPLE_BASICS_RESOLVER_H_INCLUDED +#include + #include #include -#include - namespace ripple { class Resolver diff --git a/include/xrpl/basics/ResolverAsio.h b/include/xrpl/basics/ResolverAsio.h index 51fcbdfb0d8..49700d2b243 100644 --- a/include/xrpl/basics/ResolverAsio.h +++ b/include/xrpl/basics/ResolverAsio.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/include/xrpl/basics/Slice.h b/include/xrpl/basics/Slice.h index 9e9991f0dd2..65d7acfd94e 100644 --- a/include/xrpl/basics/Slice.h +++ b/include/xrpl/basics/Slice.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/basics/TaggedCache.h b/include/xrpl/basics/TaggedCache.h index 1fcdc3707b6..dcc7c0def96 100644 --- a/include/xrpl/basics/TaggedCache.h +++ b/include/xrpl/basics/TaggedCache.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/basics/UnorderedContainers.h b/include/xrpl/basics/UnorderedContainers.h index b689a1b6ac8..4f6e1093b13 100644 --- a/include/xrpl/basics/UnorderedContainers.h +++ b/include/xrpl/basics/UnorderedContainers.h @@ -25,6 +25,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/basics/base_uint.h b/include/xrpl/basics/base_uint.h index 05d83b3bb0a..4b93330ef22 100644 --- a/include/xrpl/basics/base_uint.h +++ b/include/xrpl/basics/base_uint.h @@ -33,12 +33,13 @@ #include #include #include + #include #include + #include #include #include -#include #include namespace ripple { diff --git a/include/xrpl/basics/chrono.h b/include/xrpl/basics/chrono.h index d739b6bf44b..2ed1a960470 100644 --- a/include/xrpl/basics/chrono.h +++ b/include/xrpl/basics/chrono.h @@ -20,17 +20,16 @@ #ifndef RIPPLE_BASICS_CHRONO_H_INCLUDED #define RIPPLE_BASICS_CHRONO_H_INCLUDED -#include - #include #include #include +#include + #include #include #include #include -#include namespace ripple { diff --git a/include/xrpl/basics/contract.h b/include/xrpl/basics/contract.h index bdfc8aac362..bf98964b9eb 100644 --- a/include/xrpl/basics/contract.h +++ b/include/xrpl/basics/contract.h @@ -21,9 +21,9 @@ #define RIPPLE_BASICS_CONTRACT_H_INCLUDED #include + #include #include -#include #include namespace ripple { diff --git a/include/xrpl/basics/make_SSLContext.h b/include/xrpl/basics/make_SSLContext.h index c752a075859..aba797ce31e 100644 --- a/include/xrpl/basics/make_SSLContext.h +++ b/include/xrpl/basics/make_SSLContext.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_MAKE_SSLCONTEXT_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/basics/partitioned_unordered_map.h b/include/xrpl/basics/partitioned_unordered_map.h index 4619ca1f4ce..a378011520f 100644 --- a/include/xrpl/basics/partitioned_unordered_map.h +++ b/include/xrpl/basics/partitioned_unordered_map.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/basics/random.h b/include/xrpl/basics/random.h index ca65b581d2e..4b8bc81759b 100644 --- a/include/xrpl/basics/random.h +++ b/include/xrpl/basics/random.h @@ -22,9 +22,9 @@ #include #include + #include #include -#include #include #include #include diff --git a/include/xrpl/basics/spinlock.h b/include/xrpl/basics/spinlock.h index 14a063e27a6..5d5097bd2df 100644 --- a/include/xrpl/basics/spinlock.h +++ b/include/xrpl/basics/spinlock.h @@ -19,6 +19,7 @@ #define RIPPLE_BASICS_SPINLOCK_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/basics/tagged_integer.h b/include/xrpl/basics/tagged_integer.h index 4629e830916..b826b87db15 100644 --- a/include/xrpl/basics/tagged_integer.h +++ b/include/xrpl/basics/tagged_integer.h @@ -21,7 +21,9 @@ #define BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/asio/io_latency_probe.h b/include/xrpl/beast/asio/io_latency_probe.h index ca3efcdb3f1..966b4686aea 100644 --- a/include/xrpl/beast/asio/io_latency_probe.h +++ b/include/xrpl/beast/asio/io_latency_probe.h @@ -21,6 +21,7 @@ #define BEAST_ASIO_IO_LATENCY_PROBE_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/container/detail/aged_ordered_container.h b/include/xrpl/beast/container/detail/aged_ordered_container.h index ad807e92cfe..8c978d05173 100644 --- a/include/xrpl/beast/container/detail/aged_ordered_container.h +++ b/include/xrpl/beast/container/detail/aged_ordered_container.h @@ -25,9 +25,11 @@ #include #include #include + #include #include #include + #include #include #include diff --git a/include/xrpl/beast/container/detail/aged_unordered_container.h b/include/xrpl/beast/container/detail/aged_unordered_container.h index abafc6b2c4c..3b9c83a0149 100644 --- a/include/xrpl/beast/container/detail/aged_unordered_container.h +++ b/include/xrpl/beast/container/detail/aged_unordered_container.h @@ -25,8 +25,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/container/detail/empty_base_optimization.h b/include/xrpl/beast/container/detail/empty_base_optimization.h index 4cdc3a0e162..350046d5940 100644 --- a/include/xrpl/beast/container/detail/empty_base_optimization.h +++ b/include/xrpl/beast/container/detail/empty_base_optimization.h @@ -11,6 +11,7 @@ #define BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/core/LexicalCast.h b/include/xrpl/beast/core/LexicalCast.h index b01fd8ae140..aa67bcad50f 100644 --- a/include/xrpl/beast/core/LexicalCast.h +++ b/include/xrpl/beast/core/LexicalCast.h @@ -23,6 +23,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/beast/core/List.h b/include/xrpl/beast/core/List.h index 9b3c889d6ac..d95f92d1c8e 100644 --- a/include/xrpl/beast/core/List.h +++ b/include/xrpl/beast/core/List.h @@ -21,7 +21,6 @@ #define BEAST_INTRUSIVE_LIST_H_INCLUDED #include -#include namespace beast { diff --git a/include/xrpl/beast/hash/hash_append.h b/include/xrpl/beast/hash/hash_append.h index 2cbcd9ae3d0..6b11fe1eb32 100644 --- a/include/xrpl/beast/hash/hash_append.h +++ b/include/xrpl/beast/hash/hash_append.h @@ -23,6 +23,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/beast/hash/xxhasher.h b/include/xrpl/beast/hash/xxhasher.h index 30af05ef0a1..381980902ac 100644 --- a/include/xrpl/beast/hash/xxhasher.h +++ b/include/xrpl/beast/hash/xxhasher.h @@ -21,6 +21,7 @@ #define BEAST_HASH_XXHASHER_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/insight/Meter.h b/include/xrpl/beast/insight/Meter.h index febd5cb3dc4..7ef71988a13 100644 --- a/include/xrpl/beast/insight/Meter.h +++ b/include/xrpl/beast/insight/Meter.h @@ -20,10 +20,10 @@ #ifndef BEAST_INSIGHT_METER_H_INCLUDED #define BEAST_INSIGHT_METER_H_INCLUDED -#include - #include +#include + namespace beast { namespace insight { diff --git a/include/xrpl/beast/insight/StatsDCollector.h b/include/xrpl/beast/insight/StatsDCollector.h index 78195048d7f..fb47eeb7fc3 100644 --- a/include/xrpl/beast/insight/StatsDCollector.h +++ b/include/xrpl/beast/insight/StatsDCollector.h @@ -21,7 +21,6 @@ #define BEAST_INSIGHT_STATSDCOLLECTOR_H_INCLUDED #include - #include #include diff --git a/include/xrpl/beast/net/IPAddress.h b/include/xrpl/beast/net/IPAddress.h index cdac4abbd9c..62469cfda1b 100644 --- a/include/xrpl/beast/net/IPAddress.h +++ b/include/xrpl/beast/net/IPAddress.h @@ -25,8 +25,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/net/IPAddressConversion.h b/include/xrpl/beast/net/IPAddressConversion.h index 982a8e50f26..0dfbe3197d1 100644 --- a/include/xrpl/beast/net/IPAddressConversion.h +++ b/include/xrpl/beast/net/IPAddressConversion.h @@ -22,8 +22,6 @@ #include -#include - #include namespace beast { diff --git a/include/xrpl/beast/net/IPAddressV4.h b/include/xrpl/beast/net/IPAddressV4.h index 7711a970dec..98a92dba207 100644 --- a/include/xrpl/beast/net/IPAddressV4.h +++ b/include/xrpl/beast/net/IPAddressV4.h @@ -21,7 +21,9 @@ #define BEAST_NET_IPADDRESSV4_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/net/IPAddressV6.h b/include/xrpl/beast/net/IPAddressV6.h index 83e4d6f8a32..4a4ef73b86e 100644 --- a/include/xrpl/beast/net/IPAddressV6.h +++ b/include/xrpl/beast/net/IPAddressV6.h @@ -21,7 +21,9 @@ #define BEAST_NET_IPADDRESSV6_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/rfc2616.h b/include/xrpl/beast/rfc2616.h index 7f96e924eb5..648fbc22e2f 100644 --- a/include/xrpl/beast/rfc2616.h +++ b/include/xrpl/beast/rfc2616.h @@ -20,10 +20,6 @@ #ifndef BEAST_RFC2616_HPP #define BEAST_RFC2616_HPP -// TODO: This include is a workaround for beast compilation bug. -// Remove when fix https://github.com/boostorg/beast/pull/2682/ is available. -#include - #include #include #include @@ -32,6 +28,7 @@ #include #include +#include #include #include #include diff --git a/include/xrpl/beast/test/yield_to.h b/include/xrpl/beast/test/yield_to.h index 9d0f50eebff..9e9f83b8974 100644 --- a/include/xrpl/beast/test/yield_to.h +++ b/include/xrpl/beast/test/yield_to.h @@ -11,6 +11,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/match.h b/include/xrpl/beast/unit_test/match.h index e8e12bd5568..641787e8146 100644 --- a/include/xrpl/beast/unit_test/match.h +++ b/include/xrpl/beast/unit_test/match.h @@ -9,6 +9,7 @@ #define BEAST_UNIT_TEST_MATCH_HPP #include + #include namespace beast { diff --git a/include/xrpl/beast/unit_test/reporter.h b/include/xrpl/beast/unit_test/reporter.h index 956def1c30d..e7a7d4b3adf 100644 --- a/include/xrpl/beast/unit_test/reporter.h +++ b/include/xrpl/beast/unit_test/reporter.h @@ -10,8 +10,10 @@ #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/runner.h b/include/xrpl/beast/unit_test/runner.h index 6330f2c8c81..283f7c87238 100644 --- a/include/xrpl/beast/unit_test/runner.h +++ b/include/xrpl/beast/unit_test/runner.h @@ -9,7 +9,9 @@ #define BEAST_UNIT_TEST_RUNNER_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/suite.h b/include/xrpl/beast/unit_test/suite.h index d49730d4d5f..51cd3e17ea1 100644 --- a/include/xrpl/beast/unit_test/suite.h +++ b/include/xrpl/beast/unit_test/suite.h @@ -9,9 +9,11 @@ #define BEAST_UNIT_TEST_SUITE_HPP #include + #include #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/suite_list.h b/include/xrpl/beast/unit_test/suite_list.h index 5856b4c7dba..0095290eaca 100644 --- a/include/xrpl/beast/unit_test/suite_list.h +++ b/include/xrpl/beast/unit_test/suite_list.h @@ -10,7 +10,9 @@ #include #include + #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/thread.h b/include/xrpl/beast/unit_test/thread.h index e94108f7879..99572a549d9 100644 --- a/include/xrpl/beast/unit_test/thread.h +++ b/include/xrpl/beast/unit_test/thread.h @@ -9,6 +9,7 @@ #define BEAST_UNIT_TEST_THREAD_HPP #include + #include #include #include diff --git a/include/xrpl/beast/utility/Journal.h b/include/xrpl/beast/utility/Journal.h index 41cea2a3a0b..91ddf33d271 100644 --- a/include/xrpl/beast/utility/Journal.h +++ b/include/xrpl/beast/utility/Journal.h @@ -21,6 +21,7 @@ #define BEAST_UTILITY_JOURNAL_H_INCLUDED #include + #include namespace beast { diff --git a/include/xrpl/beast/utility/PropertyStream.h b/include/xrpl/beast/utility/PropertyStream.h index 5eaf70453e8..18895e2410a 100644 --- a/include/xrpl/beast/utility/PropertyStream.h +++ b/include/xrpl/beast/utility/PropertyStream.h @@ -22,11 +22,9 @@ #include -#include #include #include #include -#include namespace beast { diff --git a/include/xrpl/beast/utility/rngfill.h b/include/xrpl/beast/utility/rngfill.h index 93f11559cf8..0188e5c5294 100644 --- a/include/xrpl/beast/utility/rngfill.h +++ b/include/xrpl/beast/utility/rngfill.h @@ -21,6 +21,7 @@ #define BEAST_RANDOM_RNGFILL_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/beast/utility/temp_dir.h b/include/xrpl/beast/utility/temp_dir.h index 689b2d1efbf..bbb7afc7b43 100644 --- a/include/xrpl/beast/utility/temp_dir.h +++ b/include/xrpl/beast/utility/temp_dir.h @@ -21,6 +21,7 @@ #define BEAST_UTILITY_TEMP_DIR_H_INCLUDED #include + #include namespace beast { diff --git a/include/xrpl/crypto/csprng.h b/include/xrpl/crypto/csprng.h index 3ad5d700046..9a4e933a2e7 100644 --- a/include/xrpl/crypto/csprng.h +++ b/include/xrpl/crypto/csprng.h @@ -21,8 +21,6 @@ #define RIPPLE_CRYPTO_RANDOM_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/include/xrpl/json/Object.h b/include/xrpl/json/Object.h index ec60e562028..87ef8ea4f28 100644 --- a/include/xrpl/json/Object.h +++ b/include/xrpl/json/Object.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_OBJECT_H_INCLUDED #include + #include namespace Json { diff --git a/include/xrpl/json/Output.h b/include/xrpl/json/Output.h index 96905c20ba9..ef5f68e5180 100644 --- a/include/xrpl/json/Output.h +++ b/include/xrpl/json/Output.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_OUTPUT_H_INCLUDED #include + #include #include diff --git a/include/xrpl/json/Writer.h b/include/xrpl/json/Writer.h index 882e944093e..f4c37c33162 100644 --- a/include/xrpl/json/Writer.h +++ b/include/xrpl/json/Writer.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace Json { diff --git a/include/xrpl/json/detail/json_assert.h b/include/xrpl/json/detail/json_assert.h index 264bcd90f3d..5d680e6e34d 100644 --- a/include/xrpl/json/detail/json_assert.h +++ b/include/xrpl/json/detail/json_assert.h @@ -20,6 +20,7 @@ #ifndef RIPPLE_JSON_JSON_ASSERT_H_INCLUDED #define RIPPLE_JSON_JSON_ASSERT_H_INCLUDED +#include #include #define JSON_ASSERT_MESSAGE(condition, message) \ diff --git a/include/xrpl/json/json_reader.h b/include/xrpl/json/json_reader.h index 6fb07c318d8..27d608f8504 100644 --- a/include/xrpl/json/json_reader.h +++ b/include/xrpl/json/json_reader.h @@ -24,7 +24,9 @@ #include #include + #include + #include namespace Json { diff --git a/include/xrpl/json/json_value.h b/include/xrpl/json/json_value.h index e419940171e..91d29c28d68 100644 --- a/include/xrpl/json/json_value.h +++ b/include/xrpl/json/json_value.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_JSON_VALUE_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/json/json_writer.h b/include/xrpl/json/json_writer.h index 86a5ecd984a..1b4ff155083 100644 --- a/include/xrpl/json/json_writer.h +++ b/include/xrpl/json/json_writer.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/include/xrpl/protocol/Book.h b/include/xrpl/protocol/Book.h index 164a5ccfa99..0a04deb2771 100644 --- a/include/xrpl/protocol/Book.h +++ b/include/xrpl/protocol/Book.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/Feature.h b/include/xrpl/protocol/Feature.h index b6477baa02d..a2eb7d8e50a 100644 --- a/include/xrpl/protocol/Feature.h +++ b/include/xrpl/protocol/Feature.h @@ -21,7 +21,9 @@ #define RIPPLE_PROTOCOL_FEATURE_H_INCLUDED #include + #include + #include #include #include @@ -33,35 +35,39 @@ * * Steps required to add new features to the code: * - * 1) In this file, increment `numFeatures` and add a uint256 declaration - * for the feature at the bottom - * 2) Add a uint256 definition for the feature to the corresponding source - * file (Feature.cpp). Use `registerFeature` to create the feature with - * the feature's name, `Supported::no`, and `VoteBehavior::DefaultNo`. This - * should be the only place the feature's name appears in code as a string. - * 3) Use the uint256 as the parameter to `view.rules.enabled()` to - * control flow into new code that this feature limits. - * 4) If the feature development is COMPLETE, and the feature is ready to be - * SUPPORTED, change the `registerFeature` parameter to Supported::yes. - * 5) When the feature is ready to be ENABLED, change the `registerFeature` - * parameter to `VoteBehavior::DefaultYes`. - * In general, any newly supported amendments (`Supported::yes`) should have - * a `VoteBehavior::DefaultNo` for at least one full release cycle. High - * priority bug fixes can be an exception to this rule of thumb. + * 1) Add the appropriate XRPL_FEATURE or XRPL_FIX macro definition for the + * feature to features.macro with the feature's name, `Supported::no`, and + * `VoteBehavior::DefaultNo`. + * + * 2) Use the generated variable name as the parameter to `view.rules.enabled()` + * to control flow into new code that this feature limits. (featureName or + * fixName) + * + * 3) If the feature development is COMPLETE, and the feature is ready to be + * SUPPORTED, change the macro parameter in features.macro to Supported::yes. + * + * 4) In general, any newly supported amendments (`Supported::yes`) should have + * a `VoteBehavior::DefaultNo` indefinitely so that external governance can + * make the decision on when to activate it. High priority bug fixes can be + * an exception to this rule. In such cases, ensure the fix has been + * clearly communicated to the community using appropriate channels, + * then change the macro parameter in features.macro to + * `VoteBehavior::DefaultYes`. The communication process is beyond + * the scope of these instructions. + * * * When a feature has been enabled for several years, the conditional code * may be removed, and the feature "retired". To retire a feature: - * 1) Remove the uint256 declaration from this file. - * 2) MOVE the uint256 definition in Feature.cpp to the "retired features" - * section at the end of the file. - * 3) CHANGE the name of the variable to start with "retired". - * 4) CHANGE the parameters of the `registerFeature` call to `Supported::yes` - * and `VoteBehavior::DefaultNo`. + * + * 1) MOVE the macro definition in features.macro to the "retired features" + * section at the end of the file, and change the macro to XRPL_RETIRE. + * * The feature must remain registered and supported indefinitely because it - * still exists in the ledger, but there is no need to vote for it because - * there's nothing to vote for. If it is removed completely from the code, any - * instances running that code will get amendment blocked. Removing the - * feature from the ledger is beyond the scope of these instructions. + * may exist in the Amendments object on ledger. There is no need to vote + * for it because there's nothing to vote for. If the feature definition is + * removed completely from the code, any instances running that code will get + * amendment blocked. Removing the feature from the ledger is beyond the scope + * of these instructions. * */ @@ -76,11 +82,32 @@ allAmendments(); namespace detail { +#pragma push_macro("XRPL_FEATURE") +#undef XRPL_FEATURE +#pragma push_macro("XRPL_FIX") +#undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE + +#define XRPL_FEATURE(name, supported, vote) +1 +#define XRPL_FIX(name, supported, vote) +1 +#define XRPL_RETIRE(name) +1 + // This value SHOULD be equal to the number of amendments registered in // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 89; +static constexpr std::size_t numFeatures = + (0 + +#include + ); + +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") +#undef XRPL_FIX +#pragma pop_macro("XRPL_FIX") +#undef XRPL_FEATURE +#pragma pop_macro("XRPL_FEATURE") /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated @@ -320,12 +347,17 @@ foreachFeature(FeatureBitset bs, F&& f) #undef XRPL_FEATURE #pragma push_macro("XRPL_FIX") #undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE #define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name; #define XRPL_FIX(name, supported, vote) extern uint256 const fix##name; +#define XRPL_RETIRE(name) #include +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") #undef XRPL_FIX #pragma pop_macro("XRPL_FIX") #undef XRPL_FEATURE diff --git a/include/xrpl/protocol/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h index 640635c3fcb..0cbf1b608a2 100644 --- a/include/xrpl/protocol/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/HashPrefix.h b/include/xrpl/protocol/HashPrefix.h index 0b6ddda4921..ab825658e82 100644 --- a/include/xrpl/protocol/HashPrefix.h +++ b/include/xrpl/protocol/HashPrefix.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_HASHPREFIX_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index e89feb123d0..6895ed08aed 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/protocol/KnownFormats.h b/include/xrpl/protocol/KnownFormats.h index 5f5a04be1b3..db2042eadea 100644 --- a/include/xrpl/protocol/KnownFormats.h +++ b/include/xrpl/protocol/KnownFormats.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/include/xrpl/protocol/MultiApiJson.h b/include/xrpl/protocol/MultiApiJson.h index 03bab9b32ea..15743e856b6 100644 --- a/include/xrpl/protocol/MultiApiJson.h +++ b/include/xrpl/protocol/MultiApiJson.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED #define RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED +#include #include #include -#include #include #include #include diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 81a45c383fb..1e8c76dbd8b 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/Rate.h b/include/xrpl/protocol/Rate.h index 2872a5809de..548a7af6f99 100644 --- a/include/xrpl/protocol/Rate.h +++ b/include/xrpl/protocol/Rate.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include diff --git a/include/xrpl/protocol/SOTemplate.h b/include/xrpl/protocol/SOTemplate.h index b86fb63b858..9fd4cbf19d5 100644 --- a/include/xrpl/protocol/SOTemplate.h +++ b/include/xrpl/protocol/SOTemplate.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/protocol/STBase.h b/include/xrpl/protocol/STBase.h index 097341384f3..e0f28e03dea 100644 --- a/include/xrpl/protocol/STBase.h +++ b/include/xrpl/protocol/STBase.h @@ -23,12 +23,14 @@ #include #include #include + #include #include #include #include #include #include + namespace ripple { /// Note, should be treated as flags that can be | and & diff --git a/include/xrpl/protocol/STExchange.h b/include/xrpl/protocol/STExchange.h index e1a1215dbdd..dd7c4834a6b 100644 --- a/include/xrpl/protocol/STExchange.h +++ b/include/xrpl/protocol/STExchange.h @@ -28,6 +28,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/STLedgerEntry.h b/include/xrpl/protocol/STLedgerEntry.h index 6a57b32451a..96b37af0b9a 100644 --- a/include/xrpl/protocol/STLedgerEntry.h +++ b/include/xrpl/protocol/STLedgerEntry.h @@ -124,4 +124,4 @@ STLedgerEntry::getType() const } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 4c8db2e01e4..b89a415ebe3 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -35,7 +35,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/protocol/STParsedJSON.h b/include/xrpl/protocol/STParsedJSON.h index d2052bf1f4c..d6559690302 100644 --- a/include/xrpl/protocol/STParsedJSON.h +++ b/include/xrpl/protocol/STParsedJSON.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_STPARSEDJSON_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/protocol/STPathSet.h b/include/xrpl/protocol/STPathSet.h index 953a209c150..7605a2283c7 100644 --- a/include/xrpl/protocol/STPathSet.h +++ b/include/xrpl/protocol/STPathSet.h @@ -26,6 +26,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/STTx.h b/include/xrpl/protocol/STTx.h index 08b9a1bad10..8de2c8cc313 100644 --- a/include/xrpl/protocol/STTx.h +++ b/include/xrpl/protocol/STTx.h @@ -28,6 +28,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/STValidation.h b/include/xrpl/protocol/STValidation.h index 4f3e18de326..11ec733c01b 100644 --- a/include/xrpl/protocol/STValidation.h +++ b/include/xrpl/protocol/STValidation.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #include @@ -146,8 +147,7 @@ class STValidation final : public STObject, public CountedObject render() const { std::stringstream ss; - ss << "validation: " - << " ledger_hash: " << getLedgerHash() + ss << "validation: " << " ledger_hash: " << getLedgerHash() << " consensus_hash: " << getConsensusHash() << " sign_time: " << to_string(getSignTime()) << " seen_time: " << to_string(getSeenTime()) diff --git a/include/xrpl/protocol/SecretKey.h b/include/xrpl/protocol/SecretKey.h index 67dc9c4ca59..1a13cd17c98 100644 --- a/include/xrpl/protocol/SecretKey.h +++ b/include/xrpl/protocol/SecretKey.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/Seed.h b/include/xrpl/protocol/Seed.h index 1d0a736db8a..8a43d597a5c 100644 --- a/include/xrpl/protocol/Seed.h +++ b/include/xrpl/protocol/Seed.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/Serializer.h b/include/xrpl/protocol/Serializer.h index 80829c80003..5724a19f575 100644 --- a/include/xrpl/protocol/Serializer.h +++ b/include/xrpl/protocol/Serializer.h @@ -30,6 +30,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/Sign.h b/include/xrpl/protocol/Sign.h index dcbe5dfd0db..7e1156ceda7 100644 --- a/include/xrpl/protocol/Sign.h +++ b/include/xrpl/protocol/Sign.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/SystemParameters.h b/include/xrpl/protocol/SystemParameters.h index af492340545..121435dd92f 100644 --- a/include/xrpl/protocol/SystemParameters.h +++ b/include/xrpl/protocol/SystemParameters.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 01bf4669aa7..4f544963f03 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -42,7 +42,7 @@ using TERUnderlyingType = int; enum TELcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -399 .. -300: L Local error (transaction fee inadequate, exceeds local @@ -73,7 +73,7 @@ enum TELcodes : TERUnderlyingType { enum TEMcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -299 .. -200: M Malformed (bad signature) @@ -148,7 +148,7 @@ enum TEMcodes : TERUnderlyingType { enum TEFcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -199 .. -100: F @@ -192,7 +192,7 @@ enum TEFcodes : TERUnderlyingType { enum TERcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -99 .. -1: R Retry diff --git a/include/xrpl/protocol/TxFlags.h b/include/xrpl/protocol/TxFlags.h index f0f6c7f223c..e94e79aee5e 100644 --- a/include/xrpl/protocol/TxFlags.h +++ b/include/xrpl/protocol/TxFlags.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_PROTOCOL_TXFLAGS_H_INCLUDED #define RIPPLE_PROTOCOL_TXFLAGS_H_INCLUDED -#include - #include +#include + namespace ripple { /** Transaction flags. diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 44ec8ae93fd..9422d697caa 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include namespace ripple { diff --git a/include/xrpl/protocol/detail/STVar.h b/include/xrpl/protocol/detail/STVar.h index 4a830cf8d7c..6ff7e5ebc1e 100644 --- a/include/xrpl/protocol/detail/STVar.h +++ b/include/xrpl/protocol/detail/STVar.h @@ -23,12 +23,9 @@ #include #include #include -#include + #include -#include #include -#include -#include namespace ripple { namespace detail { diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 103dc34243f..0bcc268ca7c 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -23,6 +23,9 @@ #if !defined(XRPL_FIX) #error "undefined macro: XRPL_FIX" #endif +#if !defined(XRPL_RETIRE) +#error "undefined macro: XRPL_RETIRE" +#endif // Add new amendments to the top of this list. // Keep it sorted in reverse chronological order. @@ -121,3 +124,22 @@ XRPL_FIX (NFTokenDirV1, Supported::yes, VoteBehavior::Obsolete) XRPL_FEATURE(NonFungibleTokensV1, Supported::yes, VoteBehavior::Obsolete) XRPL_FEATURE(CryptoConditionsSuite, Supported::yes, VoteBehavior::Obsolete) +// The following amendments have been active for at least two years. Their +// pre-amendment code has been removed and the identifiers are deprecated. +// All known amendments and amendments that may appear in a validated +// ledger must be registered either here or above with the "active" amendments +XRPL_RETIRE(MultiSign) +XRPL_RETIRE(TrustSetAuth) +XRPL_RETIRE(FeeEscalation) +XRPL_RETIRE(PayChan) +XRPL_RETIRE(CryptoConditions) +XRPL_RETIRE(TickSize) +XRPL_RETIRE(fix1368) +XRPL_RETIRE(Escrow) +XRPL_RETIRE(fix1373) +XRPL_RETIRE(EnforceInvariants) +XRPL_RETIRE(SortedDirectories) +XRPL_RETIRE(fix1201) +XRPL_RETIRE(fix1512) +XRPL_RETIRE(fix1523) +XRPL_RETIRE(fix1528) diff --git a/include/xrpl/protocol/digest.h b/include/xrpl/protocol/digest.h index b3c7a014100..efec616a0c8 100644 --- a/include/xrpl/protocol/digest.h +++ b/include/xrpl/protocol/digest.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include diff --git a/include/xrpl/protocol/nftPageMask.h b/include/xrpl/protocol/nftPageMask.h index 1f8c39aa138..90fff10d958 100644 --- a/include/xrpl/protocol/nftPageMask.h +++ b/include/xrpl/protocol/nftPageMask.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_NFT_PAGE_MASK_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/resource/ResourceManager.h b/include/xrpl/resource/ResourceManager.h index b33b141ee05..22697d12eb0 100644 --- a/include/xrpl/resource/ResourceManager.h +++ b/include/xrpl/resource/ResourceManager.h @@ -27,6 +27,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/resource/detail/Logic.h b/include/xrpl/resource/detail/Logic.h index 226dea3aef8..b07ee00e73a 100644 --- a/include/xrpl/resource/detail/Logic.h +++ b/include/xrpl/resource/detail/Logic.h @@ -32,6 +32,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Handoff.h b/include/xrpl/server/Handoff.h index f57c9ef57ec..d33e8a7eddf 100644 --- a/include/xrpl/server/Handoff.h +++ b/include/xrpl/server/Handoff.h @@ -21,8 +21,10 @@ #define RIPPLE_SERVER_HANDOFF_H_INCLUDED #include + #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Port.h b/include/xrpl/server/Port.h index 4ab56efb459..88f824d19f4 100644 --- a/include/xrpl/server/Port.h +++ b/include/xrpl/server/Port.h @@ -22,17 +22,18 @@ #include #include + #include #include #include #include #include + #include #include #include #include #include -#include namespace boost { namespace asio { diff --git a/include/xrpl/server/Server.h b/include/xrpl/server/Server.h index e8157c03c6c..232d1c381be 100644 --- a/include/xrpl/server/Server.h +++ b/include/xrpl/server/Server.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Session.h b/include/xrpl/server/Session.h index 25cf1ad747d..196f8c78c23 100644 --- a/include/xrpl/server/Session.h +++ b/include/xrpl/server/Session.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/server/SimpleWriter.h b/include/xrpl/server/SimpleWriter.h index 0e3f63b0d9d..371d6cbf974 100644 --- a/include/xrpl/server/SimpleWriter.h +++ b/include/xrpl/server/SimpleWriter.h @@ -21,10 +21,12 @@ #define RIPPLE_SERVER_SIMPLEWRITER_H_INCLUDED #include + #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Writer.h b/include/xrpl/server/Writer.h index 18cbb35b6fd..b63a1e89e49 100644 --- a/include/xrpl/server/Writer.h +++ b/include/xrpl/server/Writer.h @@ -21,6 +21,7 @@ #define RIPPLE_SERVER_WRITER_H_INCLUDED #include + #include #include diff --git a/include/xrpl/server/detail/BaseHTTPPeer.h b/include/xrpl/server/detail/BaseHTTPPeer.h index bcdddcc711d..51ac866e1e7 100644 --- a/include/xrpl/server/detail/BaseHTTPPeer.h +++ b/include/xrpl/server/detail/BaseHTTPPeer.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -34,6 +35,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/server/detail/BasePeer.h b/include/xrpl/server/detail/BasePeer.h index 97ad77f7f22..35975efafb7 100644 --- a/include/xrpl/server/detail/BasePeer.h +++ b/include/xrpl/server/detail/BasePeer.h @@ -25,7 +25,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/server/detail/Door.h b/include/xrpl/server/detail/Door.h index 20bdf421e38..90de885579d 100644 --- a/include/xrpl/server/detail/Door.h +++ b/include/xrpl/server/detail/Door.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -34,6 +35,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/server/detail/JSONRPCUtil.h b/include/xrpl/server/detail/JSONRPCUtil.h index 7eb00096263..88efc077d8c 100644 --- a/include/xrpl/server/detail/JSONRPCUtil.h +++ b/include/xrpl/server/detail/JSONRPCUtil.h @@ -20,6 +20,7 @@ #ifndef RIPPLE_SERVER_JSONRPCUTIL_H_INCLUDED #define RIPPLE_SERVER_JSONRPCUTIL_H_INCLUDED +#include #include #include diff --git a/include/xrpl/server/detail/PlainHTTPPeer.h b/include/xrpl/server/detail/PlainHTTPPeer.h index d4b24c01313..ee31c78cad1 100644 --- a/include/xrpl/server/detail/PlainHTTPPeer.h +++ b/include/xrpl/server/detail/PlainHTTPPeer.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/PlainWSPeer.h b/include/xrpl/server/detail/PlainWSPeer.h index 8bcddee7e77..4fdc1f6f494 100644 --- a/include/xrpl/server/detail/PlainWSPeer.h +++ b/include/xrpl/server/detail/PlainWSPeer.h @@ -21,7 +21,9 @@ #define RIPPLE_SERVER_PLAINWSPEER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/SSLHTTPPeer.h b/include/xrpl/server/detail/SSLHTTPPeer.h index db6af46b5b3..fac4b866d30 100644 --- a/include/xrpl/server/detail/SSLHTTPPeer.h +++ b/include/xrpl/server/detail/SSLHTTPPeer.h @@ -22,11 +22,13 @@ #include #include + #include #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/SSLWSPeer.h b/include/xrpl/server/detail/SSLWSPeer.h index 9c88b275397..d7cc0395c79 100644 --- a/include/xrpl/server/detail/SSLWSPeer.h +++ b/include/xrpl/server/detail/SSLWSPeer.h @@ -22,12 +22,14 @@ #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/io_list.h b/include/xrpl/server/detail/io_list.h index 4475f59ab75..fbf60c9a7fc 100644 --- a/include/xrpl/server/detail/io_list.h +++ b/include/xrpl/server/detail/io_list.h @@ -21,6 +21,7 @@ #define RIPPLE_SERVER_IO_LIST_H_INCLUDED #include + #include #include #include diff --git a/src/libxrpl/basics/Archive.cpp b/src/libxrpl/basics/Archive.cpp index e5672bd953f..2ddbc8200cb 100644 --- a/src/libxrpl/basics/Archive.cpp +++ b/src/libxrpl/basics/Archive.cpp @@ -20,10 +20,15 @@ #include #include +#include +#include + #include #include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/basics/BasicConfig.cpp b/src/libxrpl/basics/BasicConfig.cpp index 2ad47ab7ee5..7d6f09b391c 100644 --- a/src/libxrpl/basics/BasicConfig.cpp +++ b/src/libxrpl/basics/BasicConfig.cpp @@ -19,8 +19,17 @@ #include #include -#include -#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/CountedObject.cpp b/src/libxrpl/basics/CountedObject.cpp index c18152938a9..d3b94554805 100644 --- a/src/libxrpl/basics/CountedObject.cpp +++ b/src/libxrpl/basics/CountedObject.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/libxrpl/basics/FileUtilities.cpp b/src/libxrpl/basics/FileUtilities.cpp index e1331433553..c0456b05569 100644 --- a/src/libxrpl/basics/FileUtilities.cpp +++ b/src/libxrpl/basics/FileUtilities.cpp @@ -19,6 +19,20 @@ #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + namespace ripple { std::string diff --git a/src/libxrpl/basics/Log.cpp b/src/libxrpl/basics/Log.cpp index ac42aa9ec43..14873a3fd79 100644 --- a/src/libxrpl/basics/Log.cpp +++ b/src/libxrpl/basics/Log.cpp @@ -19,14 +19,22 @@ #include #include -#include +#include #include -#include + +#include +#include + +#include +#include #include #include #include #include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 3bc58970ef7..1515177ab94 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -19,10 +19,15 @@ #include #include -#include + #include +#include +#include +#include +#include #include #include +#include #include #include diff --git a/src/libxrpl/basics/ResolverAsio.cpp b/src/libxrpl/basics/ResolverAsio.cpp index 8951d809dec..fde27189e73 100644 --- a/src/libxrpl/basics/ResolverAsio.cpp +++ b/src/libxrpl/basics/ResolverAsio.cpp @@ -18,17 +18,31 @@ //============================================================================== #include +#include #include #include #include +#include #include -#include + +#include +#include +#include +#include + +#include #include +#include #include #include +#include +#include #include #include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/StringUtilities.cpp b/src/libxrpl/basics/StringUtilities.cpp index cd9bdfbd030..50087307181 100644 --- a/src/libxrpl/basics/StringUtilities.cpp +++ b/src/libxrpl/basics/StringUtilities.cpp @@ -17,15 +17,24 @@ */ //============================================================================== -#include +#include #include -#include -#include #include #include -#include -#include -#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/UptimeClock.cpp b/src/libxrpl/basics/UptimeClock.cpp index 4394d02f783..42ba479fae8 100644 --- a/src/libxrpl/basics/UptimeClock.cpp +++ b/src/libxrpl/basics/UptimeClock.cpp @@ -19,6 +19,10 @@ #include +#include +#include +#include + namespace ripple { std::atomic UptimeClock::now_{0}; // seconds since start diff --git a/src/libxrpl/basics/base64.cpp b/src/libxrpl/basics/base64.cpp index a8b4e352992..741d978aa09 100644 --- a/src/libxrpl/basics/base64.cpp +++ b/src/libxrpl/basics/base64.cpp @@ -56,7 +56,10 @@ #include -#include +#include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/basics/contract.cpp b/src/libxrpl/basics/contract.cpp index 4f0a74644af..b5a7b3f3684 100644 --- a/src/libxrpl/basics/contract.cpp +++ b/src/libxrpl/basics/contract.cpp @@ -20,24 +20,13 @@ #include #include #include + #include #include +#include namespace ripple { -namespace detail { - -[[noreturn]] void -accessViolation() noexcept -{ - // dereference memory location zero - int volatile* j = 0; - (void)*j; - std::abort(); -} - -} // namespace detail - void LogThrow(std::string const& title) { @@ -55,7 +44,7 @@ LogicError(std::string const& s) noexcept // here. // For the above reasons, we want this contract to stand out. UNREACHABLE("LogicError", {{"message", s}}); - detail::accessViolation(); + std::abort(); } } // namespace ripple diff --git a/src/libxrpl/basics/make_SSLContext.cpp b/src/libxrpl/basics/make_SSLContext.cpp index 4a9ea321d54..980f2d48a69 100644 --- a/src/libxrpl/basics/make_SSLContext.cpp +++ b/src/libxrpl/basics/make_SSLContext.cpp @@ -19,8 +19,29 @@ #include #include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include -#include +#include +#include +#include namespace ripple { namespace openssl { diff --git a/src/libxrpl/basics/mulDiv.cpp b/src/libxrpl/basics/mulDiv.cpp index 7f9ffa45267..882878ebec9 100644 --- a/src/libxrpl/basics/mulDiv.cpp +++ b/src/libxrpl/basics/mulDiv.cpp @@ -18,7 +18,12 @@ //============================================================================== #include + #include +#include +#include + +#include #include namespace ripple { diff --git a/src/libxrpl/beast/core/CurrentThreadName.cpp b/src/libxrpl/beast/core/CurrentThreadName.cpp index 71b5d21fec3..b3938449722 100644 --- a/src/libxrpl/beast/core/CurrentThreadName.cpp +++ b/src/libxrpl/beast/core/CurrentThreadName.cpp @@ -22,8 +22,12 @@ //============================================================================== #include + #include +#include +#include + //------------------------------------------------------------------------------ #if BOOST_OS_WINDOWS diff --git a/src/libxrpl/beast/core/SemanticVersion.cpp b/src/libxrpl/beast/core/SemanticVersion.cpp index dfe699848d5..e659d63570b 100644 --- a/src/libxrpl/beast/core/SemanticVersion.cpp +++ b/src/libxrpl/beast/core/SemanticVersion.cpp @@ -22,7 +22,11 @@ #include #include +#include +#include #include +#include +#include namespace beast { diff --git a/src/libxrpl/beast/insight/Groups.cpp b/src/libxrpl/beast/insight/Groups.cpp index fcf7e65787e..c846ceff3b6 100644 --- a/src/libxrpl/beast/insight/Groups.cpp +++ b/src/libxrpl/beast/insight/Groups.cpp @@ -18,10 +18,20 @@ //============================================================================== #include +#include +#include +#include +#include #include #include +#include +#include +#include + #include +#include #include +#include namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/Hook.cpp b/src/libxrpl/beast/insight/Hook.cpp index 62538846349..d15e001ace6 100644 --- a/src/libxrpl/beast/insight/Hook.cpp +++ b/src/libxrpl/beast/insight/Hook.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/NullCollector.cpp b/src/libxrpl/beast/insight/NullCollector.cpp index 12ea817014e..4801bcecab3 100644 --- a/src/libxrpl/beast/insight/NullCollector.cpp +++ b/src/libxrpl/beast/insight/NullCollector.cpp @@ -17,8 +17,22 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include + namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/StatsDCollector.cpp b/src/libxrpl/beast/insight/StatsDCollector.cpp index a9febbb3070..b0e00c3cfde 100644 --- a/src/libxrpl/beast/insight/StatsDCollector.cpp +++ b/src/libxrpl/beast/insight/StatsDCollector.cpp @@ -21,20 +21,35 @@ #include #include #include +#include #include #include #include -#include +#include +#include #include -#include -#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include #include +#include +#include #include #include -#include #include +#include #include +#include +#include #ifndef BEAST_STATSDCOLLECTOR_TRACING_ENABLED #define BEAST_STATSDCOLLECTOR_TRACING_ENABLED 0 diff --git a/src/libxrpl/beast/net/IPAddressConversion.cpp b/src/libxrpl/beast/net/IPAddressConversion.cpp index 2ab84c37015..abaf1bb7b82 100644 --- a/src/libxrpl/beast/net/IPAddressConversion.cpp +++ b/src/libxrpl/beast/net/IPAddressConversion.cpp @@ -18,6 +18,10 @@ //============================================================================== #include +#include + +#include +#include namespace beast { namespace IP { diff --git a/src/libxrpl/beast/net/IPAddressV4.cpp b/src/libxrpl/beast/net/IPAddressV4.cpp index 83541479878..29455024f67 100644 --- a/src/libxrpl/beast/net/IPAddressV4.cpp +++ b/src/libxrpl/beast/net/IPAddressV4.cpp @@ -19,9 +19,6 @@ #include -#include -#include - namespace beast { namespace IP { diff --git a/src/libxrpl/beast/net/IPEndpoint.cpp b/src/libxrpl/beast/net/IPEndpoint.cpp index 490777111bd..ffe664498c2 100644 --- a/src/libxrpl/beast/net/IPEndpoint.cpp +++ b/src/libxrpl/beast/net/IPEndpoint.cpp @@ -17,8 +17,18 @@ */ //============================================================================== +#include #include -#include + +#include +#include + +#include +#include +#include +#include +#include +#include namespace beast { namespace IP { diff --git a/src/libxrpl/beast/utility/src/beast_Journal.cpp b/src/libxrpl/beast/utility/beast_Journal.cpp similarity index 98% rename from src/libxrpl/beast/utility/src/beast_Journal.cpp rename to src/libxrpl/beast/utility/beast_Journal.cpp index dd160a58708..828f2fa619e 100644 --- a/src/libxrpl/beast/utility/src/beast_Journal.cpp +++ b/src/libxrpl/beast/utility/beast_Journal.cpp @@ -18,7 +18,10 @@ //============================================================================== #include -#include + +#include +#include +#include namespace beast { diff --git a/src/libxrpl/beast/utility/src/beast_PropertyStream.cpp b/src/libxrpl/beast/utility/beast_PropertyStream.cpp similarity index 99% rename from src/libxrpl/beast/utility/src/beast_PropertyStream.cpp rename to src/libxrpl/beast/utility/beast_PropertyStream.cpp index 3d68ea30cff..22d1f898d64 100644 --- a/src/libxrpl/beast/utility/src/beast_PropertyStream.cpp +++ b/src/libxrpl/beast/utility/beast_PropertyStream.cpp @@ -19,9 +19,12 @@ #include #include + #include #include -#include +#include +#include +#include namespace beast { diff --git a/src/libxrpl/crypto/RFC1751.cpp b/src/libxrpl/crypto/RFC1751.cpp index 952e246f5f8..48bd8dc0f88 100644 --- a/src/libxrpl/crypto/RFC1751.cpp +++ b/src/libxrpl/crypto/RFC1751.cpp @@ -19,10 +19,19 @@ #include #include -#include + +#include +#include +#include +#include #include + +#include +#include #include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/crypto/csprng.cpp b/src/libxrpl/crypto/csprng.cpp index 948500734c0..986c30d8fd8 100644 --- a/src/libxrpl/crypto/csprng.cpp +++ b/src/libxrpl/crypto/csprng.cpp @@ -18,10 +18,14 @@ //============================================================================== #include -#include #include -#include + #include +#include + +#include +#include +#include #include #include diff --git a/src/libxrpl/crypto/secure_erase.cpp b/src/libxrpl/crypto/secure_erase.cpp index 93f189d519c..d5f2e250596 100644 --- a/src/libxrpl/crypto/secure_erase.cpp +++ b/src/libxrpl/crypto/secure_erase.cpp @@ -18,8 +18,11 @@ //============================================================================== #include + #include +#include + namespace ripple { void diff --git a/src/libxrpl/json/JsonPropertyStream.cpp b/src/libxrpl/json/JsonPropertyStream.cpp index 19387013b58..a8441f39ecc 100644 --- a/src/libxrpl/json/JsonPropertyStream.cpp +++ b/src/libxrpl/json/JsonPropertyStream.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace ripple { JsonPropertyStream::JsonPropertyStream() : m_top(Json::objectValue) diff --git a/src/libxrpl/json/Object.cpp b/src/libxrpl/json/Object.cpp index f1f30af9a21..62f686e228a 100644 --- a/src/libxrpl/json/Object.cpp +++ b/src/libxrpl/json/Object.cpp @@ -20,6 +20,12 @@ #include #include #include +#include +#include +#include + +#include +#include namespace Json { diff --git a/src/libxrpl/json/Output.cpp b/src/libxrpl/json/Output.cpp index c24c75b32dd..84388884da8 100644 --- a/src/libxrpl/json/Output.cpp +++ b/src/libxrpl/json/Output.cpp @@ -19,6 +19,9 @@ #include #include +#include + +#include namespace Json { diff --git a/src/libxrpl/json/Writer.cpp b/src/libxrpl/json/Writer.cpp index 2f7c0b523c6..94c73447885 100644 --- a/src/libxrpl/json/Writer.cpp +++ b/src/libxrpl/json/Writer.cpp @@ -17,10 +17,18 @@ */ //============================================================================== +#include #include #include + +#include +#include +#include #include #include +#include +#include +#include namespace Json { diff --git a/src/libxrpl/json/json_reader.cpp b/src/libxrpl/json/json_reader.cpp index 5f027e5189d..6818d73ded9 100644 --- a/src/libxrpl/json/json_reader.cpp +++ b/src/libxrpl/json/json_reader.cpp @@ -19,10 +19,15 @@ #include #include +#include #include #include +#include +#include +#include #include +#include #include namespace Json { diff --git a/src/libxrpl/json/json_value.cpp b/src/libxrpl/json/json_value.cpp index 90926afc6c4..709b425d636 100644 --- a/src/libxrpl/json/json_value.cpp +++ b/src/libxrpl/json/json_value.cpp @@ -17,11 +17,17 @@ */ //============================================================================== -#include #include +#include #include +#include +#include #include -#include + +#include +#include +#include +#include namespace Json { diff --git a/src/libxrpl/json/json_valueiterator.cpp b/src/libxrpl/json/json_valueiterator.cpp index c1a1bcc56a0..20dedf2bb29 100644 --- a/src/libxrpl/json/json_valueiterator.cpp +++ b/src/libxrpl/json/json_valueiterator.cpp @@ -19,6 +19,7 @@ // included by json_value.cpp +#include #include namespace Json { diff --git a/src/libxrpl/json/json_writer.cpp b/src/libxrpl/json/json_writer.cpp index de0ed5848af..a830f2855fb 100644 --- a/src/libxrpl/json/json_writer.cpp +++ b/src/libxrpl/json/json_writer.cpp @@ -18,8 +18,15 @@ //============================================================================== #include +#include +#include #include + +#include +#include #include +#include +#include #include #include #include diff --git a/src/libxrpl/json/to_string.cpp b/src/libxrpl/json/to_string.cpp index 7bf58241201..f6fb65d10a6 100644 --- a/src/libxrpl/json/to_string.cpp +++ b/src/libxrpl/json/to_string.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace Json { std::string diff --git a/src/libxrpl/protocol/AMMCore.cpp b/src/libxrpl/protocol/AMMCore.cpp index 3bebfc4659a..aa488271957 100644 --- a/src/libxrpl/protocol/AMMCore.cpp +++ b/src/libxrpl/protocol/AMMCore.cpp @@ -17,13 +17,26 @@ */ //============================================================================== +#include +#include +#include #include +#include #include +#include #include +#include #include #include +#include +#include #include +#include +#include +#include +#include + namespace ripple { AccountID diff --git a/src/libxrpl/protocol/AccountID.cpp b/src/libxrpl/protocol/AccountID.cpp index f271882158b..109ac3d0283 100644 --- a/src/libxrpl/protocol/AccountID.cpp +++ b/src/libxrpl/protocol/AccountID.cpp @@ -19,13 +19,21 @@ #include #include +#include +#include #include #include #include #include -#include + +#include +#include #include +#include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Asset.cpp b/src/libxrpl/protocol/Asset.cpp index 5a496352840..d4a2fccb4ac 100644 --- a/src/libxrpl/protocol/Asset.cpp +++ b/src/libxrpl/protocol/Asset.cpp @@ -17,10 +17,18 @@ */ //============================================================================== +#include +#include +#include #include -#include +#include +#include #include +#include +#include +#include + namespace ripple { AccountID const& diff --git a/src/libxrpl/protocol/Book.cpp b/src/libxrpl/protocol/Book.cpp index c096dba2b4e..cfd1fc61dc9 100644 --- a/src/libxrpl/protocol/Book.cpp +++ b/src/libxrpl/protocol/Book.cpp @@ -18,6 +18,10 @@ //============================================================================== #include +#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/BuildInfo.cpp b/src/libxrpl/protocol/BuildInfo.cpp index 151f8f570c9..39d34c43e75 100644 --- a/src/libxrpl/protocol/BuildInfo.cpp +++ b/src/libxrpl/protocol/BuildInfo.cpp @@ -21,8 +21,11 @@ #include #include #include -#include + #include +#include +#include +#include namespace ripple { @@ -33,7 +36,7 @@ namespace BuildInfo { // and follow the format described at http://semver.org/ //------------------------------------------------------------------------------ // clang-format off -char const* const versionString = "2.4.0-rc4" +char const* const versionString = "2.4.0" // clang-format on #if defined(DEBUG) || defined(SANITIZER) diff --git a/src/libxrpl/protocol/ErrorCodes.cpp b/src/libxrpl/protocol/ErrorCodes.cpp index 4cb2a874ae1..ca853c690ea 100644 --- a/src/libxrpl/protocol/ErrorCodes.cpp +++ b/src/libxrpl/protocol/ErrorCodes.cpp @@ -18,9 +18,13 @@ //============================================================================== #include +#include #include +#include + #include #include +#include namespace ripple { namespace RPC { diff --git a/src/libxrpl/protocol/Feature.cpp b/src/libxrpl/protocol/Feature.cpp index 05164489ec7..3065bdf41c1 100644 --- a/src/libxrpl/protocol/Feature.cpp +++ b/src/libxrpl/protocol/Feature.cpp @@ -17,17 +17,26 @@ */ //============================================================================== -#include - #include +#include #include +#include +#include #include + #include #include -#include +#include +#include #include +#include #include -#include + +#include +#include +#include +#include +#include namespace ripple { @@ -250,12 +259,9 @@ FeatureCollections::registerFeature( Feature const* i = getByName(name); if (!i) { - // If this check fails, and you just added a feature, increase the - // numFeatures value in Feature.h check( features.size() < detail::numFeatures, - "More features defined than allocated. Adjust numFeatures in " - "Feature.h."); + "More features defined than allocated."); auto const f = sha512Half(Slice(name.data(), name.size())); @@ -424,45 +430,26 @@ featureToName(uint256 const& f) #undef XRPL_FEATURE #pragma push_macro("XRPL_FIX") #undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE #define XRPL_FEATURE(name, supported, vote) \ uint256 const feature##name = registerFeature(#name, supported, vote); #define XRPL_FIX(name, supported, vote) \ uint256 const fix##name = registerFeature("fix" #name, supported, vote); +#define XRPL_RETIRE(name) \ + [[deprecated("The referenced amendment has been retired"), maybe_unused]] \ + uint256 const retired##name = retireFeature(#name); #include +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") #undef XRPL_FIX #pragma pop_macro("XRPL_FIX") #undef XRPL_FEATURE #pragma pop_macro("XRPL_FEATURE") -// clang-format off - -// The following amendments have been active for at least two years. Their -// pre-amendment code has been removed and the identifiers are deprecated. -// All known amendments and amendments that may appear in a validated -// ledger must be registered either here or above with the "active" amendments -[[deprecated("The referenced amendment has been retired"), maybe_unused]] -uint256 const - retiredMultiSign = retireFeature("MultiSign"), - retiredTrustSetAuth = retireFeature("TrustSetAuth"), - retiredFeeEscalation = retireFeature("FeeEscalation"), - retiredPayChan = retireFeature("PayChan"), - retiredCryptoConditions = retireFeature("CryptoConditions"), - retiredTickSize = retireFeature("TickSize"), - retiredFix1368 = retireFeature("fix1368"), - retiredEscrow = retireFeature("Escrow"), - retiredFix1373 = retireFeature("fix1373"), - retiredEnforceInvariants = retireFeature("EnforceInvariants"), - retiredSortedDirectories = retireFeature("SortedDirectories"), - retiredFix1201 = retireFeature("fix1201"), - retiredFix1512 = retireFeature("fix1512"), - retiredFix1523 = retireFeature("fix1523"), - retiredFix1528 = retireFeature("fix1528"); - -// clang-format on - // All of the features should now be registered, since variables in a cpp file // are initialized from top to bottom. // diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 7fc879609ed..9bd1ceb5eb3 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -17,13 +17,21 @@ */ //============================================================================== +#include +#include #include +#include #include + #include + #include +#include #include -#include +#include #include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Indexes.cpp b/src/libxrpl/protocol/Indexes.cpp index 046be444224..fe8f0c4778d 100644 --- a/src/libxrpl/protocol/Indexes.cpp +++ b/src/libxrpl/protocol/Indexes.cpp @@ -17,17 +17,32 @@ */ //============================================================================== +#include +#include +#include #include +#include #include +#include #include #include +#include #include #include #include +#include #include #include +#include + #include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Issue.cpp b/src/libxrpl/protocol/Issue.cpp index 179cb1eb14a..b6edf77b2ac 100644 --- a/src/libxrpl/protocol/Issue.cpp +++ b/src/libxrpl/protocol/Issue.cpp @@ -17,13 +17,18 @@ */ //============================================================================== -#include - +#include #include +#include #include +#include #include #include +#include +#include +#include + namespace ripple { std::string diff --git a/src/libxrpl/protocol/Keylet.cpp b/src/libxrpl/protocol/Keylet.cpp index 846c3bc07b3..8deb2d735ae 100644 --- a/src/libxrpl/protocol/Keylet.cpp +++ b/src/libxrpl/protocol/Keylet.cpp @@ -17,7 +17,9 @@ */ //============================================================================== +#include #include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/LedgerFormats.cpp b/src/libxrpl/protocol/LedgerFormats.cpp index 518c3771d62..9755eedf3b5 100644 --- a/src/libxrpl/protocol/LedgerFormats.cpp +++ b/src/libxrpl/protocol/LedgerFormats.cpp @@ -18,8 +18,11 @@ //============================================================================== #include +#include +#include #include -#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/LedgerHeader.cpp b/src/libxrpl/protocol/LedgerHeader.cpp index 284c4dc0557..9984a971c80 100644 --- a/src/libxrpl/protocol/LedgerHeader.cpp +++ b/src/libxrpl/protocol/LedgerHeader.cpp @@ -17,7 +17,10 @@ */ //============================================================================== +#include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/MPTIssue.cpp b/src/libxrpl/protocol/MPTIssue.cpp index 38022a0ed3a..c8decb2b3f8 100644 --- a/src/libxrpl/protocol/MPTIssue.cpp +++ b/src/libxrpl/protocol/MPTIssue.cpp @@ -17,10 +17,19 @@ */ //============================================================================== +#include +#include #include +#include +#include #include +#include #include +#include +#include +#include + namespace ripple { MPTIssue::MPTIssue(MPTID const& issuanceID) : mptID_(issuanceID) diff --git a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp index 03c9e79e265..0c0a657512d 100644 --- a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp +++ b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp @@ -17,11 +17,16 @@ */ //============================================================================== +#include #include #include #include +#include +#include #include +#include + namespace ripple { void diff --git a/src/libxrpl/protocol/NFTokenID.cpp b/src/libxrpl/protocol/NFTokenID.cpp index 72fb8b87bbe..55b03b10a5d 100644 --- a/src/libxrpl/protocol/NFTokenID.cpp +++ b/src/libxrpl/protocol/NFTokenID.cpp @@ -17,9 +17,25 @@ */ //============================================================================== +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include + namespace ripple { bool diff --git a/src/libxrpl/protocol/NFTokenOfferID.cpp b/src/libxrpl/protocol/NFTokenOfferID.cpp index 3d761e6b939..921ba4e1d15 100644 --- a/src/libxrpl/protocol/NFTokenOfferID.cpp +++ b/src/libxrpl/protocol/NFTokenOfferID.cpp @@ -17,9 +17,21 @@ */ //============================================================================== +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include +#include + namespace ripple { bool diff --git a/src/libxrpl/protocol/PublicKey.cpp b/src/libxrpl/protocol/PublicKey.cpp index fdab288cea0..cdf646e0f86 100644 --- a/src/libxrpl/protocol/PublicKey.cpp +++ b/src/libxrpl/protocol/PublicKey.cpp @@ -17,13 +17,29 @@ */ //============================================================================== +#include +#include #include #include +#include #include +#include #include #include -#include +#include + +#include +#include + #include +#include + +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Quality.cpp b/src/libxrpl/protocol/Quality.cpp index ba669d9bd1f..f7a970a3b9c 100644 --- a/src/libxrpl/protocol/Quality.cpp +++ b/src/libxrpl/protocol/Quality.cpp @@ -17,8 +17,13 @@ */ //============================================================================== +#include #include +#include #include +#include + +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/QualityFunction.cpp b/src/libxrpl/protocol/QualityFunction.cpp index 64e5a36989c..9f898dca250 100644 --- a/src/libxrpl/protocol/QualityFunction.cpp +++ b/src/libxrpl/protocol/QualityFunction.cpp @@ -17,9 +17,14 @@ */ //============================================================================== +#include +#include +#include +#include #include -#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/RPCErr.cpp b/src/libxrpl/protocol/RPCErr.cpp index e9ca3c3c1e6..2fc9ba173b5 100644 --- a/src/libxrpl/protocol/RPCErr.cpp +++ b/src/libxrpl/protocol/RPCErr.cpp @@ -17,8 +17,10 @@ */ //============================================================================== +#include #include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Rate2.cpp b/src/libxrpl/protocol/Rate2.cpp index 64ac6c46315..dfdf60f02e3 100644 --- a/src/libxrpl/protocol/Rate2.cpp +++ b/src/libxrpl/protocol/Rate2.cpp @@ -17,8 +17,14 @@ */ //============================================================================== +#include +#include +#include #include #include +#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/Rules.cpp b/src/libxrpl/protocol/Rules.cpp index 7043acff96d..3d1c718e65a 100644 --- a/src/libxrpl/protocol/Rules.cpp +++ b/src/libxrpl/protocol/Rules.cpp @@ -18,10 +18,18 @@ //============================================================================== #include +#include +#include +#include +#include #include #include +#include +#include #include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/SField.cpp b/src/libxrpl/protocol/SField.cpp index 20e1e112655..b59e2a2b69f 100644 --- a/src/libxrpl/protocol/SField.cpp +++ b/src/libxrpl/protocol/SField.cpp @@ -17,11 +17,10 @@ */ //============================================================================== -#include #include + +#include #include -#include -#include namespace ripple { diff --git a/src/libxrpl/protocol/SOTemplate.cpp b/src/libxrpl/protocol/SOTemplate.cpp index d75261c0a64..0b6e321bf48 100644 --- a/src/libxrpl/protocol/SOTemplate.cpp +++ b/src/libxrpl/protocol/SOTemplate.cpp @@ -17,8 +17,14 @@ */ //============================================================================== +#include +#include #include +#include +#include +#include + namespace ripple { SOTemplate::SOTemplate( diff --git a/src/libxrpl/protocol/STAccount.cpp b/src/libxrpl/protocol/STAccount.cpp index c033e4cb580..ba9a2d19194 100644 --- a/src/libxrpl/protocol/STAccount.cpp +++ b/src/libxrpl/protocol/STAccount.cpp @@ -17,9 +17,21 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STAmount.cpp b/src/libxrpl/protocol/STAmount.cpp index 37830830ade..e0815fbef31 100644 --- a/src/libxrpl/protocol/STAmount.cpp +++ b/src/libxrpl/protocol/STAmount.cpp @@ -17,21 +17,53 @@ */ //============================================================================== +#include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include #include #include +#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include #include +#include #include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STArray.cpp b/src/libxrpl/protocol/STArray.cpp index 0dea9c7665e..0c5b4e198c7 100644 --- a/src/libxrpl/protocol/STArray.cpp +++ b/src/libxrpl/protocol/STArray.cpp @@ -19,8 +19,17 @@ #include #include +#include +#include #include #include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STBase.cpp b/src/libxrpl/protocol/STBase.cpp index 6986957b61e..86e52a1f73f 100644 --- a/src/libxrpl/protocol/STBase.cpp +++ b/src/libxrpl/protocol/STBase.cpp @@ -18,8 +18,15 @@ //============================================================================== #include +#include +#include #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STBlob.cpp b/src/libxrpl/protocol/STBlob.cpp index 34e759b4c37..33245a1e160 100644 --- a/src/libxrpl/protocol/STBlob.cpp +++ b/src/libxrpl/protocol/STBlob.cpp @@ -17,8 +17,16 @@ */ //============================================================================== -#include +#include +#include +#include +#include #include +#include + +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STCurrency.cpp b/src/libxrpl/protocol/STCurrency.cpp index 56ac19da114..a17ed2e0d2c 100644 --- a/src/libxrpl/protocol/STCurrency.cpp +++ b/src/libxrpl/protocol/STCurrency.cpp @@ -17,10 +17,19 @@ */ //============================================================================== -#include -#include - #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index 9525a47c462..bc5b7e855e2 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -18,14 +18,22 @@ //============================================================================== #include -#include #include -#include +#include +#include #include +#include +#include #include +#include #include #include + #include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STIssue.cpp b/src/libxrpl/protocol/STIssue.cpp index 5a2008cb178..8483b8cfe33 100644 --- a/src/libxrpl/protocol/STIssue.cpp +++ b/src/libxrpl/protocol/STIssue.cpp @@ -17,20 +17,24 @@ */ //============================================================================== -#include - -#include #include -#include -#include - -#include -#include -#include - -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STLedgerEntry.cpp b/src/libxrpl/protocol/STLedgerEntry.cpp index 0350dd883b8..ae80abb69f6 100644 --- a/src/libxrpl/protocol/STLedgerEntry.cpp +++ b/src/libxrpl/protocol/STLedgerEntry.cpp @@ -17,20 +17,33 @@ */ //============================================================================== -#include - #include +#include #include #include +#include #include #include #include +#include +#include #include +#include +#include +#include +#include +#include #include -#include + +#include + #include #include -#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STNumber.cpp b/src/libxrpl/protocol/STNumber.cpp index 74961bfbcab..c0cdcccd6e9 100644 --- a/src/libxrpl/protocol/STNumber.cpp +++ b/src/libxrpl/protocol/STNumber.cpp @@ -17,10 +17,17 @@ */ //============================================================================== -#include - +#include #include #include +#include +#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 821f8f05c96..d0873561e31 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -17,16 +17,46 @@ */ //============================================================================== +#include #include +#include +#include +#include +#include +#include +#include #include +#include #include #include +#include +#include #include +#include #include +#include +#include #include #include +#include +#include #include #include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index 7d08993a8ba..0488189a667 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -18,10 +18,13 @@ //============================================================================== #include +#include #include #include #include -#include +#include +#include +#include #include #include #include @@ -30,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -39,11 +43,20 @@ #include #include #include -#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STPathSet.cpp b/src/libxrpl/protocol/STPathSet.cpp index 57bcaca6b2c..d2bd20cfe89 100644 --- a/src/libxrpl/protocol/STPathSet.cpp +++ b/src/libxrpl/protocol/STPathSet.cpp @@ -18,12 +18,22 @@ //============================================================================== #include -#include #include -#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include +#include + namespace ripple { std::size_t diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index bd1c461c8c7..a60f7325f03 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -17,26 +17,53 @@ */ //============================================================================== -#include +#include +#include +#include #include +#include #include #include -#include -#include +#include +#include +#include +#include +#include #include +#include #include #include +#include +#include +#include #include +#include #include +#include +#include #include +#include +#include +#include #include #include -#include +#include #include -#include + +#include +#include +#include #include +#include +#include +#include +#include #include +#include +#include +#include +#include #include #include diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index f14fce43219..948a47f0ac9 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -17,11 +17,23 @@ */ //============================================================================== -#include -#include -#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index c5d3102bfa7..3af0345c4e6 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include - #include +#include +#include #include #include #include @@ -29,12 +29,16 @@ #include #include #include -#include #include #include #include #include -#include +#include +#include + +#include +#include +#include namespace ripple { namespace detail { diff --git a/src/libxrpl/protocol/STVector256.cpp b/src/libxrpl/protocol/STVector256.cpp index 6f70a3849c1..50b022d294f 100644 --- a/src/libxrpl/protocol/STVector256.cpp +++ b/src/libxrpl/protocol/STVector256.cpp @@ -17,10 +17,19 @@ */ //============================================================================== -#include -#include +#include +#include +#include +#include +#include +#include #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STXChainBridge.cpp b/src/libxrpl/protocol/STXChainBridge.cpp index 2347e63379a..1499d790cb7 100644 --- a/src/libxrpl/protocol/STXChainBridge.cpp +++ b/src/libxrpl/protocol/STXChainBridge.cpp @@ -17,21 +17,24 @@ */ //============================================================================== -#include - -#include +#include +#include +#include #include -#include #include #include +#include #include #include #include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/SecretKey.cpp b/src/libxrpl/protocol/SecretKey.cpp index 474c37ac802..06b1061c1e8 100644 --- a/src/libxrpl/protocol/SecretKey.cpp +++ b/src/libxrpl/protocol/SecretKey.cpp @@ -17,16 +17,34 @@ */ //============================================================================== +#include +#include +#include #include #include #include #include #include +#include +#include #include +#include #include #include -#include +#include + +#include + #include +#include + +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Seed.cpp b/src/libxrpl/protocol/Seed.cpp index 453b4593bfb..095c09e7c09 100644 --- a/src/libxrpl/protocol/Seed.cpp +++ b/src/libxrpl/protocol/Seed.cpp @@ -17,7 +17,9 @@ */ //============================================================================== -#include +#include +#include +#include #include #include #include @@ -28,9 +30,14 @@ #include #include #include +#include + #include +#include +#include #include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index f46104f6382..339e25db1d3 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -17,11 +17,24 @@ */ //============================================================================== -#include +#include +#include +#include #include +#include +#include +#include #include #include + +#include + +#include +#include #include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/Sign.cpp b/src/libxrpl/protocol/Sign.cpp index 32645c3762c..27c2b0435c4 100644 --- a/src/libxrpl/protocol/Sign.cpp +++ b/src/libxrpl/protocol/Sign.cpp @@ -17,6 +17,15 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index dc0bdb4a591..3766f33c548 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -18,8 +18,14 @@ //============================================================================== #include + #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/TxFormats.cpp b/src/libxrpl/protocol/TxFormats.cpp index 76b1ae8ad4f..b2dd3a656f5 100644 --- a/src/libxrpl/protocol/TxFormats.cpp +++ b/src/libxrpl/protocol/TxFormats.cpp @@ -17,12 +17,13 @@ */ //============================================================================== -#include - #include #include +#include #include +#include + namespace ripple { TxFormats::TxFormats() diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index dad67c13349..d9a9f0db878 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -17,11 +17,24 @@ */ //============================================================================== -#include +#include +#include #include -#include +#include +#include +#include #include +#include +#include +#include +#include +#include #include + +#include + +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/UintTypes.cpp b/src/libxrpl/protocol/UintTypes.cpp index c57bcc153a3..dadfccfa9f4 100644 --- a/src/libxrpl/protocol/UintTypes.cpp +++ b/src/libxrpl/protocol/UintTypes.cpp @@ -17,10 +17,14 @@ */ //============================================================================== +#include #include -#include #include #include + +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/XChainAttestations.cpp b/src/libxrpl/protocol/XChainAttestations.cpp index 82e73445693..e61224b570c 100644 --- a/src/libxrpl/protocol/XChainAttestations.cpp +++ b/src/libxrpl/protocol/XChainAttestations.cpp @@ -17,26 +17,29 @@ */ //============================================================================== -#include - -#include -#include -#include +#include +#include +#include +#include #include -#include #include #include #include #include #include #include +#include #include #include #include #include -#include +#include #include +#include +#include +#include +#include namespace ripple { namespace Attestations { diff --git a/src/libxrpl/protocol/digest.cpp b/src/libxrpl/protocol/digest.cpp index 237e7aa49f0..2626ec09685 100644 --- a/src/libxrpl/protocol/digest.cpp +++ b/src/libxrpl/protocol/digest.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include -#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/tokens.cpp b/src/libxrpl/protocol/tokens.cpp index 49ec926a775..a822b1937fb 100644 --- a/src/libxrpl/protocol/tokens.cpp +++ b/src/libxrpl/protocol/tokens.cpp @@ -25,21 +25,25 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php. */ -#include - +#include #include #include #include +#include #include +#include #include -#include #include +#include +#include +#include #include -#include +#include +#include +#include #include -#include #include /* diff --git a/src/libxrpl/resource/Charge.cpp b/src/libxrpl/resource/Charge.cpp index 53df4e592dc..8c96e3696fd 100644 --- a/src/libxrpl/resource/Charge.cpp +++ b/src/libxrpl/resource/Charge.cpp @@ -18,7 +18,11 @@ //============================================================================== #include + +#include +#include #include +#include namespace ripple { namespace Resource { diff --git a/src/libxrpl/resource/Consumer.cpp b/src/libxrpl/resource/Consumer.cpp index 6f0d6dcc49b..71a84340cd8 100644 --- a/src/libxrpl/resource/Consumer.cpp +++ b/src/libxrpl/resource/Consumer.cpp @@ -17,11 +17,18 @@ */ //============================================================================== +#include +#include #include +#include #include +#include #include #include +#include +#include + namespace ripple { namespace Resource { diff --git a/src/libxrpl/resource/Fees.cpp b/src/libxrpl/resource/Fees.cpp index 17fb475394c..6d81cbbd250 100644 --- a/src/libxrpl/resource/Fees.cpp +++ b/src/libxrpl/resource/Fees.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include namespace ripple { diff --git a/src/libxrpl/resource/ResourceManager.cpp b/src/libxrpl/resource/ResourceManager.cpp index d73ca090024..08e0bcd408f 100644 --- a/src/libxrpl/resource/ResourceManager.cpp +++ b/src/libxrpl/resource/ResourceManager.cpp @@ -17,18 +17,29 @@ */ //============================================================================== -#include #include #include +#include #include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include + +#include +#include + +#include #include #include #include +#include +#include +#include namespace ripple { namespace Resource { diff --git a/src/libxrpl/server/JSONRPCUtil.cpp b/src/libxrpl/server/JSONRPCUtil.cpp index ce173b1e9eb..69adb235ee7 100644 --- a/src/libxrpl/server/JSONRPCUtil.cpp +++ b/src/libxrpl/server/JSONRPCUtil.cpp @@ -18,12 +18,14 @@ //============================================================================== #include -#include +#include +#include #include #include -#include #include -#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/server/Port.cpp b/src/libxrpl/server/Port.cpp index 9c1f16cda03..95709fc298b 100644 --- a/src/libxrpl/server/Port.cpp +++ b/src/libxrpl/server/Port.cpp @@ -17,13 +17,27 @@ */ //============================================================================== +#include +#include #include #include +#include #include #include + #include #include +#include +#include +#include +#include + +#include +#include +#include #include +#include +#include namespace ripple { diff --git a/src/test/app/AMMCalc_test.cpp b/src/test/app/AMMCalc_test.cpp index 058cdfd1d2d..bebf2844b62 100644 --- a/src/test/app/AMMCalc_test.cpp +++ b/src/test/app/AMMCalc_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/AMMClawback_test.cpp b/src/test/app/AMMClawback_test.cpp index c547a537bfb..878c570a121 100644 --- a/src/test/app/AMMClawback_test.cpp +++ b/src/test/app/AMMClawback_test.cpp @@ -14,16 +14,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include -#include -#include -#include + #include -#include + #include + namespace ripple { namespace test { class AMMClawback_test : public jtx::AMMTest diff --git a/src/test/app/AMMExtended_test.cpp b/src/test/app/AMMExtended_test.cpp index 96053b93b44..ed9fa0f1f8c 100644 --- a/src/test/app/AMMExtended_test.cpp +++ b/src/test/app/AMMExtended_test.cpp @@ -16,27 +16,24 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include #include -#include + #include #include #include #include #include #include -#include -#include -#include + #include #include -#include -#include #include #include diff --git a/src/test/app/AMM_test.cpp b/src/test/app/AMM_test.cpp index f1e81132c5e..9eee2b88050 100644 --- a/src/test/app/AMM_test.cpp +++ b/src/test/app/AMM_test.cpp @@ -16,30 +16,26 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include + #include #include -#include -#include #include -#include -#include + #include #include #include -#include -#include -#include +#include + #include #include -#include - namespace ripple { namespace test { diff --git a/src/test/app/AccountDelete_test.cpp b/src/test/app/AccountDelete_test.cpp index f8d3cf4692a..c903f95f77e 100644 --- a/src/test/app/AccountDelete_test.cpp +++ b/src/test/app/AccountDelete_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/AccountTxPaging_test.cpp b/src/test/app/AccountTxPaging_test.cpp index 680e006a74f..46a56f58e33 100644 --- a/src/test/app/AccountTxPaging_test.cpp +++ b/src/test/app/AccountTxPaging_test.cpp @@ -16,15 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include +#include + #include -#include #include -#include -#include -#include -#include +#include namespace ripple { diff --git a/src/test/app/AmendmentTable_test.cpp b/src/test/app/AmendmentTable_test.cpp index 2f95fc0280b..5ba820da951 100644 --- a/src/test/app/AmendmentTable_test.cpp +++ b/src/test/app/AmendmentTable_test.cpp @@ -19,8 +19,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/test/app/Check_test.cpp b/src/test/app/Check_test.cpp index 2c4f44ce79f..d27df464681 100644 --- a/src/test/app/Check_test.cpp +++ b/src/test/app/Check_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/Clawback_test.cpp b/src/test/app/Clawback_test.cpp index c000433d2af..d41f6de5561 100644 --- a/src/test/app/Clawback_test.cpp +++ b/src/test/app/Clawback_test.cpp @@ -19,12 +19,8 @@ #include #include -#include -#include -#include + #include -#include -#include namespace ripple { diff --git a/src/test/app/Credentials_test.cpp b/src/test/app/Credentials_test.cpp index 481850562fd..24e656672d4 100644 --- a/src/test/app/Credentials_test.cpp +++ b/src/test/app/Credentials_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include @@ -27,7 +29,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/app/CrossingLimits_test.cpp b/src/test/app/CrossingLimits_test.cpp index 6f6a7eb3e7f..1e19a178c26 100644 --- a/src/test/app/CrossingLimits_test.cpp +++ b/src/test/app/CrossingLimits_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/DID_test.cpp b/src/test/app/DID_test.cpp index 3f9cce1d33e..3a2ed260c64 100644 --- a/src/test/app/DID_test.cpp +++ b/src/test/app/DID_test.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include + #include #include -#include -#include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/DNS_test.cpp b/src/test/app/DNS_test.cpp index 7a39c5f0790..7e209deb1c0 100644 --- a/src/test/app/DNS_test.cpp +++ b/src/test/app/DNS_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/DeliverMin_test.cpp b/src/test/app/DeliverMin_test.cpp index 3c62a47a4a4..3c5fd43c18c 100644 --- a/src/test/app/DeliverMin_test.cpp +++ b/src/test/app/DeliverMin_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/DepositAuth_test.cpp b/src/test/app/DepositAuth_test.cpp index 463c606dc61..9e04c5e496a 100644 --- a/src/test/app/DepositAuth_test.cpp +++ b/src/test/app/DepositAuth_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/Discrepancy_test.cpp b/src/test/app/Discrepancy_test.cpp index 1eaa1ad86dd..8e306282a73 100644 --- a/src/test/app/Discrepancy_test.cpp +++ b/src/test/app/Discrepancy_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 123b6548358..1f872d2bdc7 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index a49dbb0bcaf..73bb539a222 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include namespace ripple { diff --git a/src/test/app/FixNFTokenPageLinks_test.cpp b/src/test/app/FixNFTokenPageLinks_test.cpp index f8db4df4f92..f87d70aacf7 100644 --- a/src/test/app/FixNFTokenPageLinks_test.cpp +++ b/src/test/app/FixNFTokenPageLinks_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include diff --git a/src/test/app/Flow_test.cpp b/src/test/app/Flow_test.cpp index 4d1397eab83..aa7e819e071 100644 --- a/src/test/app/Flow_test.cpp +++ b/src/test/app/Flow_test.cpp @@ -19,15 +19,15 @@ #include #include + #include #include #include -#include #include #include + #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/Freeze_test.cpp b/src/test/app/Freeze_test.cpp index 99696c11f6e..36578cbc6b3 100644 --- a/src/test/app/Freeze_test.cpp +++ b/src/test/app/Freeze_test.cpp @@ -16,8 +16,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include #include diff --git a/src/test/app/HashRouter_test.cpp b/src/test/app/HashRouter_test.cpp index 1234bc5b9cb..d8d7ca68511 100644 --- a/src/test/app/HashRouter_test.cpp +++ b/src/test/app/HashRouter_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/LedgerHistory_test.cpp b/src/test/app/LedgerHistory_test.cpp index e1a837a9cb2..7b1910bd4dc 100644 --- a/src/test/app/LedgerHistory_test.cpp +++ b/src/test/app/LedgerHistory_test.cpp @@ -19,14 +19,16 @@ #include #include + #include #include #include #include + #include #include + #include -#include #include namespace ripple { diff --git a/src/test/app/LedgerLoad_test.cpp b/src/test/app/LedgerLoad_test.cpp index 5b6df353d81..c151bc7b4a4 100644 --- a/src/test/app/LedgerLoad_test.cpp +++ b/src/test/app/LedgerLoad_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include @@ -28,6 +29,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/app/LedgerMaster_test.cpp b/src/test/app/LedgerMaster_test.cpp index d53d27b3185..a5517ccceeb 100644 --- a/src/test/app/LedgerMaster_test.cpp +++ b/src/test/app/LedgerMaster_test.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/LedgerReplay_test.cpp b/src/test/app/LedgerReplay_test.cpp index 883aca7bced..15f51889bbb 100644 --- a/src/test/app/LedgerReplay_test.cpp +++ b/src/test/app/LedgerReplay_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include @@ -29,6 +30,7 @@ #include #include #include + #include #include diff --git a/src/test/app/LoadFeeTrack_test.cpp b/src/test/app/LoadFeeTrack_test.cpp index fa7489bf1bb..9b0cf2fa2db 100644 --- a/src/test/app/LoadFeeTrack_test.cpp +++ b/src/test/app/LoadFeeTrack_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/app/MPToken_test.cpp b/src/test/app/MPToken_test.cpp index 9fd4927d5eb..31e5368691d 100644 --- a/src/test/app/MPToken_test.cpp +++ b/src/test/app/MPToken_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/test/app/Manifest_test.cpp b/src/test/app/Manifest_test.cpp index 0e25300417c..deaa2adbad3 100644 --- a/src/test/app/Manifest_test.cpp +++ b/src/test/app/Manifest_test.cpp @@ -18,16 +18,18 @@ //============================================================================== #include + #include #include #include #include -#include + #include #include #include #include #include + #include #include #include diff --git a/src/test/app/MultiSign_test.cpp b/src/test/app/MultiSign_test.cpp index 9648bed886f..ecac8ac67b4 100644 --- a/src/test/app/MultiSign_test.cpp +++ b/src/test/app/MultiSign_test.cpp @@ -16,7 +16,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/NFTokenBurn_test.cpp b/src/test/app/NFTokenBurn_test.cpp index a56f0a45674..a970b11789d 100644 --- a/src/test/app/NFTokenBurn_test.cpp +++ b/src/test/app/NFTokenBurn_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/NFTokenDir_test.cpp b/src/test/app/NFTokenDir_test.cpp index 23e4c671526..fe21e027393 100644 --- a/src/test/app/NFTokenDir_test.cpp +++ b/src/test/app/NFTokenDir_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include diff --git a/src/test/app/NFToken_test.cpp b/src/test/app/NFToken_test.cpp index ec1ee5111e4..62a7b00da9b 100644 --- a/src/test/app/NFToken_test.cpp +++ b/src/test/app/NFToken_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include diff --git a/src/test/app/NetworkID_test.cpp b/src/test/app/NetworkID_test.cpp index 2f02a1fd7d2..07a4641c0e1 100644 --- a/src/test/app/NetworkID_test.cpp +++ b/src/test/app/NetworkID_test.cpp @@ -19,8 +19,7 @@ #include #include -#include -#include + #include namespace ripple { diff --git a/src/test/app/OfferStream_test.cpp b/src/test/app/OfferStream_test.cpp index bf712503687..691d327cd82 100644 --- a/src/test/app/OfferStream_test.cpp +++ b/src/test/app/OfferStream_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/app/Offer_test.cpp b/src/test/app/Offer_test.cpp index 2b4245a1ae4..8ba4113341d 100644 --- a/src/test/app/Offer_test.cpp +++ b/src/test/app/Offer_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/test/app/Oracle_test.cpp b/src/test/app/Oracle_test.cpp index 44eeb1c9f98..291349309a7 100644 --- a/src/test/app/Oracle_test.cpp +++ b/src/test/app/Oracle_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/app/OversizeMeta_test.cpp b/src/test/app/OversizeMeta_test.cpp index 0a7f42e1801..f6e4466bab3 100644 --- a/src/test/app/OversizeMeta_test.cpp +++ b/src/test/app/OversizeMeta_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/Path_test.cpp b/src/test/app/Path_test.cpp index 1db15388ff0..b500014578d 100644 --- a/src/test/app/Path_test.cpp +++ b/src/test/app/Path_test.cpp @@ -19,24 +19,22 @@ #include #include + #include #include #include #include #include #include -#include + #include #include -#include #include #include #include #include -#include -#include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PayChan_test.cpp b/src/test/app/PayChan_test.cpp index bc1cbba69c0..dc839f89ec5 100644 --- a/src/test/app/PayChan_test.cpp +++ b/src/test/app/PayChan_test.cpp @@ -18,15 +18,16 @@ //============================================================================== #include + #include #include + #include #include #include #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PayStrand_test.cpp b/src/test/app/PayStrand_test.cpp index f00a7361292..4d743d9d7c8 100644 --- a/src/test/app/PayStrand_test.cpp +++ b/src/test/app/PayStrand_test.cpp @@ -17,18 +17,16 @@ #include #include + #include -#include #include #include #include -#include #include -#include + #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PermissionedDomains_test.cpp b/src/test/app/PermissionedDomains_test.cpp index 7d78652b287..65f75897ae5 100644 --- a/src/test/app/PermissionedDomains_test.cpp +++ b/src/test/app/PermissionedDomains_test.cpp @@ -18,12 +18,10 @@ //============================================================================== #include + #include -#include -#include -#include + #include -#include #include #include diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 55622e49237..1101f56c699 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -16,9 +16,11 @@ //============================================================================== #include + #include + #include -#include + #include #include diff --git a/src/test/app/RCLCensorshipDetector_test.cpp b/src/test/app/RCLCensorshipDetector_test.cpp index b5440b90903..85ba0ab78d7 100644 --- a/src/test/app/RCLCensorshipDetector_test.cpp +++ b/src/test/app/RCLCensorshipDetector_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/RCLValidations_test.cpp b/src/test/app/RCLValidations_test.cpp index 540d98bc1f1..31c38f23b1c 100644 --- a/src/test/app/RCLValidations_test.cpp +++ b/src/test/app/RCLValidations_test.cpp @@ -18,11 +18,10 @@ //============================================================================== #include + #include #include -#include -#include -#include + #include #include diff --git a/src/test/app/ReducedOffer_test.cpp b/src/test/app/ReducedOffer_test.cpp index a070051e435..5af06d594df 100644 --- a/src/test/app/ReducedOffer_test.cpp +++ b/src/test/app/ReducedOffer_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/app/Regression_test.cpp b/src/test/app/Regression_test.cpp index ec52d603ebe..ca8dcdf5e2b 100644 --- a/src/test/app/Regression_test.cpp +++ b/src/test/app/Regression_test.cpp @@ -18,12 +18,13 @@ #include #include #include + #include #include + #include #include #include -#include #include #include diff --git a/src/test/app/SHAMapStore_test.cpp b/src/test/app/SHAMapStore_test.cpp index 5fd3f79c9f5..d3b5917434b 100644 --- a/src/test/app/SHAMapStore_test.cpp +++ b/src/test/app/SHAMapStore_test.cpp @@ -19,12 +19,14 @@ #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/src/test/app/SetAuth_test.cpp b/src/test/app/SetAuth_test.cpp index 3dd8ab590a4..c531de2d75f 100644 --- a/src/test/app/SetAuth_test.cpp +++ b/src/test/app/SetAuth_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/SetRegularKey_test.cpp b/src/test/app/SetRegularKey_test.cpp index 024d8de137b..6a3a5ff2a95 100644 --- a/src/test/app/SetRegularKey_test.cpp +++ b/src/test/app/SetRegularKey_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/test/app/SetTrust_test.cpp b/src/test/app/SetTrust_test.cpp index 57e18d712f8..c99a1dafa12 100644 --- a/src/test/app/SetTrust_test.cpp +++ b/src/test/app/SetTrust_test.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include diff --git a/src/test/app/Taker_test.cpp b/src/test/app/Taker_test.cpp index 89e44b2b98b..3b3f338625c 100644 --- a/src/test/app/Taker_test.cpp +++ b/src/test/app/Taker_test.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include + #include -#include namespace ripple { diff --git a/src/test/app/TheoreticalQuality_test.cpp b/src/test/app/TheoreticalQuality_test.cpp index 917d23377bf..0269d206ccc 100644 --- a/src/test/app/TheoreticalQuality_test.cpp +++ b/src/test/app/TheoreticalQuality_test.cpp @@ -19,14 +19,13 @@ #include #include + #include #include #include #include -#include -#include #include -#include + #include #include #include diff --git a/src/test/app/Ticket_test.cpp b/src/test/app/Ticket_test.cpp index 9467390502c..dd83e3036ee 100644 --- a/src/test/app/Ticket_test.cpp +++ b/src/test/app/Ticket_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/Transaction_ordering_test.cpp b/src/test/app/Transaction_ordering_test.cpp index 928fcdb8389..472d4e2ab87 100644 --- a/src/test/app/Transaction_ordering_test.cpp +++ b/src/test/app/Transaction_ordering_test.cpp @@ -16,8 +16,8 @@ //============================================================================== #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/TrustAndBalance_test.cpp b/src/test/app/TrustAndBalance_test.cpp index b438d797276..037a7e0d895 100644 --- a/src/test/app/TrustAndBalance_test.cpp +++ b/src/test/app/TrustAndBalance_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/test/app/TxQ_test.cpp b/src/test/app/TxQ_test.cpp index 5201cb601e6..2bedee17ca9 100644 --- a/src/test/app/TxQ_test.cpp +++ b/src/test/app/TxQ_test.cpp @@ -22,11 +22,12 @@ #include #include #include + #include #include #include #include -#include + #include #include #include diff --git a/src/test/app/ValidatorKeys_test.cpp b/src/test/app/ValidatorKeys_test.cpp index 9281ec4bd77..7c8584698e5 100644 --- a/src/test/app/ValidatorKeys_test.cpp +++ b/src/test/app/ValidatorKeys_test.cpp @@ -18,10 +18,12 @@ //============================================================================== #include + #include #include #include #include + #include #include diff --git a/src/test/app/ValidatorList_test.cpp b/src/test/app/ValidatorList_test.cpp index 465723b1a70..819340bfa4d 100644 --- a/src/test/app/ValidatorList_test.cpp +++ b/src/test/app/ValidatorList_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/app/ValidatorSite_test.cpp b/src/test/app/ValidatorSite_test.cpp index 1ec302efef8..f7db0463c11 100644 --- a/src/test/app/ValidatorSite_test.cpp +++ b/src/test/app/ValidatorSite_test.cpp @@ -20,23 +20,22 @@ #include #include #include + #include -#include -#include + #include -#include #include -#include -#include -#include #include + #include #include #include #include -#include + #include +#include + namespace ripple { namespace test { namespace detail { diff --git a/src/test/app/XChain_test.cpp b/src/test/app/XChain_test.cpp index 3d25e9e989a..777cd5a68fb 100644 --- a/src/test/app/XChain_test.cpp +++ b/src/test/app/XChain_test.cpp @@ -17,6 +17,12 @@ */ //============================================================================== +#include +#include +#include +#include +#include + #include #include #include @@ -27,12 +33,6 @@ #include #include -#include -#include -#include -#include -#include - #include #include #include @@ -42,9 +42,6 @@ #include #include -#include -#include - namespace ripple::test { // SEnv class - encapsulate jtx::Env to make it more user-friendly, diff --git a/src/test/app/tx/apply_test.cpp b/src/test/app/tx/apply_test.cpp index df76e839a71..63fecde65fe 100644 --- a/src/test/app/tx/apply_test.cpp +++ b/src/test/app/tx/apply_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/basics/Buffer_test.cpp b/src/test/basics/Buffer_test.cpp index da8bcc8f12c..43ca048d7f4 100644 --- a/src/test/basics/Buffer_test.cpp +++ b/src/test/basics/Buffer_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/basics/Expected_test.cpp b/src/test/basics/Expected_test.cpp index 2f8b92eb916..d022d074616 100644 --- a/src/test/basics/Expected_test.cpp +++ b/src/test/basics/Expected_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #if BOOST_VERSION >= 107500 #include // Not part of boost before version 1.75 #endif // BOOST_VERSION diff --git a/src/test/basics/FeeUnits_test.cpp b/src/test/basics/FeeUnits_test.cpp index c32f98f1929..62662888960 100644 --- a/src/test/basics/FeeUnits_test.cpp +++ b/src/test/basics/FeeUnits_test.cpp @@ -19,7 +19,6 @@ #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/basics/FileUtilities_test.cpp b/src/test/basics/FileUtilities_test.cpp index 2b84998da7c..b78173f35fc 100644 --- a/src/test/basics/FileUtilities_test.cpp +++ b/src/test/basics/FileUtilities_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/basics/KeyCache_test.cpp b/src/test/basics/KeyCache_test.cpp index eab0e87d0a7..d39fd4a7162 100644 --- a/src/test/basics/KeyCache_test.cpp +++ b/src/test/basics/KeyCache_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include #include #include -#include #include namespace ripple { diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index 8a0a6702a63..13d8b259d1d 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/test/basics/PerfLog_test.cpp b/src/test/basics/PerfLog_test.cpp index 756988cbdac..7ec62a17017 100644 --- a/src/test/basics/PerfLog_test.cpp +++ b/src/test/basics/PerfLog_test.cpp @@ -19,8 +19,10 @@ #include #include + #include #include + #include #include #include @@ -30,7 +32,6 @@ #include #include #include -#include #include #include diff --git a/src/test/basics/Slice_test.cpp b/src/test/basics/Slice_test.cpp index a169de98539..3d474def792 100644 --- a/src/test/basics/Slice_test.cpp +++ b/src/test/basics/Slice_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/basics/TaggedCache_test.cpp b/src/test/basics/TaggedCache_test.cpp index 6fbba1a4795..519bc235cda 100644 --- a/src/test/basics/TaggedCache_test.cpp +++ b/src/test/basics/TaggedCache_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/basics/base_uint_test.cpp b/src/test/basics/base_uint_test.cpp index 9f3194f4fbc..8058e0d6f05 100644 --- a/src/test/basics/base_uint_test.cpp +++ b/src/test/basics/base_uint_test.cpp @@ -21,9 +21,10 @@ #include #include #include + #include -#include +#include #include namespace ripple { diff --git a/src/test/basics/contract_test.cpp b/src/test/basics/contract_test.cpp index 99f118794ee..9595dbabcce 100644 --- a/src/test/basics/contract_test.cpp +++ b/src/test/basics/contract_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/basics/hardened_hash_test.cpp b/src/test/basics/hardened_hash_test.cpp index 343894e52b0..248e8070351 100644 --- a/src/test/basics/hardened_hash_test.cpp +++ b/src/test/basics/hardened_hash_test.cpp @@ -19,10 +19,9 @@ #include #include -#include + #include #include -#include #include #include #include diff --git a/src/test/basics/tagged_integer_test.cpp b/src/test/basics/tagged_integer_test.cpp index 22cdc5ad53f..cb15d246a6e 100644 --- a/src/test/basics/tagged_integer_test.cpp +++ b/src/test/basics/tagged_integer_test.cpp @@ -20,6 +20,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/beast/IPEndpoint_test.cpp b/src/test/beast/IPEndpoint_test.cpp index 1ad49443dc3..7b3eba55f18 100644 --- a/src/test/beast/IPEndpoint_test.cpp +++ b/src/test/beast/IPEndpoint_test.cpp @@ -21,13 +21,14 @@ // ../impl/IPAddressV6.cpp #include + #include #include #include + #include #include #include -#include namespace beast { namespace IP { diff --git a/src/test/beast/SemanticVersion_test.cpp b/src/test/beast/SemanticVersion_test.cpp index 2f24a0c8926..fb7a3e3e4fb 100644 --- a/src/test/beast/SemanticVersion_test.cpp +++ b/src/test/beast/SemanticVersion_test.cpp @@ -16,8 +16,10 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + namespace beast { class SemanticVersion_test : public unit_test::suite @@ -279,4 +281,4 @@ class SemanticVersion_test : public unit_test::suite }; BEAST_DEFINE_TESTSUITE(SemanticVersion, beast_core, beast); -} // namespace beast \ No newline at end of file +} // namespace beast diff --git a/src/test/beast/aged_associative_container_test.cpp b/src/test/beast/aged_associative_container_test.cpp index e5736764e06..f88d5acc277 100644 --- a/src/test/beast/aged_associative_container_test.cpp +++ b/src/test/beast/aged_associative_container_test.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include - #include #include #include @@ -28,6 +26,7 @@ #include #include #include +#include #include #include diff --git a/src/test/beast/beast_CurrentThreadName_test.cpp b/src/test/beast/beast_CurrentThreadName_test.cpp index 653b0a89618..839aaaef0ac 100644 --- a/src/test/beast/beast_CurrentThreadName_test.cpp +++ b/src/test/beast/beast_CurrentThreadName_test.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/test/beast/beast_PropertyStream_test.cpp b/src/test/beast/beast_PropertyStream_test.cpp index e91f527d3c9..bbbc2fc0e0d 100644 --- a/src/test/beast/beast_PropertyStream_test.cpp +++ b/src/test/beast/beast_PropertyStream_test.cpp @@ -16,8 +16,10 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + namespace beast { class PropertyStream_test : public unit_test::suite @@ -237,4 +239,4 @@ class PropertyStream_test : public unit_test::suite }; BEAST_DEFINE_TESTSUITE(PropertyStream, utility, beast); -} // namespace beast \ No newline at end of file +} // namespace beast diff --git a/src/test/beast/beast_Zero_test.cpp b/src/test/beast/beast_Zero_test.cpp index 8fd16a4d51f..9a645334ab2 100644 --- a/src/test/beast/beast_Zero_test.cpp +++ b/src/test/beast/beast_Zero_test.cpp @@ -17,9 +17,8 @@ */ //============================================================================== -#include - #include +#include namespace beast { diff --git a/src/test/beast/beast_abstract_clock_test.cpp b/src/test/beast/beast_abstract_clock_test.cpp index a026df26376..b86afdb1391 100644 --- a/src/test/beast/beast_abstract_clock_test.cpp +++ b/src/test/beast/beast_abstract_clock_test.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/test/beast/beast_basic_seconds_clock_test.cpp b/src/test/beast/beast_basic_seconds_clock_test.cpp index f3926634dc4..c769cde07ac 100644 --- a/src/test/beast/beast_basic_seconds_clock_test.cpp +++ b/src/test/beast/beast_basic_seconds_clock_test.cpp @@ -17,9 +17,8 @@ */ //============================================================================== -#include - #include +#include namespace beast { diff --git a/src/test/beast/beast_io_latency_probe_test.cpp b/src/test/beast/beast_io_latency_probe_test.cpp index 96228194304..de3c5d1d208 100644 --- a/src/test/beast/beast_io_latency_probe_test.cpp +++ b/src/test/beast/beast_io_latency_probe_test.cpp @@ -16,21 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include -#include +#include #include +#include #include #include #include #include -#include #include #include #include -#include #include using namespace std::chrono_literals; diff --git a/src/test/beast/define_print.cpp b/src/test/beast/define_print.cpp index 0d36cd76982..ec86d5d7d78 100644 --- a/src/test/beast/define_print.cpp +++ b/src/test/beast/define_print.cpp @@ -8,6 +8,7 @@ #include #include #include + #include // Include this .cpp in your project to gain access to the printing suite diff --git a/src/test/conditions/PreimageSha256_test.cpp b/src/test/conditions/PreimageSha256_test.cpp index 9a6840b11c3..820b005a3fe 100644 --- a/src/test/conditions/PreimageSha256_test.cpp +++ b/src/test/conditions/PreimageSha256_test.cpp @@ -20,11 +20,13 @@ #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/test/consensus/ByzantineFailureSim_test.cpp b/src/test/consensus/ByzantineFailureSim_test.cpp index 92dbfc0174d..b9799434776 100644 --- a/src/test/consensus/ByzantineFailureSim_test.cpp +++ b/src/test/consensus/ByzantineFailureSim_test.cpp @@ -16,9 +16,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include + #include + #include namespace ripple { diff --git a/src/test/consensus/Consensus_test.cpp b/src/test/consensus/Consensus_test.cpp index 88280994c10..db56ab58c69 100644 --- a/src/test/consensus/Consensus_test.cpp +++ b/src/test/consensus/Consensus_test.cpp @@ -16,13 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include -#include -#include + #include -#include +#include namespace ripple { namespace test { @@ -40,6 +41,7 @@ class Consensus_test : public beast::unit_test::suite testShouldCloseLedger() { using namespace std::chrono_literals; + testcase("should close ledger"); // Use default parameters ConsensusParms const p{}; @@ -78,46 +80,102 @@ class Consensus_test : public beast::unit_test::suite testCheckConsensus() { using namespace std::chrono_literals; + testcase("check consensus"); // Use default parameterss ConsensusParms const p{}; + /////////////// + // Disputes still in doubt + // // Not enough time has elapsed BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 2, 0, 3s, 2s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 2s, false, p, true, journal_)); // If not enough peers have propsed, ensure // more time for proposals BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 2, 0, 3s, 4s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 4s, false, p, true, journal_)); // Enough time has elapsed and we all agree BEAST_EXPECT( ConsensusState::Yes == - checkConsensus(10, 2, 2, 0, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 10s, false, p, true, journal_)); // Enough time has elapsed and we don't yet agree BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 1, 0, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 1, 0, 3s, 10s, false, p, true, journal_)); // Our peers have moved on // Enough time has elapsed and we all agree BEAST_EXPECT( ConsensusState::MovedOn == - checkConsensus(10, 2, 1, 8, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 1, 8, 3s, 10s, false, p, true, journal_)); + + // If no peers, don't agree until time has passed. + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(0, 0, 0, 0, 3s, 10s, false, p, true, journal_)); + + // Agree if no peers and enough time has passed. + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(0, 0, 0, 0, 3s, 16s, false, p, true, journal_)); + + // Expire if too much time has passed without agreement + BEAST_EXPECT( + ConsensusState::Expired == + checkConsensus(10, 8, 1, 0, 1s, 19s, false, p, true, journal_)); + + /////////////// + // Stalled + // + // Not enough time has elapsed + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(10, 2, 2, 0, 3s, 2s, true, p, true, journal_)); + + // If not enough peers have propsed, ensure + // more time for proposals + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(10, 2, 2, 0, 3s, 4s, true, p, true, journal_)); + + // Enough time has elapsed and we all agree + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 2, 0, 3s, 10s, true, p, true, journal_)); + + // Enough time has elapsed and we don't yet agree, but there's nothing + // left to dispute + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 1, 0, 3s, 10s, true, p, true, journal_)); + + // Our peers have moved on + // Enough time has elapsed and we all agree, nothing left to dispute + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 1, 8, 3s, 10s, true, p, true, journal_)); // If no peers, don't agree until time has passed. BEAST_EXPECT( ConsensusState::No == - checkConsensus(0, 0, 0, 0, 3s, 10s, p, true, journal_)); + checkConsensus(0, 0, 0, 0, 3s, 10s, true, p, true, journal_)); // Agree if no peers and enough time has passed. BEAST_EXPECT( ConsensusState::Yes == - checkConsensus(0, 0, 0, 0, 3s, 16s, p, true, journal_)); + checkConsensus(0, 0, 0, 0, 3s, 16s, true, p, true, journal_)); + + // We are done if there's nothing left to dispute, no matter how much + // time has passed + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 8, 1, 0, 1s, 19s, true, p, true, journal_)); } void @@ -125,6 +183,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace std::chrono_literals; using namespace csf; + testcase("standalone"); Sim s; PeerGroup peers = s.createGroup(1); @@ -149,6 +208,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("peers agree"); ConsensusParms const parms{}; Sim sim; @@ -186,6 +246,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("slow peers"); // Several tests of a complete trust graph with a subset of peers // that have significantly longer network delays to the rest of the @@ -351,6 +412,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("close time disagree"); // This is a very specialized test to get ledgers to disagree on // the close time. It unfortunately assumes knowledge about current @@ -417,6 +479,8 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("wrong LCL"); + // Specialized test to exercise a temporary fork in which some peers // are working on an incorrect prior ledger. @@ -589,6 +653,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("consensus close time rounding"); // This is a specialized test engineered to yield ledgers with different // close times even though the peers believe they had close time @@ -604,9 +669,6 @@ class Consensus_test : public beast::unit_test::suite PeerGroup fast = sim.createGroup(4); PeerGroup network = fast + slow; - for (Peer* peer : network) - peer->consensusParms = parms; - // Connected trust graph network.trust(network); @@ -692,6 +754,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("fork"); std::uint32_t numPeers = 10; // Vary overlap between two UNLs @@ -748,6 +811,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("hub network"); // Simulate a set of 5 validators that aren't directly connected but // rely on a single hub node for communication @@ -835,6 +899,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("preferred by branch"); // Simulate network splits that are prevented from forking when using // preferred ledger by trie. This is a contrived example that involves @@ -967,6 +1032,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("pause for laggards"); // Test that validators that jump ahead of the network slow // down. @@ -1052,6 +1118,302 @@ class Consensus_test : public beast::unit_test::suite BEAST_EXPECT(sim.synchronized()); } + void + testDisputes() + { + testcase("disputes"); + + using namespace csf; + + // Test dispute objects directly + using Dispute = DisputedTx; + + Tx const txTrue{99}; + Tx const txFalse{98}; + Tx const txFollowingTrue{97}; + Tx const txFollowingFalse{96}; + int const numPeers = 100; + ConsensusParms p; + std::size_t peersUnchanged = 0; + + // Three cases: + // 1 proposing, initial vote yes + // 2 proposing, initial vote no + // 3 not proposing, initial vote doesn't matter after the first update, + // use yes + { + Dispute proposingTrue{txTrue.id(), true, numPeers, journal_}; + Dispute proposingFalse{txFalse.id(), false, numPeers, journal_}; + Dispute followingTrue{ + txFollowingTrue.id(), true, numPeers, journal_}; + Dispute followingFalse{ + txFollowingFalse.id(), false, numPeers, journal_}; + BEAST_EXPECT(proposingTrue.ID() == 99); + BEAST_EXPECT(proposingFalse.ID() == 98); + BEAST_EXPECT(followingTrue.ID() == 97); + BEAST_EXPECT(followingFalse.ID() == 96); + + // Create an even split in the peer votes + for (int i = 0; i < numPeers; ++i) + { + BEAST_EXPECT(proposingTrue.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(proposingFalse.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(followingTrue.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(followingFalse.setVote(PeerID(i), i < 50)); + } + // Switch the middle vote to match mine + BEAST_EXPECT(proposingTrue.setVote(PeerID(50), true)); + BEAST_EXPECT(proposingFalse.setVote(PeerID(49), false)); + BEAST_EXPECT(followingTrue.setVote(PeerID(50), true)); + BEAST_EXPECT(followingFalse.setVote(PeerID(49), false)); + + // no changes yet + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // I'm in the majority, my vote should not change + BEAST_EXPECT(!proposingTrue.updateVote(5, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(5, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(5, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(5, false, p)); + + BEAST_EXPECT(!proposingTrue.updateVote(10, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(10, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(10, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(10, false, p)); + + peersUnchanged = 2; + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // Right now, the vote is 51%. The requirement is about to jump to + // 65% + BEAST_EXPECT(proposingTrue.updateVote(55, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(55, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(55, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(55, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + // 16 validators change their vote to match my original vote + for (int i = 0; i < 16; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + // The vote should now be 66%, threshold is 65% + BEAST_EXPECT(proposingTrue.updateVote(60, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(60, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(60, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(60, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // Threshold jumps to 70% + BEAST_EXPECT(proposingTrue.updateVote(86, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(86, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(86, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(86, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // 5 more validators change their vote to match my original vote + for (int i = 16; i < 21; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(proposingTrue.updateVote(90, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(90, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(90, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(90, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(!proposingTrue.updateVote(150, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(150, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(150, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(150, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(!proposingTrue.updateVote(190, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(190, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(190, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(190, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + peersUnchanged = 3; + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // Threshold jumps to 95% + BEAST_EXPECT(proposingTrue.updateVote(220, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(220, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(220, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(220, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // 25 more validators change their vote to match my original vote + for (int i = 21; i < 46; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + + // The vote should now be 96%, threshold is 95% + BEAST_EXPECT(proposingTrue.updateVote(250, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(250, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + for (peersUnchanged = 0; peersUnchanged < 6; ++peersUnchanged) + { + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + } + + for (int i = 0; i < 1; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // true vote has changed recently, so not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, 0)); + // remaining votes have been unchanged in so long that we only + // need to hit the second round at 95% to be stalled, regardless + // of peers + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + // true vote has changed recently, so not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + // remaining votes have been unchanged in so long that we only + // need to hit the second round at 95% to be stalled, regardless + // of peers + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + for (int i = 1; i < 3; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // true vote changed 2 rounds ago, and peers are changing, so + // not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, 0)); + // still stalled + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + // true vote changed 2 rounds ago, and peers are NOT changing, + // so stalled + BEAST_EXPECT(proposingTrue.stalled(p, true, peersUnchanged)); + // still stalled + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + for (int i = 3; i < 5; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + BEAST_EXPECT(proposingTrue.stalled(p, true, 0)); + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + BEAST_EXPECT(proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + } + } + void run() override { @@ -1068,6 +1430,7 @@ class Consensus_test : public beast::unit_test::suite testHubNetwork(); testPreferredByBranch(); testPauseForLaggards(); + testDisputes(); } }; diff --git a/src/test/consensus/DistributedValidatorsSim_test.cpp b/src/test/consensus/DistributedValidatorsSim_test.cpp index 3abac36b4f1..2f6ed74c237 100644 --- a/src/test/consensus/DistributedValidatorsSim_test.cpp +++ b/src/test/consensus/DistributedValidatorsSim_test.cpp @@ -16,17 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include + #include -#include #include #include + #include #include #include #include +#include namespace ripple { namespace test { diff --git a/src/test/consensus/LedgerTiming_test.cpp b/src/test/consensus/LedgerTiming_test.cpp index 95e27f5c854..79c0f3f8842 100644 --- a/src/test/consensus/LedgerTiming_test.cpp +++ b/src/test/consensus/LedgerTiming_test.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include namespace ripple { diff --git a/src/test/consensus/LedgerTrie_test.cpp b/src/test/consensus/LedgerTrie_test.cpp index 6f13db43be2..f46fea8e6e0 100644 --- a/src/test/consensus/LedgerTrie_test.cpp +++ b/src/test/consensus/LedgerTrie_test.cpp @@ -16,11 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include + #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/consensus/NegativeUNL_test.cpp b/src/test/consensus/NegativeUNL_test.cpp index 4993f679e1a..7eb05e68bb0 100644 --- a/src/test/consensus/NegativeUNL_test.cpp +++ b/src/test/consensus/NegativeUNL_test.cpp @@ -18,13 +18,14 @@ //============================================================================== #include + #include #include #include #include #include #include -#include + #include namespace ripple { diff --git a/src/test/consensus/ScaleFreeSim_test.cpp b/src/test/consensus/ScaleFreeSim_test.cpp index 3e3cec97618..226cf5bfed3 100644 --- a/src/test/consensus/ScaleFreeSim_test.cpp +++ b/src/test/consensus/ScaleFreeSim_test.cpp @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include -#include + #include + #include namespace ripple { diff --git a/src/test/consensus/Validations_test.cpp b/src/test/consensus/Validations_test.cpp index 0279d6330cc..4424d7619d2 100644 --- a/src/test/consensus/Validations_test.cpp +++ b/src/test/consensus/Validations_test.cpp @@ -19,13 +19,13 @@ #include #include + #include + #include #include #include -#include -#include -#include + #include namespace ripple { diff --git a/src/test/core/ClosureCounter_test.cpp b/src/test/core/ClosureCounter_test.cpp index 83d2fdb6e4a..a426a4aea49 100644 --- a/src/test/core/ClosureCounter_test.cpp +++ b/src/test/core/ClosureCounter_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/core/Config_test.cpp b/src/test/core/Config_test.cpp index 2bf398c9a95..8b0fce1e204 100644 --- a/src/test/core/Config_test.cpp +++ b/src/test/core/Config_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include @@ -29,7 +30,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/core/Coroutine_test.cpp b/src/test/core/Coroutine_test.cpp index 0fdc5a4f49a..8458da647d4 100644 --- a/src/test/core/Coroutine_test.cpp +++ b/src/test/core/Coroutine_test.cpp @@ -18,9 +18,10 @@ //============================================================================== #include + #include + #include -#include #include namespace ripple { diff --git a/src/test/core/CryptoPRNG_test.cpp b/src/test/core/CryptoPRNG_test.cpp index 303a2176315..21924e582c0 100644 --- a/src/test/core/CryptoPRNG_test.cpp +++ b/src/test/core/CryptoPRNG_test.cpp @@ -18,11 +18,9 @@ //============================================================================== #include + #include #include -#include -#include -#include namespace ripple { diff --git a/src/test/core/JobQueue_test.cpp b/src/test/core/JobQueue_test.cpp index 42338063db3..66f110be9c3 100644 --- a/src/test/core/JobQueue_test.cpp +++ b/src/test/core/JobQueue_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/core/SociDB_test.cpp b/src/test/core/SociDB_test.cpp index 82d0cbe9035..8f2a3c66465 100644 --- a/src/test/core/SociDB_test.cpp +++ b/src/test/core/SociDB_test.cpp @@ -18,10 +18,12 @@ //============================================================================== #include -#include + #include + #include #include + #include #include diff --git a/src/test/core/Workers_test.cpp b/src/test/core/Workers_test.cpp index 3fac4808f9f..e37f7a71f88 100644 --- a/src/test/core/Workers_test.cpp +++ b/src/test/core/Workers_test.cpp @@ -17,13 +17,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include #include #include + #include #include + #include -#include #include #include #include diff --git a/src/test/csf/BasicNetwork_test.cpp b/src/test/csf/BasicNetwork_test.cpp index 61660ae4c4e..4173db65022 100644 --- a/src/test/csf/BasicNetwork_test.cpp +++ b/src/test/csf/BasicNetwork_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include diff --git a/src/test/csf/CollectorRef.h b/src/test/csf/CollectorRef.h index 72d1e9545d8..309b48af1f0 100644 --- a/src/test/csf/CollectorRef.h +++ b/src/test/csf/CollectorRef.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_COLLECTOREF_H_INCLUDED #define RIPPLE_TEST_CSF_COLLECTOREF_H_INCLUDED diff --git a/src/test/csf/Digraph_test.cpp b/src/test/csf/Digraph_test.cpp index 80319445caf..0cc4be19762 100644 --- a/src/test/csf/Digraph_test.cpp +++ b/src/test/csf/Digraph_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/csf/Histogram.h b/src/test/csf/Histogram.h index 2df1844a21d..fb0f5323966 100644 --- a/src/test/csf/Histogram.h +++ b/src/test/csf/Histogram.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_HISTOGRAM_H_INCLUDED #define RIPPLE_TEST_CSF_HISTOGRAM_H_INCLUDED diff --git a/src/test/csf/Histogram_test.cpp b/src/test/csf/Histogram_test.cpp index ea8b864780a..40274c9046d 100644 --- a/src/test/csf/Histogram_test.cpp +++ b/src/test/csf/Histogram_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/csf/Peer.h b/src/test/csf/Peer.h index dceafb96482..678924112ed 100644 --- a/src/test/csf/Peer.h +++ b/src/test/csf/Peer.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PEER_H_INCLUDED #define RIPPLE_TEST_CSF_PEER_H_INCLUDED @@ -26,12 +27,16 @@ #include #include #include + #include #include + #include #include + #include #include + #include namespace ripple { diff --git a/src/test/csf/PeerGroup.h b/src/test/csf/PeerGroup.h index b59bfa6763c..0da1ef69c9c 100644 --- a/src/test/csf/PeerGroup.h +++ b/src/test/csf/PeerGroup.h @@ -16,11 +16,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PEERGROUP_H_INCLUDED #define RIPPLE_TEST_CSF_PEERGROUP_H_INCLUDED #include #include + #include #include diff --git a/src/test/csf/Proposal.h b/src/test/csf/Proposal.h index 1d70464bab5..eae258a251e 100644 --- a/src/test/csf/Proposal.h +++ b/src/test/csf/Proposal.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PROPOSAL_H_INCLUDED #define RIPPLE_TEST_CSF_PROPOSAL_H_INCLUDED #include #include #include + #include namespace ripple { @@ -36,4 +38,4 @@ using Proposal = ConsensusProposal; } // namespace test } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/src/test/csf/Scheduler_test.cpp b/src/test/csf/Scheduler_test.cpp index 931150bbeb2..1935e40236e 100644 --- a/src/test/csf/Scheduler_test.cpp +++ b/src/test/csf/Scheduler_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include diff --git a/src/test/csf/SimTime.h b/src/test/csf/SimTime.h index 930338108e1..32d657b6251 100644 --- a/src/test/csf/SimTime.h +++ b/src/test/csf/SimTime.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_CSF_SIMTIME_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/csf/TrustGraph.h b/src/test/csf/TrustGraph.h index 649f210646f..5770c792bc2 100644 --- a/src/test/csf/TrustGraph.h +++ b/src/test/csf/TrustGraph.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_CSF_UNL_H_INCLUDED #include + #include #include diff --git a/src/test/csf/Tx.h b/src/test/csf/Tx.h index f87f382167d..066aee22688 100644 --- a/src/test/csf/Tx.h +++ b/src/test/csf/Tx.h @@ -16,12 +16,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_TX_H_INCLUDED #define RIPPLE_TEST_CSF_TX_H_INCLUDED + #include #include + #include #include + #include #include #include @@ -48,7 +52,7 @@ class Tx { } - ID + ID const& id() const { return id_; diff --git a/src/test/csf/Validation.h b/src/test/csf/Validation.h index 57c2bc66681..e79222c84f3 100644 --- a/src/test/csf/Validation.h +++ b/src/test/csf/Validation.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED #define RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED #include + #include #include diff --git a/src/test/csf/collectors.h b/src/test/csf/collectors.h index 8dcaa035314..0494178ae9d 100644 --- a/src/test/csf/collectors.h +++ b/src/test/csf/collectors.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_COLLECTORS_H_INCLUDED #define RIPPLE_TEST_CSF_COLLECTORS_H_INCLUDED #include #include #include + #include #include diff --git a/src/test/csf/events.h b/src/test/csf/events.h index 37d1b4b0bd7..2209a10f60c 100644 --- a/src/test/csf/events.h +++ b/src/test/csf/events.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_EVENTS_H_INCLUDED #define RIPPLE_TEST_CSF_EVENTS_H_INCLUDED @@ -23,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/csf/impl/Sim.cpp b/src/test/csf/impl/Sim.cpp index 8f78ad92331..6cc950180cd 100644 --- a/src/test/csf/impl/Sim.cpp +++ b/src/test/csf/impl/Sim.cpp @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include namespace ripple { diff --git a/src/test/csf/impl/ledgers.cpp b/src/test/csf/impl/ledgers.cpp index 775ec2e58b1..74be491b39d 100644 --- a/src/test/csf/impl/ledgers.cpp +++ b/src/test/csf/impl/ledgers.cpp @@ -16,10 +16,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include -#include +#include namespace ripple { namespace test { diff --git a/src/test/csf/ledgers.h b/src/test/csf/ledgers.h index 1c8d4eb54c6..a02adb9c879 100644 --- a/src/test/csf/ledgers.h +++ b/src/test/csf/ledgers.h @@ -16,17 +16,22 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_LEDGERS_H_INCLUDED #define RIPPLE_TEST_CSF_LEDGERS_H_INCLUDED #include + #include + #include #include #include #include #include + #include + #include #include diff --git a/src/test/csf/submitters.h b/src/test/csf/submitters.h index 35752de89bd..2680c097121 100644 --- a/src/test/csf/submitters.h +++ b/src/test/csf/submitters.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_SUBMITTERS_H_INCLUDED #define RIPPLE_TEST_CSF_SUBMITTERS_H_INCLUDED @@ -23,7 +24,9 @@ #include #include #include + #include + namespace ripple { namespace test { namespace csf { diff --git a/src/test/csf/timers.h b/src/test/csf/timers.h index 7e5d88c6696..94b421e4b4d 100644 --- a/src/test/csf/timers.h +++ b/src/test/csf/timers.h @@ -16,11 +16,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_TIMERS_H_INCLUDED #define RIPPLE_TEST_CSF_TIMERS_H_INCLUDED #include #include + #include #include diff --git a/src/test/json/Object_test.cpp b/src/test/json/Object_test.cpp index 4a64d6538a3..94a9e96cf68 100644 --- a/src/test/json/Object_test.cpp +++ b/src/test/json/Object_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/json/Output_test.cpp b/src/test/json/Output_test.cpp index ddc5f08992b..2343843fe3d 100644 --- a/src/test/json/Output_test.cpp +++ b/src/test/json/Output_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/json/TestOutputSuite.h b/src/test/json/TestOutputSuite.h index a4f36dac4ee..44992df64bb 100644 --- a/src/test/json/TestOutputSuite.h +++ b/src/test/json/TestOutputSuite.h @@ -21,6 +21,7 @@ #define RIPPLE_RPC_TESTOUTPUTSUITE_H_INCLUDED #include + #include #include diff --git a/src/test/json/Writer_test.cpp b/src/test/json/Writer_test.cpp index 97d4297c926..c5305876ffb 100644 --- a/src/test/json/Writer_test.cpp +++ b/src/test/json/Writer_test.cpp @@ -18,9 +18,9 @@ //============================================================================== #include + #include #include -#include namespace Json { diff --git a/src/test/json/json_value_test.cpp b/src/test/json/json_value_test.cpp index dacc22cc014..0858786f047 100644 --- a/src/test/json/json_value_test.cpp +++ b/src/test/json/json_value_test.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include #include #include #include diff --git a/src/test/jtx.h b/src/test/jtx.h index f3c69ce33c3..6b73ca63eca 100644 --- a/src/test/jtx.h +++ b/src/test/jtx.h @@ -69,6 +69,7 @@ #include #include #include + #include #endif diff --git a/src/test/jtx/AMM.h b/src/test/jtx/AMM.h index 52039f74aea..71e2e5f34cb 100644 --- a/src/test/jtx/AMM.h +++ b/src/test/jtx/AMM.h @@ -25,7 +25,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/test/jtx/AMMTest.h b/src/test/jtx/AMMTest.h index 0481dc98a49..5ff2d21a192 100644 --- a/src/test/jtx/AMMTest.h +++ b/src/test/jtx/AMMTest.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED #define RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED #include #include #include + #include #include diff --git a/src/test/jtx/Account.h b/src/test/jtx/Account.h index f49070dff03..d91bb4a383e 100644 --- a/src/test/jtx/Account.h +++ b/src/test/jtx/Account.h @@ -24,6 +24,7 @@ #include #include #include + #include #include diff --git a/src/test/jtx/CaptureLogs.h b/src/test/jtx/CaptureLogs.h index ddb04cb3ff7..a8afb521c38 100644 --- a/src/test/jtx/CaptureLogs.h +++ b/src/test/jtx/CaptureLogs.h @@ -17,6 +17,9 @@ */ //============================================================================== +#ifndef RIPPLE_TEST_JTX_CAPTURELOGS_H_INCLUDED +#define RIPPLE_TEST_JTX_CAPTURELOGS_H_INCLUDED + #include namespace ripple { @@ -92,3 +95,5 @@ class CaptureLogs : public Logs } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/CheckMessageLogs.h b/src/test/jtx/CheckMessageLogs.h index e51b84b1c04..fd3915440e1 100644 --- a/src/test/jtx/CheckMessageLogs.h +++ b/src/test/jtx/CheckMessageLogs.h @@ -17,6 +17,9 @@ */ //============================================================================== +#ifndef RIPPLE_TEST_JTX_CHECKMESSAGELOGS_H_INCLUDED +#define RIPPLE_TEST_JTX_CHECKMESSAGELOGS_H_INCLUDED + #include namespace ripple { @@ -80,3 +83,5 @@ class CheckMessageLogs : public Logs } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/Env.h b/src/test/jtx/Env.h index 66845ae91dc..4e8bb64f59c 100644 --- a/src/test/jtx/Env.h +++ b/src/test/jtx/Env.h @@ -29,12 +29,14 @@ #include #include #include + #include #include #include #include #include #include + #include #include #include @@ -46,6 +48,7 @@ #include #include #include + #include #include #include diff --git a/src/test/jtx/Env_test.cpp b/src/test/jtx/Env_test.cpp index 691f96c2591..622efe297d0 100644 --- a/src/test/jtx/Env_test.cpp +++ b/src/test/jtx/Env_test.cpp @@ -18,16 +18,18 @@ //============================================================================== #include + #include #include + #include #include -#include #include #include #include #include + #include #include diff --git a/src/test/jtx/JSONRPCClient.h b/src/test/jtx/JSONRPCClient.h index bbffc726694..3765893eb7f 100644 --- a/src/test/jtx/JSONRPCClient.h +++ b/src/test/jtx/JSONRPCClient.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_HTTPCLIENT_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/test/jtx/JTx.h b/src/test/jtx/JTx.h index 81ba1b406a0..198839dd28b 100644 --- a/src/test/jtx/JTx.h +++ b/src/test/jtx/JTx.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/test/jtx/ManualTimeKeeper.h b/src/test/jtx/ManualTimeKeeper.h index 86477bf99f6..c9bf4d4763a 100644 --- a/src/test/jtx/ManualTimeKeeper.h +++ b/src/test/jtx/ManualTimeKeeper.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_MANUALTIMEKEEPER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/Oracle.h b/src/test/jtx/Oracle.h index 32ec0b2e859..9d2554c18f6 100644 --- a/src/test/jtx/Oracle.h +++ b/src/test/jtx/Oracle.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_ORACLE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/PathSet.h b/src/test/jtx/PathSet.h index 0f4c4ddd3dd..df9de540a12 100644 --- a/src/test/jtx/PathSet.h +++ b/src/test/jtx/PathSet.h @@ -21,6 +21,7 @@ #define RIPPLE_LEDGER_TESTS_PATHSET_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 262c6ebeb8f..16bb966317d 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED #define RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED #include + #include #include #include diff --git a/src/test/jtx/TestSuite.h b/src/test/jtx/TestSuite.h index 22b8fb7e53b..d54439d846d 100644 --- a/src/test/jtx/TestSuite.h +++ b/src/test/jtx/TestSuite.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_TESTSUITE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/TrustedPublisherServer.h b/src/test/jtx/TrustedPublisherServer.h index b786cae2846..61386734841 100644 --- a/src/test/jtx/TrustedPublisherServer.h +++ b/src/test/jtx/TrustedPublisherServer.h @@ -16,16 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_TRUSTED_PUBLISHER_SERVER_H_INCLUDED #define RIPPLE_TEST_TRUSTED_PUBLISHER_SERVER_H_INCLUDED #include + #include #include #include #include #include #include + #include #include #include diff --git a/src/test/jtx/WSClient.h b/src/test/jtx/WSClient.h index d0356dbcbf7..8a479f97c3f 100644 --- a/src/test/jtx/WSClient.h +++ b/src/test/jtx/WSClient.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_WSCLIENT_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/WSClient_test.cpp b/src/test/jtx/WSClient_test.cpp index 18dadb0bf9a..471e6ff31be 100644 --- a/src/test/jtx/WSClient_test.cpp +++ b/src/test/jtx/WSClient_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/amount.h b/src/test/jtx/amount.h index 9990c77c38c..589347b12c4 100644 --- a/src/test/jtx/amount.h +++ b/src/test/jtx/amount.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include #include #include diff --git a/src/test/jtx/credentials.h b/src/test/jtx/credentials.h index 2f5c63dccb8..9161b7241d0 100644 --- a/src/test/jtx/credentials.h +++ b/src/test/jtx/credentials.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TEST_JTX_CREDENTIALS_H_INCLUDED +#define RIPPLE_TEST_JTX_CREDENTIALS_H_INCLUDED #include #include @@ -97,8 +98,8 @@ Json::Value ledgerEntry(jtx::Env& env, std::string const& credIdx); } // namespace credentials - } // namespace jtx - } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/delivermin.h b/src/test/jtx/delivermin.h index 46e633dab20..f8b0da2c192 100644 --- a/src/test/jtx/delivermin.h +++ b/src/test/jtx/delivermin.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_DELIVERMIN_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/fee.h b/src/test/jtx/fee.h index 4e29fad1521..7d54804f87f 100644 --- a/src/test/jtx/fee.h +++ b/src/test/jtx/fee.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/test/jtx/flags.h b/src/test/jtx/flags.h index c8887cdee4b..b5e82078034 100644 --- a/src/test/jtx/flags.h +++ b/src/test/jtx/flags.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_FLAGS_H_INCLUDED #include + #include #include #include diff --git a/src/test/jtx/impl/AMM.cpp b/src/test/jtx/impl/AMM.cpp index 089d3508d70..3482e7e8671 100644 --- a/src/test/jtx/impl/AMM.cpp +++ b/src/test/jtx/impl/AMM.cpp @@ -18,10 +18,11 @@ //============================================================================== #include - #include + #include #include + #include #include #include diff --git a/src/test/jtx/impl/AMMTest.cpp b/src/test/jtx/impl/AMMTest.cpp index 575e2e1d889..8555be01a9b 100644 --- a/src/test/jtx/impl/AMMTest.cpp +++ b/src/test/jtx/impl/AMMTest.cpp @@ -17,13 +17,14 @@ */ //============================================================================== -#include - #include +#include #include #include + #include #include + #include #include diff --git a/src/test/jtx/impl/Account.cpp b/src/test/jtx/impl/Account.cpp index 9d41456ef75..b61048e66f2 100644 --- a/src/test/jtx/impl/Account.cpp +++ b/src/test/jtx/impl/Account.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/Env.cpp b/src/test/jtx/impl/Env.cpp index 43286ab7824..e006f268cf8 100644 --- a/src/test/jtx/impl/Env.cpp +++ b/src/test/jtx/impl/Env.cpp @@ -23,31 +23,27 @@ #include #include #include -#include #include #include #include #include + #include #include -#include -#include #include #include + #include #include #include #include -#include -#include #include -#include #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/JSONRPCClient.cpp b/src/test/jtx/impl/JSONRPCClient.cpp index 19c20b5babe..4db13c95fdf 100644 --- a/src/test/jtx/impl/JSONRPCClient.cpp +++ b/src/test/jtx/impl/JSONRPCClient.cpp @@ -16,17 +16,21 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/Oracle.cpp b/src/test/jtx/impl/Oracle.cpp index df9483cbaae..721a1c299db 100644 --- a/src/test/jtx/impl/Oracle.cpp +++ b/src/test/jtx/impl/Oracle.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include @@ -377,4 +377,4 @@ validDocumentID(AnyValue const& v) } // namespace oracle } // namespace jtx } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/jtx/impl/TestHelpers.cpp b/src/test/jtx/impl/TestHelpers.cpp index 3bf69729ab0..e5b136e9c08 100644 --- a/src/test/jtx/impl/TestHelpers.cpp +++ b/src/test/jtx/impl/TestHelpers.cpp @@ -18,9 +18,9 @@ //============================================================================== #include - #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/WSClient.cpp b/src/test/jtx/impl/WSClient.cpp index 03e2b2d6086..20cca3179ad 100644 --- a/src/test/jtx/impl/WSClient.cpp +++ b/src/test/jtx/impl/WSClient.cpp @@ -19,21 +19,19 @@ #include #include + #include #include #include #include + #include #include -#include +#include #include #include -#include - -#include - namespace ripple { namespace test { diff --git a/src/test/jtx/impl/acctdelete.cpp b/src/test/jtx/impl/acctdelete.cpp index d7f8f10e04d..842eea7fc2e 100644 --- a/src/test/jtx/impl/acctdelete.cpp +++ b/src/test/jtx/impl/acctdelete.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/amount.cpp b/src/test/jtx/impl/amount.cpp index 5be53dc0a95..9134122da91 100644 --- a/src/test/jtx/impl/amount.cpp +++ b/src/test/jtx/impl/amount.cpp @@ -19,8 +19,9 @@ #include #include + #include -#include + #include namespace ripple { diff --git a/src/test/jtx/impl/attester.cpp b/src/test/jtx/impl/attester.cpp index 66be9da83b3..91abfc459ba 100644 --- a/src/test/jtx/impl/attester.cpp +++ b/src/test/jtx/impl/attester.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include diff --git a/src/test/jtx/impl/check.cpp b/src/test/jtx/impl/check.cpp index 21af6c9cc3f..f5aa76658c3 100644 --- a/src/test/jtx/impl/check.cpp +++ b/src/test/jtx/impl/check.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/credentials.cpp b/src/test/jtx/impl/credentials.cpp index bc7ccf93cd4..f29bc45e208 100644 --- a/src/test/jtx/impl/credentials.cpp +++ b/src/test/jtx/impl/credentials.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/delivermin.cpp b/src/test/jtx/impl/delivermin.cpp index 6e4838c7c0a..fe9f4e8fe65 100644 --- a/src/test/jtx/impl/delivermin.cpp +++ b/src/test/jtx/impl/delivermin.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/deposit.cpp b/src/test/jtx/impl/deposit.cpp index d91607c9906..5f4ae6bdb39 100644 --- a/src/test/jtx/impl/deposit.cpp +++ b/src/test/jtx/impl/deposit.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/did.cpp b/src/test/jtx/impl/did.cpp index a9a6e974ef4..67a523403c9 100644 --- a/src/test/jtx/impl/did.cpp +++ b/src/test/jtx/impl/did.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index fd4949d5a44..b94c79ccb85 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -17,9 +17,9 @@ */ //============================================================================== +#include #include -#include #include namespace ripple { diff --git a/src/test/jtx/impl/fee.cpp b/src/test/jtx/impl/fee.cpp index e390136a3c0..71e3dd089a6 100644 --- a/src/test/jtx/impl/fee.cpp +++ b/src/test/jtx/impl/fee.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/flags.cpp b/src/test/jtx/impl/flags.cpp index 6658d3eba9b..a6ddfc1d717 100644 --- a/src/test/jtx/impl/flags.cpp +++ b/src/test/jtx/impl/flags.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/jtx_json.cpp b/src/test/jtx/impl/jtx_json.cpp index c9cf6636cf9..b76ad2ef0c6 100644 --- a/src/test/jtx/impl/jtx_json.cpp +++ b/src/test/jtx/impl/jtx_json.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/last_ledger_sequence.cpp b/src/test/jtx/impl/last_ledger_sequence.cpp index 57742bab2a1..4b4368429f9 100644 --- a/src/test/jtx/impl/last_ledger_sequence.cpp +++ b/src/test/jtx/impl/last_ledger_sequence.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/ledgerStateFix.cpp b/src/test/jtx/impl/ledgerStateFix.cpp index 2f121dc2671..8c780691913 100644 --- a/src/test/jtx/impl/ledgerStateFix.cpp +++ b/src/test/jtx/impl/ledgerStateFix.cpp @@ -20,6 +20,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/memo.cpp b/src/test/jtx/impl/memo.cpp index 6469748b4f9..1214ec2a2c9 100644 --- a/src/test/jtx/impl/memo.cpp +++ b/src/test/jtx/impl/memo.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/multisign.cpp b/src/test/jtx/impl/multisign.cpp index 42c3bfc78bf..a802528247e 100644 --- a/src/test/jtx/impl/multisign.cpp +++ b/src/test/jtx/impl/multisign.cpp @@ -19,13 +19,12 @@ #include #include + #include -#include #include -#include #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/offer.cpp b/src/test/jtx/impl/offer.cpp index 55a1af4beab..f48c0f2d21d 100644 --- a/src/test/jtx/impl/offer.cpp +++ b/src/test/jtx/impl/offer.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/paths.cpp b/src/test/jtx/impl/paths.cpp index 393e36e9d61..2a45909eb91 100644 --- a/src/test/jtx/impl/paths.cpp +++ b/src/test/jtx/impl/paths.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/jtx/impl/pay.cpp b/src/test/jtx/impl/pay.cpp index 2a627223fdd..82fe910e9b9 100644 --- a/src/test/jtx/impl/pay.cpp +++ b/src/test/jtx/impl/pay.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/permissioned_domains.cpp b/src/test/jtx/impl/permissioned_domains.cpp index 9cdf7c664f2..866ca3bb7e7 100644 --- a/src/test/jtx/impl/permissioned_domains.cpp +++ b/src/test/jtx/impl/permissioned_domains.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/quality2.cpp b/src/test/jtx/impl/quality2.cpp index dd10b3c6117..46f36cb6d63 100644 --- a/src/test/jtx/impl/quality2.cpp +++ b/src/test/jtx/impl/quality2.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/rate.cpp b/src/test/jtx/impl/rate.cpp index f95170537f3..0526cdc28fc 100644 --- a/src/test/jtx/impl/rate.cpp +++ b/src/test/jtx/impl/rate.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/regkey.cpp b/src/test/jtx/impl/regkey.cpp index 9fc260d2d03..cff2de3e8ed 100644 --- a/src/test/jtx/impl/regkey.cpp +++ b/src/test/jtx/impl/regkey.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/sendmax.cpp b/src/test/jtx/impl/sendmax.cpp index 9514b923166..168ce4659d9 100644 --- a/src/test/jtx/impl/sendmax.cpp +++ b/src/test/jtx/impl/sendmax.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/seq.cpp b/src/test/jtx/impl/seq.cpp index 3a3de002db6..82f0e98b4c9 100644 --- a/src/test/jtx/impl/seq.cpp +++ b/src/test/jtx/impl/seq.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/tag.cpp b/src/test/jtx/impl/tag.cpp index be456a1e0e8..9a8c491da23 100644 --- a/src/test/jtx/impl/tag.cpp +++ b/src/test/jtx/impl/tag.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/ticket.cpp b/src/test/jtx/impl/ticket.cpp index 69bcab4d9f1..ef1ffd416bc 100644 --- a/src/test/jtx/impl/ticket.cpp +++ b/src/test/jtx/impl/ticket.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/token.cpp b/src/test/jtx/impl/token.cpp index 49f473fcd82..bea974a016d 100644 --- a/src/test/jtx/impl/token.cpp +++ b/src/test/jtx/impl/token.cpp @@ -21,6 +21,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/trust.cpp b/src/test/jtx/impl/trust.cpp index dee4b282367..5e9eadca8de 100644 --- a/src/test/jtx/impl/trust.cpp +++ b/src/test/jtx/impl/trust.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/txflags.cpp b/src/test/jtx/impl/txflags.cpp index 7bc59876a99..77c46f35b38 100644 --- a/src/test/jtx/impl/txflags.cpp +++ b/src/test/jtx/impl/txflags.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/utility.cpp b/src/test/jtx/impl/utility.cpp index c10fb918540..afa7ee8f352 100644 --- a/src/test/jtx/impl/utility.cpp +++ b/src/test/jtx/impl/utility.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include @@ -27,7 +29,6 @@ #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/xchain_bridge.cpp b/src/test/jtx/impl/xchain_bridge.cpp index 43b0e7c2f96..c63734ee8f9 100644 --- a/src/test/jtx/impl/xchain_bridge.cpp +++ b/src/test/jtx/impl/xchain_bridge.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include - #include #include +#include + #include #include #include diff --git a/src/test/jtx/jtx_json.h b/src/test/jtx/jtx_json.h index 837d6524766..47f5a3c223c 100644 --- a/src/test/jtx/jtx_json.h +++ b/src/test/jtx/jtx_json.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_JSON_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/multisign.h b/src/test/jtx/multisign.h index 44cee17b7bf..6bcb1a671c1 100644 --- a/src/test/jtx/multisign.h +++ b/src/test/jtx/multisign.h @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/test/jtx/offer.h b/src/test/jtx/offer.h index 3951f4f934a..260b734ddd2 100644 --- a/src/test/jtx/offer.h +++ b/src/test/jtx/offer.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_OFFER_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/owners.h b/src/test/jtx/owners.h index 2299af2d7f3..fc904f9e870 100644 --- a/src/test/jtx/owners.h +++ b/src/test/jtx/owners.h @@ -21,9 +21,12 @@ #define RIPPLE_TEST_JTX_OWNERS_H_INCLUDED #include + #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/paths.h b/src/test/jtx/paths.h index cc9caf3af72..d1d5f5849af 100644 --- a/src/test/jtx/paths.h +++ b/src/test/jtx/paths.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_JTX_PATHS_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/test/jtx/pay.h b/src/test/jtx/pay.h index 6294b5b3082..f9d8822f533 100644 --- a/src/test/jtx/pay.h +++ b/src/test/jtx/pay.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/permissioned_domains.h b/src/test/jtx/permissioned_domains.h index 49b420d3d20..ee80c6a69f5 100644 --- a/src/test/jtx/permissioned_domains.h +++ b/src/test/jtx/permissioned_domains.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TEST_JTX_PERMISSIONED_DOMAINS_H_INCLUDED +#define RIPPLE_TEST_JTX_PERMISSIONED_DOMAINS_H_INCLUDED #include #include @@ -69,3 +70,5 @@ getNewDomain(std::shared_ptr const& meta); } // namespace jtx } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/prop.h b/src/test/jtx/prop.h index 8dc5f21917d..70498074d6d 100644 --- a/src/test/jtx/prop.h +++ b/src/test/jtx/prop.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_PROP_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/rate.h b/src/test/jtx/rate.h index 0f8186accfc..6fb8c9a8e9d 100644 --- a/src/test/jtx/rate.h +++ b/src/test/jtx/rate.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_RATE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/regkey.h b/src/test/jtx/regkey.h index 7d021e4f277..ce87c9b2598 100644 --- a/src/test/jtx/regkey.h +++ b/src/test/jtx/regkey.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/require.h b/src/test/jtx/require.h index 271419e51b9..bec21235a62 100644 --- a/src/test/jtx/require.h +++ b/src/test/jtx/require.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_REQUIRE_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/rpc.h b/src/test/jtx/rpc.h index f9962849698..be9ce22bf71 100644 --- a/src/test/jtx/rpc.h +++ b/src/test/jtx/rpc.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_RPC_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/sendmax.h b/src/test/jtx/sendmax.h index 495c61c33b8..54a1c25e2fb 100644 --- a/src/test/jtx/sendmax.h +++ b/src/test/jtx/sendmax.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_SENDMAX_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/ter.h b/src/test/jtx/ter.h index d75d9f09d06..ab37275badf 100644 --- a/src/test/jtx/ter.h +++ b/src/test/jtx/ter.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_TER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/trust.h b/src/test/jtx/trust.h index 0d02c6e76c4..5f0cebcbeff 100644 --- a/src/test/jtx/trust.h +++ b/src/test/jtx/trust.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_TRUST_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/utility.h b/src/test/jtx/utility.h index 6d34452cdf8..2c21fbd3ff9 100644 --- a/src/test/jtx/utility.h +++ b/src/test/jtx/utility.h @@ -21,10 +21,13 @@ #define RIPPLE_TEST_JTX_UTILITY_H_INCLUDED #include + #include #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/xchain_bridge.h b/src/test/jtx/xchain_bridge.h index 9968317c8de..8ff19bd508d 100644 --- a/src/test/jtx/xchain_bridge.h +++ b/src/test/jtx/xchain_bridge.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/test/ledger/BookDirs_test.cpp b/src/test/ledger/BookDirs_test.cpp index b50f4381f48..19a1b5d2725 100644 --- a/src/test/ledger/BookDirs_test.cpp +++ b/src/test/ledger/BookDirs_test.cpp @@ -16,7 +16,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/ledger/Directory_test.cpp b/src/test/ledger/Directory_test.cpp index bea394f2f36..825d7ff340f 100644 --- a/src/test/ledger/Directory_test.cpp +++ b/src/test/ledger/Directory_test.cpp @@ -16,12 +16,15 @@ //============================================================================== #include + #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/test/ledger/Invariants_test.cpp b/src/test/ledger/Invariants_test.cpp index ecf1c8e3979..18b037cbbe0 100644 --- a/src/test/ledger/Invariants_test.cpp +++ b/src/test/ledger/Invariants_test.cpp @@ -20,9 +20,10 @@ #include #include #include + #include #include -#include + #include #include #include diff --git a/src/test/ledger/PaymentSandbox_test.cpp b/src/test/ledger/PaymentSandbox_test.cpp index dd9b5c5d88b..303e700f404 100644 --- a/src/test/ledger/PaymentSandbox_test.cpp +++ b/src/test/ledger/PaymentSandbox_test.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include #include + #include #include diff --git a/src/test/ledger/PendingSaves_test.cpp b/src/test/ledger/PendingSaves_test.cpp index 1bd42a64a60..e2a43eb5852 100644 --- a/src/test/ledger/PendingSaves_test.cpp +++ b/src/test/ledger/PendingSaves_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/ledger/SkipList_test.cpp b/src/test/ledger/SkipList_test.cpp index 3e8987a806a..c2088d77cf7 100644 --- a/src/test/ledger/SkipList_test.cpp +++ b/src/test/ledger/SkipList_test.cpp @@ -17,10 +17,11 @@ */ //============================================================================== -#include +#include + #include #include -#include + #include namespace ripple { diff --git a/src/test/ledger/View_test.cpp b/src/test/ledger/View_test.cpp index fc9dce7de79..a9af8e2a403 100644 --- a/src/test/ledger/View_test.cpp +++ b/src/test/ledger/View_test.cpp @@ -18,14 +18,16 @@ //============================================================================== #include + #include #include #include #include #include #include + #include -#include + #include namespace ripple { diff --git a/src/test/nodestore/Backend_test.cpp b/src/test/nodestore/Backend_test.cpp index dc1fe8c7fe2..488370fbe97 100644 --- a/src/test/nodestore/Backend_test.cpp +++ b/src/test/nodestore/Backend_test.cpp @@ -19,10 +19,14 @@ #include #include + #include #include #include + +#include #include + #include namespace ripple { diff --git a/src/test/nodestore/Basics_test.cpp b/src/test/nodestore/Basics_test.cpp index aa423e7dc03..62a66c9dce0 100644 --- a/src/test/nodestore/Basics_test.cpp +++ b/src/test/nodestore/Basics_test.cpp @@ -18,8 +18,7 @@ //============================================================================== #include -#include -#include + #include #include diff --git a/src/test/nodestore/Database_test.cpp b/src/test/nodestore/Database_test.cpp index 59557f3c79f..bbf6381ee50 100644 --- a/src/test/nodestore/Database_test.cpp +++ b/src/test/nodestore/Database_test.cpp @@ -22,9 +22,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/test/nodestore/TestBase.h b/src/test/nodestore/TestBase.h index 98608c5fb11..634f2bf0051 100644 --- a/src/test/nodestore/TestBase.h +++ b/src/test/nodestore/TestBase.h @@ -23,12 +23,15 @@ #include #include #include + #include #include #include #include #include + #include + #include namespace ripple { diff --git a/src/test/nodestore/Timing_test.cpp b/src/test/nodestore/Timing_test.cpp index 73789c02449..3df18eee66a 100644 --- a/src/test/nodestore/Timing_test.cpp +++ b/src/test/nodestore/Timing_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include #include @@ -29,16 +30,16 @@ #include #include #include + #include + #include #include #include #include -#include #include #include #include -#include #include #include diff --git a/src/test/nodestore/import_test.cpp b/src/test/nodestore/import_test.cpp index e13fe9c0c8d..d7865a20fc0 100644 --- a/src/test/nodestore/import_test.cpp +++ b/src/test/nodestore/import_test.cpp @@ -18,24 +18,27 @@ //============================================================================== #include +#include + #include #include #include #include #include + #include #include + +#include +#include +#include + #include #include #include #include -#include -#include -#include #include -#include - /* Math: diff --git a/src/test/nodestore/varint_test.cpp b/src/test/nodestore/varint_test.cpp index da7ae9d2858..4f6d3c141cc 100644 --- a/src/test/nodestore/varint_test.cpp +++ b/src/test/nodestore/varint_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/overlay/ProtocolVersion_test.cpp b/src/test/overlay/ProtocolVersion_test.cpp index dfc0ee70b8e..da976f89011 100644 --- a/src/test/overlay/ProtocolVersion_test.cpp +++ b/src/test/overlay/ProtocolVersion_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/overlay/cluster_test.cpp b/src/test/overlay/cluster_test.cpp index d22674d28c6..76bbc9d4e32 100644 --- a/src/test/overlay/cluster_test.cpp +++ b/src/test/overlay/cluster_test.cpp @@ -19,8 +19,9 @@ #include #include + #include -#include + #include #include diff --git a/src/test/overlay/compression_test.cpp b/src/test/overlay/compression_test.cpp index 19669efc23f..76c38fd59b2 100644 --- a/src/test/overlay/compression_test.cpp +++ b/src/test/overlay/compression_test.cpp @@ -22,15 +22,16 @@ #include #include #include + #include #include -#include #include #include #include #include #include #include + #include #include #include @@ -41,9 +42,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/test/overlay/handshake_test.cpp b/src/test/overlay/handshake_test.cpp index 93038e522a4..2d5155aaee6 100644 --- a/src/test/overlay/handshake_test.cpp +++ b/src/test/overlay/handshake_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { @@ -61,4 +62,4 @@ class handshake_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(handshake, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/overlay/reduce_relay_test.cpp b/src/test/overlay/reduce_relay_test.cpp index e0edae54897..9fc105262b4 100644 --- a/src/test/overlay/reduce_relay_test.cpp +++ b/src/test/overlay/reduce_relay_test.cpp @@ -16,11 +16,15 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include #include +#include #include + #include #include #include diff --git a/src/test/overlay/short_read_test.cpp b/src/test/overlay/short_read_test.cpp index 0efc49b84e3..739d7ea954d 100644 --- a/src/test/overlay/short_read_test.cpp +++ b/src/test/overlay/short_read_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include @@ -26,9 +27,7 @@ #include #include -#include #include -#include #include #include #include diff --git a/src/test/overlay/tx_reduce_relay_test.cpp b/src/test/overlay/tx_reduce_relay_test.cpp index 3d6c2a4d1ef..07ff2bb14ad 100644 --- a/src/test/overlay/tx_reduce_relay_test.cpp +++ b/src/test/overlay/tx_reduce_relay_test.cpp @@ -16,11 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include #include + #include #include @@ -283,4 +286,4 @@ class tx_reduce_relay_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(tx_reduce_relay, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/peerfinder/Livecache_test.cpp b/src/test/peerfinder/Livecache_test.cpp index 7fb9f02f42a..a150f02f05d 100644 --- a/src/test/peerfinder/Livecache_test.cpp +++ b/src/test/peerfinder/Livecache_test.cpp @@ -19,11 +19,13 @@ #include #include + #include + #include -#include #include #include + #include namespace ripple { diff --git a/src/test/peerfinder/PeerFinder_test.cpp b/src/test/peerfinder/PeerFinder_test.cpp index a1cb8d7408d..9006b8c1c7f 100644 --- a/src/test/peerfinder/PeerFinder_test.cpp +++ b/src/test/peerfinder/PeerFinder_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include -#include + #include -#include #include #include #include diff --git a/src/test/protocol/ApiVersion_test.cpp b/src/test/protocol/ApiVersion_test.cpp index 7d634dc569d..2dc4f4d6bb0 100644 --- a/src/test/protocol/ApiVersion_test.cpp +++ b/src/test/protocol/ApiVersion_test.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include diff --git a/src/test/protocol/Hooks_test.cpp b/src/test/protocol/Hooks_test.cpp index fb61d10a739..0637b52efab 100644 --- a/src/test/protocol/Hooks_test.cpp +++ b/src/test/protocol/Hooks_test.cpp @@ -18,8 +18,9 @@ //============================================================================== #include + #include -#include + #include #include diff --git a/src/test/protocol/InnerObjectFormats_test.cpp b/src/test/protocol/InnerObjectFormats_test.cpp index cfc8d123c22..f4d9722392c 100644 --- a/src/test/protocol/InnerObjectFormats_test.cpp +++ b/src/test/protocol/InnerObjectFormats_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include -#include // Json::Reader -#include // RPC::containsError -#include +#include // Json::Reader +#include // RPC::containsError #include // STParsedJSONObject namespace ripple { diff --git a/src/test/protocol/Issue_test.cpp b/src/test/protocol/Issue_test.cpp index 7ec1507e04b..53ebf5be245 100644 --- a/src/test/protocol/Issue_test.cpp +++ b/src/test/protocol/Issue_test.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/test/protocol/Memo_test.cpp b/src/test/protocol/Memo_test.cpp index bd63e7003ad..a7fa846a4d2 100644 --- a/src/test/protocol/Memo_test.cpp +++ b/src/test/protocol/Memo_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/test/protocol/PublicKey_test.cpp b/src/test/protocol/PublicKey_test.cpp index 7fa798d1483..0f5aef261af 100644 --- a/src/test/protocol/PublicKey_test.cpp +++ b/src/test/protocol/PublicKey_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/protocol/Quality_test.cpp b/src/test/protocol/Quality_test.cpp index 64cf0c71b3a..aa9918a0642 100644 --- a/src/test/protocol/Quality_test.cpp +++ b/src/test/protocol/Quality_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/protocol/STAmount_test.cpp b/src/test/protocol/STAmount_test.cpp index b512c42a643..1836fa85951 100644 --- a/src/test/protocol/STAmount_test.cpp +++ b/src/test/protocol/STAmount_test.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include diff --git a/src/test/protocol/STIssue_test.cpp b/src/test/protocol/STIssue_test.cpp index 4c9eeb0ba1b..6e8d37331b1 100644 --- a/src/test/protocol/STIssue_test.cpp +++ b/src/test/protocol/STIssue_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include @@ -161,4 +162,4 @@ class STIssue_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(STIssue, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/protocol/STObject_test.cpp b/src/test/protocol/STObject_test.cpp index 071a5f4f63c..e02cfeeea40 100644 --- a/src/test/protocol/STObject_test.cpp +++ b/src/test/protocol/STObject_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/protocol/STTx_test.cpp b/src/test/protocol/STTx_test.cpp index 54037eaa5ba..f48bea11aa0 100644 --- a/src/test/protocol/STTx_test.cpp +++ b/src/test/protocol/STTx_test.cpp @@ -26,9 +26,8 @@ #include #include #include -#include #include -#include + #include namespace ripple { diff --git a/src/test/protocol/STValidation_test.cpp b/src/test/protocol/STValidation_test.cpp index 8efb5847488..784fc43c24a 100644 --- a/src/test/protocol/STValidation_test.cpp +++ b/src/test/protocol/STValidation_test.cpp @@ -18,14 +18,10 @@ //============================================================================== #include -#include + #include #include #include -#include -#include -#include -#include #include #include diff --git a/src/test/protocol/SecretKey_test.cpp b/src/test/protocol/SecretKey_test.cpp index bce89bce734..248be5a0da0 100644 --- a/src/test/protocol/SecretKey_test.cpp +++ b/src/test/protocol/SecretKey_test.cpp @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/test/protocol/Seed_test.cpp b/src/test/protocol/Seed_test.cpp index 3619e84541e..0b89eb22a76 100644 --- a/src/test/protocol/Seed_test.cpp +++ b/src/test/protocol/Seed_test.cpp @@ -20,10 +20,10 @@ #include #include #include -#include #include #include #include + #include namespace ripple { diff --git a/src/test/protocol/SeqProxy_test.cpp b/src/test/protocol/SeqProxy_test.cpp index 5e44bca5b40..7a660c10d23 100644 --- a/src/test/protocol/SeqProxy_test.cpp +++ b/src/test/protocol/SeqProxy_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/resource/Logic_test.cpp b/src/test/resource/Logic_test.cpp index b445890c326..49326e7dc5b 100644 --- a/src/test/resource/Logic_test.cpp +++ b/src/test/resource/Logic_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include @@ -26,6 +27,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/rpc/AMMInfo_test.cpp b/src/test/rpc/AMMInfo_test.cpp index c1e059a3ead..a0985ea1044 100644 --- a/src/test/rpc/AMMInfo_test.cpp +++ b/src/test/rpc/AMMInfo_test.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include diff --git a/src/test/rpc/AccountCurrencies_test.cpp b/src/test/rpc/AccountCurrencies_test.cpp index 7d16ca48a93..3ccb89c471f 100644 --- a/src/test/rpc/AccountCurrencies_test.cpp +++ b/src/test/rpc/AccountCurrencies_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/AccountInfo_test.cpp b/src/test/rpc/AccountInfo_test.cpp index cb9712aef56..238b7396118 100644 --- a/src/test/rpc/AccountInfo_test.cpp +++ b/src/test/rpc/AccountInfo_test.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include -#include - #include #include -#include -#include -#include + +#include +#include namespace ripple { namespace test { diff --git a/src/test/rpc/AccountLines_test.cpp b/src/test/rpc/AccountLines_test.cpp index bae00d7a769..6e6f0def199 100644 --- a/src/test/rpc/AccountLines_test.cpp +++ b/src/test/rpc/AccountLines_test.cpp @@ -18,13 +18,13 @@ //============================================================================== #include + #include #include #include #include namespace ripple { - namespace RPC { class AccountLines_test : public beast::unit_test::suite @@ -250,6 +250,10 @@ class AccountLines_test : public beast::unit_test::suite gw1.human() + R"("})"); BEAST_EXPECT(lines[jss::result][jss::lines].isArray()); BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26); + + // Check no ripple is not set for trustlines between alice and gw1 + auto const& line = lines[jss::result][jss::lines][0u]; + BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple)); } { // Use a malformed peer. diff --git a/src/test/rpc/AccountObjects_test.cpp b/src/test/rpc/AccountObjects_test.cpp index 232a091114c..b723095aeb5 100644 --- a/src/test/rpc/AccountObjects_test.cpp +++ b/src/test/rpc/AccountObjects_test.cpp @@ -20,7 +20,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/test/rpc/AccountOffers_test.cpp b/src/test/rpc/AccountOffers_test.cpp index da6acc97e98..2aa85ac9b99 100644 --- a/src/test/rpc/AccountOffers_test.cpp +++ b/src/test/rpc/AccountOffers_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/AccountSet_test.cpp b/src/test/rpc/AccountSet_test.cpp index 3c6cad00e28..7bca51ae96f 100644 --- a/src/test/rpc/AccountSet_test.cpp +++ b/src/test/rpc/AccountSet_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include #include diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index f6a9225ec48..f10b5b83870 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/rpc/AmendmentBlocked_test.cpp b/src/test/rpc/AmendmentBlocked_test.cpp index 196ce0e463d..bea9cdf57d1 100644 --- a/src/test/rpc/AmendmentBlocked_test.cpp +++ b/src/test/rpc/AmendmentBlocked_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/test/rpc/Book_test.cpp b/src/test/rpc/Book_test.cpp index 6bcc0c20809..79e3f940f82 100644 --- a/src/test/rpc/Book_test.cpp +++ b/src/test/rpc/Book_test.cpp @@ -17,7 +17,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/Connect_test.cpp b/src/test/rpc/Connect_test.cpp index 8f3fe26adbf..cc021ba08fb 100644 --- a/src/test/rpc/Connect_test.cpp +++ b/src/test/rpc/Connect_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/DeliveredAmount_test.cpp b/src/test/rpc/DeliveredAmount_test.cpp index 9ed858e2a33..9a63f248423 100644 --- a/src/test/rpc/DeliveredAmount_test.cpp +++ b/src/test/rpc/DeliveredAmount_test.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include #include namespace ripple { diff --git a/src/test/rpc/DepositAuthorized_test.cpp b/src/test/rpc/DepositAuthorized_test.cpp index 46637d421e1..2ccad9d7799 100644 --- a/src/test/rpc/DepositAuthorized_test.cpp +++ b/src/test/rpc/DepositAuthorized_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/Feature_test.cpp b/src/test/rpc/Feature_test.cpp index 12d4b27745c..bc789f9a748 100644 --- a/src/test/rpc/Feature_test.cpp +++ b/src/test/rpc/Feature_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/GRPCTestClientBase.h b/src/test/rpc/GRPCTestClientBase.h index f8b74ed6d5c..06531ef5522 100644 --- a/src/test/rpc/GRPCTestClientBase.h +++ b/src/test/rpc/GRPCTestClientBase.h @@ -21,7 +21,9 @@ #define RIPPLED_GRPCTESTCLIENTBASE_H #include + #include + #include namespace ripple { diff --git a/src/test/rpc/GatewayBalances_test.cpp b/src/test/rpc/GatewayBalances_test.cpp index 4e847c8dbdd..730d58bcca1 100644 --- a/src/test/rpc/GatewayBalances_test.cpp +++ b/src/test/rpc/GatewayBalances_test.cpp @@ -17,7 +17,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/GetAggregatePrice_test.cpp b/src/test/rpc/GetAggregatePrice_test.cpp index aad3c9be99f..1e09219f57f 100644 --- a/src/test/rpc/GetAggregatePrice_test.cpp +++ b/src/test/rpc/GetAggregatePrice_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/test/rpc/GetCounts_test.cpp b/src/test/rpc/GetCounts_test.cpp index 132ed93d7be..d0b3404781c 100644 --- a/src/test/rpc/GetCounts_test.cpp +++ b/src/test/rpc/GetCounts_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/rpc/Handler_test.cpp b/src/test/rpc/Handler_test.cpp index 2c3bfd30d4c..4883cf664f7 100644 --- a/src/test/rpc/Handler_test.cpp +++ b/src/test/rpc/Handler_test.cpp @@ -18,13 +18,14 @@ //============================================================================== #include + #include + #include #include #include #include -#include #include namespace ripple::test { diff --git a/src/test/rpc/JSONRPC_test.cpp b/src/test/rpc/JSONRPC_test.cpp index 6e97301fc3e..03f206707b2 100644 --- a/src/test/rpc/JSONRPC_test.cpp +++ b/src/test/rpc/JSONRPC_test.cpp @@ -19,15 +19,16 @@ #include #include + #include #include #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/test/rpc/KeyGeneration_test.cpp b/src/test/rpc/KeyGeneration_test.cpp index e136bb04beb..07ebd93dd36 100644 --- a/src/test/rpc/KeyGeneration_test.cpp +++ b/src/test/rpc/KeyGeneration_test.cpp @@ -16,9 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include + #include #include #include diff --git a/src/test/rpc/LedgerClosed_test.cpp b/src/test/rpc/LedgerClosed_test.cpp index c3f7f900e3c..b0a2216b1f3 100644 --- a/src/test/rpc/LedgerClosed_test.cpp +++ b/src/test/rpc/LedgerClosed_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/LedgerData_test.cpp b/src/test/rpc/LedgerData_test.cpp index 1e4f97a935f..b56cb241dd0 100644 --- a/src/test/rpc/LedgerData_test.cpp +++ b/src/test/rpc/LedgerData_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/LedgerHeader_test.cpp b/src/test/rpc/LedgerHeader_test.cpp index d8fe738b888..a80f706b6f0 100644 --- a/src/test/rpc/LedgerHeader_test.cpp +++ b/src/test/rpc/LedgerHeader_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/rpc/LedgerRPC_test.cpp b/src/test/rpc/LedgerRPC_test.cpp index ebc6297fe41..d4fd2fd3920 100644 --- a/src/test/rpc/LedgerRPC_test.cpp +++ b/src/test/rpc/LedgerRPC_test.cpp @@ -22,14 +22,13 @@ #include #include #include -#include + #include -#include + #include #include #include #include -#include #include namespace ripple { @@ -3190,7 +3189,18 @@ class LedgerRPC_test : public beast::unit_test::suite params[jss::permissioned_domain][jss::account] = 1; params[jss::permissioned_domain][jss::seq] = seq; auto const jrr = env.rpc("json", "ledger_entry", to_string(params)); - checkErrorValue(jrr[jss::result], "malformedRequest", ""); + checkErrorValue(jrr[jss::result], "malformedAddress", ""); + } + + { + // Fail, account is an object + Json::Value params; + params[jss::ledger_index] = jss::validated; + params[jss::permissioned_domain][jss::account] = + Json::Value{Json::ValueType::objectValue}; + params[jss::permissioned_domain][jss::seq] = seq; + auto const jrr = env.rpc("json", "ledger_entry", to_string(params)); + checkErrorValue(jrr[jss::result], "malformedAddress", ""); } { diff --git a/src/test/rpc/LedgerRequestRPC_test.cpp b/src/test/rpc/LedgerRequestRPC_test.cpp index 61905c99c18..221f639819e 100644 --- a/src/test/rpc/LedgerRequestRPC_test.cpp +++ b/src/test/rpc/LedgerRequestRPC_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/rpc/ManifestRPC_test.cpp b/src/test/rpc/ManifestRPC_test.cpp index fcf47a5745d..d040ed56325 100644 --- a/src/test/rpc/ManifestRPC_test.cpp +++ b/src/test/rpc/ManifestRPC_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/NoRippleCheck_test.cpp b/src/test/rpc/NoRippleCheck_test.cpp index 4551365029f..6cd566e144a 100644 --- a/src/test/rpc/NoRippleCheck_test.cpp +++ b/src/test/rpc/NoRippleCheck_test.cpp @@ -19,14 +19,16 @@ #include #include + #include #include + #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/test/rpc/NoRipple_test.cpp b/src/test/rpc/NoRipple_test.cpp index aa5e6e1efef..5c41f25128d 100644 --- a/src/test/rpc/NoRipple_test.cpp +++ b/src/test/rpc/NoRipple_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/OwnerInfo_test.cpp b/src/test/rpc/OwnerInfo_test.cpp index 606f2274b88..8d9f9c401f0 100644 --- a/src/test/rpc/OwnerInfo_test.cpp +++ b/src/test/rpc/OwnerInfo_test.cpp @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include diff --git a/src/test/rpc/Peers_test.cpp b/src/test/rpc/Peers_test.cpp index ab9b17b2593..d325da12c32 100644 --- a/src/test/rpc/Peers_test.cpp +++ b/src/test/rpc/Peers_test.cpp @@ -19,9 +19,12 @@ #include #include + #include #include + #include + #include namespace ripple { diff --git a/src/test/rpc/RPCCall_test.cpp b/src/test/rpc/RPCCall_test.cpp index b812740fb3f..8438ef533de 100644 --- a/src/test/rpc/RPCCall_test.cpp +++ b/src/test/rpc/RPCCall_test.cpp @@ -17,8 +17,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/RPCHelpers_test.cpp b/src/test/rpc/RPCHelpers_test.cpp index 11a0ef787d1..531649b8afe 100644 --- a/src/test/rpc/RPCHelpers_test.cpp +++ b/src/test/rpc/RPCHelpers_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/RPCOverload_test.cpp b/src/test/rpc/RPCOverload_test.cpp index c3328fb0b28..efe69496fbf 100644 --- a/src/test/rpc/RPCOverload_test.cpp +++ b/src/test/rpc/RPCOverload_test.cpp @@ -18,7 +18,9 @@ #include #include #include + #include + #include #include diff --git a/src/test/rpc/RobustTransaction_test.cpp b/src/test/rpc/RobustTransaction_test.cpp index b0506224f79..ccef6e297e2 100644 --- a/src/test/rpc/RobustTransaction_test.cpp +++ b/src/test/rpc/RobustTransaction_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include diff --git a/src/test/rpc/Roles_test.cpp b/src/test/rpc/Roles_test.cpp index 8cef5dcbc61..5ac86543304 100644 --- a/src/test/rpc/Roles_test.cpp +++ b/src/test/rpc/Roles_test.cpp @@ -19,11 +19,8 @@ #include #include -#include -#include -#include -#include +#include #include #include diff --git a/src/test/rpc/ServerInfo_test.cpp b/src/test/rpc/ServerInfo_test.cpp index 5e202f275ae..21312ef8fff 100644 --- a/src/test/rpc/ServerInfo_test.cpp +++ b/src/test/rpc/ServerInfo_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include diff --git a/src/test/rpc/Simulate_test.cpp b/src/test/rpc/Simulate_test.cpp index 656e5f0577e..089c444e116 100644 --- a/src/test/rpc/Simulate_test.cpp +++ b/src/test/rpc/Simulate_test.cpp @@ -20,8 +20,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/Status_test.cpp b/src/test/rpc/Status_test.cpp index c68131e8131..e37fe2dabde 100644 --- a/src/test/rpc/Status_test.cpp +++ b/src/test/rpc/Status_test.cpp @@ -18,9 +18,9 @@ //============================================================================== #include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 662442676f0..1546f2c8597 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -18,14 +18,17 @@ #include #include #include + #include #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/test/rpc/TransactionEntry_test.cpp b/src/test/rpc/TransactionEntry_test.cpp index 09423ed25d5..bafb01f5ffc 100644 --- a/src/test/rpc/TransactionEntry_test.cpp +++ b/src/test/rpc/TransactionEntry_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/TransactionHistory_test.cpp b/src/test/rpc/TransactionHistory_test.cpp index 63151bdaeb6..d5b1b27a358 100644 --- a/src/test/rpc/TransactionHistory_test.cpp +++ b/src/test/rpc/TransactionHistory_test.cpp @@ -20,8 +20,11 @@ #include #include #include + #include + #include + #include namespace ripple { diff --git a/src/test/rpc/Transaction_test.cpp b/src/test/rpc/Transaction_test.cpp index 2bd20eb3707..6aef32dbf30 100644 --- a/src/test/rpc/Transaction_test.cpp +++ b/src/test/rpc/Transaction_test.cpp @@ -20,8 +20,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/ValidatorInfo_test.cpp b/src/test/rpc/ValidatorInfo_test.cpp index 5ca1af7a3c3..4904923e0b4 100644 --- a/src/test/rpc/ValidatorInfo_test.cpp +++ b/src/test/rpc/ValidatorInfo_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/ValidatorRPC_test.cpp b/src/test/rpc/ValidatorRPC_test.cpp index b53b8d1f82f..d03cbbf8410 100644 --- a/src/test/rpc/ValidatorRPC_test.cpp +++ b/src/test/rpc/ValidatorRPC_test.cpp @@ -19,13 +19,13 @@ #include #include + #include #include #include -#include + #include #include -#include #include #include diff --git a/src/test/rpc/Version_test.cpp b/src/test/rpc/Version_test.cpp index b66e502b9f3..c0bc5d450b0 100644 --- a/src/test/rpc/Version_test.cpp +++ b/src/test/rpc/Version_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/server/ServerStatus_test.cpp b/src/test/server/ServerStatus_test.cpp index f15085d6efa..bcd355e301d 100644 --- a/src/test/server/ServerStatus_test.cpp +++ b/src/test/server/ServerStatus_test.cpp @@ -21,18 +21,22 @@ #include #include #include + #include #include #include #include + #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/test/server/Server_test.cpp b/src/test/server/Server_test.cpp index c17c752ff12..f8895ae7e9b 100644 --- a/src/test/server/Server_test.cpp +++ b/src/test/server/Server_test.cpp @@ -17,18 +17,19 @@ */ //============================================================================== +#include +#include +#include +#include + #include + #include #include #include #include #include -#include -#include -#include -#include - #include #include #include diff --git a/src/test/shamap/FetchPack_test.cpp b/src/test/shamap/FetchPack_test.cpp index ac2d16ecc99..04385f94418 100644 --- a/src/test/shamap/FetchPack_test.cpp +++ b/src/test/shamap/FetchPack_test.cpp @@ -19,15 +19,17 @@ #include #include + #include #include -#include + #include #include #include #include #include #include + #include #include diff --git a/src/test/shamap/SHAMapSync_test.cpp b/src/test/shamap/SHAMapSync_test.cpp index 627e97e152c..c3af07f0369 100644 --- a/src/test/shamap/SHAMapSync_test.cpp +++ b/src/test/shamap/SHAMapSync_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include #include diff --git a/src/test/shamap/SHAMap_test.cpp b/src/test/shamap/SHAMap_test.cpp index c8c877935f5..3197e0944d3 100644 --- a/src/test/shamap/SHAMap_test.cpp +++ b/src/test/shamap/SHAMap_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/shamap/common.h b/src/test/shamap/common.h index db5a2c40acf..47308a82f84 100644 --- a/src/test/shamap/common.h +++ b/src/test/shamap/common.h @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/unit_test/FileDirGuard.h b/src/test/unit_test/FileDirGuard.h index 246ac262378..d247ae30157 100644 --- a/src/test/unit_test/FileDirGuard.h +++ b/src/test/unit_test/FileDirGuard.h @@ -21,7 +21,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define TEST_UNIT_TEST_DIRGUARD_H #include + #include + #include namespace ripple { diff --git a/src/test/unit_test/multi_runner.h b/src/test/unit_test/multi_runner.h index a4435dd1af7..653bbead066 100644 --- a/src/test/unit_test/multi_runner.h +++ b/src/test/unit_test/multi_runner.h @@ -22,8 +22,8 @@ #include #include -#include +#include #include #include #include diff --git a/src/xrpld/app/consensus/RCLCensorshipDetector.h b/src/xrpld/app/consensus/RCLCensorshipDetector.h index 12a768ca4c8..7cdf15949d4 100644 --- a/src/xrpld/app/consensus/RCLCensorshipDetector.h +++ b/src/xrpld/app/consensus/RCLCensorshipDetector.h @@ -21,7 +21,9 @@ #define RIPPLE_APP_CONSENSUS_RCLCENSORSHIPDETECTOR_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLConsensus.cpp b/src/xrpld/app/consensus/RCLConsensus.cpp index fe368a69a67..0a5cee41212 100644 --- a/src/xrpld/app/consensus/RCLConsensus.cpp +++ b/src/xrpld/app/consensus/RCLConsensus.cpp @@ -37,6 +37,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLConsensus.h b/src/xrpld/app/consensus/RCLConsensus.h index 6519b90e4cb..735c67fd01e 100644 --- a/src/xrpld/app/consensus/RCLConsensus.h +++ b/src/xrpld/app/consensus/RCLConsensus.h @@ -28,13 +28,11 @@ #include #include #include -#include #include -#include -#include + #include #include -#include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLCxLedger.h b/src/xrpld/app/consensus/RCLCxLedger.h index ed7ad9faeb7..cd14c30a94d 100644 --- a/src/xrpld/app/consensus/RCLCxLedger.h +++ b/src/xrpld/app/consensus/RCLCxLedger.h @@ -23,8 +23,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.cpp b/src/xrpld/app/consensus/RCLCxPeerPos.cpp index 37f61a8c2d5..83847b2e9ee 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.cpp +++ b/src/xrpld/app/consensus/RCLCxPeerPos.cpp @@ -18,10 +18,8 @@ //============================================================================== #include -#include -#include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.h b/src/xrpld/app/consensus/RCLCxPeerPos.h index b5d3d152cb2..63cfde87000 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.h +++ b/src/xrpld/app/consensus/RCLCxPeerPos.h @@ -21,15 +21,15 @@ #define RIPPLE_APP_CONSENSUS_RCLCXPEERPOS_H_INCLUDED #include -#include + #include #include #include #include #include -#include + #include -#include + #include #include diff --git a/src/xrpld/app/consensus/RCLCxTx.h b/src/xrpld/app/consensus/RCLCxTx.h index bbf3797887c..baa0899f020 100644 --- a/src/xrpld/app/consensus/RCLCxTx.h +++ b/src/xrpld/app/consensus/RCLCxTx.h @@ -20,10 +20,7 @@ #ifndef RIPPLE_APP_CONSENSUS_RCLCXTX_H_INCLUDED #define RIPPLE_APP_CONSENSUS_RCLCXTX_H_INCLUDED -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLValidations.cpp b/src/xrpld/app/consensus/RCLValidations.cpp index c4d9389e896..a04047c78a1 100644 --- a/src/xrpld/app/consensus/RCLValidations.cpp +++ b/src/xrpld/app/consensus/RCLValidations.cpp @@ -22,18 +22,15 @@ #include #include #include -#include #include -#include #include #include #include + #include -#include #include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLValidations.h b/src/xrpld/app/consensus/RCLValidations.h index 7b1559fba43..a9f872bee9d 100644 --- a/src/xrpld/app/consensus/RCLValidations.h +++ b/src/xrpld/app/consensus/RCLValidations.h @@ -22,11 +22,12 @@ #include #include + #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/AbstractFetchPackContainer.h b/src/xrpld/app/ledger/AbstractFetchPackContainer.h index 2b27471c64a..a93169800ef 100644 --- a/src/xrpld/app/ledger/AbstractFetchPackContainer.h +++ b/src/xrpld/app/ledger/AbstractFetchPackContainer.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedger.cpp b/src/xrpld/app/ledger/AcceptedLedger.cpp index a82323f6286..21efc4983f9 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.cpp +++ b/src/xrpld/app/ledger/AcceptedLedger.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedger.h b/src/xrpld/app/ledger/AcceptedLedger.h index 65a782aef70..6b17d93c9d1 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.h +++ b/src/xrpld/app/ledger/AcceptedLedger.h @@ -21,7 +21,6 @@ #define RIPPLE_APP_LEDGER_ACCEPTEDLEDGER_H_INCLUDED #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedgerTx.cpp b/src/xrpld/app/ledger/AcceptedLedgerTx.cpp index 6bdb602fd83..7944578f77e 100644 --- a/src/xrpld/app/ledger/AcceptedLedgerTx.cpp +++ b/src/xrpld/app/ledger/AcceptedLedgerTx.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/ledger/AcceptedLedgerTx.h b/src/xrpld/app/ledger/AcceptedLedgerTx.h index 725057aa02c..efa16371a79 100644 --- a/src/xrpld/app/ledger/AcceptedLedgerTx.h +++ b/src/xrpld/app/ledger/AcceptedLedgerTx.h @@ -21,7 +21,9 @@ #define RIPPLE_APP_LEDGER_ACCEPTEDLEDGERTX_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/BookListeners.cpp b/src/xrpld/app/ledger/BookListeners.cpp index 2379807a91a..fa5fa65059b 100644 --- a/src/xrpld/app/ledger/BookListeners.cpp +++ b/src/xrpld/app/ledger/BookListeners.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/BookListeners.h b/src/xrpld/app/ledger/BookListeners.h index 6ac52de28ee..ca58bf30589 100644 --- a/src/xrpld/app/ledger/BookListeners.h +++ b/src/xrpld/app/ledger/BookListeners.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_LEDGER_BOOKLISTENERS_H_INCLUDED #include + #include #include diff --git a/src/xrpld/app/ledger/BuildLedger.h b/src/xrpld/app/ledger/BuildLedger.h index 409fa3529c4..0805db6c8df 100644 --- a/src/xrpld/app/ledger/BuildLedger.h +++ b/src/xrpld/app/ledger/BuildLedger.h @@ -21,10 +21,9 @@ #define RIPPLE_APP_LEDGER_BUILD_LEDGER_H_INCLUDED #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp index 77a0370f7d9..e62426b7201 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp @@ -19,11 +19,11 @@ #include #include -#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.h b/src/xrpld/app/ledger/ConsensusTransSetSF.h index 857f2b8eae2..4a68f577ada 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.h +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/InboundLedger.h b/src/xrpld/app/ledger/InboundLedger.h index 13f603e79d0..e8f244bfc03 100644 --- a/src/xrpld/app/ledger/InboundLedger.h +++ b/src/xrpld/app/ledger/InboundLedger.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/xrpld/app/ledger/InboundLedgers.h b/src/xrpld/app/ledger/InboundLedgers.h index 937a1515890..037897392f2 100644 --- a/src/xrpld/app/ledger/InboundLedgers.h +++ b/src/xrpld/app/ledger/InboundLedgers.h @@ -21,9 +21,8 @@ #define RIPPLE_APP_LEDGER_INBOUNDLEDGERS_H_INCLUDED #include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/InboundTransactions.h b/src/xrpld/app/ledger/InboundTransactions.h index 368375c07c5..6feee440041 100644 --- a/src/xrpld/app/ledger/InboundTransactions.h +++ b/src/xrpld/app/ledger/InboundTransactions.h @@ -22,7 +22,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 852f73cde14..d3c59fbeb69 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -17,28 +17,22 @@ */ //============================================================================== -#include #include #include -#include #include -#include #include -#include #include #include -#include -#include #include #include #include #include #include #include +#include + #include -#include #include -#include #include #include #include @@ -46,15 +40,12 @@ #include #include #include -#include #include #include -#include + #include #include -#include - namespace ripple { create_genesis_t const create_genesis{}; diff --git a/src/xrpld/app/ledger/Ledger.h b/src/xrpld/app/ledger/Ledger.h index 0eb102eb518..81c26526e5e 100644 --- a/src/xrpld/app/ledger/Ledger.h +++ b/src/xrpld/app/ledger/Ledger.h @@ -20,18 +20,18 @@ #ifndef RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED #define RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED +#include #include #include #include #include + #include #include -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerCleaner.h b/src/xrpld/app/ledger/LedgerCleaner.h index 251e8d51281..b086e021345 100644 --- a/src/xrpld/app/ledger/LedgerCleaner.h +++ b/src/xrpld/app/ledger/LedgerCleaner.h @@ -21,10 +21,10 @@ #define RIPPLE_APP_LEDGER_LEDGERCLEANER_H_INCLUDED #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerHistory.cpp b/src/xrpld/app/ledger/LedgerHistory.cpp index ed0b11723b0..bf866abf3f0 100644 --- a/src/xrpld/app/ledger/LedgerHistory.cpp +++ b/src/xrpld/app/ledger/LedgerHistory.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/LedgerHistory.h b/src/xrpld/app/ledger/LedgerHistory.h index 9d414e4aad3..33f8bf1d961 100644 --- a/src/xrpld/app/ledger/LedgerHistory.h +++ b/src/xrpld/app/ledger/LedgerHistory.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include diff --git a/src/xrpld/app/ledger/LedgerHolder.h b/src/xrpld/app/ledger/LedgerHolder.h index 5636a8ca20d..c0c9d74f463 100644 --- a/src/xrpld/app/ledger/LedgerHolder.h +++ b/src/xrpld/app/ledger/LedgerHolder.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerMaster.h b/src/xrpld/app/ledger/LedgerMaster.h index dd7f0b6a614..f8d726ec8e1 100644 --- a/src/xrpld/app/ledger/LedgerMaster.h +++ b/src/xrpld/app/ledger/LedgerMaster.h @@ -28,18 +28,17 @@ #include #include #include + #include -#include #include #include #include #include #include -#include #include -#include #include +#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplay.h b/src/xrpld/app/ledger/LedgerReplay.h index 8e52c8d5d5d..a3bdedf8218 100644 --- a/src/xrpld/app/ledger/LedgerReplay.h +++ b/src/xrpld/app/ledger/LedgerReplay.h @@ -21,9 +21,9 @@ #define RIPPLE_APP_LEDGER_LEDGERREPLAY_H_INCLUDED #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplayTask.h b/src/xrpld/app/ledger/LedgerReplayTask.h index 54863e70956..03110d8442f 100644 --- a/src/xrpld/app/ledger/LedgerReplayTask.h +++ b/src/xrpld/app/ledger/LedgerReplayTask.h @@ -24,7 +24,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplayer.h b/src/xrpld/app/ledger/LedgerReplayer.h index 4ce4b20b221..b00430303a1 100644 --- a/src/xrpld/app/ledger/LedgerReplayer.h +++ b/src/xrpld/app/ledger/LedgerReplayer.h @@ -23,9 +23,9 @@ #include #include #include + #include -#include #include #include diff --git a/src/xrpld/app/ledger/LedgerToJson.h b/src/xrpld/app/ledger/LedgerToJson.h index 8f9316cbc66..40be57fc9c4 100644 --- a/src/xrpld/app/ledger/LedgerToJson.h +++ b/src/xrpld/app/ledger/LedgerToJson.h @@ -24,11 +24,9 @@ #include #include #include -#include + #include #include -#include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/LocalTxs.h b/src/xrpld/app/ledger/LocalTxs.h index 638e070f444..bf86992a693 100644 --- a/src/xrpld/app/ledger/LocalTxs.h +++ b/src/xrpld/app/ledger/LocalTxs.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/OpenLedger.h b/src/xrpld/app/ledger/OpenLedger.h index 95d4a7cb234..9fe56ff4889 100644 --- a/src/xrpld/app/ledger/OpenLedger.h +++ b/src/xrpld/app/ledger/OpenLedger.h @@ -25,10 +25,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/OrderBookDB.cpp b/src/xrpld/app/ledger/OrderBookDB.cpp index 265e0b62905..5d3616ce20e 100644 --- a/src/xrpld/app/ledger/OrderBookDB.cpp +++ b/src/xrpld/app/ledger/OrderBookDB.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/OrderBookDB.h b/src/xrpld/app/ledger/OrderBookDB.h index ce0d9f0fafe..d120f43aea4 100644 --- a/src/xrpld/app/ledger/OrderBookDB.h +++ b/src/xrpld/app/ledger/OrderBookDB.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/PendingSaves.h b/src/xrpld/app/ledger/PendingSaves.h index d296fcacc96..20263fd1f3b 100644 --- a/src/xrpld/app/ledger/PendingSaves.h +++ b/src/xrpld/app/ledger/PendingSaves.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PENDINGSAVES_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/ledger/TransactionMaster.h b/src/xrpld/app/ledger/TransactionMaster.h index 65f27af6021..ffbbe4ae090 100644 --- a/src/xrpld/app/ledger/TransactionMaster.h +++ b/src/xrpld/app/ledger/TransactionMaster.h @@ -23,7 +23,9 @@ #include #include #include + #include +#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/BuildLedger.cpp b/src/xrpld/app/ledger/detail/BuildLedger.cpp index 5d0f4966a4e..3f099cd2ea7 100644 --- a/src/xrpld/app/ledger/detail/BuildLedger.cpp +++ b/src/xrpld/app/ledger/detail/BuildLedger.cpp @@ -21,9 +21,9 @@ #include #include #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/InboundLedger.cpp b/src/xrpld/app/ledger/detail/InboundLedger.cpp index 32fdff76ab3..c1eed3a9f32 100644 --- a/src/xrpld/app/ledger/detail/InboundLedger.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedger.cpp @@ -23,10 +23,10 @@ #include #include #include -#include #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index 99a26ce8f9f..b05268f65b8 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -23,11 +23,11 @@ #include #include #include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/ledger/detail/InboundTransactions.cpp b/src/xrpld/app/ledger/detail/InboundTransactions.cpp index b8f327ff8a3..54477ccaedb 100644 --- a/src/xrpld/app/ledger/detail/InboundTransactions.cpp +++ b/src/xrpld/app/ledger/detail/InboundTransactions.cpp @@ -23,9 +23,11 @@ #include #include #include + #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp index 27322e302cc..7c0dccfb9b4 100644 --- a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp +++ b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h index b0b2c76c245..24359647660 100644 --- a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h +++ b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h @@ -23,10 +23,10 @@ #include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerMaster.cpp b/src/xrpld/app/ledger/detail/LedgerMaster.cpp index 6bc894da487..0c6a5e786cb 100644 --- a/src/xrpld/app/ledger/detail/LedgerMaster.cpp +++ b/src/xrpld/app/ledger/detail/LedgerMaster.cpp @@ -40,6 +40,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp index 7b9d881d544..5bfad61bf4a 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp index 164fbf8cc5a..a9d2657f9b6 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp @@ -22,7 +22,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp index 3ef3201567a..6de717be4fe 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp @@ -20,7 +20,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerToJson.cpp b/src/xrpld/app/ledger/detail/LedgerToJson.cpp index 3f6869df1d8..5f1e47e8b37 100644 --- a/src/xrpld/app/ledger/detail/LedgerToJson.cpp +++ b/src/xrpld/app/ledger/detail/LedgerToJson.cpp @@ -19,14 +19,14 @@ #include #include -#include #include #include #include #include #include -#include + #include +#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LocalTxs.cpp b/src/xrpld/app/ledger/detail/LocalTxs.cpp index a6eb7721a3e..b6bfc8f8500 100644 --- a/src/xrpld/app/ledger/detail/LocalTxs.cpp +++ b/src/xrpld/app/ledger/detail/LocalTxs.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include /* diff --git a/src/xrpld/app/ledger/detail/OpenLedger.cpp b/src/xrpld/app/ledger/detail/OpenLedger.cpp index a6b93b46949..86a3b4b8400 100644 --- a/src/xrpld/app/ledger/detail/OpenLedger.cpp +++ b/src/xrpld/app/ledger/detail/OpenLedger.cpp @@ -25,8 +25,7 @@ #include #include #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp index 912c29a9f67..fc7e4d140ce 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.h b/src/xrpld/app/ledger/detail/SkipListAcquire.h index 03c8181df68..0e979451744 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.h +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.h @@ -25,7 +25,6 @@ #include #include #include -#include namespace ripple { class InboundLedgers; diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp index 35d8f1fffb1..09614886917 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp @@ -18,9 +18,7 @@ //============================================================================== #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.h b/src/xrpld/app/ledger/detail/TimeoutCounter.h index 228e879d4de..85ce6fc3b43 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.h +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.h @@ -22,9 +22,11 @@ #include #include -#include + #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp index fa4758ebcc5..23694b3cb6e 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.h b/src/xrpld/app/ledger/detail/TransactionAcquire.h index 230bce2fc94..f0d9b40928f 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.h +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_APP_LEDGER_TRANSACTIONACQUIRE_H_INCLUDED #define RIPPLE_APP_LEDGER_TRANSACTIONACQUIRE_H_INCLUDED -#include #include #include diff --git a/src/xrpld/app/ledger/detail/TransactionMaster.cpp b/src/xrpld/app/ledger/detail/TransactionMaster.cpp index e2e1213a37e..7acc3579b0b 100644 --- a/src/xrpld/app/ledger/detail/TransactionMaster.cpp +++ b/src/xrpld/app/ledger/detail/TransactionMaster.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/main/Application.cpp b/src/xrpld/app/main/Application.cpp index 3953b56d672..aa502b41438 100644 --- a/src/xrpld/app/main/Application.cpp +++ b/src/xrpld/app/main/Application.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -57,10 +56,10 @@ #include #include #include + #include #include #include -#include #include #include #include @@ -86,7 +85,6 @@ #include #include #include -#include namespace ripple { @@ -1557,10 +1555,10 @@ ApplicationImp::run() if (!config_->standalone()) { // VFALCO NOTE This seems unnecessary. If we properly refactor the load - // manager then the deadlock detector can just always be + // manager then the stall detector can just always be // "armed" // - getLoadManager().activateDeadlockDetector(); + getLoadManager().activateStallDetector(); } { diff --git a/src/xrpld/app/main/Application.h b/src/xrpld/app/main/Application.h index 8f2dd606ded..27d18407666 100644 --- a/src/xrpld/app/main/Application.h +++ b/src/xrpld/app/main/Application.h @@ -22,14 +22,15 @@ #include #include -#include #include + #include #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/main/BasicApp.cpp b/src/xrpld/app/main/BasicApp.cpp index 504309d0838..a4b1a74685e 100644 --- a/src/xrpld/app/main/BasicApp.cpp +++ b/src/xrpld/app/main/BasicApp.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include BasicApp::BasicApp(std::size_t numberOfThreads) diff --git a/src/xrpld/app/main/BasicApp.h b/src/xrpld/app/main/BasicApp.h index 1c42a3d3330..cd1e8c1a717 100644 --- a/src/xrpld/app/main/BasicApp.h +++ b/src/xrpld/app/main/BasicApp.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_BASICAPP_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/main/CollectorManager.cpp b/src/xrpld/app/main/CollectorManager.cpp index ae7ff965f5c..81f59d8e2b4 100644 --- a/src/xrpld/app/main/CollectorManager.cpp +++ b/src/xrpld/app/main/CollectorManager.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index 7dc4d03b2c2..2ee811dc19e 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -18,11 +18,11 @@ //============================================================================== #include -#include -#include - #include + +#include #include +#include namespace ripple { @@ -447,8 +447,8 @@ GRPCServerImpl::handleRpcs() if (!ok) { - JLOG(journal_.debug()) << "Request listener cancelled. " - << "Destroying object"; + JLOG(journal_.debug()) + << "Request listener cancelled. " << "Destroying object"; erase(ptr); } else diff --git a/src/xrpld/app/main/GRPCServer.h b/src/xrpld/app/main/GRPCServer.h index 0298a40493c..2ecbd5e7daa 100644 --- a/src/xrpld/app/main/GRPCServer.h +++ b/src/xrpld/app/main/GRPCServer.h @@ -28,11 +28,10 @@ #include #include #include -#include -#include -#include #include +#include + #include namespace ripple { diff --git a/src/xrpld/app/main/LoadManager.cpp b/src/xrpld/app/main/LoadManager.cpp index 01b96a3d26c..9ae9e44a3a5 100644 --- a/src/xrpld/app/main/LoadManager.cpp +++ b/src/xrpld/app/main/LoadManager.cpp @@ -21,9 +21,10 @@ #include #include #include -#include + #include #include + #include #include #include @@ -31,7 +32,7 @@ namespace ripple { LoadManager::LoadManager(Application& app, beast::Journal journal) - : app_(app), journal_(journal), deadLock_(), armed_(false) + : app_(app), journal_(journal), lastHeartbeat_(), armed_(false) { } @@ -52,19 +53,19 @@ LoadManager::~LoadManager() //------------------------------------------------------------------------------ void -LoadManager::activateDeadlockDetector() +LoadManager::activateStallDetector() { std::lock_guard sl(mutex_); armed_ = true; - deadLock_ = std::chrono::steady_clock::now(); + lastHeartbeat_ = std::chrono::steady_clock::now(); } void -LoadManager::resetDeadlockDetector() +LoadManager::heartbeat() { - auto const detector_start = std::chrono::steady_clock::now(); + auto const heartbeat = std::chrono::steady_clock::now(); std::lock_guard sl(mutex_); - deadLock_ = detector_start; + lastHeartbeat_ = heartbeat; } //------------------------------------------------------------------------------ @@ -117,63 +118,62 @@ LoadManager::run() break; // Copy out shared data under a lock. Use copies outside lock. - auto const deadLock = deadLock_; + auto const lastHeartbeat = lastHeartbeat_; auto const armed = armed_; sl.unlock(); - // Measure the amount of time we have been deadlocked, in seconds. + // Measure the amount of time we have been stalled, in seconds. using namespace std::chrono; - auto const timeSpentDeadlocked = - duration_cast(steady_clock::now() - deadLock); + auto const timeSpentStalled = + duration_cast(steady_clock::now() - lastHeartbeat); constexpr auto reportingIntervalSeconds = 10s; - constexpr auto deadlockFatalLogMessageTimeLimit = 90s; - constexpr auto deadlockLogicErrorTimeLimit = 600s; + constexpr auto stallFatalLogMessageTimeLimit = 90s; + constexpr auto stallLogicErrorTimeLimit = 600s; - if (armed && (timeSpentDeadlocked >= reportingIntervalSeconds)) + if (armed && (timeSpentStalled >= reportingIntervalSeconds)) { - // Report the deadlocked condition every - // reportingIntervalSeconds - if ((timeSpentDeadlocked % reportingIntervalSeconds) == 0s) + // Report the stalled condition every reportingIntervalSeconds + if ((timeSpentStalled % reportingIntervalSeconds) == 0s) { - if (timeSpentDeadlocked < deadlockFatalLogMessageTimeLimit) + if (timeSpentStalled < stallFatalLogMessageTimeLimit) { JLOG(journal_.warn()) - << "Server stalled for " << timeSpentDeadlocked.count() + << "Server stalled for " << timeSpentStalled.count() << " seconds."; + if (app_.getJobQueue().isOverloaded()) { - JLOG(journal_.warn()) << app_.getJobQueue().getJson(0); + JLOG(journal_.warn()) + << "JobQueue: " << app_.getJobQueue().getJson(0); } } else { JLOG(journal_.fatal()) - << "Deadlock detected. Deadlocked time: " - << timeSpentDeadlocked.count() << "s"; + << "Server stalled for " << timeSpentStalled.count() + << " seconds."; JLOG(journal_.fatal()) << "JobQueue: " << app_.getJobQueue().getJson(0); } } - // If we go over the deadlockTimeLimit spent deadlocked, it - // means that the deadlock resolution code has failed, which - // qualifies as undefined behavior. - // - if (timeSpentDeadlocked >= deadlockLogicErrorTimeLimit) + // If we go over the stallLogicErrorTimeLimit spent stalled, it + // means that the stall resolution code has failed, which qualifies + // as a LogicError + if (timeSpentStalled >= stallLogicErrorTimeLimit) { JLOG(journal_.fatal()) - << "LogicError: Deadlock detected. Deadlocked time: " - << timeSpentDeadlocked.count() << "s"; + << "LogicError: Fatal server stall detected. Stalled time: " + << timeSpentStalled.count() << "s"; JLOG(journal_.fatal()) << "JobQueue: " << app_.getJobQueue().getJson(0); - LogicError("Deadlock detected"); + LogicError("Fatal server stall detected"); } } } - bool change; - + bool change = false; if (app_.getJobQueue().isOverloaded()) { JLOG(journal_.info()) << "Raising local fee (JQ overload): " diff --git a/src/xrpld/app/main/LoadManager.h b/src/xrpld/app/main/LoadManager.h index f818068dcfa..166c40538ca 100644 --- a/src/xrpld/app/main/LoadManager.h +++ b/src/xrpld/app/main/LoadManager.h @@ -21,8 +21,8 @@ #define RIPPLE_APP_MAIN_LOADMANAGER_H_INCLUDED #include + #include -#include #include #include #include @@ -58,28 +58,28 @@ class LoadManager */ ~LoadManager(); - /** Turn on deadlock detection. + /** Turn on stall detection. - The deadlock detector begins in a disabled state. After this function - is called, it will report deadlocks using a separate thread whenever + The stall detector begins in a disabled state. After this function + is called, it will report stalls using a separate thread whenever the reset function is not called at least once per 10 seconds. - @see resetDeadlockDetector + @see resetStallDetector */ - // VFALCO NOTE it seems that the deadlock detector has an "armed" state + // VFALCO NOTE it seems that the stall detector has an "armed" state // to prevent it from going off during program startup if // there's a lengthy initialization operation taking place? // void - activateDeadlockDetector(); + activateStallDetector(); - /** Reset the deadlock detection timer. + /** Reset the stall detection timer. - A dedicated thread monitors the deadlock timer, and if too much + A dedicated thread monitors the stall timer, and if too much time passes it will produce log warnings. */ void - resetDeadlockDetector(); + heartbeat(); //-------------------------------------------------------------------------- @@ -98,12 +98,12 @@ class LoadManager beast::Journal const journal_; std::thread thread_; - std::mutex mutex_; // Guards deadLock_, armed_, cv_ + std::mutex mutex_; // Guards lastHeartbeat_, armed_, cv_ std::condition_variable cv_; bool stop_ = false; - std::chrono::steady_clock::time_point - deadLock_; // Detect server deadlocks. + // Detect server stalls + std::chrono::steady_clock::time_point lastHeartbeat_; bool armed_; friend std::unique_ptr diff --git a/src/xrpld/app/main/Main.cpp b/src/xrpld/app/main/Main.cpp index 6e92c2e83a7..2fa0f68df47 100644 --- a/src/xrpld/app/main/Main.cpp +++ b/src/xrpld/app/main/Main.cpp @@ -18,34 +18,26 @@ //============================================================================== #include -#include #include #include #include #include #include -#include + #include -#include -#include -#include #include -#include #include -#include #ifdef ENABLE_TESTS #include + #include #endif // ENABLE_TESTS - -#include - -#include -#include #include #include +#include + #include #include #include diff --git a/src/xrpld/app/main/NodeIdentity.cpp b/src/xrpld/app/main/NodeIdentity.cpp index e0b83d54c8d..a1da64a0f93 100644 --- a/src/xrpld/app/main/NodeIdentity.cpp +++ b/src/xrpld/app/main/NodeIdentity.cpp @@ -22,7 +22,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeIdentity.h b/src/xrpld/app/main/NodeIdentity.h index b4da8651949..3616255c13e 100644 --- a/src/xrpld/app/main/NodeIdentity.h +++ b/src/xrpld/app/main/NodeIdentity.h @@ -21,10 +21,11 @@ #define RIPPLE_APP_MAIN_NODEIDENTITY_H_INCLUDED #include + #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeStoreScheduler.cpp b/src/xrpld/app/main/NodeStoreScheduler.cpp index f2dce5421f0..6ef2ff3ca66 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.cpp +++ b/src/xrpld/app/main/NodeStoreScheduler.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeStoreScheduler.h b/src/xrpld/app/main/NodeStoreScheduler.h index b16142b2613..c21cc939347 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.h +++ b/src/xrpld/app/main/NodeStoreScheduler.h @@ -22,7 +22,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/AMMHelpers.h b/src/xrpld/app/misc/AMMHelpers.h index c6c0c808bfe..f27d542e32b 100644 --- a/src/xrpld/app/misc/AMMHelpers.h +++ b/src/xrpld/app/misc/AMMHelpers.h @@ -30,11 +30,8 @@ #include #include #include -#include #include -#include - namespace ripple { namespace detail { diff --git a/src/xrpld/app/misc/AMMUtils.h b/src/xrpld/app/misc/AMMUtils.h index 52fe819a28e..ebc28341097 100644 --- a/src/xrpld/app/misc/AMMUtils.h +++ b/src/xrpld/app/misc/AMMUtils.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED #define RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED #include + #include #include #include diff --git a/src/xrpld/app/misc/AmendmentTable.h b/src/xrpld/app/misc/AmendmentTable.h index d6193adca2c..deb0386236c 100644 --- a/src/xrpld/app/misc/AmendmentTable.h +++ b/src/xrpld/app/misc/AmendmentTable.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/misc/CredentialHelpers.cpp b/src/xrpld/app/misc/CredentialHelpers.cpp index a18cd40336b..dcc5975b347 100644 --- a/src/xrpld/app/misc/CredentialHelpers.cpp +++ b/src/xrpld/app/misc/CredentialHelpers.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/misc/CredentialHelpers.h b/src/xrpld/app/misc/CredentialHelpers.h index acc4f2621db..8b52acf54e0 100644 --- a/src/xrpld/app/misc/CredentialHelpers.h +++ b/src/xrpld/app/misc/CredentialHelpers.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED +#define RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED #include @@ -78,3 +79,5 @@ verifyDepositPreauth( std::shared_ptr const& sleDst); } // namespace ripple + +#endif diff --git a/src/xrpld/app/misc/DeliverMax.h b/src/xrpld/app/misc/DeliverMax.h index 3bc875ee4ba..815bf521895 100644 --- a/src/xrpld/app/misc/DeliverMax.h +++ b/src/xrpld/app/misc/DeliverMax.h @@ -22,9 +22,6 @@ #include -#include -#include - namespace Json { class Value; } diff --git a/src/xrpld/app/misc/FeeVote.h b/src/xrpld/app/misc/FeeVote.h index 47769e21e4d..35f723aa024 100644 --- a/src/xrpld/app/misc/FeeVote.h +++ b/src/xrpld/app/misc/FeeVote.h @@ -22,9 +22,8 @@ #include #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 5583b688621..e312ab042f8 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include #include -#include + #include #include #include diff --git a/src/xrpld/app/misc/LoadFeeTrack.h b/src/xrpld/app/misc/LoadFeeTrack.h index 875a7bb7dfa..0064359c762 100644 --- a/src/xrpld/app/misc/LoadFeeTrack.h +++ b/src/xrpld/app/misc/LoadFeeTrack.h @@ -22,9 +22,8 @@ #include #include -#include -#include #include + #include #include #include diff --git a/src/xrpld/app/misc/NegativeUNLVote.h b/src/xrpld/app/misc/NegativeUNLVote.h index f0284f267a8..72ed9657178 100644 --- a/src/xrpld/app/misc/NegativeUNLVote.h +++ b/src/xrpld/app/misc/NegativeUNLVote.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_MISC_NEGATIVEUNLVOTE_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 2b3c38eea4c..b721c80bfde 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -50,23 +50,22 @@ #include #include #include + #include #include #include #include -#include #include #include #include -#include #include #include #include #include -#include #include #include #include + #include #include @@ -79,7 +78,6 @@ #include #include #include -#include namespace ripple { @@ -252,6 +250,12 @@ class NetworkOPsImp final : public NetworkOPs beast::get_abstract_clock(), validatorKeys, app_.logs().journal("LedgerConsensus")) + , validatorPK_( + validatorKeys.keys ? validatorKeys.keys->publicKey + : decltype(validatorPK_){}) + , validatorMasterPK_( + validatorKeys.keys ? validatorKeys.keys->masterPublicKey + : decltype(validatorMasterPK_){}) , m_ledgerMaster(ledgerMaster) , m_job_queue(job_queue) , m_standalone(standalone) @@ -735,6 +739,9 @@ class NetworkOPsImp final : public NetworkOPs RCLConsensus mConsensus; + std::optional const validatorPK_; + std::optional const validatorMasterPK_; + ConsensusPhase mLastConsensusPhase; LedgerMaster& m_ledgerMaster; @@ -1018,7 +1025,7 @@ NetworkOPsImp::processHeartbeatTimer() // VFALCO NOTE This is for diagnosing a crash on exit LoadManager& mgr(app_.getLoadManager()); - mgr.resetDeadlockDetector(); + mgr.heartbeat(); std::size_t const numPeers = app_.overlay().size(); @@ -1920,6 +1927,23 @@ NetworkOPsImp::beginConsensus( bool NetworkOPsImp::processTrustedProposal(RCLCxPeerPos peerPos) { + auto const& peerKey = peerPos.publicKey(); + if (validatorPK_ == peerKey || validatorMasterPK_ == peerKey) + { + // Could indicate a operator misconfiguration where two nodes are + // running with the same validator key configured, so this isn't fatal, + // and it doesn't necessarily indicate peer misbehavior. But since this + // is a trusted message, it could be a very big deal. Either way, we + // don't want to relay the proposal. Note that the byzantine behavior + // detection in handleNewValidation will notify other peers. + UNREACHABLE( + "ripple::NetworkOPsImp::processTrustedProposal : received own " + "proposal"); + JLOG(m_journal.error()) + << "Received a TRUSTED proposal signed with my key from a peer"; + return false; + } + return mConsensus.peerProposal(app_.timeKeeper().closeTime(), peerPos); } diff --git a/src/xrpld/app/misc/NetworkOPs.h b/src/xrpld/app/misc/NetworkOPs.h index be849531e2b..e3535522139 100644 --- a/src/xrpld/app/misc/NetworkOPs.h +++ b/src/xrpld/app/misc/NetworkOPs.h @@ -25,12 +25,13 @@ #include #include #include + #include #include + #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/SHAMapStore.h b/src/xrpld/app/misc/SHAMapStore.h index d8415713a76..d2836be2874 100644 --- a/src/xrpld/app/misc/SHAMapStore.h +++ b/src/xrpld/app/misc/SHAMapStore.h @@ -22,7 +22,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/misc/SHAMapStoreImp.cpp b/src/xrpld/app/misc/SHAMapStoreImp.cpp index e2e0e3b9c46..52ea40cf94d 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.cpp +++ b/src/xrpld/app/misc/SHAMapStoreImp.cpp @@ -17,16 +17,16 @@ */ //============================================================================== -#include - #include #include +#include #include #include #include #include #include #include + #include #include diff --git a/src/xrpld/app/misc/SHAMapStoreImp.h b/src/xrpld/app/misc/SHAMapStoreImp.h index 7d36f092be8..2b618f65388 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.h +++ b/src/xrpld/app/misc/SHAMapStoreImp.h @@ -22,15 +22,13 @@ #include #include -#include #include #include #include - #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/misc/TxQ.h b/src/xrpld/app/misc/TxQ.h index db5af4509f2..6fc61055f13 100644 --- a/src/xrpld/app/misc/TxQ.h +++ b/src/xrpld/app/misc/TxQ.h @@ -23,12 +23,15 @@ #include #include #include + #include #include #include #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/ValidatorKeys.h b/src/xrpld/app/misc/ValidatorKeys.h index f5b9e5735a6..d29d6cdc6dd 100644 --- a/src/xrpld/app/misc/ValidatorKeys.h +++ b/src/xrpld/app/misc/ValidatorKeys.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/ValidatorList.h b/src/xrpld/app/misc/ValidatorList.h index 7576455798a..4e18aa5db3f 100644 --- a/src/xrpld/app/misc/ValidatorList.h +++ b/src/xrpld/app/misc/ValidatorList.h @@ -23,16 +23,16 @@ #include #include #include + #include #include #include #include #include -#include -#include + #include + #include -#include #include namespace protocol { diff --git a/src/xrpld/app/misc/ValidatorSite.h b/src/xrpld/app/misc/ValidatorSite.h index 39bf895807f..88e30e28ab0 100644 --- a/src/xrpld/app/misc/ValidatorSite.h +++ b/src/xrpld/app/misc/ValidatorSite.h @@ -23,14 +23,13 @@ #include #include #include -#include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/misc/detail/AMMUtils.cpp b/src/xrpld/app/misc/detail/AMMUtils.cpp index 0b83afc6d39..5078049a4a8 100644 --- a/src/xrpld/app/misc/detail/AMMUtils.cpp +++ b/src/xrpld/app/misc/detail/AMMUtils.cpp @@ -16,11 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include -#include #include namespace ripple { @@ -149,8 +150,8 @@ ammLPHolds( } amount.setIssuer(ammAccount); - JLOG(j.trace()) << "ammLPHolds:" - << " lpAccount=" << to_string(lpAccount) + JLOG(j.trace()) << "ammLPHolds:" << " lpAccount=" + << to_string(lpAccount) << " amount=" << amount.getFullText(); } diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.cpp b/src/xrpld/app/misc/detail/AccountTxPaging.cpp index 898c41b40c4..278680581e5 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.cpp +++ b/src/xrpld/app/misc/detail/AccountTxPaging.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include #include #include #include + #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.h b/src/xrpld/app/misc/detail/AccountTxPaging.h index 23a5cbd9c23..062c3e867d0 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.h +++ b/src/xrpld/app/misc/detail/AccountTxPaging.h @@ -21,9 +21,8 @@ #define RIPPLE_APP_MISC_IMPL_ACCOUNTTXPAGING_H_INCLUDED #include + #include -#include -#include //------------------------------------------------------------------------------ diff --git a/src/xrpld/app/misc/detail/AmendmentTable.cpp b/src/xrpld/app/misc/detail/AmendmentTable.cpp index d7a5ae82474..ae41a2aa7e6 100644 --- a/src/xrpld/app/misc/detail/AmendmentTable.cpp +++ b/src/xrpld/app/misc/detail/AmendmentTable.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -30,6 +31,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp index 50fb0ac14db..96e75554013 100644 --- a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp +++ b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp @@ -18,18 +18,14 @@ //============================================================================== #include -#include #include + #include #include #include #include -#include -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/Manifest.cpp b/src/xrpld/app/misc/detail/Manifest.cpp index 04c8523aece..c42256495ef 100644 --- a/src/xrpld/app/misc/detail/Manifest.cpp +++ b/src/xrpld/app/misc/detail/Manifest.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/misc/detail/Transaction.cpp b/src/xrpld/app/misc/detail/Transaction.cpp index 30af6b773d0..89bf1a7202e 100644 --- a/src/xrpld/app/misc/detail/Transaction.cpp +++ b/src/xrpld/app/misc/detail/Transaction.cpp @@ -23,12 +23,9 @@ #include #include #include -#include -#include + #include -#include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/misc/detail/TxQ.cpp b/src/xrpld/app/misc/detail/TxQ.cpp index 6e7a2139081..11d81fb8aef 100644 --- a/src/xrpld/app/misc/detail/TxQ.cpp +++ b/src/xrpld/app/misc/detail/TxQ.cpp @@ -19,13 +19,14 @@ #include #include -#include #include #include + #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorKeys.cpp b/src/xrpld/app/misc/detail/ValidatorKeys.cpp index 2b36848c882..8227c5bcdb9 100644 --- a/src/xrpld/app/misc/detail/ValidatorKeys.cpp +++ b/src/xrpld/app/misc/detail/ValidatorKeys.cpp @@ -17,11 +17,11 @@ */ //============================================================================== -#include - #include +#include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorList.cpp b/src/xrpld/app/misc/detail/ValidatorList.cpp index 3a81443db6b..282c3c9e193 100644 --- a/src/xrpld/app/misc/detail/ValidatorList.cpp +++ b/src/xrpld/app/misc/detail/ValidatorList.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -31,6 +32,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorSite.cpp b/src/xrpld/app/misc/detail/ValidatorSite.cpp index 1994f498614..799689ef250 100644 --- a/src/xrpld/app/misc/detail/ValidatorSite.cpp +++ b/src/xrpld/app/misc/detail/ValidatorSite.cpp @@ -22,11 +22,11 @@ #include #include #include -#include -#include + #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/detail/Work.h b/src/xrpld/app/misc/detail/Work.h index afd49adf326..15be569566e 100644 --- a/src/xrpld/app/misc/detail/Work.h +++ b/src/xrpld/app/misc/detail/Work.h @@ -20,10 +20,6 @@ #ifndef RIPPLE_APP_MISC_DETAIL_WORK_H_INCLUDED #define RIPPLE_APP_MISC_DETAIL_WORK_H_INCLUDED -// TODO: This include is a workaround for beast compilation bug. -// Remove when fix https://github.com/boostorg/beast/pull/2682/ is available. -#include - #include #include diff --git a/src/xrpld/app/misc/detail/WorkBase.h b/src/xrpld/app/misc/detail/WorkBase.h index cd909265115..a2b852edfd3 100644 --- a/src/xrpld/app/misc/detail/WorkBase.h +++ b/src/xrpld/app/misc/detail/WorkBase.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_MISC_DETAIL_WORKBASE_H_INCLUDED #include + #include #include @@ -30,8 +31,6 @@ #include #include -#include - namespace ripple { namespace detail { diff --git a/src/xrpld/app/misc/detail/WorkFile.h b/src/xrpld/app/misc/detail/WorkFile.h index 9b8d86f5e16..51fd6db78c5 100644 --- a/src/xrpld/app/misc/detail/WorkFile.h +++ b/src/xrpld/app/misc/detail/WorkFile.h @@ -21,10 +21,10 @@ #define RIPPLE_APP_MISC_DETAIL_WORKFILE_H_INCLUDED #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/detail/WorkSSL.cpp b/src/xrpld/app/misc/detail/WorkSSL.cpp similarity index 100% rename from src/xrpld/app/misc/detail/detail/WorkSSL.cpp rename to src/xrpld/app/misc/detail/WorkSSL.cpp diff --git a/src/xrpld/app/misc/detail/WorkSSL.h b/src/xrpld/app/misc/detail/WorkSSL.h index d48f0b5fdff..2d423a9e50e 100644 --- a/src/xrpld/app/misc/detail/WorkSSL.h +++ b/src/xrpld/app/misc/detail/WorkSSL.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/src/xrpld/app/paths/AMMLiquidity.h b/src/xrpld/app/paths/AMMLiquidity.h index fe60d39262f..b41e26ac842 100644 --- a/src/xrpld/app/paths/AMMLiquidity.h +++ b/src/xrpld/app/paths/AMMLiquidity.h @@ -25,9 +25,9 @@ #include #include #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/AMMOffer.h b/src/xrpld/app/paths/AMMOffer.h index e90a5b8611f..9241ba2057c 100644 --- a/src/xrpld/app/paths/AMMOffer.h +++ b/src/xrpld/app/paths/AMMOffer.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/paths/AccountCurrencies.h b/src/xrpld/app/paths/AccountCurrencies.h index 26282e742c3..566fad91047 100644 --- a/src/xrpld/app/paths/AccountCurrencies.h +++ b/src/xrpld/app/paths/AccountCurrencies.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_ACCOUNTCURRENCIES_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/Credit.cpp b/src/xrpld/app/paths/Credit.cpp index e027949e761..ca721e4edf2 100644 --- a/src/xrpld/app/paths/Credit.cpp +++ b/src/xrpld/app/paths/Credit.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/paths/Credit.h b/src/xrpld/app/paths/Credit.h index b71ec057ae1..0ea2d687ddf 100644 --- a/src/xrpld/app/paths/Credit.h +++ b/src/xrpld/app/paths/Credit.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_CREDIT_H_INCLUDED #include + #include #include diff --git a/src/xrpld/app/paths/Flow.cpp b/src/xrpld/app/paths/Flow.cpp index 3df8f6f9992..66793fc74c4 100644 --- a/src/xrpld/app/paths/Flow.cpp +++ b/src/xrpld/app/paths/Flow.cpp @@ -23,15 +23,11 @@ #include #include #include + #include #include #include -#include - -#include -#include - namespace ripple { template diff --git a/src/xrpld/app/paths/Flow.h b/src/xrpld/app/paths/Flow.h index 5390394b7f0..048b8785f18 100644 --- a/src/xrpld/app/paths/Flow.h +++ b/src/xrpld/app/paths/Flow.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequest.cpp b/src/xrpld/app/paths/PathRequest.cpp index 643923320a2..dc2868eaf20 100644 --- a/src/xrpld/app/paths/PathRequest.cpp +++ b/src/xrpld/app/paths/PathRequest.cpp @@ -26,15 +26,15 @@ #include #include #include +#include + #include #include #include #include #include -#include #include - #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequest.h b/src/xrpld/app/paths/PathRequest.h index 21f10d066ba..3fdbecf7edc 100644 --- a/src/xrpld/app/paths/PathRequest.h +++ b/src/xrpld/app/paths/PathRequest.h @@ -24,13 +24,14 @@ #include #include #include + #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequests.cpp b/src/xrpld/app/paths/PathRequests.cpp index 86560445ec7..9ada5267515 100644 --- a/src/xrpld/app/paths/PathRequests.cpp +++ b/src/xrpld/app/paths/PathRequests.cpp @@ -21,11 +21,12 @@ #include #include #include + #include #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequests.h b/src/xrpld/app/paths/PathRequests.h index 670790518a1..fadf6b7b7c4 100644 --- a/src/xrpld/app/paths/PathRequests.h +++ b/src/xrpld/app/paths/PathRequests.h @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/app/paths/Pathfinder.cpp b/src/xrpld/app/paths/Pathfinder.cpp index 5864357aec4..379bb07e4b5 100644 --- a/src/xrpld/app/paths/Pathfinder.cpp +++ b/src/xrpld/app/paths/Pathfinder.cpp @@ -23,9 +23,9 @@ #include #include #include -#include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/Pathfinder.h b/src/xrpld/app/paths/Pathfinder.h index 01556a3c63f..973fda88551 100644 --- a/src/xrpld/app/paths/Pathfinder.h +++ b/src/xrpld/app/paths/Pathfinder.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/RippleCalc.cpp b/src/xrpld/app/paths/RippleCalc.cpp index c7b2e1f01e0..c783bb8e9f3 100644 --- a/src/xrpld/app/paths/RippleCalc.cpp +++ b/src/xrpld/app/paths/RippleCalc.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/paths/RippleCalc.h b/src/xrpld/app/paths/RippleCalc.h index 9e03da9c906..45f68725ccb 100644 --- a/src/xrpld/app/paths/RippleCalc.h +++ b/src/xrpld/app/paths/RippleCalc.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_RIPPLECALC_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/paths/RippleLineCache.cpp b/src/xrpld/app/paths/RippleLineCache.cpp index 38b630eeb7e..f047dc9500b 100644 --- a/src/xrpld/app/paths/RippleLineCache.cpp +++ b/src/xrpld/app/paths/RippleLineCache.cpp @@ -19,7 +19,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/RippleLineCache.h b/src/xrpld/app/paths/RippleLineCache.h index cde1d589f92..5a3188c8102 100644 --- a/src/xrpld/app/paths/RippleLineCache.h +++ b/src/xrpld/app/paths/RippleLineCache.h @@ -22,11 +22,11 @@ #include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/paths/TrustLine.cpp b/src/xrpld/app/paths/TrustLine.cpp index 6390c8d2117..28572b899ee 100644 --- a/src/xrpld/app/paths/TrustLine.cpp +++ b/src/xrpld/app/paths/TrustLine.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include #include + #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/TrustLine.h b/src/xrpld/app/paths/TrustLine.h index 4189f7ff481..efbe281f5e1 100644 --- a/src/xrpld/app/paths/TrustLine.h +++ b/src/xrpld/app/paths/TrustLine.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_RIPPLESTATE_H_INCLUDED #include + #include #include #include @@ -100,12 +101,6 @@ class TrustLineBase return mFlags & (!mViewLowest ? lsfLowAuth : lsfHighAuth); } - bool - getDefaultRipple() const - { - return mFlags & lsfDefaultRipple; - } - bool getNoRipple() const { diff --git a/src/xrpld/app/paths/detail/AMMLiquidity.cpp b/src/xrpld/app/paths/detail/AMMLiquidity.cpp index 813554ba7ff..83894b2e76a 100644 --- a/src/xrpld/app/paths/detail/AMMLiquidity.cpp +++ b/src/xrpld/app/paths/detail/AMMLiquidity.cpp @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include +#include #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/AMMOffer.cpp b/src/xrpld/app/paths/detail/AMMOffer.cpp index 16ea8628f3b..c719c0a92d6 100644 --- a/src/xrpld/app/paths/detail/AMMOffer.cpp +++ b/src/xrpld/app/paths/detail/AMMOffer.cpp @@ -15,10 +15,11 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -//==============================================================================/ -#include +//============================================================================== #include +#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/BookStep.cpp b/src/xrpld/app/paths/detail/BookStep.cpp index 1d35f80b183..5e650230fe4 100644 --- a/src/xrpld/app/paths/detail/BookStep.cpp +++ b/src/xrpld/app/paths/detail/BookStep.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/detail/DirectStep.cpp b/src/xrpld/app/paths/detail/DirectStep.cpp index 46aa129ac71..4e5ccea3f11 100644 --- a/src/xrpld/app/paths/detail/DirectStep.cpp +++ b/src/xrpld/app/paths/detail/DirectStep.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -204,8 +205,7 @@ class DirectStepI : public StepImp> logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " - << "\nSrc: " << src_ << "\nDst: " << dst_; + ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; return ostr.str(); } diff --git a/src/xrpld/app/paths/detail/FlowDebugInfo.h b/src/xrpld/app/paths/detail/FlowDebugInfo.h index 4c3ea5faf1b..e28b34f5d17 100644 --- a/src/xrpld/app/paths/detail/FlowDebugInfo.h +++ b/src/xrpld/app/paths/detail/FlowDebugInfo.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/paths/detail/PaySteps.cpp b/src/xrpld/app/paths/detail/PaySteps.cpp index b73b1ac8acc..99f212d5481 100644 --- a/src/xrpld/app/paths/detail/PaySteps.cpp +++ b/src/xrpld/app/paths/detail/PaySteps.cpp @@ -19,16 +19,13 @@ #include #include + #include -#include #include -#include #include #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/paths/detail/StepChecks.h b/src/xrpld/app/paths/detail/StepChecks.h index d4fda2bfe62..4acafd1b9aa 100644 --- a/src/xrpld/app/paths/detail/StepChecks.h +++ b/src/xrpld/app/paths/detail/StepChecks.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/paths/detail/Steps.h b/src/xrpld/app/paths/detail/Steps.h index dee90f617a5..bb9abf6545b 100644 --- a/src/xrpld/app/paths/detail/Steps.h +++ b/src/xrpld/app/paths/detail/Steps.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_IMPL_PAYSTEPS_H_INCLUDED #include + #include #include #include @@ -28,6 +29,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/StrandFlow.h b/src/xrpld/app/paths/detail/StrandFlow.h index 0e168b73cce..47037c5f5e7 100644 --- a/src/xrpld/app/paths/detail/StrandFlow.h +++ b/src/xrpld/app/paths/detail/StrandFlow.h @@ -28,8 +28,8 @@ #include #include #include + #include -#include #include #include #include @@ -39,7 +39,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp index ab211a7c856..4f38a7b422e 100644 --- a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp +++ b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include @@ -30,7 +31,6 @@ #include -#include #include namespace ripple { diff --git a/src/xrpld/app/rdb/RelationalDatabase.h b/src/xrpld/app/rdb/RelationalDatabase.h index a7528e2370d..927b08d3853 100644 --- a/src/xrpld/app/rdb/RelationalDatabase.h +++ b/src/xrpld/app/rdb/RelationalDatabase.h @@ -25,11 +25,11 @@ #include #include #include -#include #include + #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/rdb/State.h b/src/xrpld/app/rdb/State.h index e65e9d4d57a..595e749f187 100644 --- a/src/xrpld/app/rdb/State.h +++ b/src/xrpld/app/rdb/State.h @@ -25,6 +25,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/Wallet.h b/src/xrpld/app/rdb/Wallet.h index 6130c9fc263..5cbb3565209 100644 --- a/src/xrpld/app/rdb/Wallet.h +++ b/src/xrpld/app/rdb/Wallet.h @@ -20,12 +20,10 @@ #ifndef RIPPLE_APP_RDB_WALLET_H_INCLUDED #define RIPPLE_APP_RDB_WALLET_H_INCLUDED -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/rdb/backend/detail/Node.cpp b/src/xrpld/app/rdb/backend/detail/Node.cpp index 493e277bfcd..a230eac6e3d 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.cpp +++ b/src/xrpld/app/rdb/backend/detail/Node.cpp @@ -22,16 +22,17 @@ #include #include #include -#include #include #include #include #include + #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/backend/detail/Node.h b/src/xrpld/app/rdb/backend/detail/Node.h index 59c484d2063..0e8c678be5e 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.h +++ b/src/xrpld/app/rdb/backend/detail/Node.h @@ -21,12 +21,8 @@ #define RIPPLE_APP_RDB_BACKEND_DETAIL_NODE_H_INCLUDED #include -#include #include #include -#include -#include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp index 95836a85bbf..edd1fb2174e 100644 --- a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp +++ b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp @@ -17,20 +17,15 @@ */ //============================================================================== -#include #include -#include #include -#include #include #include #include #include #include -#include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/rdb/detail/Vacuum.cpp b/src/xrpld/app/rdb/detail/Vacuum.cpp index 3c61fb5790a..4231f090a30 100644 --- a/src/xrpld/app/rdb/detail/Vacuum.cpp +++ b/src/xrpld/app/rdb/detail/Vacuum.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/detail/Wallet.cpp b/src/xrpld/app/rdb/detail/Wallet.cpp index ffb28596918..0a329f2ccb3 100644 --- a/src/xrpld/app/rdb/detail/Wallet.cpp +++ b/src/xrpld/app/rdb/detail/Wallet.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/apply.h b/src/xrpld/app/tx/apply.h index 38325252c99..101f9a946d5 100644 --- a/src/xrpld/app/tx/apply.h +++ b/src/xrpld/app/tx/apply.h @@ -23,10 +23,10 @@ #include #include #include + #include #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/applySteps.h b/src/xrpld/app/tx/applySteps.h index c1eb17c9920..2a5557ff4b0 100644 --- a/src/xrpld/app/tx/applySteps.h +++ b/src/xrpld/app/tx/applySteps.h @@ -21,6 +21,7 @@ #define RIPPLE_TX_APPLYSTEPS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMBid.cpp b/src/xrpld/app/tx/detail/AMMBid.cpp index e8a14c14922..6fec46be903 100644 --- a/src/xrpld/app/tx/detail/AMMBid.cpp +++ b/src/xrpld/app/tx/detail/AMMBid.cpp @@ -17,15 +17,14 @@ */ //============================================================================== -#include - #include #include +#include #include #include + #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMClawback.cpp b/src/xrpld/app/tx/detail/AMMClawback.cpp index 162224ff913..64a42374ec5 100644 --- a/src/xrpld/app/tx/detail/AMMClawback.cpp +++ b/src/xrpld/app/tx/detail/AMMClawback.cpp @@ -23,12 +23,12 @@ #include #include #include -#include + #include #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMCreate.cpp b/src/xrpld/app/tx/detail/AMMCreate.cpp index 31773166d4a..deafa6f27a9 100644 --- a/src/xrpld/app/tx/detail/AMMCreate.cpp +++ b/src/xrpld/app/tx/detail/AMMCreate.cpp @@ -17,16 +17,15 @@ */ //============================================================================== -#include - #include #include #include +#include #include #include + #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMDelete.cpp b/src/xrpld/app/tx/detail/AMMDelete.cpp index 430ac17e87b..28d56eab989 100644 --- a/src/xrpld/app/tx/detail/AMMDelete.cpp +++ b/src/xrpld/app/tx/detail/AMMDelete.cpp @@ -17,13 +17,11 @@ */ //============================================================================== -#include - #include +#include #include + #include -#include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMDeposit.cpp b/src/xrpld/app/tx/detail/AMMDeposit.cpp index 675f560098c..6a718a3f04d 100644 --- a/src/xrpld/app/tx/detail/AMMDeposit.cpp +++ b/src/xrpld/app/tx/detail/AMMDeposit.cpp @@ -17,19 +17,16 @@ */ //============================================================================== -#include - #include #include +#include #include #include + #include #include -#include #include -#include - namespace ripple { NotTEC diff --git a/src/xrpld/app/tx/detail/AMMVote.cpp b/src/xrpld/app/tx/detail/AMMVote.cpp index 1b8b91e518a..84d0905a221 100644 --- a/src/xrpld/app/tx/detail/AMMVote.cpp +++ b/src/xrpld/app/tx/detail/AMMVote.cpp @@ -17,14 +17,12 @@ */ //============================================================================== -#include - -#include #include +#include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMWithdraw.cpp b/src/xrpld/app/tx/detail/AMMWithdraw.cpp index 23e8529cfc9..586f453c6f9 100644 --- a/src/xrpld/app/tx/detail/AMMWithdraw.cpp +++ b/src/xrpld/app/tx/detail/AMMWithdraw.cpp @@ -17,18 +17,15 @@ */ //============================================================================== -#include - #include #include +#include #include + #include #include -#include #include -#include - namespace ripple { NotTEC diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index 5a37f74b2f0..71fe246f157 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -19,12 +19,10 @@ #include #include -#include + #include #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 1ddcff55065..715d4ea471a 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -23,11 +23,12 @@ #include #include #include + #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/BookTip.cpp b/src/xrpld/app/tx/detail/BookTip.cpp index 011d992dd72..a766efbde19 100644 --- a/src/xrpld/app/tx/detail/BookTip.cpp +++ b/src/xrpld/app/tx/detail/BookTip.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/BookTip.h b/src/xrpld/app/tx/detail/BookTip.h index 4de6b785b90..f215cdb6208 100644 --- a/src/xrpld/app/tx/detail/BookTip.h +++ b/src/xrpld/app/tx/detail/BookTip.h @@ -21,11 +21,10 @@ #define RIPPLE_APP_BOOK_BOOKTIP_H_INCLUDED #include + #include #include -#include - namespace ripple { class Logs; diff --git a/src/xrpld/app/tx/detail/CancelCheck.cpp b/src/xrpld/app/tx/detail/CancelCheck.cpp index 7954e86cf3b..cfa3bd10e2d 100644 --- a/src/xrpld/app/tx/detail/CancelCheck.cpp +++ b/src/xrpld/app/tx/detail/CancelCheck.cpp @@ -17,14 +17,13 @@ */ //============================================================================== -#include - #include +#include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/CancelOffer.cpp b/src/xrpld/app/tx/detail/CancelOffer.cpp index 30e955a8282..6d8c077a621 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.cpp +++ b/src/xrpld/app/tx/detail/CancelOffer.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/CancelOffer.h b/src/xrpld/app/tx/detail/CancelOffer.h index 0942e61282b..0813dd0aef6 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.h +++ b/src/xrpld/app/tx/detail/CancelOffer.h @@ -21,8 +21,7 @@ #define RIPPLE_TX_CANCELOFFER_H_INCLUDED #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CashCheck.cpp b/src/xrpld/app/tx/detail/CashCheck.cpp index f6e5f6f3e3f..468adbd209b 100644 --- a/src/xrpld/app/tx/detail/CashCheck.cpp +++ b/src/xrpld/app/tx/detail/CashCheck.cpp @@ -20,11 +20,11 @@ #include #include #include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index 2f5d1c6e317..e40e61ff94e 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Change.h b/src/xrpld/app/tx/detail/Change.h index b0780a75c04..d710827dd63 100644 --- a/src/xrpld/app/tx/detail/Change.h +++ b/src/xrpld/app/tx/detail/Change.h @@ -20,12 +20,7 @@ #ifndef RIPPLE_TX_CHANGE_H_INCLUDED #define RIPPLE_TX_CHANGE_H_INCLUDED -#include -#include -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Clawback.cpp b/src/xrpld/app/tx/detail/Clawback.cpp index d60acf9fd73..e58faf2286b 100644 --- a/src/xrpld/app/tx/detail/Clawback.cpp +++ b/src/xrpld/app/tx/detail/Clawback.cpp @@ -19,12 +19,12 @@ #include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateCheck.cpp b/src/xrpld/app/tx/detail/CreateCheck.cpp index 3a278eed738..19ef28b8438 100644 --- a/src/xrpld/app/tx/detail/CreateCheck.cpp +++ b/src/xrpld/app/tx/detail/CreateCheck.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include +#include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/CreateOffer.cpp b/src/xrpld/app/tx/detail/CreateOffer.cpp index f1b66468840..92ba54f0774 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.cpp +++ b/src/xrpld/app/tx/detail/CreateOffer.cpp @@ -21,10 +21,10 @@ #include #include #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateOffer.h b/src/xrpld/app/tx/detail/CreateOffer.h index 234267804c9..35808c78fed 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.h +++ b/src/xrpld/app/tx/detail/CreateOffer.h @@ -23,7 +23,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateTicket.cpp b/src/xrpld/app/tx/detail/CreateTicket.cpp index b04f4af1d30..594335f4897 100644 --- a/src/xrpld/app/tx/detail/CreateTicket.cpp +++ b/src/xrpld/app/tx/detail/CreateTicket.cpp @@ -17,13 +17,12 @@ */ //============================================================================== -#include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateTicket.h b/src/xrpld/app/tx/detail/CreateTicket.h index 099dcde9347..86cf91bb5af 100644 --- a/src/xrpld/app/tx/detail/CreateTicket.h +++ b/src/xrpld/app/tx/detail/CreateTicket.h @@ -22,8 +22,6 @@ #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Credentials.cpp b/src/xrpld/app/tx/detail/Credentials.cpp index ca80bc159e3..73c397cf371 100644 --- a/src/xrpld/app/tx/detail/Credentials.cpp +++ b/src/xrpld/app/tx/detail/Credentials.cpp @@ -19,15 +19,13 @@ #include #include - -#include #include #include + #include #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/Credentials.h b/src/xrpld/app/tx/detail/Credentials.h index 7e7522d82c1..5b4acb39981 100644 --- a/src/xrpld/app/tx/detail/Credentials.h +++ b/src/xrpld/app/tx/detail/Credentials.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TX_CREDENTIALS_H_INCLUDED +#define RIPPLE_TX_CREDENTIALS_H_INCLUDED #include @@ -85,3 +86,5 @@ class CredentialAccept : public Transactor }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/DID.cpp b/src/xrpld/app/tx/detail/DID.cpp index 6e5a3108c72..31ce7c8770b 100644 --- a/src/xrpld/app/tx/detail/DID.cpp +++ b/src/xrpld/app/tx/detail/DID.cpp @@ -18,14 +18,13 @@ //============================================================================== #include - #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteAccount.cpp b/src/xrpld/app/tx/detail/DeleteAccount.cpp index 18ddf01a8d7..d5620694604 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.cpp +++ b/src/xrpld/app/tx/detail/DeleteAccount.cpp @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteAccount.h b/src/xrpld/app/tx/detail/DeleteAccount.h index 5f88a9ba718..c9d3305562c 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.h +++ b/src/xrpld/app/tx/detail/DeleteAccount.h @@ -21,8 +21,6 @@ #define RIPPLE_TX_DELETEACCOUNT_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteOracle.cpp b/src/xrpld/app/tx/detail/DeleteOracle.cpp index 807e52ee6b4..78e3d552303 100644 --- a/src/xrpld/app/tx/detail/DeleteOracle.cpp +++ b/src/xrpld/app/tx/detail/DeleteOracle.cpp @@ -18,8 +18,8 @@ //============================================================================== #include -#include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/DepositPreauth.cpp b/src/xrpld/app/tx/detail/DepositPreauth.cpp index 599fcd60526..f10f09b38fe 100644 --- a/src/xrpld/app/tx/detail/DepositPreauth.cpp +++ b/src/xrpld/app/tx/detail/DepositPreauth.cpp @@ -20,11 +20,11 @@ #include #include #include + #include #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 41b51b295f5..165a6df5f43 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -17,24 +17,21 @@ */ //============================================================================== -#include - #include #include #include +#include #include #include #include #include + #include #include -#include #include #include #include #include -#include -#include // During an EscrowFinish, the transaction must specify both // a condition and a fulfillment. We track whether that diff --git a/src/xrpld/app/tx/detail/InvariantCheck.cpp b/src/xrpld/app/tx/detail/InvariantCheck.cpp index d39492c1085..b97a0c02eea 100644 --- a/src/xrpld/app/tx/detail/InvariantCheck.cpp +++ b/src/xrpld/app/tx/detail/InvariantCheck.cpp @@ -17,13 +17,13 @@ */ //============================================================================== -#include - #include +#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/LedgerStateFix.cpp b/src/xrpld/app/tx/detail/LedgerStateFix.cpp index 568ed49304a..008d9b6ae7b 100644 --- a/src/xrpld/app/tx/detail/LedgerStateFix.cpp +++ b/src/xrpld/app/tx/detail/LedgerStateFix.cpp @@ -18,12 +18,11 @@ //============================================================================== #include - #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/LedgerStateFix.h b/src/xrpld/app/tx/detail/LedgerStateFix.h index b480d239291..bff51a723c2 100644 --- a/src/xrpld/app/tx/detail/LedgerStateFix.h +++ b/src/xrpld/app/tx/detail/LedgerStateFix.h @@ -21,8 +21,6 @@ #define RIPPLE_TX_LEDGER_STATE_FIX_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp index 8042c9c6982..cfc098ab0fa 100644 --- a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp +++ b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp index 1297a918e1d..1bd3fcadd74 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp @@ -19,9 +19,9 @@ #include #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp index a0f0b9d8602..ed5d3c4f965 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp @@ -18,11 +18,10 @@ //============================================================================== #include - #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp index 4e395c30be6..12208dba1b6 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp @@ -18,10 +18,9 @@ //============================================================================== #include -#include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp b/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp index 9ae6616e382..4c5fdb7683d 100644 --- a/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp @@ -20,10 +20,10 @@ #include #include #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenBurn.cpp b/src/xrpld/app/tx/detail/NFTokenBurn.cpp index 725e35791f9..947a663f920 100644 --- a/src/xrpld/app/tx/detail/NFTokenBurn.cpp +++ b/src/xrpld/app/tx/detail/NFTokenBurn.cpp @@ -19,13 +19,10 @@ #include #include -#include + #include #include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp b/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp index ef66ceecd0c..f6072bc9534 100644 --- a/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp @@ -20,9 +20,10 @@ #include #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp b/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp index 43178d31b4a..8e1a026415b 100644 --- a/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp @@ -20,10 +20,9 @@ #include #include #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenMint.cpp b/src/xrpld/app/tx/detail/NFTokenMint.cpp index 76e561cfc3f..42b551b3a4d 100644 --- a/src/xrpld/app/tx/detail/NFTokenMint.cpp +++ b/src/xrpld/app/tx/detail/NFTokenMint.cpp @@ -19,14 +19,15 @@ #include #include + #include -#include #include #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenMint.h b/src/xrpld/app/tx/detail/NFTokenMint.h index c95fd5944e4..f606120c545 100644 --- a/src/xrpld/app/tx/detail/NFTokenMint.h +++ b/src/xrpld/app/tx/detail/NFTokenMint.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenModify.cpp b/src/xrpld/app/tx/detail/NFTokenModify.cpp index 7e616ea6ca0..a3803c423b6 100644 --- a/src/xrpld/app/tx/detail/NFTokenModify.cpp +++ b/src/xrpld/app/tx/detail/NFTokenModify.cpp @@ -19,11 +19,9 @@ #include #include -#include + #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenUtils.cpp b/src/xrpld/app/tx/detail/NFTokenUtils.cpp index 04eb53ae764..9c9754aa95a 100644 --- a/src/xrpld/app/tx/detail/NFTokenUtils.cpp +++ b/src/xrpld/app/tx/detail/NFTokenUtils.cpp @@ -20,12 +20,13 @@ #include #include #include + #include #include -#include #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/NFTokenUtils.h b/src/xrpld/app/tx/detail/NFTokenUtils.h index f5232630eef..38ced59e9c9 100644 --- a/src/xrpld/app/tx/detail/NFTokenUtils.h +++ b/src/xrpld/app/tx/detail/NFTokenUtils.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include #include diff --git a/src/xrpld/app/tx/detail/Offer.h b/src/xrpld/app/tx/detail/Offer.h index 23129952c3d..abc0212335d 100644 --- a/src/xrpld/app/tx/detail/Offer.h +++ b/src/xrpld/app/tx/detail/Offer.h @@ -21,12 +21,13 @@ #define RIPPLE_APP_BOOK_OFFER_H_INCLUDED #include + #include #include #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/OfferStream.cpp b/src/xrpld/app/tx/detail/OfferStream.cpp index 4e1cdd9b238..7640cca206b 100644 --- a/src/xrpld/app/tx/detail/OfferStream.cpp +++ b/src/xrpld/app/tx/detail/OfferStream.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/app/tx/detail/OfferStream.h b/src/xrpld/app/tx/detail/OfferStream.h index be224a67b4e..cf6c1c3d2d3 100644 --- a/src/xrpld/app/tx/detail/OfferStream.h +++ b/src/xrpld/app/tx/detail/OfferStream.h @@ -23,10 +23,10 @@ #include #include #include + #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/PayChan.cpp b/src/xrpld/app/tx/detail/PayChan.cpp index aa248075d56..fa5d44fb000 100644 --- a/src/xrpld/app/tx/detail/PayChan.cpp +++ b/src/xrpld/app/tx/detail/PayChan.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -30,7 +31,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Payment.cpp b/src/xrpld/app/tx/detail/Payment.cpp index 1ed3bacbbd8..c2b7b23a6a5 100644 --- a/src/xrpld/app/tx/detail/Payment.cpp +++ b/src/xrpld/app/tx/detail/Payment.cpp @@ -21,12 +21,12 @@ #include #include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Payment.h b/src/xrpld/app/tx/detail/Payment.h index 3176ae1c0d3..775d4e8d46b 100644 --- a/src/xrpld/app/tx/detail/Payment.h +++ b/src/xrpld/app/tx/detail/Payment.h @@ -20,10 +20,7 @@ #ifndef RIPPLE_TX_PAYMENT_H_INCLUDED #define RIPPLE_TX_PAYMENT_H_INCLUDED -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp b/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp index 4c2bd6f8d85..64c498b68b1 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp +++ b/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/PermissionedDomainDelete.h b/src/xrpld/app/tx/detail/PermissionedDomainDelete.h index ce0d1f14d86..8b5fa68e59d 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainDelete.h +++ b/src/xrpld/app/tx/detail/PermissionedDomainDelete.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TX_PERMISSIONEDDOMAINDELETE_H_INCLUDED +#define RIPPLE_TX_PERMISSIONEDDOMAINDELETE_H_INCLUDED #include @@ -44,3 +45,5 @@ class PermissionedDomainDelete : public Transactor }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp index a5141523b3c..6e2df2a0829 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp +++ b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.h b/src/xrpld/app/tx/detail/PermissionedDomainSet.h index 7419770946f..502d576e329 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainSet.h +++ b/src/xrpld/app/tx/detail/PermissionedDomainSet.h @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#pragma once + +#ifndef RIPPLE_TX_PERMISSIONEDDOMAINSET_H_INCLUDED +#define RIPPLE_TX_PERMISSIONEDDOMAINSET_H_INCLUDED #include @@ -43,3 +45,5 @@ class PermissionedDomainSet : public Transactor }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/SetAccount.cpp b/src/xrpld/app/tx/detail/SetAccount.cpp index c0e115c2497..d871cc32800 100644 --- a/src/xrpld/app/tx/detail/SetAccount.cpp +++ b/src/xrpld/app/tx/detail/SetAccount.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetAccount.h b/src/xrpld/app/tx/detail/SetAccount.h index 62cae28e51c..4604a11a6c6 100644 --- a/src/xrpld/app/tx/detail/SetAccount.h +++ b/src/xrpld/app/tx/detail/SetAccount.h @@ -21,10 +21,7 @@ #define RIPPLE_TX_SETACCOUNT_H_INCLUDED #include -#include -#include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SetOracle.cpp b/src/xrpld/app/tx/detail/SetOracle.cpp index 055143cc6fd..8559c3e7b9e 100644 --- a/src/xrpld/app/tx/detail/SetOracle.cpp +++ b/src/xrpld/app/tx/detail/SetOracle.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetRegularKey.cpp b/src/xrpld/app/tx/detail/SetRegularKey.cpp index 9f165612f3a..92d130a15ae 100644 --- a/src/xrpld/app/tx/detail/SetRegularKey.cpp +++ b/src/xrpld/app/tx/detail/SetRegularKey.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetRegularKey.h b/src/xrpld/app/tx/detail/SetRegularKey.h index 89a714342ff..055748aa250 100644 --- a/src/xrpld/app/tx/detail/SetRegularKey.h +++ b/src/xrpld/app/tx/detail/SetRegularKey.h @@ -21,9 +21,6 @@ #define RIPPLE_TX_SETREGULARKEY_H_INCLUDED #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SetSignerList.cpp b/src/xrpld/app/tx/detail/SetSignerList.cpp index 173107e02ae..4a1ee703a07 100644 --- a/src/xrpld/app/tx/detail/SetSignerList.cpp +++ b/src/xrpld/app/tx/detail/SetSignerList.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include - #include +#include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetSignerList.h b/src/xrpld/app/tx/detail/SetSignerList.h index 35951645c21..1827aca9756 100644 --- a/src/xrpld/app/tx/detail/SetSignerList.h +++ b/src/xrpld/app/tx/detail/SetSignerList.h @@ -20,16 +20,12 @@ #ifndef RIPPLE_TX_SETSIGNERLIST_H_INCLUDED #define RIPPLE_TX_SETSIGNERLIST_H_INCLUDED -#include #include #include -#include -#include + #include -#include -#include #include -#include + #include #include diff --git a/src/xrpld/app/tx/detail/SetTrust.cpp b/src/xrpld/app/tx/detail/SetTrust.cpp index b1e0494ba46..93abcdc4c4d 100644 --- a/src/xrpld/app/tx/detail/SetTrust.cpp +++ b/src/xrpld/app/tx/detail/SetTrust.cpp @@ -19,12 +19,12 @@ #include #include + #include #include #include #include #include -#include namespace { diff --git a/src/xrpld/app/tx/detail/SetTrust.h b/src/xrpld/app/tx/detail/SetTrust.h index 6e5a72b3062..7a5394c6841 100644 --- a/src/xrpld/app/tx/detail/SetTrust.h +++ b/src/xrpld/app/tx/detail/SetTrust.h @@ -21,9 +21,7 @@ #define RIPPLE_TX_SETTRUST_H_INCLUDED #include -#include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SignerEntries.cpp b/src/xrpld/app/tx/detail/SignerEntries.cpp index cab362a8e3b..e5e159862af 100644 --- a/src/xrpld/app/tx/detail/SignerEntries.cpp +++ b/src/xrpld/app/tx/detail/SignerEntries.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/SignerEntries.h b/src/xrpld/app/tx/detail/SignerEntries.h index 2227aa98109..bd16398f561 100644 --- a/src/xrpld/app/tx/detail/SignerEntries.h +++ b/src/xrpld/app/tx/detail/SignerEntries.h @@ -21,12 +21,11 @@ #define RIPPLE_TX_IMPL_SIGNER_ENTRIES_H_INCLUDED #include // NotTEC -#include // -#include // beast::Journal -#include // Rules -#include // STTx::maxMultiSigners -#include // temMALFORMED -#include // AccountID + +#include // +#include // beast::Journal +#include // temMALFORMED +#include // AccountID #include #include diff --git a/src/xrpld/app/tx/detail/Taker.cpp b/src/xrpld/app/tx/detail/Taker.cpp index e98d65fd114..9bfd6dc1d3d 100644 --- a/src/xrpld/app/tx/detail/Taker.cpp +++ b/src/xrpld/app/tx/detail/Taker.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/app/tx/detail/Taker.h b/src/xrpld/app/tx/detail/Taker.h index 3e64c59b542..3702a30deb7 100644 --- a/src/xrpld/app/tx/detail/Taker.h +++ b/src/xrpld/app/tx/detail/Taker.h @@ -21,14 +21,13 @@ #define RIPPLE_APP_BOOK_TAKER_H_INCLUDED #include -#include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index f192126387d..d11c20c610d 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -26,13 +26,13 @@ #include #include #include + #include #include #include #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Transactor.h b/src/xrpld/app/tx/detail/Transactor.h index a4ba3bfed25..e98269c38a0 100644 --- a/src/xrpld/app/tx/detail/Transactor.h +++ b/src/xrpld/app/tx/detail/Transactor.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/XChainBridge.cpp b/src/xrpld/app/tx/detail/XChainBridge.cpp index 0c6be61040c..5fa03557e5a 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.cpp +++ b/src/xrpld/app/tx/detail/XChainBridge.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -41,8 +42,7 @@ #include #include #include -#include -#include + #include #include diff --git a/src/xrpld/app/tx/detail/XChainBridge.h b/src/xrpld/app/tx/detail/XChainBridge.h index 2e5e927d120..82b64cc0e35 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.h +++ b/src/xrpld/app/tx/detail/XChainBridge.h @@ -21,7 +21,7 @@ #define RIPPLE_TX_XCHAINBRIDGE_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/apply.cpp b/src/xrpld/app/tx/detail/apply.cpp index 03b0c3d74d6..615fd6a92d3 100644 --- a/src/xrpld/app/tx/detail/apply.cpp +++ b/src/xrpld/app/tx/detail/apply.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/applySteps.cpp b/src/xrpld/app/tx/detail/applySteps.cpp index 95cc3521a91..4cb505db50c 100644 --- a/src/xrpld/app/tx/detail/applySteps.cpp +++ b/src/xrpld/app/tx/detail/applySteps.cpp @@ -61,6 +61,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/conditions/Condition.h b/src/xrpld/conditions/Condition.h index a3120f1b3ca..52408127ec2 100644 --- a/src/xrpld/conditions/Condition.h +++ b/src/xrpld/conditions/Condition.h @@ -21,14 +21,12 @@ #define RIPPLE_CONDITIONS_CONDITION_H #include + #include #include -#include + #include #include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/Fulfillment.h b/src/xrpld/conditions/Fulfillment.h index e70bcf54d41..8e770352a9d 100644 --- a/src/xrpld/conditions/Fulfillment.h +++ b/src/xrpld/conditions/Fulfillment.h @@ -21,7 +21,7 @@ #define RIPPLE_CONDITIONS_FULFILLMENT_H #include -#include + #include #include diff --git a/src/xrpld/conditions/detail/Condition.cpp b/src/xrpld/conditions/detail/Condition.cpp index 3085ace0a31..84c0e4b01a4 100644 --- a/src/xrpld/conditions/detail/Condition.cpp +++ b/src/xrpld/conditions/detail/Condition.cpp @@ -18,12 +18,8 @@ //============================================================================== #include -#include #include #include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/Fulfillment.cpp b/src/xrpld/conditions/detail/Fulfillment.cpp index 285113ebfb2..47fde969a35 100644 --- a/src/xrpld/conditions/detail/Fulfillment.cpp +++ b/src/xrpld/conditions/detail/Fulfillment.cpp @@ -21,9 +21,8 @@ #include #include #include + #include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/PreimageSha256.h b/src/xrpld/conditions/detail/PreimageSha256.h index 5185ded7a67..273a29d653d 100644 --- a/src/xrpld/conditions/detail/PreimageSha256.h +++ b/src/xrpld/conditions/detail/PreimageSha256.h @@ -23,9 +23,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/xrpld/conditions/detail/error.cpp b/src/xrpld/conditions/detail/error.cpp index 3594c9e14da..10a3a43921c 100644 --- a/src/xrpld/conditions/detail/error.cpp +++ b/src/xrpld/conditions/detail/error.cpp @@ -18,10 +18,10 @@ //============================================================================== #include + #include + #include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/error.h b/src/xrpld/conditions/detail/error.h index 8e8f8cc842d..a701ba88599 100644 --- a/src/xrpld/conditions/detail/error.h +++ b/src/xrpld/conditions/detail/error.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_CONDITIONS_ERROR_H #define RIPPLE_CONDITIONS_ERROR_H -#include #include namespace ripple { diff --git a/src/xrpld/conditions/detail/utils.h b/src/xrpld/conditions/detail/utils.h index 35d9c7dea51..28943bd6403 100644 --- a/src/xrpld/conditions/detail/utils.h +++ b/src/xrpld/conditions/detail/utils.h @@ -21,17 +21,13 @@ #define RIPPLE_CONDITIONS_UTILS_H #include + #include #include -#include + #include -#include + #include -#include -#include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/consensus/Consensus.cpp b/src/xrpld/consensus/Consensus.cpp index 3720062fdb5..fb57687df08 100644 --- a/src/xrpld/consensus/Consensus.cpp +++ b/src/xrpld/consensus/Consensus.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { @@ -108,6 +109,7 @@ checkConsensusReached( bool count_self, std::size_t minConsensusPct, bool reachedMax, + bool stalled, std::unique_ptr const& clog) { CLOG(clog) << "checkConsensusReached params: agreeing: " << agreeing @@ -137,6 +139,17 @@ checkConsensusReached( return false; } + // We only get stalled when every disputed transaction unequivocally has 80% + // (minConsensusPct) agreement, either for or against. That is: either under + // 20% or over 80% consensus (repectively "nay" or "yay"). This prevents + // manipulation by a minority of byzantine peers of which transactions make + // the cut to get into the ledger. + if (stalled) + { + CLOG(clog) << "consensus stalled. "; + return true; + } + if (count_self) { ++agreeing; @@ -146,6 +159,7 @@ checkConsensusReached( } std::size_t currentPercentage = (agreeing * 100) / total; + CLOG(clog) << "currentPercentage: " << currentPercentage; bool const ret = currentPercentage >= minConsensusPct; if (ret) @@ -167,6 +181,7 @@ checkConsensus( std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, + bool stalled, ConsensusParms const& parms, bool proposing, beast::Journal j, @@ -180,7 +195,7 @@ checkConsensus( << " minimum duration to reach consensus: " << parms.ledgerMIN_CONSENSUS.count() << "ms" << " max consensus time " << parms.ledgerMAX_CONSENSUS.count() - << "s" + << "ms" << " minimum consensus percentage: " << parms.minCONSENSUS_PCT << ". "; @@ -210,10 +225,12 @@ checkConsensus( proposing, parms.minCONSENSUS_PCT, currentAgreeTime > parms.ledgerMAX_CONSENSUS, + stalled, clog)) { - JLOG(j.debug()) << "normal consensus"; - CLOG(clog) << "reached. "; + JLOG((stalled ? j.warn() : j.debug())) + << "normal consensus" << (stalled ? ", but stalled" : ""); + CLOG(clog) << "reached" << (stalled ? ", but stalled." : "."); return ConsensusState::Yes; } @@ -225,6 +242,7 @@ checkConsensus( false, parms.minCONSENSUS_PCT, currentAgreeTime > parms.ledgerMAX_CONSENSUS, + false, clog)) { JLOG(j.warn()) << "We see no consensus, but 80% of nodes have moved on"; @@ -232,6 +250,19 @@ checkConsensus( return ConsensusState::MovedOn; } + std::chrono::milliseconds const maxAgreeTime = + previousAgreeTime * parms.ledgerABANDON_CONSENSUS_FACTOR; + if (currentAgreeTime > std::clamp( + maxAgreeTime, + parms.ledgerMAX_CONSENSUS, + parms.ledgerABANDON_CONSENSUS)) + { + JLOG(j.warn()) << "consensus taken too long"; + CLOG(clog) << "Consensus taken too long. "; + // Note the Expired result may be overridden by the caller. + return ConsensusState::Expired; + } + // no consensus yet JLOG(j.trace()) << "no consensus"; CLOG(clog) << "No consensus. "; diff --git a/src/xrpld/consensus/Consensus.h b/src/xrpld/consensus/Consensus.h index dd53c74b311..948c00a8b26 100644 --- a/src/xrpld/consensus/Consensus.h +++ b/src/xrpld/consensus/Consensus.h @@ -25,12 +25,13 @@ #include #include #include + #include #include #include #include -#include +#include #include #include #include @@ -81,6 +82,10 @@ shouldCloseLedger( last ledger @param currentAgreeTime how long, in milliseconds, we've been trying to agree + @param stalled the network appears to be stalled, where + neither we nor our peers have changed their vote on any disputes in a + while. This is undesirable, and will cause us to end consensus + without 80% agreement. @param parms Consensus constant parameters @param proposing whether we should count ourselves @param j journal for logging @@ -94,6 +99,7 @@ checkConsensus( std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, + bool stalled, ConsensusParms const& parms, bool proposing, beast::Journal j, @@ -574,6 +580,9 @@ class Consensus NetClock::duration closeResolution_ = ledgerDefaultTimeResolution; + ConsensusParms::AvalancheState closeTimeAvalancheState_ = + ConsensusParms::init; + // Time it took for the last consensus round to converge std::chrono::milliseconds prevRoundTime_; @@ -599,6 +608,13 @@ class Consensus std::optional result_; ConsensusCloseTimes rawCloseTimes_; + // The number of calls to phaseEstablish where none of our peers + // have changed any votes on disputed transactions. + std::size_t peerUnchangedCounter_ = 0; + + // The total number of times we have called phaseEstablish + std::size_t establishCounter_ = 0; + //------------------------------------------------------------------------- // Peer related consensus data @@ -696,6 +712,7 @@ Consensus::startRoundInternal( previousLedger_ = prevLedger; result_.reset(); convergePercent_ = 0; + closeTimeAvalancheState_ = ConsensusParms::init; haveCloseTimeConsensus_ = false; openTime_.reset(clock_.now()); currPeerPositions_.clear(); @@ -1196,8 +1213,7 @@ Consensus::phaseOpen(std::unique_ptr const& clog) adaptor_.parms().ledgerIDLE_INTERVAL, 2 * previousLedger_.closeTimeResolution()); CLOG(clog) << "idle interval set to " << idleInterval.count() - << "ms based on " - << "ledgerIDLE_INTERVAL: " + << "ms based on " << "ledgerIDLE_INTERVAL: " << adaptor_.parms().ledgerIDLE_INTERVAL.count() << ", previous ledger close time resolution: " << previousLedger_.closeTimeResolution().count() << "ms. "; @@ -1352,6 +1368,9 @@ Consensus::phaseEstablish( // can only establish consensus if we already took a stance XRPL_ASSERT(result_, "ripple::Consensus::phaseEstablish : result is set"); + ++peerUnchangedCounter_; + ++establishCounter_; + using namespace std::chrono; ConsensusParms const& parms = adaptor_.parms(); @@ -1418,6 +1437,8 @@ Consensus::closeLedger(std::unique_ptr const& clog) phase_ = ConsensusPhase::establish; JLOG(j_.debug()) << "transitioned to ConsensusPhase::establish"; rawCloseTimes_.self = now_; + peerUnchangedCounter_ = 0; + establishCounter_ = 0; result_.emplace(adaptor_.onClose(previousLedger_, now_, mode_.get())); result_->roundTime.reset(clock_.now()); @@ -1551,16 +1572,11 @@ Consensus::updateOurPositions( } else { - int neededWeight; - - if (convergePercent_ < parms.avMID_CONSENSUS_TIME) - neededWeight = parms.avINIT_CONSENSUS_PCT; - else if (convergePercent_ < parms.avLATE_CONSENSUS_TIME) - neededWeight = parms.avMID_CONSENSUS_PCT; - else if (convergePercent_ < parms.avSTUCK_CONSENSUS_TIME) - neededWeight = parms.avLATE_CONSENSUS_PCT; - else - neededWeight = parms.avSTUCK_CONSENSUS_PCT; + // We don't track rounds for close time, so just pass 0s + auto const [neededWeight, newState] = getNeededWeight( + parms, closeTimeAvalancheState_, convergePercent_, 0, 0); + if (newState) + closeTimeAvalancheState_ = *newState; CLOG(clog) << "neededWeight " << neededWeight << ". "; int participants = currPeerPositions_.size(); @@ -1682,7 +1698,8 @@ Consensus::haveConsensus( } else { - JLOG(j_.debug()) << nodeId << " has " << peerProp.position(); + JLOG(j_.debug()) << "Proposal disagreement: Peer " << nodeId + << " has " << peerProp.position(); ++disagree; } } @@ -1692,6 +1709,17 @@ Consensus::haveConsensus( JLOG(j_.debug()) << "Checking for TX consensus: agree=" << agree << ", disagree=" << disagree; + ConsensusParms const& parms = adaptor_.parms(); + // Stalling is BAD + bool const stalled = haveCloseTimeConsensus_ && + std::ranges::all_of(result_->disputes, + [this, &parms](auto const& dispute) { + return dispute.second.stalled( + parms, + mode_.get() == ConsensusMode::proposing, + peerUnchangedCounter_); + }); + // Determine if we actually have consensus or not result_->state = checkConsensus( prevProposers_, @@ -1700,7 +1728,8 @@ Consensus::haveConsensus( currentFinished, prevRoundTime_, result_->roundTime.read(), - adaptor_.parms(), + stalled, + parms, mode_.get() == ConsensusMode::proposing, j_, clog); @@ -1711,6 +1740,33 @@ Consensus::haveConsensus( return false; } + // Consensus has taken far too long. Drop out of the round. + if (result_->state == ConsensusState::Expired) + { + static auto const minimumCounter = + parms.avalancheCutoffs.size() * parms.avMIN_ROUNDS; + std::stringstream ss; + if (establishCounter_ < minimumCounter) + { + // If each round of phaseEstablish takes a very long time, we may + // "expire" before we've given consensus enough time at each + // avalanche level to actually come to a consensus. In that case, + // keep trying. This should only happen if there are an extremely + // large number of disputes such that each round takes an inordinate + // amount of time. + + ss << "Consensus time has expired in round " << establishCounter_ + << "; continue until round " << minimumCounter << ". " + << Json::Compact{getJson(false)}; + JLOG(j_.error()) << ss.str(); + CLOG(clog) << ss.str() << ". "; + return false; + } + ss << "Consensus expired. " << Json::Compact{getJson(true)}; + JLOG(j_.error()) << ss.str(); + CLOG(clog) << ss.str() << ". "; + leaveConsensus(clog); + } // There is consensus, but we need to track if the network moved on // without us. if (result_->state == ConsensusState::MovedOn) @@ -1803,8 +1859,9 @@ Consensus::createDisputes( { Proposal_t const& peerProp = peerPos.proposal(); auto const cit = acquired_.find(peerProp.position()); - if (cit != acquired_.end()) - dtx.setVote(nodeId, cit->second.exists(txID)); + if (cit != acquired_.end() && + dtx.setVote(nodeId, cit->second.exists(txID))) + peerUnchangedCounter_ = 0; } adaptor_.share(dtx.tx()); @@ -1829,7 +1886,8 @@ Consensus::updateDisputes(NodeID_t const& node, TxSet_t const& other) for (auto& it : result_->disputes) { auto& d = it.second; - d.setVote(node, other.exists(d.tx().id())); + if (d.setVote(node, other.exists(d.tx().id()))) + peerUnchangedCounter_ = 0; } } diff --git a/src/xrpld/consensus/ConsensusParms.h b/src/xrpld/consensus/ConsensusParms.h index a0b6c6be8d4..9bfacfb8d6f 100644 --- a/src/xrpld/consensus/ConsensusParms.h +++ b/src/xrpld/consensus/ConsensusParms.h @@ -20,8 +20,13 @@ #ifndef RIPPLE_CONSENSUS_CONSENSUS_PARMS_H_INCLUDED #define RIPPLE_CONSENSUS_CONSENSUS_PARMS_H_INCLUDED +#include + #include #include +#include +#include +#include namespace ripple { @@ -43,7 +48,7 @@ struct ConsensusParms This is a safety to protect against very old validations and the time it takes to adjust the close time accuracy window. */ - std::chrono::seconds validationVALID_WALL = std::chrono::minutes{5}; + std::chrono::seconds const validationVALID_WALL = std::chrono::minutes{5}; /** Duration a validation remains current after first observed. @@ -51,33 +56,34 @@ struct ConsensusParms first saw it. This provides faster recovery in very rare cases where the number of validations produced by the network is lower than normal */ - std::chrono::seconds validationVALID_LOCAL = std::chrono::minutes{3}; + std::chrono::seconds const validationVALID_LOCAL = std::chrono::minutes{3}; /** Duration pre-close in which validations are acceptable. The number of seconds before a close time that we consider a validation acceptable. This protects against extreme clock errors */ - std::chrono::seconds validationVALID_EARLY = std::chrono::minutes{3}; + std::chrono::seconds const validationVALID_EARLY = std::chrono::minutes{3}; //! How long we consider a proposal fresh - std::chrono::seconds proposeFRESHNESS = std::chrono::seconds{20}; + std::chrono::seconds const proposeFRESHNESS = std::chrono::seconds{20}; //! How often we force generating a new proposal to keep ours fresh - std::chrono::seconds proposeINTERVAL = std::chrono::seconds{12}; + std::chrono::seconds const proposeINTERVAL = std::chrono::seconds{12}; //------------------------------------------------------------------------- // Consensus durations are relative to the internal Consensus clock and use // millisecond resolution. //! The percentage threshold above which we can declare consensus. - std::size_t minCONSENSUS_PCT = 80; + std::size_t const minCONSENSUS_PCT = 80; //! The duration a ledger may remain idle before closing - std::chrono::milliseconds ledgerIDLE_INTERVAL = std::chrono::seconds{15}; + std::chrono::milliseconds const ledgerIDLE_INTERVAL = + std::chrono::seconds{15}; //! The number of seconds we wait minimum to ensure participation - std::chrono::milliseconds ledgerMIN_CONSENSUS = + std::chrono::milliseconds const ledgerMIN_CONSENSUS = std::chrono::milliseconds{1950}; /** The maximum amount of time to spend pausing for laggards. @@ -86,13 +92,26 @@ struct ConsensusParms * validators don't appear to be offline that are merely waiting for * laggards. */ - std::chrono::milliseconds ledgerMAX_CONSENSUS = std::chrono::seconds{15}; + std::chrono::milliseconds const ledgerMAX_CONSENSUS = + std::chrono::seconds{15}; //! Minimum number of seconds to wait to ensure others have computed the LCL - std::chrono::milliseconds ledgerMIN_CLOSE = std::chrono::seconds{2}; + std::chrono::milliseconds const ledgerMIN_CLOSE = std::chrono::seconds{2}; //! How often we check state or change positions - std::chrono::milliseconds ledgerGRANULARITY = std::chrono::seconds{1}; + std::chrono::milliseconds const ledgerGRANULARITY = std::chrono::seconds{1}; + + //! How long to wait before completely abandoning consensus + std::size_t const ledgerABANDON_CONSENSUS_FACTOR = 10; + + /** + * Maximum amount of time to give a consensus round + * + * Does not include the time to build the LCL, so there is no reason for a + * round to go this long, regardless of how big the ledger is. + */ + std::chrono::milliseconds const ledgerABANDON_CONSENSUS = + std::chrono::seconds{120}; /** The minimum amount of time to consider the previous round to have taken. @@ -104,38 +123,80 @@ struct ConsensusParms twice the interval between proposals (0.7s) divided by the interval between mid and late consensus ([85-50]/100). */ - std::chrono::milliseconds avMIN_CONSENSUS_TIME = std::chrono::seconds{5}; + std::chrono::milliseconds const avMIN_CONSENSUS_TIME = + std::chrono::seconds{5}; //------------------------------------------------------------------------------ // Avalanche tuning // As a function of the percent this round's duration is of the prior round, // we increase the threshold for yes votes to add a transaction to our // position. + enum AvalancheState { init, mid, late, stuck }; + struct AvalancheCutoff + { + int const consensusTime; + std::size_t const consensusPct; + AvalancheState const next; + }; + //! Map the consensus requirement avalanche state to the amount of time that + //! must pass before moving to that state, the agreement percentage required + //! at that state, and the next state. "stuck" loops back on itself because + //! once we're stuck, we're stuck. + //! This structure allows for "looping" of states if needed. + std::map const avalancheCutoffs{ + // {state, {time, percent, nextState}}, + // Initial state: 50% of nodes must vote yes + {init, {0, 50, mid}}, + // mid-consensus starts after 50% of the previous round time, and + // requires 65% yes + {mid, {50, 65, late}}, + // late consensus starts after 85% time, and requires 70% yes + {late, {85, 70, stuck}}, + // we're stuck after 2x time, requires 95% yes votes + {stuck, {200, 95, stuck}}, + }; - //! Percentage of nodes on our UNL that must vote yes - std::size_t avINIT_CONSENSUS_PCT = 50; - - //! Percentage of previous round duration before we advance - std::size_t avMID_CONSENSUS_TIME = 50; - - //! Percentage of nodes that most vote yes after advancing - std::size_t avMID_CONSENSUS_PCT = 65; - - //! Percentage of previous round duration before we advance - std::size_t avLATE_CONSENSUS_TIME = 85; - - //! Percentage of nodes that most vote yes after advancing - std::size_t avLATE_CONSENSUS_PCT = 70; - - //! Percentage of previous round duration before we are stuck - std::size_t avSTUCK_CONSENSUS_TIME = 200; + //! Percentage of nodes required to reach agreement on ledger close time + std::size_t const avCT_CONSENSUS_PCT = 75; - //! Percentage of nodes that must vote yes after we are stuck - std::size_t avSTUCK_CONSENSUS_PCT = 95; + //! Number of rounds before certain actions can happen. + // (Moving to the next avalanche level, considering that votes are stalled + // without consensus.) + std::size_t const avMIN_ROUNDS = 2; - //! Percentage of nodes required to reach agreement on ledger close time - std::size_t avCT_CONSENSUS_PCT = 75; + //! Number of rounds before a stuck vote is considered unlikely to change + //! because voting stalled + std::size_t const avSTALLED_ROUNDS = 4; }; +inline std::pair> +getNeededWeight( + ConsensusParms const& p, + ConsensusParms::AvalancheState currentState, + int percentTime, + std::size_t currentRounds, + std::size_t minimumRounds) +{ + // at() can throw, but the map is built by hand to ensure all valid + // values are available. + auto const& currentCutoff = p.avalancheCutoffs.at(currentState); + // Should we consider moving to the next state? + if (currentCutoff.next != currentState && currentRounds >= minimumRounds) + { + // at() can throw, but the map is built by hand to ensure all + // valid values are available. + auto const& nextCutoff = p.avalancheCutoffs.at(currentCutoff.next); + // See if enough time has passed to move on to the next. + XRPL_ASSERT( + nextCutoff.consensusTime >= currentCutoff.consensusTime, + "ripple::getNeededWeight : next state valid"); + if (percentTime >= nextCutoff.consensusTime) + { + return {nextCutoff.consensusPct, currentCutoff.next}; + } + } + return {currentCutoff.consensusPct, {}}; +} + } // namespace ripple #endif diff --git a/src/xrpld/consensus/ConsensusProposal.h b/src/xrpld/consensus/ConsensusProposal.h index 18dcf60006b..6734d59205a 100644 --- a/src/xrpld/consensus/ConsensusProposal.h +++ b/src/xrpld/consensus/ConsensusProposal.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED #define RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED @@ -23,7 +24,9 @@ #include #include #include +#include #include + #include #include #include diff --git a/src/xrpld/consensus/ConsensusTypes.h b/src/xrpld/consensus/ConsensusTypes.h index ba8e0a8b1ac..ccb421abed0 100644 --- a/src/xrpld/consensus/ConsensusTypes.h +++ b/src/xrpld/consensus/ConsensusTypes.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include @@ -186,6 +188,7 @@ struct ConsensusCloseTimes enum class ConsensusState { No, //!< We do not have consensus MovedOn, //!< The network has consensus without us + Expired, //!< Consensus time limit has hard-expired Yes //!< We have consensus along with the network }; @@ -235,7 +238,7 @@ struct ConsensusResult ConsensusTimer roundTime; // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn + // will be either Yes or MovedOn or Expired ConsensusState state = ConsensusState::No; // The number of peers proposing during the round diff --git a/src/xrpld/consensus/DisputedTx.h b/src/xrpld/consensus/DisputedTx.h index bffb1009323..513f2408294 100644 --- a/src/xrpld/consensus/DisputedTx.h +++ b/src/xrpld/consensus/DisputedTx.h @@ -21,14 +21,12 @@ #define RIPPLE_APP_CONSENSUS_IMPL_DISPUTEDTX_H_INCLUDED #include + #include -#include #include #include -#include -#include + #include -#include namespace ripple { @@ -84,6 +82,51 @@ class DisputedTx return ourVote_; } + //! Are we and our peers "stalled" where we probably won't change + //! our vote? + bool + stalled(ConsensusParms const& p, bool proposing, int peersUnchanged) const + { + // at() can throw, but the map is built by hand to ensure all valid + // values are available. + auto const& currentCutoff = p.avalancheCutoffs.at(avalancheState_); + auto const& nextCutoff = p.avalancheCutoffs.at(currentCutoff.next); + + // We're have not reached the final avalanche state, or been there long + // enough, so there's room for change. Check the times in case the state + // machine is altered to allow states to loop. + if (nextCutoff.consensusTime > currentCutoff.consensusTime || + avalancheCounter_ < p.avMIN_ROUNDS) + return false; + + // We've haven't had this vote for minimum rounds yet. Things could + // change. + if (proposing && currentVoteCounter_ < p.avMIN_ROUNDS) + return false; + + // If we or any peers have changed a vote in several rounds, then + // things could still change. But if _either_ has not changed in that + // long, we're unlikely to change our vote any time soon. (This prevents + // a malicious peer from flip-flopping a vote to prevent consensus.) + if (peersUnchanged < p.avSTALLED_ROUNDS && + (proposing && currentVoteCounter_ < p.avSTALLED_ROUNDS)) + return false; + + // Does this transaction have more than 80% agreement + + // Compute the percentage of nodes voting 'yes' (possibly including us) + int const support = (yays_ + (proposing && ourVote_ ? 1 : 0)) * 100; + int total = nays_ + yays_ + (proposing ? 1 : 0); + if (!total) + // There are no votes, so we know nothing + return false; + int const weight = support / total; + // Returns true if the tx has more than minCONSENSUS_PCT (80) percent + // agreement. Either voting for _or_ voting against the tx. + return weight > p.minCONSENSUS_PCT || + weight < (100 - p.minCONSENSUS_PCT); + } + //! The disputed transaction. Tx_t const& tx() const @@ -102,8 +145,12 @@ class DisputedTx @param peer Identifier of peer. @param votesYes Whether peer votes to include the disputed transaction. + + @return bool Whether the peer changed its vote. (A new vote counts as a + change.) */ - void + [[nodiscard]] + bool setVote(NodeID_t const& peer, bool votesYes); /** Remove a peer's vote @@ -137,12 +184,18 @@ class DisputedTx bool ourVote_; //< Our vote (true is yes) Tx_t tx_; //< Transaction under dispute Map_t votes_; //< Map from NodeID to vote + //! The number of rounds we've gone without changing our vote + std::size_t currentVoteCounter_ = 0; + //! Which minimum acceptance percentage phase we are currently in + ConsensusParms::AvalancheState avalancheState_ = ConsensusParms::init; + //! How long we have been in the current acceptance phase + std::size_t avalancheCounter_ = 0; beast::Journal const j_; }; // Track a peer's yes/no vote on a particular disputed tx_ template -void +bool DisputedTx::setVote(NodeID_t const& peer, bool votesYes) { auto const [it, inserted] = votes_.insert(std::make_pair(peer, votesYes)); @@ -160,6 +213,7 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) JLOG(j_.debug()) << "Peer " << peer << " votes NO on " << tx_.id(); ++nays_; } + return true; } // changes vote to yes else if (votesYes && !it->second) @@ -168,6 +222,7 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) --nays_; ++yays_; it->second = true; + return true; } // changes vote to no else if (!votesYes && it->second) @@ -176,7 +231,9 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) ++nays_; --yays_; it->second = false; + return true; } + return false; } // Remove a peer's vote on this disputed transaction @@ -213,21 +270,26 @@ DisputedTx::updateVote( bool newPosition; int weight; + // When proposing, to prevent avalanche stalls, we increase the needed + // weight slightly over time. We also need to ensure that the consensus has + // made a minimum number of attempts at each "state" before moving + // to the next. + // Proposing or not, we need to keep track of which state we've reached so + // we can determine if the vote has stalled. + auto const [requiredPct, newState] = getNeededWeight( + p, avalancheState_, percentTime, ++avalancheCounter_, p.avMIN_ROUNDS); + if (newState) + { + avalancheState_ = *newState; + avalancheCounter_ = 0; + } + if (proposing) // give ourselves full weight { // This is basically the percentage of nodes voting 'yes' (including us) weight = (yays_ * 100 + (ourVote_ ? 100 : 0)) / (nays_ + yays_ + 1); - // To prevent avalanche stalls, we increase the needed weight slightly - // over time. - if (percentTime < p.avMID_CONSENSUS_TIME) - newPosition = weight > p.avINIT_CONSENSUS_PCT; - else if (percentTime < p.avLATE_CONSENSUS_TIME) - newPosition = weight > p.avMID_CONSENSUS_PCT; - else if (percentTime < p.avSTUCK_CONSENSUS_TIME) - newPosition = weight > p.avLATE_CONSENSUS_PCT; - else - newPosition = weight > p.avSTUCK_CONSENSUS_PCT; + newPosition = weight > requiredPct; } else { @@ -238,13 +300,16 @@ DisputedTx::updateVote( if (newPosition == ourVote_) { - JLOG(j_.info()) << "No change (" << (ourVote_ ? "YES" : "NO") - << ") : weight " << weight << ", percent " - << percentTime; + ++currentVoteCounter_; + JLOG(j_.info()) << "No change (" << (ourVote_ ? "YES" : "NO") << ") on " + << tx_.id() << " : weight " << weight << ", percent " + << percentTime + << ", round(s) with this vote: " << currentVoteCounter_; JLOG(j_.debug()) << Json::Compact{getJson()}; return false; } + currentVoteCounter_ = 0; ourVote_ = newPosition; JLOG(j_.debug()) << "We now vote " << (ourVote_ ? "YES" : "NO") << " on " << tx_.id(); diff --git a/src/xrpld/consensus/LedgerTiming.h b/src/xrpld/consensus/LedgerTiming.h index b3ef5ee59c2..434f19b0818 100644 --- a/src/xrpld/consensus/LedgerTiming.h +++ b/src/xrpld/consensus/LedgerTiming.h @@ -22,8 +22,8 @@ #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/consensus/Validations.h b/src/xrpld/consensus/Validations.h index 582d36cbcd9..c333aeaefd7 100644 --- a/src/xrpld/consensus/Validations.h +++ b/src/xrpld/consensus/Validations.h @@ -21,6 +21,7 @@ #define RIPPLE_CONSENSUS_VALIDATIONS_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/core/ClosureCounter.h b/src/xrpld/core/ClosureCounter.h index 9b1a69bf95d..92117a91c45 100644 --- a/src/xrpld/core/ClosureCounter.h +++ b/src/xrpld/core/ClosureCounter.h @@ -21,11 +21,11 @@ #define RIPPLE_CORE_CLOSURE_COUNTER_H_INCLUDED #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index c0cedcc1a47..8e29ecdcf41 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -24,20 +24,13 @@ #include #include #include -#include #include // VFALCO Breaks levelization -#include #include // VFALCO FIX: This include should not be here -#include -#include -#include #include -#include #include #include -#include #include #include #include diff --git a/src/xrpld/core/DatabaseCon.h b/src/xrpld/core/DatabaseCon.h index 8c6ba730320..299861e1b03 100644 --- a/src/xrpld/core/DatabaseCon.h +++ b/src/xrpld/core/DatabaseCon.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/xrpld/core/Job.h b/src/xrpld/core/Job.h index 76d26c39e72..66048f4f21a 100644 --- a/src/xrpld/core/Job.h +++ b/src/xrpld/core/Job.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include diff --git a/src/xrpld/core/JobQueue.h b/src/xrpld/core/JobQueue.h index 06f90dd1c4e..051c2982514 100644 --- a/src/xrpld/core/JobQueue.h +++ b/src/xrpld/core/JobQueue.h @@ -24,11 +24,11 @@ #include #include #include + #include #include + #include -#include // workaround for boost 1.72 bug -#include // workaround for boost 1.72 bug namespace ripple { diff --git a/src/xrpld/core/JobTypeData.h b/src/xrpld/core/JobTypeData.h index 43d63895d8b..89532c15d9f 100644 --- a/src/xrpld/core/JobTypeData.h +++ b/src/xrpld/core/JobTypeData.h @@ -21,6 +21,7 @@ #define RIPPLE_CORE_JOBTYPEDATA_H_INCLUDED #include + #include #include diff --git a/src/xrpld/core/JobTypes.h b/src/xrpld/core/JobTypes.h index 29b096b7a3b..29863893d97 100644 --- a/src/xrpld/core/JobTypes.h +++ b/src/xrpld/core/JobTypes.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/core/LoadEvent.h b/src/xrpld/core/LoadEvent.h index 458c8a0cd6e..3b5f69194fa 100644 --- a/src/xrpld/core/LoadEvent.h +++ b/src/xrpld/core/LoadEvent.h @@ -21,7 +21,6 @@ #define RIPPLE_CORE_LOADEVENT_H_INCLUDED #include -#include #include namespace ripple { diff --git a/src/xrpld/core/LoadMonitor.h b/src/xrpld/core/LoadMonitor.h index e57429da23b..c65a0e68707 100644 --- a/src/xrpld/core/LoadMonitor.h +++ b/src/xrpld/core/LoadMonitor.h @@ -21,8 +21,10 @@ #define RIPPLE_CORE_LOADMONITOR_H_INCLUDED #include + #include #include + #include #include diff --git a/src/xrpld/core/SociDB.h b/src/xrpld/core/SociDB.h index 20f210d4e38..a741504e971 100644 --- a/src/xrpld/core/SociDB.h +++ b/src/xrpld/core/SociDB.h @@ -34,10 +34,13 @@ #endif #include + #include + #define SOCI_USE_BOOST -#include #include + +#include #include #include diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index 6a34b1db91f..fb4a4aab211 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include @@ -28,11 +29,12 @@ #include #include #include + #include #include #include #include -#include + #include #include #include diff --git a/src/xrpld/core/detail/DatabaseCon.cpp b/src/xrpld/core/detail/DatabaseCon.cpp index 6d49c647a6f..89e4daf90e0 100644 --- a/src/xrpld/core/detail/DatabaseCon.cpp +++ b/src/xrpld/core/detail/DatabaseCon.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/core/detail/Job.cpp b/src/xrpld/core/detail/Job.cpp index 17f600a4f41..d62f49ff494 100644 --- a/src/xrpld/core/detail/Job.cpp +++ b/src/xrpld/core/detail/Job.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/xrpld/core/detail/JobQueue.cpp b/src/xrpld/core/detail/JobQueue.cpp index 5eb1f24d43a..1ea1df51abb 100644 --- a/src/xrpld/core/detail/JobQueue.cpp +++ b/src/xrpld/core/detail/JobQueue.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/xrpld/core/detail/LoadEvent.cpp b/src/xrpld/core/detail/LoadEvent.cpp index 2602c0691fc..bee2a145791 100644 --- a/src/xrpld/core/detail/LoadEvent.cpp +++ b/src/xrpld/core/detail/LoadEvent.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/core/detail/LoadMonitor.cpp b/src/xrpld/core/detail/LoadMonitor.cpp index 80b08bbdfc3..98fa959d6ca 100644 --- a/src/xrpld/core/detail/LoadMonitor.cpp +++ b/src/xrpld/core/detail/LoadMonitor.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/core/detail/SociDB.cpp b/src/xrpld/core/detail/SociDB.cpp index 94f9098d9c0..96b1f97977f 100644 --- a/src/xrpld/core/detail/SociDB.cpp +++ b/src/xrpld/core/detail/SociDB.cpp @@ -23,15 +23,18 @@ #endif #include -#include #include #include + #include #include + #include -#include + #include +#include + namespace ripple { static auto checkpointPageCount = 1000; diff --git a/src/xrpld/core/detail/Workers.cpp b/src/xrpld/core/detail/Workers.cpp index 7286f378e85..53b5944ac00 100644 --- a/src/xrpld/core/detail/Workers.cpp +++ b/src/xrpld/core/detail/Workers.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/core/detail/Workers.h b/src/xrpld/core/detail/Workers.h index 3645d4fbcf0..3f41e382b03 100644 --- a/src/xrpld/core/detail/Workers.h +++ b/src/xrpld/core/detail/Workers.h @@ -21,7 +21,9 @@ #define RIPPLE_CORE_WORKERS_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/ledger/ApplyView.h b/src/xrpld/ledger/ApplyView.h index e99e8b29763..1abff33be09 100644 --- a/src/xrpld/ledger/ApplyView.h +++ b/src/xrpld/ledger/ApplyView.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index 74ee2908295..1c282565b17 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/ledger/BookDirs.h b/src/xrpld/ledger/BookDirs.h index 2c27a5b6596..dc58905c5a2 100644 --- a/src/xrpld/ledger/BookDirs.h +++ b/src/xrpld/ledger/BookDirs.h @@ -22,6 +22,8 @@ #include +#include + namespace ripple { class BookDirs diff --git a/src/xrpld/ledger/CachedView.h b/src/xrpld/ledger/CachedView.h index fd921c63ca9..ae59312f98e 100644 --- a/src/xrpld/ledger/CachedView.h +++ b/src/xrpld/ledger/CachedView.h @@ -22,9 +22,9 @@ #include #include + #include -#include -#include + #include #include diff --git a/src/xrpld/ledger/Dir.h b/src/xrpld/ledger/Dir.h index 0e92d7dbca6..d3a52558fd8 100644 --- a/src/xrpld/ledger/Dir.h +++ b/src/xrpld/ledger/Dir.h @@ -21,6 +21,7 @@ #define RIPPLE_LEDGER_DIR_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/ledger/OpenView.h b/src/xrpld/ledger/OpenView.h index c8e1911bf96..ecc618e185d 100644 --- a/src/xrpld/ledger/OpenView.h +++ b/src/xrpld/ledger/OpenView.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/ledger/PaymentSandbox.h b/src/xrpld/ledger/PaymentSandbox.h index d7299b2efbf..a41a0211a29 100644 --- a/src/xrpld/ledger/PaymentSandbox.h +++ b/src/xrpld/ledger/PaymentSandbox.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/src/xrpld/ledger/RawView.h b/src/xrpld/ledger/RawView.h index cd9bcff8761..fb6dcffe06e 100644 --- a/src/xrpld/ledger/RawView.h +++ b/src/xrpld/ledger/RawView.h @@ -21,11 +21,9 @@ #define RIPPLE_LEDGER_RAWVIEW_H_INCLUDED #include + #include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/ledger/ReadView.h b/src/xrpld/ledger/ReadView.h index fb695b9a360..53e12083f34 100644 --- a/src/xrpld/ledger/ReadView.h +++ b/src/xrpld/ledger/ReadView.h @@ -21,11 +21,9 @@ #define RIPPLE_LEDGER_READVIEW_H_INCLUDED #include + #include #include -#include -#include -#include #include #include #include @@ -35,9 +33,8 @@ #include #include #include -#include + #include -#include #include #include diff --git a/src/xrpld/ledger/View.h b/src/xrpld/ledger/View.h index aca3f9fa6d8..85aa02f1b4c 100644 --- a/src/xrpld/ledger/View.h +++ b/src/xrpld/ledger/View.h @@ -20,27 +20,23 @@ #ifndef RIPPLE_LEDGER_VIEW_H_INCLUDED #define RIPPLE_LEDGER_VIEW_H_INCLUDED -#include #include #include -#include #include + #include #include #include #include #include #include -#include #include #include + #include #include -#include #include -#include - namespace ripple { enum class WaiveTransferFee : bool { No = false, Yes }; diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 2c76b9b587d..c11a72d7829 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index b95e41363ce..b1bac733fc8 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ApplyView.cpp b/src/xrpld/ledger/detail/ApplyView.cpp index 8b491bdcb2b..3191b47cbbf 100644 --- a/src/xrpld/ledger/detail/ApplyView.cpp +++ b/src/xrpld/ledger/detail/ApplyView.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyViewBase.cpp b/src/xrpld/ledger/detail/ApplyViewBase.cpp index 647927ae965..1d93eae7aac 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.cpp +++ b/src/xrpld/ledger/detail/ApplyViewBase.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/ledger/detail/ApplyViewBase.h b/src/xrpld/ledger/detail/ApplyViewBase.h index 8cc38e41430..f9c9c80af04 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.h +++ b/src/xrpld/ledger/detail/ApplyViewBase.h @@ -21,9 +21,9 @@ #define RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index b9b333eb8b8..74b71c8324f 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/ledger/detail/BookDirs.cpp b/src/xrpld/ledger/detail/BookDirs.cpp index f584db89e84..41a14945a65 100644 --- a/src/xrpld/ledger/detail/BookDirs.cpp +++ b/src/xrpld/ledger/detail/BookDirs.cpp @@ -20,6 +20,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/CachedView.cpp b/src/xrpld/ledger/detail/CachedView.cpp index 0463e5de05c..5d6d3546884 100644 --- a/src/xrpld/ledger/detail/CachedView.cpp +++ b/src/xrpld/ledger/detail/CachedView.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/ledger/detail/OpenView.cpp b/src/xrpld/ledger/detail/OpenView.cpp index 619006161f8..5c62d8cef8d 100644 --- a/src/xrpld/ledger/detail/OpenView.cpp +++ b/src/xrpld/ledger/detail/OpenView.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/PaymentSandbox.cpp b/src/xrpld/ledger/detail/PaymentSandbox.cpp index 745d8a90c7a..3eab8454721 100644 --- a/src/xrpld/ledger/detail/PaymentSandbox.cpp +++ b/src/xrpld/ledger/detail/PaymentSandbox.cpp @@ -20,10 +20,9 @@ #include #include #include + #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/ledger/detail/RawStateTable.cpp b/src/xrpld/ledger/detail/RawStateTable.cpp index b93fc4a2aa6..f19eed8297d 100644 --- a/src/xrpld/ledger/detail/RawStateTable.cpp +++ b/src/xrpld/ledger/detail/RawStateTable.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ReadViewFwdRange.h b/src/xrpld/ledger/detail/ReadViewFwdRange.h index 626a5f4743e..0dab5e9464e 100644 --- a/src/xrpld/ledger/detail/ReadViewFwdRange.h +++ b/src/xrpld/ledger/detail/ReadViewFwdRange.h @@ -21,7 +21,6 @@ #define RIPPLE_LEDGER_READVIEWFWDRANGE_H_INCLUDED #include -#include #include #include diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index 85abf7fc62c..1860f614456 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -19,14 +19,15 @@ #include #include + #include #include -#include #include #include #include #include #include + #include namespace ripple { @@ -529,8 +530,7 @@ xrpLiquid( STAmount const amount = (balance < reserve) ? STAmount{0} : balance - reserve; - JLOG(j.trace()) << "accountHolds:" - << " account=" << to_string(id) + JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(id) << " amount=" << amount.getFullText() << " fullBalance=" << fullBalance.getFullText() << " balance=" << balance.getFullText() diff --git a/src/xrpld/net/AutoSocket.h b/src/xrpld/net/AutoSocket.h index be35c082461..7486d6128dc 100644 --- a/src/xrpld/net/AutoSocket.h +++ b/src/xrpld/net/AutoSocket.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/net/HTTPClient.h b/src/xrpld/net/HTTPClient.h index 3b7da776ea4..2a33500aa48 100644 --- a/src/xrpld/net/HTTPClient.h +++ b/src/xrpld/net/HTTPClient.h @@ -21,7 +21,9 @@ #define RIPPLE_NET_HTTPCLIENT_H_INCLUDED #include + #include + #include #include diff --git a/src/xrpld/net/HTTPClientSSLContext.h b/src/xrpld/net/HTTPClientSSLContext.h index 64ca2461d23..2da5ac38de6 100644 --- a/src/xrpld/net/HTTPClientSSLContext.h +++ b/src/xrpld/net/HTTPClientSSLContext.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/xrpld/net/InfoSub.h b/src/xrpld/net/InfoSub.h index 08fba26ff00..c8762c31fd4 100644 --- a/src/xrpld/net/InfoSub.h +++ b/src/xrpld/net/InfoSub.h @@ -21,12 +21,12 @@ #define RIPPLE_NET_INFOSUB_H_INCLUDED #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/net/RPCCall.h b/src/xrpld/net/RPCCall.h index 9c78bb20d25..612d80c6639 100644 --- a/src/xrpld/net/RPCCall.h +++ b/src/xrpld/net/RPCCall.h @@ -21,13 +21,15 @@ #define RIPPLE_NET_RPCCALL_H_INCLUDED #include + #include #include + #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/net/RPCSub.h b/src/xrpld/net/RPCSub.h index b2a751d4a19..9730ca2dec2 100644 --- a/src/xrpld/net/RPCSub.h +++ b/src/xrpld/net/RPCSub.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/net/RegisterSSLCerts.h b/src/xrpld/net/RegisterSSLCerts.h index 88664139f19..58c8c6c82d2 100644 --- a/src/xrpld/net/RegisterSSLCerts.h +++ b/src/xrpld/net/RegisterSSLCerts.h @@ -21,6 +21,7 @@ #define RIPPLE_NET_REGISTER_SSL_CERTS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/HTTPClient.cpp b/src/xrpld/net/detail/HTTPClient.cpp index 61c2875a5fa..0ead4cf0dc3 100644 --- a/src/xrpld/net/detail/HTTPClient.cpp +++ b/src/xrpld/net/detail/HTTPClient.cpp @@ -20,14 +20,15 @@ #include #include #include + #include -#include -#include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/InfoSub.cpp b/src/xrpld/net/detail/InfoSub.cpp index e22a3704802..7acd7f07a79 100644 --- a/src/xrpld/net/detail/InfoSub.cpp +++ b/src/xrpld/net/detail/InfoSub.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/net/detail/RPCCall.cpp b/src/xrpld/net/detail/RPCCall.cpp index c91005a66db..814ea362e4f 100644 --- a/src/xrpld/net/detail/RPCCall.cpp +++ b/src/xrpld/net/detail/RPCCall.cpp @@ -23,17 +23,16 @@ #include #include #include + #include #include #include #include #include #include -#include #include #include #include -#include #include #include #include @@ -41,7 +40,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/net/detail/RPCSub.cpp b/src/xrpld/net/detail/RPCSub.cpp index 13bdf9119b4..96f91cdcf59 100644 --- a/src/xrpld/net/detail/RPCSub.cpp +++ b/src/xrpld/net/detail/RPCSub.cpp @@ -19,10 +19,12 @@ #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/RegisterSSLCerts.cpp b/src/xrpld/net/detail/RegisterSSLCerts.cpp index ede42b03af2..0dbf036e010 100644 --- a/src/xrpld/net/detail/RegisterSSLCerts.cpp +++ b/src/xrpld/net/detail/RegisterSSLCerts.cpp @@ -16,17 +16,20 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include #if BOOST_OS_WINDOWS #include #include -#include + #include #include #include + #include + +#include #endif namespace ripple { diff --git a/src/xrpld/nodestore/Backend.h b/src/xrpld/nodestore/Backend.h index 29f37553327..10978954165 100644 --- a/src/xrpld/nodestore/Backend.h +++ b/src/xrpld/nodestore/Backend.h @@ -21,7 +21,7 @@ #define RIPPLE_NODESTORE_BACKEND_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/Database.h b/src/xrpld/nodestore/Database.h index c22ede82481..e1aa801c44f 100644 --- a/src/xrpld/nodestore/Database.h +++ b/src/xrpld/nodestore/Database.h @@ -23,11 +23,12 @@ #include #include #include -#include + +#include +#include #include #include -#include namespace ripple { diff --git a/src/xrpld/nodestore/Factory.h b/src/xrpld/nodestore/Factory.h index 8853a6ce9a5..b0768907da4 100644 --- a/src/xrpld/nodestore/Factory.h +++ b/src/xrpld/nodestore/Factory.h @@ -22,7 +22,10 @@ #include #include + +#include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/NodeObject.h b/src/xrpld/nodestore/NodeObject.h index f5a1fdb075d..dd7f4c4dc7d 100644 --- a/src/xrpld/nodestore/NodeObject.h +++ b/src/xrpld/nodestore/NodeObject.h @@ -22,7 +22,7 @@ #include #include -#include +#include // VFALCO NOTE Intentionally not in the NodeStore namespace diff --git a/src/xrpld/nodestore/Scheduler.h b/src/xrpld/nodestore/Scheduler.h index 236c2260eed..663db7eb74b 100644 --- a/src/xrpld/nodestore/Scheduler.h +++ b/src/xrpld/nodestore/Scheduler.h @@ -21,6 +21,7 @@ #define RIPPLE_NODESTORE_SCHEDULER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/Types.h b/src/xrpld/nodestore/Types.h index a5792fe7df3..5e22eb4ddf1 100644 --- a/src/xrpld/nodestore/Types.h +++ b/src/xrpld/nodestore/Types.h @@ -21,7 +21,7 @@ #define RIPPLE_NODESTORE_TYPES_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/backend/MemoryFactory.cpp b/src/xrpld/nodestore/backend/MemoryFactory.cpp index aac305cea07..dc3106cc91f 100644 --- a/src/xrpld/nodestore/backend/MemoryFactory.cpp +++ b/src/xrpld/nodestore/backend/MemoryFactory.cpp @@ -19,9 +19,12 @@ #include #include + #include + #include #include + #include #include #include diff --git a/src/xrpld/nodestore/backend/NuDBFactory.cpp b/src/xrpld/nodestore/backend/NuDBFactory.cpp index 24ebffd33a2..2f4e9d502e3 100644 --- a/src/xrpld/nodestore/backend/NuDBFactory.cpp +++ b/src/xrpld/nodestore/backend/NuDBFactory.cpp @@ -22,15 +22,19 @@ #include #include #include + #include #include + #include + +#include + #include #include #include #include #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/backend/NullFactory.cpp b/src/xrpld/nodestore/backend/NullFactory.cpp index 47254cd50fc..5aae8ca7cf7 100644 --- a/src/xrpld/nodestore/backend/NullFactory.cpp +++ b/src/xrpld/nodestore/backend/NullFactory.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/backend/RocksDBFactory.cpp b/src/xrpld/nodestore/backend/RocksDBFactory.cpp index 2034128949f..0e421cd6bdb 100644 --- a/src/xrpld/nodestore/backend/RocksDBFactory.cpp +++ b/src/xrpld/nodestore/backend/RocksDBFactory.cpp @@ -20,13 +20,13 @@ #include #if RIPPLE_ROCKSDB_AVAILABLE - #include // VFALCO Bad dependency #include #include #include #include #include + #include #include #include @@ -191,8 +191,12 @@ class RocksDBBackend : public Backend, public BatchWriter::Callback if (keyValues.exists("bbt_options")) { + rocksdb::ConfigOptions config_options; auto const s = rocksdb::GetBlockBasedTableOptionsFromString( - table_options, get(keyValues, "bbt_options"), &table_options); + config_options, + table_options, + get(keyValues, "bbt_options"), + &table_options); if (!s.ok()) Throw( std::string("Unable to set RocksDB bbt_options: ") + diff --git a/src/xrpld/nodestore/detail/BatchWriter.h b/src/xrpld/nodestore/detail/BatchWriter.h index c48002f4f80..15ba508f64c 100644 --- a/src/xrpld/nodestore/detail/BatchWriter.h +++ b/src/xrpld/nodestore/detail/BatchWriter.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/nodestore/detail/Database.cpp b/src/xrpld/nodestore/detail/Database.cpp index 7564ca60b52..4edafcddca1 100644 --- a/src/xrpld/nodestore/detail/Database.cpp +++ b/src/xrpld/nodestore/detail/Database.cpp @@ -18,11 +18,13 @@ //============================================================================== #include + #include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp b/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp index 85e5d3c0da9..2502d52815f 100644 --- a/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp +++ b/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/DatabaseNodeImp.h b/src/xrpld/nodestore/detail/DatabaseNodeImp.h index d90f02ce877..160bf92d5ed 100644 --- a/src/xrpld/nodestore/detail/DatabaseNodeImp.h +++ b/src/xrpld/nodestore/detail/DatabaseNodeImp.h @@ -21,6 +21,7 @@ #define RIPPLE_NODESTORE_DATABASENODEIMP_H_INCLUDED #include + #include #include diff --git a/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp b/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp index c7e6c8c349f..a4828ab2c22 100644 --- a/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp +++ b/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/DecodedBlob.cpp b/src/xrpld/nodestore/detail/DecodedBlob.cpp index fbf9f532a0a..adec27a68f2 100644 --- a/src/xrpld/nodestore/detail/DecodedBlob.cpp +++ b/src/xrpld/nodestore/detail/DecodedBlob.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/EncodedBlob.h b/src/xrpld/nodestore/detail/EncodedBlob.h index 01b167159e7..a238f2b8560 100644 --- a/src/xrpld/nodestore/detail/EncodedBlob.h +++ b/src/xrpld/nodestore/detail/EncodedBlob.h @@ -21,9 +21,11 @@ #define RIPPLE_NODESTORE_ENCODEDBLOB_H_INCLUDED #include -#include + #include + #include + #include #include #include diff --git a/src/xrpld/nodestore/detail/NodeObject.cpp b/src/xrpld/nodestore/detail/NodeObject.cpp index f633014b09f..0e81c047c6c 100644 --- a/src/xrpld/nodestore/detail/NodeObject.cpp +++ b/src/xrpld/nodestore/detail/NodeObject.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/codec.h b/src/xrpld/nodestore/detail/codec.h index f19672b8123..7bc3ab2caa3 100644 --- a/src/xrpld/nodestore/detail/codec.h +++ b/src/xrpld/nodestore/detail/codec.h @@ -25,15 +25,18 @@ #include #include + #include #include #include + +#include + +#include + #include #include -#include -#include #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/varint.h b/src/xrpld/nodestore/detail/varint.h index 75d8e58a751..6ccbe68b87f 100644 --- a/src/xrpld/nodestore/detail/varint.h +++ b/src/xrpld/nodestore/detail/varint.h @@ -20,8 +20,9 @@ #ifndef BEAST_NUDB_VARINT_H_INCLUDED #define BEAST_NUDB_VARINT_H_INCLUDED -#include #include + +#include #include namespace ripple { diff --git a/src/xrpld/overlay/Cluster.h b/src/xrpld/overlay/Cluster.h index 42bda586c0d..a2fd7f9c53b 100644 --- a/src/xrpld/overlay/Cluster.h +++ b/src/xrpld/overlay/Cluster.h @@ -20,18 +20,16 @@ #ifndef RIPPLE_OVERLAY_CLUSTER_H_INCLUDED #define RIPPLE_OVERLAY_CLUSTER_H_INCLUDED -#include #include + #include #include -#include #include #include + #include -#include #include #include -#include namespace ripple { diff --git a/src/xrpld/overlay/ClusterNode.h b/src/xrpld/overlay/ClusterNode.h index 1ca78208dd5..02b4709c52b 100644 --- a/src/xrpld/overlay/ClusterNode.h +++ b/src/xrpld/overlay/ClusterNode.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/overlay/Compression.h b/src/xrpld/overlay/Compression.h index c7437badc4d..3a278a3403d 100644 --- a/src/xrpld/overlay/Compression.h +++ b/src/xrpld/overlay/Compression.h @@ -22,7 +22,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/overlay/Message.h b/src/xrpld/overlay/Message.h index 247e53ec9fd..92e2824327f 100644 --- a/src/xrpld/overlay/Message.h +++ b/src/xrpld/overlay/Message.h @@ -21,17 +21,13 @@ #define RIPPLE_OVERLAY_MESSAGE_H_INCLUDED #include + #include #include #include -#include -#include + #include -#include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/overlay/Overlay.h b/src/xrpld/overlay/Overlay.h index 9aff1560682..7f5c858f67a 100644 --- a/src/xrpld/overlay/Overlay.h +++ b/src/xrpld/overlay/Overlay.h @@ -21,21 +21,18 @@ #define RIPPLE_OVERLAY_OVERLAY_H_INCLUDED #include -#include + #include #include #include -#include + #include #include -#include #include -#include #include + #include -#include #include -#include namespace boost { namespace asio { diff --git a/src/xrpld/overlay/Peer.h b/src/xrpld/overlay/Peer.h index 2646b24a3ed..9a5bd7136ba 100644 --- a/src/xrpld/overlay/Peer.h +++ b/src/xrpld/overlay/Peer.h @@ -21,6 +21,7 @@ #define RIPPLE_OVERLAY_PEER_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/overlay/PeerReservationTable.h b/src/xrpld/overlay/PeerReservationTable.h index fb3add61f70..ddd65261615 100644 --- a/src/xrpld/overlay/PeerReservationTable.h +++ b/src/xrpld/overlay/PeerReservationTable.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff --git a/src/xrpld/overlay/PeerSet.h b/src/xrpld/overlay/PeerSet.h index aca6242f9de..6fb4b656430 100644 --- a/src/xrpld/overlay/PeerSet.h +++ b/src/xrpld/overlay/PeerSet.h @@ -23,11 +23,6 @@ #include #include #include -#include -#include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/overlay/ReduceRelayCommon.h b/src/xrpld/overlay/ReduceRelayCommon.h index 8289e467e65..01d7dc597fc 100644 --- a/src/xrpld/overlay/ReduceRelayCommon.h +++ b/src/xrpld/overlay/ReduceRelayCommon.h @@ -62,4 +62,4 @@ static constexpr std::size_t MAX_TX_QUEUE_SIZE = 10000; } // namespace ripple -#endif // RIPPLED_REDUCERELAYCOMMON_H_INCLUDED \ No newline at end of file +#endif // RIPPLED_REDUCERELAYCOMMON_H_INCLUDED diff --git a/src/xrpld/overlay/Slot.h b/src/xrpld/overlay/Slot.h index 92ec09de124..b2db772f5b7 100644 --- a/src/xrpld/overlay/Slot.h +++ b/src/xrpld/overlay/Slot.h @@ -22,9 +22,10 @@ #include #include -#include + #include #include +#include #include #include #include diff --git a/src/xrpld/overlay/Squelch.h b/src/xrpld/overlay/Squelch.h index 2919922da92..0507bd4d2d9 100644 --- a/src/xrpld/overlay/Squelch.h +++ b/src/xrpld/overlay/Squelch.h @@ -21,7 +21,7 @@ #define RIPPLE_OVERLAY_SQUELCH_H_INCLUDED #include -#include + #include #include diff --git a/src/xrpld/overlay/detail/Cluster.cpp b/src/xrpld/overlay/detail/Cluster.cpp index 9d25248e8df..b4e5b6fc509 100644 --- a/src/xrpld/overlay/detail/Cluster.cpp +++ b/src/xrpld/overlay/detail/Cluster.cpp @@ -21,10 +21,11 @@ #include #include #include + #include #include -#include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/ConnectAttempt.cpp b/src/xrpld/overlay/detail/ConnectAttempt.cpp index 4bb76369c4c..30763b1357b 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.cpp +++ b/src/xrpld/overlay/detail/ConnectAttempt.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/ConnectAttempt.h b/src/xrpld/overlay/detail/ConnectAttempt.h index 474ac3c069f..c3e07f956ac 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.h +++ b/src/xrpld/overlay/detail/ConnectAttempt.h @@ -21,7 +21,6 @@ #define RIPPLE_OVERLAY_CONNECTATTEMPT_H_INCLUDED #include -#include namespace ripple { diff --git a/src/xrpld/overlay/detail/Handshake.cpp b/src/xrpld/overlay/detail/Handshake.cpp index 8f1aae8c025..657d28072f5 100644 --- a/src/xrpld/overlay/detail/Handshake.cpp +++ b/src/xrpld/overlay/detail/Handshake.cpp @@ -20,11 +20,14 @@ #include #include #include + #include #include #include #include + #include + #include // VFALCO Shouldn't we have to include the OpenSSL diff --git a/src/xrpld/overlay/detail/Handshake.h b/src/xrpld/overlay/detail/Handshake.h index 76c11b287ca..37f138b88b7 100644 --- a/src/xrpld/overlay/detail/Handshake.h +++ b/src/xrpld/overlay/detail/Handshake.h @@ -22,18 +22,17 @@ #include #include + #include #include -#include -#include -#include -#include -#include #include +#include #include #include #include +#include + #include #include diff --git a/src/xrpld/overlay/detail/Message.cpp b/src/xrpld/overlay/detail/Message.cpp index cdcf433f610..6473f30c89b 100644 --- a/src/xrpld/overlay/detail/Message.cpp +++ b/src/xrpld/overlay/detail/Message.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/OverlayImpl.cpp b/src/xrpld/overlay/detail/OverlayImpl.cpp index b69a074e996..2209414d9f8 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.cpp +++ b/src/xrpld/overlay/detail/OverlayImpl.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include @@ -27,10 +26,12 @@ #include #include #include +#include #include #include #include #include + #include #include #include @@ -502,6 +503,9 @@ OverlayImpl::start() // Pool of servers operated by @Xrpkuwait - https://xrpkuwait.com bootstrapIps.push_back("hubs.xrpkuwait.com 51235"); + + // Pool of servers operated by XRPL Commons - https://xrpl-commons.org + bootstrapIps.push_back("hub.xrpl-commons.org 51235"); } m_resolver.resolve( diff --git a/src/xrpld/overlay/detail/OverlayImpl.h b/src/xrpld/overlay/detail/OverlayImpl.h index c5cfe6274e3..4112e6dfd97 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.h +++ b/src/xrpld/overlay/detail/OverlayImpl.h @@ -30,17 +30,20 @@ #include #include #include + #include #include #include #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 8989f89fb3e..6df9b78df82 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -32,6 +32,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerImp.h b/src/xrpld/overlay/detail/PeerImp.h index 23916db2175..459b359ffb9 100644 --- a/src/xrpld/overlay/detail/PeerImp.h +++ b/src/xrpld/overlay/detail/PeerImp.h @@ -24,11 +24,10 @@ #include #include #include -#include #include #include + #include -#include #include #include #include @@ -39,6 +38,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerReservationTable.cpp b/src/xrpld/overlay/detail/PeerReservationTable.cpp index 6fd0112f46f..1a2842591cd 100644 --- a/src/xrpld/overlay/detail/PeerReservationTable.cpp +++ b/src/xrpld/overlay/detail/PeerReservationTable.cpp @@ -17,17 +17,14 @@ */ //============================================================================== -#include - #include #include -#include +#include + #include #include #include -#include - #include #include #include diff --git a/src/xrpld/overlay/detail/ProtocolMessage.h b/src/xrpld/overlay/detail/ProtocolMessage.h index 54f99eb73d0..26c83055a34 100644 --- a/src/xrpld/overlay/detail/ProtocolMessage.h +++ b/src/xrpld/overlay/detail/ProtocolMessage.h @@ -23,14 +23,14 @@ #include #include #include -#include + #include #include + #include #include -#include + #include -#include #include #include #include diff --git a/src/xrpld/overlay/detail/ProtocolVersion.cpp b/src/xrpld/overlay/detail/ProtocolVersion.cpp index 0fecb301f7f..9da1d6416e1 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.cpp +++ b/src/xrpld/overlay/detail/ProtocolVersion.cpp @@ -18,10 +18,13 @@ //============================================================================== #include + #include #include + #include #include + #include #include diff --git a/src/xrpld/overlay/detail/ProtocolVersion.h b/src/xrpld/overlay/detail/ProtocolVersion.h index 71ab0d59d75..efdb4908f0e 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.h +++ b/src/xrpld/overlay/detail/ProtocolVersion.h @@ -21,6 +21,7 @@ #define RIPPLE_OVERLAY_PROTOCOLVERSION_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/overlay/detail/TrafficCount.h b/src/xrpld/overlay/detail/TrafficCount.h index 9b4fabdc344..b508970e446 100644 --- a/src/xrpld/overlay/detail/TrafficCount.h +++ b/src/xrpld/overlay/detail/TrafficCount.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED #define RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED -#include #include #include diff --git a/src/xrpld/overlay/detail/TxMetrics.cpp b/src/xrpld/overlay/detail/TxMetrics.cpp index 8759e0122e5..bd493d74678 100644 --- a/src/xrpld/overlay/detail/TxMetrics.cpp +++ b/src/xrpld/overlay/detail/TxMetrics.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/overlay/detail/TxMetrics.h b/src/xrpld/overlay/detail/TxMetrics.h index eda7f1bb1b3..7f369cdda8c 100644 --- a/src/xrpld/overlay/detail/TxMetrics.h +++ b/src/xrpld/overlay/detail/TxMetrics.h @@ -138,4 +138,4 @@ struct TxMetrics } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/src/xrpld/overlay/detail/ZeroCopyStream.h b/src/xrpld/overlay/detail/ZeroCopyStream.h index ac210bf6b9e..41d94578b08 100644 --- a/src/xrpld/overlay/detail/ZeroCopyStream.h +++ b/src/xrpld/overlay/detail/ZeroCopyStream.h @@ -23,7 +23,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/overlay/make_Overlay.h b/src/xrpld/overlay/make_Overlay.h index 6532281f3dc..34760265622 100644 --- a/src/xrpld/overlay/make_Overlay.h +++ b/src/xrpld/overlay/make_Overlay.h @@ -22,10 +22,10 @@ #include #include + #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/peerfinder/PeerfinderManager.h b/src/xrpld/peerfinder/PeerfinderManager.h index 10de99abe62..a670fb87802 100644 --- a/src/xrpld/peerfinder/PeerfinderManager.h +++ b/src/xrpld/peerfinder/PeerfinderManager.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/Slot.h b/src/xrpld/peerfinder/Slot.h index 879c6a53317..171faed945c 100644 --- a/src/xrpld/peerfinder/Slot.h +++ b/src/xrpld/peerfinder/Slot.h @@ -22,7 +22,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Bootcache.cpp b/src/xrpld/peerfinder/detail/Bootcache.cpp index 1af5f0e1c97..9652d55802e 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.cpp +++ b/src/xrpld/peerfinder/detail/Bootcache.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Bootcache.h b/src/xrpld/peerfinder/detail/Bootcache.h index 07e8869594c..4a5d95fd415 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.h +++ b/src/xrpld/peerfinder/detail/Bootcache.h @@ -22,9 +22,11 @@ #include #include + #include #include #include + #include #include #include diff --git a/src/xrpld/peerfinder/detail/Checker.h b/src/xrpld/peerfinder/detail/Checker.h index 338bd839541..e7983471a5b 100644 --- a/src/xrpld/peerfinder/detail/Checker.h +++ b/src/xrpld/peerfinder/detail/Checker.h @@ -21,15 +21,14 @@ #define RIPPLE_PEERFINDER_CHECKER_H_INCLUDED #include -#include + #include #include #include -#include + #include #include #include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Counts.h b/src/xrpld/peerfinder/detail/Counts.h index 0078ae28411..c91b27b0262 100644 --- a/src/xrpld/peerfinder/detail/Counts.h +++ b/src/xrpld/peerfinder/detail/Counts.h @@ -23,9 +23,8 @@ #include #include #include -#include -#include +#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Handouts.h b/src/xrpld/peerfinder/detail/Handouts.h index 36e9c712e38..4c30af48059 100644 --- a/src/xrpld/peerfinder/detail/Handouts.h +++ b/src/xrpld/peerfinder/detail/Handouts.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Livecache.h b/src/xrpld/peerfinder/detail/Livecache.h index 03d99592107..503ea0161ab 100644 --- a/src/xrpld/peerfinder/detail/Livecache.h +++ b/src/xrpld/peerfinder/detail/Livecache.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include #include diff --git a/src/xrpld/peerfinder/detail/Logic.h b/src/xrpld/peerfinder/detail/Logic.h index 01f38ad7fd4..b3922f63b3f 100644 --- a/src/xrpld/peerfinder/detail/Logic.h +++ b/src/xrpld/peerfinder/detail/Logic.h @@ -30,10 +30,10 @@ #include #include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp index 8baa2b50b9a..86093fa166f 100644 --- a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp +++ b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp @@ -22,11 +22,11 @@ #include #include #include + #include -#include + #include #include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/SlotImp.h b/src/xrpld/peerfinder/detail/SlotImp.h index 45143a90121..e5d8b1e6c5b 100644 --- a/src/xrpld/peerfinder/detail/SlotImp.h +++ b/src/xrpld/peerfinder/detail/SlotImp.h @@ -22,8 +22,9 @@ #include #include -#include + #include + #include #include diff --git a/src/xrpld/peerfinder/detail/Source.h b/src/xrpld/peerfinder/detail/Source.h index a64da7b9e79..0f388ec3bbd 100644 --- a/src/xrpld/peerfinder/detail/Source.h +++ b/src/xrpld/peerfinder/detail/Source.h @@ -21,6 +21,7 @@ #define RIPPLE_PEERFINDER_SOURCE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/SourceStrings.h b/src/xrpld/peerfinder/detail/SourceStrings.h index 52d985a7017..0c858dca85e 100644 --- a/src/xrpld/peerfinder/detail/SourceStrings.h +++ b/src/xrpld/peerfinder/detail/SourceStrings.h @@ -21,6 +21,7 @@ #define RIPPLE_PEERFINDER_SOURCESTRINGS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Store.h b/src/xrpld/peerfinder/detail/Store.h index f0c033c7a6d..2d51dfc204e 100644 --- a/src/xrpld/peerfinder/detail/Store.h +++ b/src/xrpld/peerfinder/detail/Store.h @@ -1,3 +1,4 @@ + //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled diff --git a/src/xrpld/peerfinder/detail/StoreSqdb.h b/src/xrpld/peerfinder/detail/StoreSqdb.h index ad8b886d4a3..a8e74e6db4f 100644 --- a/src/xrpld/peerfinder/detail/StoreSqdb.h +++ b/src/xrpld/peerfinder/detail/StoreSqdb.h @@ -23,8 +23,6 @@ #include #include #include -#include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/make_Manager.h b/src/xrpld/peerfinder/make_Manager.h index 3a4f68d94c9..fba95e8f22f 100644 --- a/src/xrpld/peerfinder/make_Manager.h +++ b/src/xrpld/peerfinder/make_Manager.h @@ -21,7 +21,9 @@ #define RIPPLE_PEERFINDER_MAKE_MANAGER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/perflog/PerfLog.h b/src/xrpld/perflog/PerfLog.h index a7d66f57ad7..58df185e092 100644 --- a/src/xrpld/perflog/PerfLog.h +++ b/src/xrpld/perflog/PerfLog.h @@ -22,8 +22,11 @@ #include #include + #include + #include + #include #include #include diff --git a/src/xrpld/perflog/detail/PerfLogImp.cpp b/src/xrpld/perflog/detail/PerfLogImp.cpp index 559bdb1743c..a34faf885c5 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.cpp +++ b/src/xrpld/perflog/detail/PerfLogImp.cpp @@ -17,18 +17,17 @@ */ //============================================================================== +#include #include -#include #include #include #include #include -#include + #include #include #include -#include #include #include #include diff --git a/src/xrpld/perflog/detail/PerfLogImp.h b/src/xrpld/perflog/detail/PerfLogImp.h index 937486f75dc..d9354471f1b 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.h +++ b/src/xrpld/perflog/detail/PerfLogImp.h @@ -22,20 +22,18 @@ #include #include -#include + #include -#include + #include + #include #include #include #include -#include #include #include -#include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/CTID.h b/src/xrpld/rpc/CTID.h index 8cac8d63171..8407d515263 100644 --- a/src/xrpld/rpc/CTID.h +++ b/src/xrpld/rpc/CTID.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_RPC_CTID_H_INCLUDED #define RIPPLE_RPC_CTID_H_INCLUDED -#include #include + #include #include #include diff --git a/src/xrpld/rpc/Context.h b/src/xrpld/rpc/Context.h index edc5582a401..32a7cca6534 100644 --- a/src/xrpld/rpc/Context.h +++ b/src/xrpld/rpc/Context.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_RPC_CONTEXT_H_INCLUDED #define RIPPLE_RPC_CONTEXT_H_INCLUDED -#include #include #include #include diff --git a/src/xrpld/rpc/GRPCHandlers.h b/src/xrpld/rpc/GRPCHandlers.h index 679b16fd8ac..29e3b1b9ca6 100644 --- a/src/xrpld/rpc/GRPCHandlers.h +++ b/src/xrpld/rpc/GRPCHandlers.h @@ -21,7 +21,9 @@ #define RIPPLE_RPC_GRPCHANDLER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/rpc/RPCHandler.h b/src/xrpld/rpc/RPCHandler.h index c056ca27eb6..0b5f73bcbe3 100644 --- a/src/xrpld/rpc/RPCHandler.h +++ b/src/xrpld/rpc/RPCHandler.h @@ -20,8 +20,6 @@ #ifndef RIPPLE_RPC_RPCHANDLER_H_INCLUDED #define RIPPLE_RPC_RPCHANDLER_H_INCLUDED -#include -#include #include #include diff --git a/src/xrpld/rpc/Role.h b/src/xrpld/rpc/Role.h index 0ce84e09ef6..c65db622e73 100644 --- a/src/xrpld/rpc/Role.h +++ b/src/xrpld/rpc/Role.h @@ -25,11 +25,12 @@ #include #include #include + #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/ServerHandler.h b/src/xrpld/rpc/ServerHandler.h index 032011ca771..5f726733131 100644 --- a/src/xrpld/rpc/ServerHandler.h +++ b/src/xrpld/rpc/ServerHandler.h @@ -20,10 +20,11 @@ #ifndef RIPPLE_RPC_SERVERHANDLER_H_INCLUDED #define RIPPLE_RPC_SERVERHANDLER_H_INCLUDED +#include #include #include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/detail/DeliveredAmount.cpp b/src/xrpld/rpc/detail/DeliveredAmount.cpp index 93af8599146..9a6d0e9dc81 100644 --- a/src/xrpld/rpc/detail/DeliveredAmount.cpp +++ b/src/xrpld/rpc/detail/DeliveredAmount.cpp @@ -17,18 +17,14 @@ */ //============================================================================== -#include - #include #include #include -#include #include -#include -#include +#include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/Handler.cpp b/src/xrpld/rpc/detail/Handler.cpp index 7414a4b088e..abdfa921bba 100644 --- a/src/xrpld/rpc/detail/Handler.cpp +++ b/src/xrpld/rpc/detail/Handler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/detail/Handler.h b/src/xrpld/rpc/detail/Handler.h index cb1a2579ecb..e0fb66f6fd9 100644 --- a/src/xrpld/rpc/detail/Handler.h +++ b/src/xrpld/rpc/detail/Handler.h @@ -22,12 +22,10 @@ #include #include -#include #include #include #include #include -#include namespace Json { class Object; diff --git a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp index 721be652622..5054ca9cb42 100644 --- a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp +++ b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp @@ -19,11 +19,6 @@ #include -#include -#include -#include -#include - namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/RPCHandler.cpp b/src/xrpld/rpc/detail/RPCHandler.cpp index 19b33709c83..c261666eb9e 100644 --- a/src/xrpld/rpc/detail/RPCHandler.cpp +++ b/src/xrpld/rpc/detail/RPCHandler.cpp @@ -31,17 +31,15 @@ #include #include #include + #include -#include -#include #include #include -#include #include #include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/RPCHelpers.cpp b/src/xrpld/rpc/detail/RPCHelpers.cpp index 11c7a7698f3..3449a744d6c 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCHelpers.cpp @@ -28,8 +28,8 @@ #include #include #include + #include -#include #include #include #include diff --git a/src/xrpld/rpc/detail/RPCHelpers.h b/src/xrpld/rpc/detail/RPCHelpers.h index 74171af28e3..89af0052928 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.h +++ b/src/xrpld/rpc/detail/RPCHelpers.h @@ -20,16 +20,15 @@ #ifndef RIPPLE_RPC_RPCHELPERS_H_INCLUDED #define RIPPLE_RPC_RPCHELPERS_H_INCLUDED -#include -#include -#include -#include - #include #include #include #include #include + +#include +#include +#include #include #include diff --git a/src/xrpld/rpc/detail/Role.cpp b/src/xrpld/rpc/detail/Role.cpp index b374f035884..94da34efa22 100644 --- a/src/xrpld/rpc/detail/Role.cpp +++ b/src/xrpld/rpc/detail/Role.cpp @@ -18,10 +18,11 @@ //============================================================================== #include + #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/detail/ServerHandler.cpp b/src/xrpld/rpc/detail/ServerHandler.cpp index e5b7d9e3270..a5aca596578 100644 --- a/src/xrpld/rpc/detail/ServerHandler.cpp +++ b/src/xrpld/rpc/detail/ServerHandler.cpp @@ -17,18 +17,17 @@ */ //============================================================================== -#include - #include -#include #include #include #include #include #include +#include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/detail/Status.cpp b/src/xrpld/rpc/detail/Status.cpp index 7b23c2cc13a..738219b6b50 100644 --- a/src/xrpld/rpc/detail/Status.cpp +++ b/src/xrpld/rpc/detail/Status.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/rpc/detail/TransactionSign.cpp b/src/xrpld/rpc/detail/TransactionSign.cpp index 376a0ce24a5..2a7807f8cae 100644 --- a/src/xrpld/rpc/detail/TransactionSign.cpp +++ b/src/xrpld/rpc/detail/TransactionSign.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include @@ -29,16 +28,16 @@ #include #include #include + #include #include #include #include -#include #include -#include #include #include #include + #include #include diff --git a/src/xrpld/rpc/detail/TransactionSign.h b/src/xrpld/rpc/detail/TransactionSign.h index 13e963644a0..406707a6a87 100644 --- a/src/xrpld/rpc/detail/TransactionSign.h +++ b/src/xrpld/rpc/detail/TransactionSign.h @@ -22,7 +22,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/rpc/detail/WSInfoSub.h b/src/xrpld/rpc/detail/WSInfoSub.h index 2267b9147f4..1652617455e 100644 --- a/src/xrpld/rpc/detail/WSInfoSub.h +++ b/src/xrpld/rpc/detail/WSInfoSub.h @@ -22,10 +22,11 @@ #include #include + #include #include #include -#include + #include #include diff --git a/src/xrpld/rpc/handlers/AMMInfo.cpp b/src/xrpld/rpc/handlers/AMMInfo.cpp index 1990cdafd3e..b312264f90e 100644 --- a/src/xrpld/rpc/handlers/AMMInfo.cpp +++ b/src/xrpld/rpc/handlers/AMMInfo.cpp @@ -16,15 +16,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include + #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountChannels.cpp b/src/xrpld/rpc/handlers/AccountChannels.cpp index 4b9ff7e43c5..5d810d61a00 100644 --- a/src/xrpld/rpc/handlers/AccountChannels.cpp +++ b/src/xrpld/rpc/handlers/AccountChannels.cpp @@ -17,18 +17,18 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include -#include #include #include + namespace ripple { void diff --git a/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp b/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp index 6c8fe282674..2d08561ec90 100644 --- a/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp +++ b/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp @@ -17,11 +17,11 @@ */ //============================================================================== -#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/AccountInfo.cpp b/src/xrpld/rpc/handlers/AccountInfo.cpp index 90e3a8d46e0..6416309e2e9 100644 --- a/src/xrpld/rpc/handlers/AccountInfo.cpp +++ b/src/xrpld/rpc/handlers/AccountInfo.cpp @@ -23,13 +23,12 @@ #include #include #include + #include #include #include -#include #include #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountLines.cpp b/src/xrpld/rpc/handlers/AccountLines.cpp index 5170342eb99..e921eee386b 100644 --- a/src/xrpld/rpc/handlers/AccountLines.cpp +++ b/src/xrpld/rpc/handlers/AccountLines.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -54,10 +54,10 @@ addLine(Json::Value& jsonLines, RPCTrustLine const& line) jPeer[jss::authorized] = true; if (line.getAuthPeer()) jPeer[jss::peer_authorized] = true; - if (line.getNoRipple() || !line.getDefaultRipple()) - jPeer[jss::no_ripple] = line.getNoRipple(); - if (line.getNoRipplePeer() || !line.getDefaultRipple()) - jPeer[jss::no_ripple_peer] = line.getNoRipplePeer(); + if (line.getNoRipple()) + jPeer[jss::no_ripple] = true; + if (line.getNoRipplePeer()) + jPeer[jss::no_ripple_peer] = true; if (line.getFreeze()) jPeer[jss::freeze] = true; if (line.getFreezePeer()) diff --git a/src/xrpld/rpc/handlers/AccountObjects.cpp b/src/xrpld/rpc/handlers/AccountObjects.cpp index 1bdd95a74ca..03ea427b123 100644 --- a/src/xrpld/rpc/handlers/AccountObjects.cpp +++ b/src/xrpld/rpc/handlers/AccountObjects.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -31,7 +31,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountOffers.cpp b/src/xrpld/rpc/handlers/AccountOffers.cpp index 86559a79f4f..bc575d2d861 100644 --- a/src/xrpld/rpc/handlers/AccountOffers.cpp +++ b/src/xrpld/rpc/handlers/AccountOffers.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/AccountTx.cpp b/src/xrpld/rpc/handlers/AccountTx.cpp index ae50401b630..26c8065edf5 100644 --- a/src/xrpld/rpc/handlers/AccountTx.cpp +++ b/src/xrpld/rpc/handlers/AccountTx.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -28,7 +27,7 @@ #include #include #include -#include + #include #include #include @@ -37,8 +36,6 @@ #include #include -#include - namespace ripple { using TxnsData = RelationalDatabase::AccountTxs; diff --git a/src/xrpld/rpc/handlers/BlackList.cpp b/src/xrpld/rpc/handlers/BlackList.cpp index 3e887ff7309..ee8326a3d6a 100644 --- a/src/xrpld/rpc/handlers/BlackList.cpp +++ b/src/xrpld/rpc/handlers/BlackList.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/BookOffers.cpp b/src/xrpld/rpc/handlers/BookOffers.cpp index dccc03de5be..bede01b9279 100644 --- a/src/xrpld/rpc/handlers/BookOffers.cpp +++ b/src/xrpld/rpc/handlers/BookOffers.cpp @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/CanDelete.cpp b/src/xrpld/rpc/handlers/CanDelete.cpp index df2301d03e0..b7056e74391 100644 --- a/src/xrpld/rpc/handlers/CanDelete.cpp +++ b/src/xrpld/rpc/handlers/CanDelete.cpp @@ -19,14 +19,14 @@ #include #include -#include #include #include + #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Connect.cpp b/src/xrpld/rpc/handlers/Connect.cpp index eb4f67e76f8..81a85fd5ae3 100644 --- a/src/xrpld/rpc/handlers/Connect.cpp +++ b/src/xrpld/rpc/handlers/Connect.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ConsensusInfo.cpp b/src/xrpld/rpc/handlers/ConsensusInfo.cpp index ce727bb4006..113a2f28157 100644 --- a/src/xrpld/rpc/handlers/ConsensusInfo.cpp +++ b/src/xrpld/rpc/handlers/ConsensusInfo.cpp @@ -17,12 +17,11 @@ */ //============================================================================== -#include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/DepositAuthorized.cpp b/src/xrpld/rpc/handlers/DepositAuthorized.cpp index 50aa9ef2898..1bb480544d1 100644 --- a/src/xrpld/rpc/handlers/DepositAuthorized.cpp +++ b/src/xrpld/rpc/handlers/DepositAuthorized.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Feature1.cpp b/src/xrpld/rpc/handlers/Feature1.cpp index 75e583a352c..b2c8098ad13 100644 --- a/src/xrpld/rpc/handlers/Feature1.cpp +++ b/src/xrpld/rpc/handlers/Feature1.cpp @@ -21,8 +21,8 @@ #include #include #include + #include -#include #include #include diff --git a/src/xrpld/rpc/handlers/Fee1.cpp b/src/xrpld/rpc/handlers/Fee1.cpp index de5bdc4f6ca..6d15a4d95f1 100644 --- a/src/xrpld/rpc/handlers/Fee1.cpp +++ b/src/xrpld/rpc/handlers/Fee1.cpp @@ -22,8 +22,8 @@ #include #include #include + #include -#include namespace ripple { Json::Value diff --git a/src/xrpld/rpc/handlers/FetchInfo.cpp b/src/xrpld/rpc/handlers/FetchInfo.cpp index a4287266e52..1e0fa82480c 100644 --- a/src/xrpld/rpc/handlers/FetchInfo.cpp +++ b/src/xrpld/rpc/handlers/FetchInfo.cpp @@ -17,12 +17,11 @@ */ //============================================================================== -#include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/GatewayBalances.cpp b/src/xrpld/rpc/handlers/GatewayBalances.cpp index 26f338cb4f9..e8b95bd75c1 100644 --- a/src/xrpld/rpc/handlers/GatewayBalances.cpp +++ b/src/xrpld/rpc/handlers/GatewayBalances.cpp @@ -22,9 +22,9 @@ #include #include #include + #include #include -#include #include #include #include diff --git a/src/xrpld/rpc/handlers/GetAggregatePrice.cpp b/src/xrpld/rpc/handlers/GetAggregatePrice.cpp index 7467b94b63f..8001071f85f 100644 --- a/src/xrpld/rpc/handlers/GetAggregatePrice.cpp +++ b/src/xrpld/rpc/handlers/GetAggregatePrice.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/GetCounts.cpp b/src/xrpld/rpc/handlers/GetCounts.cpp index 690106ebbd2..9f57f08a247 100644 --- a/src/xrpld/rpc/handlers/GetCounts.cpp +++ b/src/xrpld/rpc/handlers/GetCounts.cpp @@ -23,13 +23,12 @@ #include #include #include -#include #include #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/GetCounts.h b/src/xrpld/rpc/handlers/GetCounts.h index dacf93fa910..57b43e44bdb 100644 --- a/src/xrpld/rpc/handlers/GetCounts.h +++ b/src/xrpld/rpc/handlers/GetCounts.h @@ -21,6 +21,7 @@ #define RIPPLE_RPC_HANDLERS_GETCOUNTS_H_INCLUDED #include + #include namespace ripple { @@ -30,4 +31,4 @@ getCountsJson(Application& app, int minObjectCount); } -#endif \ No newline at end of file +#endif diff --git a/src/xrpld/rpc/handlers/LedgerAccept.cpp b/src/xrpld/rpc/handlers/LedgerAccept.cpp index dbd7eb9f1ca..8784513363f 100644 --- a/src/xrpld/rpc/handlers/LedgerAccept.cpp +++ b/src/xrpld/rpc/handlers/LedgerAccept.cpp @@ -22,9 +22,8 @@ #include #include #include + #include -#include -#include #include #include diff --git a/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp b/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp index 48f024c051e..943065e5225 100644 --- a/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp +++ b/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LedgerClosed.cpp b/src/xrpld/rpc/handlers/LedgerClosed.cpp index b5644d9910e..9a188700461 100644 --- a/src/xrpld/rpc/handlers/LedgerClosed.cpp +++ b/src/xrpld/rpc/handlers/LedgerClosed.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerCurrent.cpp b/src/xrpld/rpc/handlers/LedgerCurrent.cpp index 7f1d83c17a7..8927e449536 100644 --- a/src/xrpld/rpc/handlers/LedgerCurrent.cpp +++ b/src/xrpld/rpc/handlers/LedgerCurrent.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LedgerData.cpp b/src/xrpld/rpc/handlers/LedgerData.cpp index ad26b83b43b..7bd50cc1e54 100644 --- a/src/xrpld/rpc/handlers/LedgerData.cpp +++ b/src/xrpld/rpc/handlers/LedgerData.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -169,16 +170,23 @@ doLedgerDataGrpc( } auto e = ledger->sles.end(); - if (auto key = uint256::fromVoidChecked(request.end_marker())) + if (request.end_marker().size() != 0) { + auto const key = uint256::fromVoidChecked(request.end_marker()); + + if (!key) + return { + response, + {grpc::StatusCode::INVALID_ARGUMENT, "end marker malformed"}}; + + if (*key < startKey) + return { + response, + {grpc::StatusCode::INVALID_ARGUMENT, + "end marker out of range"}}; + e = ledger->sles.upper_bound(*key); } - else if (request.end_marker().size() != 0) - { - grpc::Status errorStatus{ - grpc::StatusCode::INVALID_ARGUMENT, "end marker malformed"}; - return {response, errorStatus}; - } int maxLimit = RPC::Tuning::pageLength(true); diff --git a/src/xrpld/rpc/handlers/LedgerEntry.cpp b/src/xrpld/rpc/handlers/LedgerEntry.cpp index 7298ee290d8..7da99b3a764 100644 --- a/src/xrpld/rpc/handlers/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/LedgerEntry.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -32,6 +32,7 @@ #include #include #include + #include namespace ripple { @@ -821,12 +822,18 @@ parsePermissionedDomains(Json::Value const& pd, Json::Value& jvResult) return std::nullopt; } - if (!pd.isMember(jss::account) || !pd[jss::account].isString()) + if (!pd.isMember(jss::account)) { jvResult[jss::error] = "malformedRequest"; return std::nullopt; } + if (!pd[jss::account].isString()) + { + jvResult[jss::error] = "malformedAddress"; + return std::nullopt; + } + if (!pd.isMember(jss::seq) || (pd[jss::seq].isInt() && pd[jss::seq].asInt() < 0) || (!pd[jss::seq].isInt() && !pd[jss::seq].isUInt())) diff --git a/src/xrpld/rpc/handlers/LedgerHandler.cpp b/src/xrpld/rpc/handlers/LedgerHandler.cpp index 486c587d7e1..4015bb9fcc3 100644 --- a/src/xrpld/rpc/handlers/LedgerHandler.cpp +++ b/src/xrpld/rpc/handlers/LedgerHandler.cpp @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/LedgerHandler.h b/src/xrpld/rpc/handlers/LedgerHandler.h index 0a1ba2b427e..0e47164ad3d 100644 --- a/src/xrpld/rpc/handlers/LedgerHandler.h +++ b/src/xrpld/rpc/handlers/LedgerHandler.h @@ -29,6 +29,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerHeader.cpp b/src/xrpld/rpc/handlers/LedgerHeader.cpp index b73ee260d4a..1815c8db562 100644 --- a/src/xrpld/rpc/handlers/LedgerHeader.cpp +++ b/src/xrpld/rpc/handlers/LedgerHeader.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerRequest.cpp b/src/xrpld/rpc/handlers/LedgerRequest.cpp index 8f79bb04f30..fed89daaf20 100644 --- a/src/xrpld/rpc/handlers/LedgerRequest.cpp +++ b/src/xrpld/rpc/handlers/LedgerRequest.cpp @@ -17,17 +17,13 @@ */ //============================================================================== -#include -#include #include -#include #include #include -#include + #include -#include #include -#include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LogLevel.cpp b/src/xrpld/rpc/handlers/LogLevel.cpp index bf0a0e1e285..0fc266569e8 100644 --- a/src/xrpld/rpc/handlers/LogLevel.cpp +++ b/src/xrpld/rpc/handlers/LogLevel.cpp @@ -19,11 +19,13 @@ #include #include + #include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LogRotate.cpp b/src/xrpld/rpc/handlers/LogRotate.cpp index b7a887b0e27..959c77d718f 100644 --- a/src/xrpld/rpc/handlers/LogRotate.cpp +++ b/src/xrpld/rpc/handlers/LogRotate.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Manifest.cpp b/src/xrpld/rpc/handlers/Manifest.cpp index 1debd48422a..4d783c1d3bb 100644 --- a/src/xrpld/rpc/handlers/Manifest.cpp +++ b/src/xrpld/rpc/handlers/Manifest.cpp @@ -19,10 +19,10 @@ #include #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/NFTOffers.cpp b/src/xrpld/rpc/handlers/NFTOffers.cpp index bffb3dfbb60..52a5c69ab0e 100644 --- a/src/xrpld/rpc/handlers/NFTOffers.cpp +++ b/src/xrpld/rpc/handlers/NFTOffers.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/NoRippleCheck.cpp b/src/xrpld/rpc/handlers/NoRippleCheck.cpp index 94830a4f397..a6007e9eaba 100644 --- a/src/xrpld/rpc/handlers/NoRippleCheck.cpp +++ b/src/xrpld/rpc/handlers/NoRippleCheck.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/OwnerInfo.cpp b/src/xrpld/rpc/handlers/OwnerInfo.cpp index 83bf8b0ef21..36c14cecafa 100644 --- a/src/xrpld/rpc/handlers/OwnerInfo.cpp +++ b/src/xrpld/rpc/handlers/OwnerInfo.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/PathFind.cpp b/src/xrpld/rpc/handlers/PathFind.cpp index 6c9021ce97d..29304227c22 100644 --- a/src/xrpld/rpc/handlers/PathFind.cpp +++ b/src/xrpld/rpc/handlers/PathFind.cpp @@ -19,9 +19,9 @@ #include #include -#include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/PayChanClaim.cpp b/src/xrpld/rpc/handlers/PayChanClaim.cpp index f9c40ee776d..aaa559895c0 100644 --- a/src/xrpld/rpc/handlers/PayChanClaim.cpp +++ b/src/xrpld/rpc/handlers/PayChanClaim.cpp @@ -17,18 +17,15 @@ */ //============================================================================== -#include #include #include #include -#include + #include #include #include #include -#include #include -#include #include diff --git a/src/xrpld/rpc/handlers/Peers.cpp b/src/xrpld/rpc/handlers/Peers.cpp index f3be0df558e..33f3af27e64 100644 --- a/src/xrpld/rpc/handlers/Peers.cpp +++ b/src/xrpld/rpc/handlers/Peers.cpp @@ -17,13 +17,14 @@ */ //============================================================================== +#include #include #include #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Ping.cpp b/src/xrpld/rpc/handlers/Ping.cpp index cb0dabcb9de..e96ff190545 100644 --- a/src/xrpld/rpc/handlers/Ping.cpp +++ b/src/xrpld/rpc/handlers/Ping.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/Print.cpp b/src/xrpld/rpc/handlers/Print.cpp index df501240882..d9a7f3484e1 100644 --- a/src/xrpld/rpc/handlers/Print.cpp +++ b/src/xrpld/rpc/handlers/Print.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Reservations.cpp b/src/xrpld/rpc/handlers/Reservations.cpp index 1ff2d506afa..b19b948469c 100644 --- a/src/xrpld/rpc/handlers/Reservations.cpp +++ b/src/xrpld/rpc/handlers/Reservations.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/RipplePathFind.cpp b/src/xrpld/rpc/handlers/RipplePathFind.cpp index 80c336004b4..abe1b3b9bbc 100644 --- a/src/xrpld/rpc/handlers/RipplePathFind.cpp +++ b/src/xrpld/rpc/handlers/RipplePathFind.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/ServerInfo.cpp b/src/xrpld/rpc/handlers/ServerInfo.cpp index 1cb90c0b9db..b303402e2da 100644 --- a/src/xrpld/rpc/handlers/ServerInfo.cpp +++ b/src/xrpld/rpc/handlers/ServerInfo.cpp @@ -17,14 +17,13 @@ */ //============================================================================== -#include #include #include #include + #include #include #include -#include #include #include #include diff --git a/src/xrpld/rpc/handlers/ServerState.cpp b/src/xrpld/rpc/handlers/ServerState.cpp index dec18eca119..dbe80c65994 100644 --- a/src/xrpld/rpc/handlers/ServerState.cpp +++ b/src/xrpld/rpc/handlers/ServerState.cpp @@ -20,9 +20,8 @@ #include #include #include -#include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/SignFor.cpp b/src/xrpld/rpc/handlers/SignFor.cpp index 80f5594e1ea..5a26450dbe6 100644 --- a/src/xrpld/rpc/handlers/SignFor.cpp +++ b/src/xrpld/rpc/handlers/SignFor.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/SignHandler.cpp b/src/xrpld/rpc/handlers/SignHandler.cpp index 2547ef8ead7..f6b068ddd3d 100644 --- a/src/xrpld/rpc/handlers/SignHandler.cpp +++ b/src/xrpld/rpc/handlers/SignHandler.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/Simulate.cpp b/src/xrpld/rpc/handlers/Simulate.cpp index 7d391497f63..3c7340ece32 100644 --- a/src/xrpld/rpc/handlers/Simulate.cpp +++ b/src/xrpld/rpc/handlers/Simulate.cpp @@ -21,11 +21,12 @@ #include #include #include +#include #include #include #include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Stop.cpp b/src/xrpld/rpc/handlers/Stop.cpp index ea37a1aaa1b..03e73fb6b70 100644 --- a/src/xrpld/rpc/handlers/Stop.cpp +++ b/src/xrpld/rpc/handlers/Stop.cpp @@ -19,9 +19,8 @@ #include #include -#include -#include +#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Submit.cpp b/src/xrpld/rpc/handlers/Submit.cpp index 0a3fe419238..b0ea437cf12 100644 --- a/src/xrpld/rpc/handlers/Submit.cpp +++ b/src/xrpld/rpc/handlers/Submit.cpp @@ -18,13 +18,11 @@ //============================================================================== #include -#include #include #include #include -#include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp b/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp index 5535e376818..48ac8245e86 100644 --- a/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp +++ b/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Subscribe.cpp b/src/xrpld/rpc/handlers/Subscribe.cpp index 66fe89dea04..35b82edb3ff 100644 --- a/src/xrpld/rpc/handlers/Subscribe.cpp +++ b/src/xrpld/rpc/handlers/Subscribe.cpp @@ -25,6 +25,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/TransactionEntry.cpp b/src/xrpld/rpc/handlers/TransactionEntry.cpp index e81e0434595..c94e95063ba 100644 --- a/src/xrpld/rpc/handlers/TransactionEntry.cpp +++ b/src/xrpld/rpc/handlers/TransactionEntry.cpp @@ -18,11 +18,11 @@ //============================================================================== #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Tx.cpp b/src/xrpld/rpc/handlers/Tx.cpp index b603e3945a2..c3b3305af73 100644 --- a/src/xrpld/rpc/handlers/Tx.cpp +++ b/src/xrpld/rpc/handlers/Tx.cpp @@ -29,13 +29,13 @@ #include #include #include + #include #include #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/TxHistory.cpp b/src/xrpld/rpc/handlers/TxHistory.cpp index 1122eab51c3..786f7c6398a 100644 --- a/src/xrpld/rpc/handlers/TxHistory.cpp +++ b/src/xrpld/rpc/handlers/TxHistory.cpp @@ -22,16 +22,13 @@ #include #include #include -#include -#include #include #include -#include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/TxReduceRelay.cpp b/src/xrpld/rpc/handlers/TxReduceRelay.cpp index d8c21b3fa46..665e78f4de3 100644 --- a/src/xrpld/rpc/handlers/TxReduceRelay.cpp +++ b/src/xrpld/rpc/handlers/TxReduceRelay.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/UnlList.cpp b/src/xrpld/rpc/handlers/UnlList.cpp index b3394534372..4edb86b7b32 100644 --- a/src/xrpld/rpc/handlers/UnlList.cpp +++ b/src/xrpld/rpc/handlers/UnlList.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Unsubscribe.cpp b/src/xrpld/rpc/handlers/Unsubscribe.cpp index bab0d99744c..c890de593ae 100644 --- a/src/xrpld/rpc/handlers/Unsubscribe.cpp +++ b/src/xrpld/rpc/handlers/Unsubscribe.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidationCreate.cpp b/src/xrpld/rpc/handlers/ValidationCreate.cpp index ce53f84d951..6690e7f284d 100644 --- a/src/xrpld/rpc/handlers/ValidationCreate.cpp +++ b/src/xrpld/rpc/handlers/ValidationCreate.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidatorInfo.cpp b/src/xrpld/rpc/handlers/ValidatorInfo.cpp index d1a63371980..638aeb7842a 100644 --- a/src/xrpld/rpc/handlers/ValidatorInfo.cpp +++ b/src/xrpld/rpc/handlers/ValidatorInfo.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidatorListSites.cpp b/src/xrpld/rpc/handlers/ValidatorListSites.cpp index 39bc4e36471..fc241072336 100644 --- a/src/xrpld/rpc/handlers/ValidatorListSites.cpp +++ b/src/xrpld/rpc/handlers/ValidatorListSites.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Validators.cpp b/src/xrpld/rpc/handlers/Validators.cpp index 599e76f847a..4d8318d1940 100644 --- a/src/xrpld/rpc/handlers/Validators.cpp +++ b/src/xrpld/rpc/handlers/Validators.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/WalletPropose.cpp b/src/xrpld/rpc/handlers/WalletPropose.cpp index f3300b9ed04..2c9cadcbbac 100644 --- a/src/xrpld/rpc/handlers/WalletPropose.cpp +++ b/src/xrpld/rpc/handlers/WalletPropose.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include @@ -28,8 +29,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/Family.h b/src/xrpld/shamap/Family.h index bbb22c273d0..eb04df05e41 100644 --- a/src/xrpld/shamap/Family.h +++ b/src/xrpld/shamap/Family.h @@ -23,8 +23,9 @@ #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/shamap/FullBelowCache.h b/src/xrpld/shamap/FullBelowCache.h index eed7e6294a0..f792b9035f5 100644 --- a/src/xrpld/shamap/FullBelowCache.h +++ b/src/xrpld/shamap/FullBelowCache.h @@ -25,6 +25,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/shamap/SHAMap.h b/src/xrpld/shamap/SHAMap.h index c10f4eb1cb7..e63245b51c5 100644 --- a/src/xrpld/shamap/SHAMap.h +++ b/src/xrpld/shamap/SHAMap.h @@ -23,17 +23,16 @@ #include #include #include -#include #include #include #include #include #include #include -#include -#include + #include #include + #include #include diff --git a/src/xrpld/shamap/SHAMapAccountStateLeafNode.h b/src/xrpld/shamap/SHAMapAccountStateLeafNode.h index 842c1092dd9..1069c363ecb 100644 --- a/src/xrpld/shamap/SHAMapAccountStateLeafNode.h +++ b/src/xrpld/shamap/SHAMapAccountStateLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapInnerNode.h b/src/xrpld/shamap/SHAMapInnerNode.h index d2791915c3c..c45621d0c19 100644 --- a/src/xrpld/shamap/SHAMapInnerNode.h +++ b/src/xrpld/shamap/SHAMapInnerNode.h @@ -20,20 +20,12 @@ #ifndef RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED #define RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED -#include #include #include #include -#include -#include #include -#include -#include #include -#include -#include -#include #include #include diff --git a/src/xrpld/shamap/SHAMapItem.h b/src/xrpld/shamap/SHAMapItem.h index 2aba5d5d8eb..4c9ce654692 100644 --- a/src/xrpld/shamap/SHAMapItem.h +++ b/src/xrpld/shamap/SHAMapItem.h @@ -26,6 +26,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapLeafNode.h b/src/xrpld/shamap/SHAMapLeafNode.h index d5d84d3f003..9ff46a9bb75 100644 --- a/src/xrpld/shamap/SHAMapLeafNode.h +++ b/src/xrpld/shamap/SHAMapLeafNode.h @@ -25,7 +25,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapMissingNode.h b/src/xrpld/shamap/SHAMapMissingNode.h index 50aa193b2b6..73ffe0090a8 100644 --- a/src/xrpld/shamap/SHAMapMissingNode.h +++ b/src/xrpld/shamap/SHAMapMissingNode.h @@ -21,7 +21,9 @@ #define RIPPLE_SHAMAP_SHAMAPMISSINGNODE_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapNodeID.h b/src/xrpld/shamap/SHAMapNodeID.h index 176553fd7d3..abdca3a55ad 100644 --- a/src/xrpld/shamap/SHAMapNodeID.h +++ b/src/xrpld/shamap/SHAMapNodeID.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include diff --git a/src/xrpld/shamap/SHAMapSyncFilter.h b/src/xrpld/shamap/SHAMapSyncFilter.h index b14effac88b..a2ac2f99e84 100644 --- a/src/xrpld/shamap/SHAMapSyncFilter.h +++ b/src/xrpld/shamap/SHAMapSyncFilter.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_SHAMAP_SHAMAPSYNCFILTER_H_INCLUDED #define RIPPLE_SHAMAP_SHAMAPSYNCFILTER_H_INCLUDED -#include #include + #include /** Callback for filtering SHAMap during sync. */ diff --git a/src/xrpld/shamap/SHAMapTreeNode.h b/src/xrpld/shamap/SHAMapTreeNode.h index d6b0ebce9e1..6f209d13d79 100644 --- a/src/xrpld/shamap/SHAMapTreeNode.h +++ b/src/xrpld/shamap/SHAMapTreeNode.h @@ -22,15 +22,11 @@ #include #include -#include + #include -#include -#include #include #include -#include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapTxLeafNode.h b/src/xrpld/shamap/SHAMapTxLeafNode.h index f4d3f21e908..7444e61813e 100644 --- a/src/xrpld/shamap/SHAMapTxLeafNode.h +++ b/src/xrpld/shamap/SHAMapTxLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h b/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h index 6ea55f4ac46..78cc919b4e1 100644 --- a/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h +++ b/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/TreeNodeCache.h b/src/xrpld/shamap/TreeNodeCache.h index f59fdc92801..3eead799a3a 100644 --- a/src/xrpld/shamap/TreeNodeCache.h +++ b/src/xrpld/shamap/TreeNodeCache.h @@ -22,6 +22,8 @@ #include +#include + namespace ripple { using TreeNodeCache = TaggedCache; diff --git a/src/xrpld/shamap/detail/NodeFamily.cpp b/src/xrpld/shamap/detail/NodeFamily.cpp index bf95003aef8..21dbe7469e8 100644 --- a/src/xrpld/shamap/detail/NodeFamily.cpp +++ b/src/xrpld/shamap/detail/NodeFamily.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMap.cpp b/src/xrpld/shamap/detail/SHAMap.cpp index 09a546be147..7c3fadbec90 100644 --- a/src/xrpld/shamap/detail/SHAMap.cpp +++ b/src/xrpld/shamap/detail/SHAMap.cpp @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapDelta.cpp b/src/xrpld/shamap/detail/SHAMapDelta.cpp index baabd4ef139..a6c54b6f22f 100644 --- a/src/xrpld/shamap/detail/SHAMapDelta.cpp +++ b/src/xrpld/shamap/detail/SHAMapDelta.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/shamap/detail/SHAMapInnerNode.cpp b/src/xrpld/shamap/detail/SHAMapInnerNode.cpp index b2fba1f9314..7d3c3c8fb26 100644 --- a/src/xrpld/shamap/detail/SHAMapInnerNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapInnerNode.cpp @@ -18,20 +18,17 @@ //============================================================================== #include - #include #include -#include + #include #include #include -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp index 72ec177fb39..cdf0f80a840 100644 --- a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapNodeID.cpp b/src/xrpld/shamap/detail/SHAMapNodeID.cpp index 7f093dbe46e..efe4f959361 100644 --- a/src/xrpld/shamap/detail/SHAMapNodeID.cpp +++ b/src/xrpld/shamap/detail/SHAMapNodeID.cpp @@ -19,9 +19,9 @@ #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapSync.cpp b/src/xrpld/shamap/detail/SHAMapSync.cpp index 4f938257511..092b1efc5ad 100644 --- a/src/xrpld/shamap/detail/SHAMapSync.cpp +++ b/src/xrpld/shamap/detail/SHAMapSync.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp index fe5b5377eee..c50683213cd 100644 --- a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp @@ -19,18 +19,16 @@ #include #include -#include #include #include #include + #include #include #include #include -#include #include #include -#include #include diff --git a/src/xrpld/shamap/detail/TaggedPointer.h b/src/xrpld/shamap/detail/TaggedPointer.h index 48534076548..beee32a9451 100644 --- a/src/xrpld/shamap/detail/TaggedPointer.h +++ b/src/xrpld/shamap/detail/TaggedPointer.h @@ -23,7 +23,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/shamap/detail/TaggedPointer.ipp b/src/xrpld/shamap/detail/TaggedPointer.ipp index 0e67947a8ed..bed821b5c9d 100644 --- a/src/xrpld/shamap/detail/TaggedPointer.ipp +++ b/src/xrpld/shamap/detail/TaggedPointer.ipp @@ -19,13 +19,13 @@ #include #include -#include -#include -#include +#include #include +#include + namespace ripple { namespace { From 1573a443b713cb6a119c4324a0a78ec14555de23 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:07:17 -0400 Subject: [PATCH 03/73] smart escrow devnet 1 host functions (#5353) * devnet 1 host functions * clang-format * fix build issues --- examples/example/src/example.cpp | 4 +- include/xrpl/protocol/FeeUnits.h | 4 +- include/xrpl/protocol/MPTAmount.h | 3 +- include/xrpl/protocol/XRPAmount.h | 3 +- src/test/app/Escrow_test.cpp | 56 +- src/test/app/Wasm_test.cpp | 6491 +++++++---------------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 118 + src/xrpld/app/misc/WasmHostFuncImpl.h | 69 + src/xrpld/app/misc/WasmVM.cpp | 807 ++- src/xrpld/app/misc/WasmVM.h | 105 +- src/xrpld/app/tx/detail/Escrow.cpp | 26 +- 11 files changed, 2596 insertions(+), 5090 deletions(-) create mode 100644 src/xrpld/app/misc/WasmHostFuncImpl.cpp create mode 100644 src/xrpld/app/misc/WasmHostFuncImpl.h diff --git a/examples/example/src/example.cpp b/examples/example/src/example.cpp index 8c3acdee075..41dcd624624 100644 --- a/examples/example/src/example.cpp +++ b/examples/example/src/example.cpp @@ -2,7 +2,9 @@ #include -int main(int argc, char const** argv) { +int +main(int argc, char const** argv) +{ std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str()); return 0; } diff --git a/include/xrpl/protocol/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h index 0cbf1b608a2..fd760d07aec 100644 --- a/include/xrpl/protocol/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -451,8 +451,8 @@ mulDivU(Source1 value, Dest mul, Source2 div) } using namespace boost::multiprecision; - - uint128_t product; + using uint128 = boost::multiprecision::uint128_t; + uint128 product; product = multiply( product, static_cast(value.value()), diff --git a/include/xrpl/protocol/MPTAmount.h b/include/xrpl/protocol/MPTAmount.h index 244d6839156..cf00aa81fb5 100644 --- a/include/xrpl/protocol/MPTAmount.h +++ b/include/xrpl/protocol/MPTAmount.h @@ -152,11 +152,12 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; + using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128_t const amt128(amt.value()); + int128 const amt128(amt.value()); auto const neg = amt.value() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/include/xrpl/protocol/XRPAmount.h b/include/xrpl/protocol/XRPAmount.h index 1d6cae9ecf2..bdd0f0b7977 100644 --- a/include/xrpl/protocol/XRPAmount.h +++ b/include/xrpl/protocol/XRPAmount.h @@ -286,11 +286,12 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; + using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128_t const amt128(amt.drops()); + int128 const amt128(amt.drops()); auto const neg = amt.drops() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 1f872d2bdc7..0ac8bba8a0e 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1672,22 +1672,22 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] // pub fn ready() -> bool { - // unsafe { host_lib::get_ledger_sqn() >= 5} + // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; { // featureSmartEscrow disabled @@ -1827,22 +1827,22 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] // pub fn ready() -> bool { - // unsafe { host_lib::get_ledger_sqn() >= 5} + // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; { // basic FinishFunction situation diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 31e8007c72c..ce8d836269c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -132,4601 +132,2020 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(true); } - void - testEscrowWasmP0() - { - testcase("escrow wasm P0 test"); - auto wasmHex = - "0061736d0100000001090260017f017f6000000305040001010004050170010101" - "05030100100609017f01418080c0000b071802066d656d6f727902000b6d6f636b" - "5f657363726f7700030a25040800200041056f450b02000b0e0010818080800010" - "81808080000b08002000100010020b0072046e616d650011106d6f636b5f657363" - "726f772e7761736d014404000b6d6f636b5f657363726f77010564756d6d790211" - "5f5f7761736d5f63616c6c5f64746f7273031a6d6f636b5f657363726f772e636f" - "6d6d616e645f6578706f7274071201000f5f5f737461636b5f706f696e74657200" - "c0010970726f64756365727302086c616e67756167650204527573740003433131" - "000c70726f6365737365642d62790205727573746325312e38332e302d6e696768" - "746c79202863326637346333663920323032342d30392d30392905636c616e675f" - "31382e312e322d776173692d73646b202868747470733a2f2f6769746875622e63" - "6f6d2f6c6c766d2f6c6c766d2d70726f6a65637420323661316436363031643732" - "376139366634333031643064383634376235613432373630616530632900560f74" - "61726765745f6665617475726573052b0b62756c6b2d6d656d6f72792b0a6d756c" - "746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e" - "63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, 15); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - - re = runEscrowWasm(wasm, funcName, 11); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - void testBadWasm() { testcase("bad wasm test"); + + HostFunctions hfs; auto wasmHex = "00000000"; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, 15); + auto re = runEscrowWasm(wasm, funcName, &hfs, 15); BEAST_EXPECT(re.error()); } void - testEscrowWasmP1() + testEscrowWasmDN1() { - testcase("escrow wasm P1 test"); + testcase("escrow wasm devnet 1 test"); auto wasmHex = - "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" - "00030c0b01010200000000000003000405017001030305030100110619037f0141" - "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" - "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" - "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" - "200010012200450d0120000f0b230041206b220024002000410036021820004101" - "36020c200041b480c00036020820004204370210200041086a41d080c000100500" - "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" - "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" - "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" - "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" - "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" - "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" - "0245044041002100410021010c040b4100210020054100411920074101766b2007" - "411f461b7421044100210103400240200228020441787122062005490d00200620" - "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" - "021422062000200620022004411d764104716a41106a2802002202471b20002006" - "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" - "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" - "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" - "000b20012000410372360204200020016a220020002802044101723602040c060b" - "024041022000742203410020036b72200120007471682206410374220041a483c0" - "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" - "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" - "360204200120056a2206200020056b2204410172360204200020016a2004360200" - "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" - "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" - "200220057236020020000c010b20002802080b2102200020033602082002200336" - "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" - "043602000c050b200068410274419482c0006a280200220128020441787120056b" - "2103200121020240034002400240200128021022000d00200128021422000d0020" - "022802182107024002402002200228020c22004604402002411441102002280214" - "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" - "013602080c010b200241146a200241106a20001b21040340200421062001220041" - "146a200041106a200028021422011b210420004114411020011b6a28020022010d" - "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" - "28020047044020074110411420072802102002461b6a20003602002000450d040c" - "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" - "77713602000c030b200028020441787120056b22012003200120034922011b2103" - "2000200220011b2102200021010c010b0b20002007360218200228021022010440" - "20002001360210200120003602180b20022802142201450d002000200136021420" - "0120003602180b02400240200341104f044020022005410372360204200220056a" - "22062003410172360204200320066a200336020041b485c0002802002204450d01" - "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" - "2205410120044103767422047145044041ac85c000200420057236020020000c01" - "0b20002802080b2104200020013602082004200136020c2001200036020c200120" - "043602080c010b2002200320056a2200410372360204200020026a220020002802" - "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" - "41086a0f0b20002001724504404100210141022007742200410020006b72200871" - "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" - "20012000280204417871220420056b220620034922071b21082000280210220245" - "0440200028021421020b20012008200420054922001b210120032006200320071b" - "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" - "200020056b4f710d0020012802182107024002402001200128020c220046044020" - "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" - "2202200036020c200020023602080c010b200141146a200141106a20001b210403" - "40200421062002220041146a200041106a200028021422021b2104200041144110" - "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" - "28021c410274419482c0006a220228020047044020074110411420072802102001" - "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" - "b085c000280200417e200128021c77713602000c010b2000200736021820012802" - "102202044020002002360210200220003602180b20012802142202450d00200020" - "02360214200220003602180b0240200341104f0440200120054103723602042001" - "20056a22022003410172360204200220036a200336020020034180024f04402002" - "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" - "410120034103767422037145044041ac85c000200320047236020020000c010b20" - "002802080b2103200020023602082003200236020c2002200036020c2002200336" - "02080c010b2001200320056a2200410372360204200020016a2200200028020441" - "01723602040b0c010b024002400240024002400240200541b485c0002802002201" - "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" - "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" - "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" - "02002201200020002001491b3602000240024041c085c000280200220304404194" - "83c0002100034020002802002201200028020422066a2002460d02200028020822" - "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" - "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" - "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" - "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" - "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" - "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" - "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" - "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" - "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" - "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" - "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" - "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" - "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" - "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" - "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" - "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" - "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" - "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" - "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" - "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" - "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" - "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" - "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" - "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" - "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" - "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" - "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" - "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" - "85c000200441286b220036020020022000410172360204200020026a4128360204" - "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" - "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" - "20046a2101419483c0002100024002400340200120002802002206470440200028" - "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" - "0028020022014f04402003200120002802046a2206490d010b200028020821000c" - "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" - "0172360204200020026a412836020441cc85c00041808080013602002003200641" - "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" - "002109200141106a419c83c00029020037020020012009370208419883c0002004" - "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" - "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" - "012003460d0720012001280204417e713602042003200120036b22004101723602" - "042001200036020020004180024f04402003200010070c080b200041f8017141a4" - "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" - "ac85c000200020027236020020010c010b20012802080b21002001200336020820" - "00200336020c2003200136020c200320003602080c070b20002002360200200020" - "0028020420046a360204200220054103723602042006410f6a41787141086b2201" - "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" - "460d04200128020422054103714101460440200120054178712200100820002001" - "6a22012802042105200020036a21030b20012005417e7136020420042003410172" - "360204200320046a200336020020034180024f04402004200310070c060b200341" - "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" - "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" - "043602082003200436020c2004200036020c200420033602080c050b41b885c000" - "200020056b220136020041c085c00041c085c000280200220020056a2202360200" - "2002200141017236020420002005410372360204200041086a21000c060b41bc85" - "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" - "85c000410036020020002001410372360204200020016a22012001280204410172" - "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" - "2002410172360204200020016a2002360200200020054103723602040b20004108" - "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" - "71220141086b220236020041b885c00041b885c00028020020046a220320002001" - "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" - "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" - "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" - "0041b485c00041b485c00028020020036a22003602002004200041017236020420" - "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" - "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" - "20056a22023602002002200141017236020420002005410372360204200041086a" - "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" - "402007410020076b41037122026a21062002044020072103418080c00021050340" - "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" - "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" - "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" - "6b411871210820052802002105034020062005200c762004280200220520087472" - "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" - "20022104034020062004280200360200200441046a2104200641046a2206200349" - "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" - "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" - "4122460440200021032007210241002105412221080240034020032d0000220920" - "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" - "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" - "0b000bd20601047f0240200041046b280200220241787122034104410820024103" - "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" - "0041046b280200220341787122006a21020240024020034101710d002003410271" - "450d012001280200220320006a2100200120036b220141bc85c000280200460440" - "20022802044103714103470d0141b485c000200036020020022002280204417e71" - "36020420012000410172360204200220003602000c020b2001200310080b024002" - "4002400240024020022802042203410271450440200241c085c000280200460d02" - "200241bc85c000280200460d0320022003417871220210082001200020026a2200" - "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" - "0020003602000c060b20022003417e713602042001200041017236020420002001" - "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" - "c00028020041016b220036020020000d04419c83c0002802002200044003402001" - "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" - "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" - "003602002001200041017236020441bc85c000280200200146044041b485c00041" - "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" - "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" - "00210103402002200128020022054f04402002200520012802046a490d040b2001" - "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" - "20006a220036020020012000410172360204200020016a20003602000c020b2000" - "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" - "007145044041ac85c000200020037236020020020c010b20022802080b21002002" - "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" - "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" - "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" - "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" - "7f230041206b220224002002410036021020024101360204200242043702082002" - "412e36021c200220003602182002200241186a360200200220011005000ba40201" - "037f230041206b22022400200241106a2203200041106a29020037030020024108" - "6a2204200041086a290200370300200241013b011c200220013602182002200029" - "0200370300230041206b2200240020022802182101200041106a20032902003703" - "00200041086a20042902003703002000200236021c200020013602182000200229" - "020037030041002102230041106b22012400200028020c21030240024002400240" - "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" - "2802042102200328020021030c010b20014180808080783602002001200036020c" - "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" - "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" - "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" - "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" - "2002410274419482c0006a21044101200274220341b085c0002802007145044020" - "042000360200200020043602182000200036020c2000200036020841b085c00041" - "b085c0002802002003723602000f0b024002402001200428020022032802044178" - "71460440200321020c010b20014100411920024101766b2002411f461b74210503" - "4020032005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c200220" - "00360208200041003602182000200236020c200020013602080f0b200420003602" - "00200020033602182000200036020c200020003602080bf10201047f200028020c" - "21020240024020014180024f044020002802182103024002402000200246044020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" - "2201200236020c200220013602080c010b200041146a200041106a20021b210403" - "40200421052001220241146a200241106a200228021422011b2104200241144110" - "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" - "0274419482c0006a220128020047044020034110411420032802102000461b6a20" - "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" - "280200417e200028021c77713602000c020b200028020822002002470440200020" - "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" - "77713602000f0b2002200336021820002802102201044020022001360210200120" - "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" - "017f230041106b22032400419082c000419082c000280200220441016a36020002" - "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" - "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" - "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" - "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" - "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" - "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" - "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" - "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" - "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" - "64006000100029000000a804000009000000617373657274696f6e206661696c65" - "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" - "6765010452757374000c70726f6365737365642d62790105727573746325312e38" - "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" - "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("check_accountID"); - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - std::vector data(str.begin(), str.end()); - auto re = runEscrowWasm(wasm, funcName, data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; - std::vector data(str.begin(), str.end()); - auto re = runEscrowWasm(wasm, funcName, data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - } - - void - testEscrowWasmP2P3() - { - testcase("escrow wasm P2 & P3 test"); - auto wasmHex = - "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" - "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" - "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" - "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" - "616004030305060001070808080809040702000000040403030304030500020306" - "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" - "0903020201020200000405000203030402020205100b0303000005030101010104" - "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" - "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" - "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" - "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" - "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" - "360228200320023602242003200136022020034180013a002c2003410036021c20" - "03428080808010370214200341c8006a200341146a108180808000024002400240" - "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" - "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" - "2903483703300240024020032802282202200328022422064f0d00200328022021" - "070340200720026a2d000041776a220141174b0d02410120017441938080047145" - "0d022006200241016a2202470d000b200320063602280b20002003290330370300" - "200041106a2004290300370300200041086a200529030037030020032802142202" - "450d04200328021820021082808080000c040b20032002360228200341086a2007" - "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" - "200328020c21012003280208210641141084808080002202450d01200220063602" - "0c2002411636020020002002360204200041063a00002002200136021020034130" - "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" - "032802142202450d00200328021820021082808080000b200341e0006a24808080" - "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" - "210302400240024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f0006a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" - "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" - "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241386a200320052005200441016a220420052004491b" - "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" - "84808080002207450d1f2007200836020c20074105360200200720043602100c08" - "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" - "c080001a200228024c21042002280248210841141084808080002207450d1e2007" - "200836020c20074107360200200720043602100c070b20022902dc02210e200228" - "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228024421042002280240210841141084808080002207450d1c2007200836020c" - "20074115360200200720043602100c050b200241b0016a20011081808080000240" - "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" - "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" - "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" - "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" - "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" - "000120042007360204200441106a2003290300370300200441036a20052d00003a" - "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" - "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" - "0000200420083602100c180b200628020021030b200241306a2003200520052004" - "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" - "042002280230210841141084808080002207450d172007200836020c2007410236" - "0200200720043602100b200241d8026a109180808000024020022802d802220445" - "0d002009200441186c1082808080000b200128020c210320012802142104200128" - "0210210541062106410121090b200120012d001841016a3a001802400240200420" - "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" - "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" - "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28021421082002280210210541141084808080002204450d1d200441163602000c" - "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" - "41776a220841174b0d024101200874419380800471450d022001200441016a2204" - "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" - "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" - "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" - "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" - "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" - "210541141084808080002204450d1a200441153602000c040b200241206a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228022421082002280220210541141084808080002204450d1920044116360200" - "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" - "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" - "001a200228021c21082002280218210541141084808080002204450d1620044102" - "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" - "01200220073602b401200220063a00b001024020090d00200241063a0078200220" - "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" - "200241c8016a1092808080000c110b200241086a20032005200520042005200449" - "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" - "1084808080002204450d142004200136020c200441183602002000200436020420" - "0041063a0000200420083602100c130b200141003602082001200441016a360214" - "200241b0016a2006200110938080800020022802b40121080240024020022802b0" - "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" - "948080800020022d00784106460d1320002002290378370300200041106a200241" - "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" - "150b41002101024020044100480d00024020040d0041012101410021050c030b41" - "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" - "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" - "086a220320012008200410df808080003602002002200536027c200241033a0078" - "2002200436028401200041106a200241f8006a41106a290300370300200041086a" - "2003290300370300200020022903783703000c120b2001200441016a3602142002" - "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" - "20024190016a109680808000024020022d00784106460d00200020022903783703" - "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" - "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" - "200020043602040c120b2000200228029801360204200041063a00000c110b0240" - "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" - "14200141bb80c0800041031086808080002204450d02200041063a000020002004" - "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" - "0a490d042002200320052005200441016a220420052004491b1083808080004100" - "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" - "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" - "200241003a007820002002290378370300200041086a200241f8006a41086a2903" - "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" - "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" - "00200020043602040c0e0b20024181023b01782000200229037837030020004108" - "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" - "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" - "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" - "02290378370300200041086a200241f8006a41086a290300370300200041106a20" - "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" - "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" - "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" - "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" - "21070c070b20022802d401220441003602082004200428021441016a3602142002" - "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" - "460d06200241d8026a200720022802b801109880808000024020022802d8022204" - "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" - "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" - "41003602dc01200220053602e002200220083602dc02200220043602d802200241" - "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" - "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" - "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" - "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" - "024020022d00b101450d0020022802d40122044100360208200420042802144101" - "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" - "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" - "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" - "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" - "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" - "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" - "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" - "290300220f370300200220022903b00122103703d802200541106a200e37020020" - "0541086a200f3702002005201037020020024180026a41086a200c290200370300" - "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" - "186a280200360200200220022902b00137038002200220033602a4022002200736" - "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" - "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" - "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" - "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" - "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" - "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" - "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" - "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" - "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" - "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" - "200820041082808080000b200241dc016a109b808080000b41062106410121090b" - "200120012d001841016a3a0018200128020c210302400240024020012802142204" - "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" - "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" - "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" - "21040c050b200241e8006a200320052005200441016a220420052004491b108380" - "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" - "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" - "200441016a220436021420052004470d000b200521040b200241e0006a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28026421082002280260210541141084808080002204450d072004200536020c20" - "044103360200200420083602100c010b200241d8006a200320052005200441016a" - "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" - "280258210541141084808080002204450d062004200536020c2004411636020020" - "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" - "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" - "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" - "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" - "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" - "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" - "80000c010b200241d0006a200320052005200420052004491b1083808080004100" - "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" - "0d042004200136020c2004411836020020002004360204200041063a0000200420" - "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" - "200041063a0000200020043602040c010b20002002290378370300200041106a20" - "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" - "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" - "002202417871220341044108200241037122021b20016a490d0002402002450d00" - "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" - "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" - "0301057f02400240024002400240024020022003490d0041012104410021052003" - "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" - "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" - "418a94a8d000736b20077241808182847871418081828478460d00034020062001" - "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" - "034109490d0103400240024020074108480d004180828408200120076a22064178" - "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" - "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" - "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" - "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" - "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" - "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" - "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" - "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" - "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" - "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" - "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" - "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" - "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" - "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" - "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" - "0041002100410021060c040b4100210020024100411920054101766b2005411f46" - "1b74210741002106034002402001220128020441787122082002490d0020082002" - "6b220820034f0d00200821032001210620080d004100210320012106200121000c" - "060b200128021422082000200820012007411d764104716a41106a280200220147" - "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" - "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" - "0022032802082206460d002006200236020c200220063602080c010b4100200141" - "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" - "0204410172360204200341086a0f0b024002402000200374410220037422004100" - "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" - "0022002802082207460d002007200636020c200620073602080c010b4100200141" - "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" - "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" - "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" - "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" - "d2c08000200621010c010b200628020821010b200620033602082001200336020c" - "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" - "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" - "787120026b2103200621010240024003400240200628021022000d002006280214" - "22000d0020012802182105024002400240200128020c22002001470d0020014114" - "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" - "0036020c200020063602080c010b200141146a200141106a20001b210703402007" - "21082006220041146a200041106a200028021422061b210720004114411020061b" - "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" - "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" - "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" - "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" - "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" - "360218024020012802102206450d0020002006360210200620003602180b200128" - "02142206450d0020002006360214200620003602180b0240024002402003411049" - "0d0020012002410372360204200120026a22022003410172360204200220036a20" - "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" - "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" - "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" - "0b200620003602082007200036020c2000200636020c200020073602080c010b20" - "01200320026a2200410372360204200120006a220020002802044101723602040c" - "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" - "4020002006720d004100210641022005742200410020006b722004712200450d03" - "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" - "280204417871220120026b220820034922051b2104200120024921072008200320" - "051b21080240200028021022010d00200028021421010b2006200420071b210620" - "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" - "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" - "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" - "410021000c020b20062802082201200036020c200020013602080c010b20064114" - "6a200641106a20001b21070340200721082001220041146a200041106a20002802" - "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" - "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" - "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" - "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" - "c080000c010b20002005360218024020062802102201450d002000200136021020" - "0120003602180b20062802142201450d0020002001360214200120003602180b02" - "40024020034110490d0020062002410372360204200620026a2200200341017236" - "0204200020036a200336020002402003418002490d002000200310d7808080000c" - "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" - "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" - "200228020821030b200220003602082003200036020c2000200236020c20002003" - "3602080c010b2006200320026a2200410372360204200620006a22002000280204" - "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" - "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" - "200241af80046a220641107640002203417f4622070d0720034110742201450d07" - "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" - "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" - "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" - "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" - "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" - "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" - "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" - "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" - "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" - "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" - "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" - "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" - "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" - "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" - "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" - "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" - "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" - "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" - "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" - "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" - "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" - "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" - "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" - "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" - "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" - "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" - "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" - "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" - "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" - "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" - "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" - "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" - "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" - "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" - "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" - "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" - "003602f0d2c0800020012000410172360204200120006a41283602044100418080" - "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" - "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" - "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" - "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" - "02402000280200220620034b0d002003200620002802046a2206490d020b200028" - "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" - "800020012000410172360204200120006a412836020441004180808001360284d3" - "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" - "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" - "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" - "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" - "200041046a22002006490d000b20072003460d0720072007280204417e71360204" - "2003200720036b22004101723602042007200036020002402000418002490d0020" - "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" - "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" - "c08000200621000c010b200628020821000b200620033602082000200336020c20" - "03200636020c200320003602080c070b200020013602002000200028020420086a" - "360204200120024103723602042007410f6a41787141786a2206200120026a2200" - "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" - "200628020422024103714101470d0020062002417871220210a880808000200220" - "036a2103200620026a220628020421020b20062002417e71360204200020034101" - "72360204200020036a200336020002402003418002490d002000200310d7808080" - "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" - "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" - "010b200228020821030b200220003602082003200036020c2000200236020c2000" - "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" - "8000220020026a22063602f8d2c080002006200341017236020420002002410372" - "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" - "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" - "410372360204200320006a220020002802044101723602040c010b410020063602" - "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" - "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" - "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" - "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" - "d2c0800020062001410172360204200020036a4128360204410041808080013602" - "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" - "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" - "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" - "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" - "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" - "0020026a22063602f8d2c080002006200341017236020420002002410372360204" - "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" - "02000b200041046a109b808080000c020b20002802042201450d01200028020820" - "011082808080000f0b200041046a10918080800020002802042201450d00200028" - "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" - "80808080002000280214220420002802102205200420054b1b2106200028020c21" - "0702400240024002400340024020020d00410021040c050b20062004460d012000" - "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" - "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" - "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" - "8080002204450d01200441093602000c020b200320072005200610838080800041" - "002d00c0cfc080001a200328020421012003280200210241141084808080002204" - "450d00200441053602000c010b000b2004200236020c200420013602100b200341" - "106a24808080800020040b970202027f027e23808080800041106b220424808080" - "8000024002400240024002400240024002402001280214220520012802104f0d00" - "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" - "020b2002450d02420121060c050b20042001200220034100108880808000200428" - "02000d020c030b200420012002200341001089808080002004280200450d022000" - "2004280204360208200042033703000c040b420021060240420020037d22074200" - "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" - "020b20002004280204360208200042033703000c020b2004290308210342002106" - "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" - "23808080800041106b220524808080800020012001280214220641016a22073602" - "140240024002402007200128021022084f0d00200720086b2109200128020c210a" - "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" - "410a490d00024020060d002005200a20082008200741016a220720082007491b10" - "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" - "808080002207450d072007200c36020c2007410d36020020002007360204200041" - "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" - "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" - "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" - "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" - "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" - "20002001200220032007108b808080000c010b200541086a200128020c20082008" - "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" - "0c21062005280208210c41141084808080002207450d012007200c36020c200741" - "053602002000200736020420004101360200200720063602100b200541106a2480" - "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" - "0620012001280214220741016a220836021402402008200128021022094f0d0041" - "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" - "2001200741026a22083602140b200128020c210a02400240024002400240024002" - "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" - "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" - "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" - "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" - "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" - "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" - "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" - "042007200836020c20074105360200200020073602042000410136020020072001" - "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" - "020421012005280200210841141084808080002207450d032007200836020c2007" - "410d3602002000200736020420004101360200200720013602100c040b20042008" - "6a2207411f7541808080807873200720084100482007200448731b21070b200020" - "01200220032007108b808080000c020b2000200120022003502006108c80808000" - "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" - "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" - "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" - "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" - "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" - "22052480808080002003ba2106024002400240024002400240024020042004411f" - "7522077320076b220741b502490d0003402006440000000000000000610d062004" - "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" - "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" - "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" - "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" - "84808080002204450d022004200136020c2004410e360200200020043602042004" - "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" - "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" - "28020c21072005280208210141141084808080002204450d012004200136020c20" - "04410e36020020002004360204200420073602100b410121040c020b000b200020" - "0620069a20021b390308410021040b20002004360200200541106a248080808000" - "0b840201027f23808080800041106b220524808080800002400240024002402004" - "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" - "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" - "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" - "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" - "1084808080002204450d002004200336020c2004410e3602002000200436020420" - "042001360210410121040c020b000b200044000000000000000044000000000000" - "008020021b390308410021040b20002004360200200541106a2480808080000b95" - "0502067f017e23808080800041306b2203248080808000200128020c2104024002" - "40024002400240024020012802142205200128021022064f0d002001200541016a" - "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" - "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" - "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" - "21072003280218210441141084808080002201450d022001200436020c20014105" - "3602002000200136020820004203370300200120073602100c040b200341086a20" - "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" - "1a200328020c21072003280208210441141084808080002201450d012001200436" - "020c2001410d3602002000200136020820004203370300200120073602100c030b" - "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" - "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" - "01450d012001200436020c2001410d360200200020013602082000420337030020" - "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" - "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" - "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" - "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" - "0b0b200341206a200120022009108e808080000240024020032802200d00200020" - "032b0328390308420021090c010b20002003280224360208420321090b20002009" - "3703000c020b000b20002001200220091087808080000b200341306a2480808080" - "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" - "0641016a2107200520066b2108200128020c20066a210541002104034002402005" - "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" - "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" - "200720046a3602142008200441016a2204470d000b200821040b20002001200220" - "032004108b808080000f0b200020012002200320041088808080000bc80101047f" - "23808080800041206b2202248080808000024002400240200028020c450d002000" - "21010c010b200241106a41086a2203200041086a28020036020020022000290200" - "370310200241086a200128020c2001280210200128021410838080800041002d00" - "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" - "200120022903103702002001200536020c20012004360210200141086a20032802" - "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" + "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" + "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" + "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" + "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" + "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" + "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" + "745f6c696213676574506172656e744c656467657254696d650005035453020603" + "070101080901010a01000202010102080008000b0c030101010104050802030303" + "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" + "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" + "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" + "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" + "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" + "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" + "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" + "14200142808080801037020c200141033a00382001412036022820014100360234" + "2001418080c08000360230200141003602202001410036021820012001410c6a36" + "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" + "808080000d00200128020c21002001280210220220012802141080808080000240" + "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" + "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" + "027f017e037f23808080800041306b220324808080800041272104024002402000" + "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" + "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" + "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" + "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" + "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" + "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" + "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" + "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" + "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" + "41096a20046a412720046b108c808080002104200341306a24808080800020040b" + "6c01027f024002402000417c6a2802002202417871220341044108200241037122" + "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" + "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" + "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" + "2005200136020c2005200036020820052003360214200520023602102005410236" + "021c200541b884c08000360218200542023702242005418180808000ad42208620" + "0541106aad843703382005418280808000ad422086200541086aad843703302005" + "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" + "0041c0006b220224808080800002400240200028020022032d00000d0020012802" + "14419582c080004104200128021828020c118080808000808080800021000c010b" + "4101210020012802142204419982c0800041042001280218220528020c22061180" + "8080800080808080000d00200341016a210302400240200128021c22074104710d" + "0041012100200441f184c080004101200611808080800080808080000d02200320" + "01108a80808000450d010c020b200441f284c08000410220061180808080008080" + "8080000d0141012100200241013a001b200220053602102002200436020c200220" + "07360238200241c884c08000360234200220012d00203a003c2002200128021036" + "022c200220012902083702242002200129020037021c20022002411b6a36021420" + "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" + "80004102200228023428020c11808080800080808080000d010b2001280214419c" + "97c080004101200128021828020c118080808000808080800021000b200241c000" + "6a24808080800020000be90201057f2380808080004180016b2202248080808000" + "0240024002400240200128021c22034110710d0020034120710d01200031000041" + "01200110868080800021000c030b20002d0000210041ff00210303402002200322" + "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" + "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" + "0041ff00210303402002200322046a22052000410f712203413072200341376a20" + "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" + "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" + "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" + "02402004418101490d002004418001418885c08000108b80808000000b20014101" + "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" + "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" + "20032000360200200320013602042003410236020c200341d887c0800036020820" + "0342023702142003418380808000ad4220862204200341046aad84370328200320" + "042003ad843703202003200341206a360210200341086a200210aa80808000000b" + "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" + "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" + "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" + "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" + "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" + "2802000d000240200028021422012000280218220920082002200310ad80808000" + "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" + "0240024002402000280204220120064b0d00200028021422012000280218220920" + "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" + "2000413036021020002d0020210b4101210c200041013a00202000280214220920" + "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" + "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" + "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" + "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" + "1180808080008080808000210c0c010b200120066b210702400240024020002d00" + "2022010e0402000100020b20072101410021070c010b2007410176210120074101" + "6a41017621070b200141016a210120002802102106200028021821092000280214" + "210a024003402001417f6a2201450d01200a200620092802101181808080008080" + "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" + "200a20042005200928020c11808080800080808080000d00410021010340024020" + "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" + "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" + "0041106b220224808080800020022000280200220041046a36020c200141e181c0" + "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" + "418580808000108f808080002100200241106a24808080800020000be70201057f" + "2380808080004180016b22022480808080000240024002400240200128021c2203" + "4110710d0020034120710d0120003502004101200110868080800021000c030b20" + "00280200210041ff00210303402002200322046a22052000410f71220341307220" + "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" + "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" + "004110492106200041047621002006450d000b02402004418101490d0020044180" + "01418885c08000108b80808000000b20014101419885c080004102200541810120" + "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" + "85c08000108b80808000000b20014101419885c080004102200541810120044101" + "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" + "8080800041106b220b248080808000200028021420012002200028021828020c11" + "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" + "200b41086a200320042005200610b680808000200720082009200a10b680808000" + "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" + "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" + "0028021828020c118080808000808080800021000c010b200028021441ee84c080" + "004101200028021828020c118080808000808080800021000b200b41106a248080" + "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" + "23808080800041306b2203248080808000200341033a002c2003412036021c4100" + "210420034100360228200320013602242003200036022020034100360214200341" + "0036020c02400240024002400240200228021022050d00200228020c2200450d01" + "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" + "280200210003400240200041046a2802002207450d002003280220200028020020" + "07200328022428020c11808080800080808080000d040b20012802002003410c6a" + "200128020411818080800080808080000d03200141086a2101200041086a210020" + "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" + "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" + "40200041046a2802002201450d0020032802202000280200200120032802242802" + "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" + "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" + "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" + "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" + "0b0b200320073602102003200b36020c200141046a280200210702400240024020" + "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" + "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a200128020411818080800080808080000d02" + "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" + "280220200228020020044103746a22012802002001280204200328022428020c11" + "80808080008080808000450d010b410121010c010b410021010b200341306a2480" + "8080800020010b1e01017f024020002802002201450d0020002802042001108780" + "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" + "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" + "808080000be30201027f23808080800041106b2202248080808000024002400240" + "02402001418001490d002002410036020c2001418010490d010240200141808004" + "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" + "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" + "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" + "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" + "032000280200470d0020001096808080000b2000200341016a3602082000280204" + "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" + "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" + "20032001109780808000200028020821030b200028020420036a2002410c6a2001" + "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "014108411810d480808000024020012802082200418180808078460d0020002001" - "28020c109580808000000b200141106a2480808080000b950101027f0240200028" - "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" - "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" - "0041046a28020020021082808080000c010b200010918080800020002802002202" - "450d00200041046a280200200241186c1082808080000b200041186a2100200141" - "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" - "01020b20002802082201450d01200028020420011082808080000c010b20002d00" - "044103470d00200028020822012802002102024020012802042203280200220445" - "0d002002200411808080800080808080000b024020032802042203450d00200220" - "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" - "097f017e23808080800041306b2203248080808000024002400240024002400240" - "0240024002400340024002402001280208220420012802042205460d0002400240" - "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" - "00460d0120074120490d012006200441016a22086a21094100200520086b417871" - "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" - "800020012802042105200128020821070c040b200741086a2107200b41086a2109" - "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" - "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" - "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" - "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" - "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" - "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" - "1084808080002207450d052007200936020c200741043602002000200736020420" - "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" - "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" - "024020094122470d002002280208450d0520072004490d072002200b20046a2007" - "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" - "0204200228020810ca8080800020032802282207450d032000200328022c360208" - "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" - "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" - "450d052007200936020c2007411036020020002007360204200041023602002007" - "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" - "80002001200741016a2209360208024020092005490d00200341206a200b200520" - "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" - "1084808080002207450d06200741043602000c090b2001200741026a2204360208" - "02400240024002400240024002400240024002400240200b20096a2d0000220741" - "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" - "00470d020240200228020822072002280200470d00200210cb808080000b200220" - "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" - "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" - "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" - "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" - "22072002280200470d00200210cb808080000b2002200741016a36020820022802" - "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" - "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" - "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" - "02200741016a360208200228020420076a41083a0000410021070c050b02402002" - "28020822072002280200470d00200210cb808080000b2002200741016a36020820" - "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" - "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" - "0000410021070c030b0240200228020822072002280200470d00200210cb808080" - "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" - "40200228020822072002280200470d00200210cb808080000b2002200741016a36" - "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" - "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" - "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" - "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" - "40024020032802282207450d002000200328022c3602084100210b0c010b410221" - "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" - "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" - "200936020c2007200b3602100b20004102360200200020073602040b200341306a" - "2480808080000b7901027f410021030240024020024100480d00024020020d0041" - "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" - "040d01410121030b20032002109580808000000b20042001200210df8080800021" - "012000200236020c2000200136020820002003360204200041033a00000b100002" - "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" - "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" - "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" - "370308200041023a0000200020012903083703100f0b200041023a000020002001" - "290308220337031020002003423f883703080bb40701077f23808080800041306b" - "22022480808080002001280200220328020c210402400240024002402003280214" - "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" - "174b0d024101200874419380800471450d022003200541016a2205360214200620" - "05470d000b200621050b41012108200241286a200420062006200541016a220520" - "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" - "210341141084808080002205450d022005200336020c2005410336020020002005" - "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" - "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" - "20053602140240200520064f0d00034002400240024002400240200420056a2d00" - "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" - "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" - "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" - "0c21062002280208210341141084808080002205450d092005200336020c200541" - "1136020020002005360204200520063602100c080b200041013a0001410021080c" - "070b41012108200241186a200420062006200541016a220520062005491b108380" - "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" - "80002205450d072005200336020c20054115360200200020053602042005200636" - "02100c060b2003200541016a220536021420062005470d000b200621050b410121" - "08200241106a200420062006200541016a220520062005491b1083808080004100" - "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" - "0d042005200336020c2005410536020020002005360204200520063602100c030b" - "41002108200141003a0004024020074122460d002002200420062006200541016a" - "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" - "280200210641141084808080002205450d042005200636020c2005411136020020" - "002005360204200520083602100c020b200041013a00010c020b200241206a2004" - "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" - "21082002280220210641141084808080002205450d022005200636020c20054108" - "36020020002005360204200520083602100b410121080b200020083a0000200241" - "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" - "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" - "8080800022040d01410121030b20032002109580808000000b20042001200210df" - "8080800021012000200236020820002001360204200020033602000bdc0201067f" - "23808080800041106b22022480808080002001280200220328020c210402400240" - "02400240024020032802142201200341106a28020022054f0d000340200420016a" - "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" - "41016a220136021420052001470d000b200521010b200241086a20042005200520" - "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" - "21072002280208210541141084808080002201450d03200141033602000c010b02" - "402006413a470d002003200141016a360214200020031081808080000c020b2002" - "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" - "001a200228020421072002280200210541141084808080002201450d0220014106" - "3602000b2001200536020c20002001360204200041063a0000200120073602100b" - "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" - "042480808080000240024002400240024002400240024002400240024002400240" - "20012802002205450d002002280208210620022802042107200128020421080240" - "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" - "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" - "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" - "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" - "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" - "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" - "2002290204220fa721092002280200220b418080808078470d03200921050c010b" - "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" - "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" - "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" - "028c02200142808080801037020420012009360200200920032903003703002009" - "41086a200341086a290300370300200941106a200341106a2903003703000c010b" - "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" - "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" - "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" - "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" - "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" - "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" - "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" - "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" - "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" - "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" - "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" - "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" - "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" - "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" - "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" - "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" - "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" - "200420042903880137026020042005360208200420063602782008280200220d41" - "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" - "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" - "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" - "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" - "370300200b2003290300370300200b41086a200341086a290300370300200d200e" - "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" - "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" - "246a200441dc006a41186a28020036020020042010370234200420073602302004" - "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" - "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" - "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" - "210d200b2f019203410b490d02200641016a210602400240024002400240024002" - "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" - "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" - "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" - "36027820044188016a200441f8006a10c18080800020042802b001410520044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" - "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" - "2105200d418080808078460d032004200d3602302008200441086a412410df8080" - "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" - "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" - "41003b019203200d410036028802200b41003b019003200b200d36028802200120" - "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" - "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" - "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" - "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" - "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" - "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" - "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" - "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" - "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" - "6a200941106a220d290300370300200041086a200941086a220b29030037030020" - "092003290300370300200b200341086a290300370300200d200341106a29030037" - "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" - "80808080004100210241002103024020002802002204450d002001200436021820" - "014100360214200120043602082001410036020420012000280204220336021c20" - "01200336020c20002802082103410121020b200120033602202001200236021020" - "01200236020002400240024003400240024002400240024020030d002001280200" - "450d0820012802082104200128020422030d0141002100200128020c2203450d06" - "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" - "024020024101712203450d0020012802040d0020012802082103200128020c2200" - "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" - "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" - "3702082001200336020441012102200141013602000b2001280208210002402001" - "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" - "20012802242203450d0120012802282100200128022c220520032f019203490d02" - "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" - "2001200436020c20014100360208200120033602040c010b200320044102746a41" - "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" - "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" - "2802002204450d00200028020420041082808080000b0240024002400240200320" - "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" - "20032802042200450d01200328020820001082808080000c010b200341046a1091" - "8080800020032802042200450d002003280208200041186c1082808080000b2001" - "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" - "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" - "03037f017e037f23808080800041f0006b22022480808080004100210302402000" - "2d0000220420012d0000470d00410121030240024002400240024020040e060500" - "01020304050b20002d000120012d00014621030c040b4100210320002903082205" - "2001290308520d030240024002402005a70e03000102000b200029031020012903" - "105121030c050b200029031020012903105121030c040b20002b031020012b0310" - "6121030c030b41002103200028020c2204200128020c470d022000280208200128" - "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" - "0d012001280208210420002802082100200641016a210103402001417f6a220145" - "21032001450d0220002004109c808080002106200441186a2104200041186a2100" - "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" - "6c2002420037026420024100360254200241003602442002410036023020024100" - "36022020022001280208220636025c200220012802042203360258200220063602" - "4c2002200336024820022000280208220636023820022000280204220136023420" - "0220063602282002200136022420022004410020031b3602602002200341004722" - "033602502002200336024020022004410020011b36023c20022001410047220336" - "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" - "80004101210320022802102201450d0120022802142104200241086a2007109d80" - "80800020022802082200450d0141002103200128020822062000280208470d0120" - "0228020c210820012802042000280204200610dc808080000d0120042008109c80" - "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" - "200128022022020d00410021020c010b20012002417f6a36022002400240024020" - "012802004101470d0020012802040d01200128020821030240200128020c220245" - "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" - "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" - "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" - "050c010b03402003280288022205450d03200241016a210220032f019003210420" - "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" - "21060c010b200520034102746a4198036a21030340200328020022064198036a21" - "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" - "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" - "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" - "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" - "001a200010848080800022010d01410121010b20012000109580808000000b2001" - "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" - "108080808000024002400240024020042d00384106460d00200441086a41106a20" - "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" - "29030037030020042004290338370308200441386a200220031080808080002004" - "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" - "0629030037030020042004290338370320200441086a10a0808080002205450d02" - "200441206a10a0808080002206450d0320052006109c808080002105200441206a" - "108580808000200441086a10858080800002402003450d00200220031082808080" - "000b02402001450d00200020011082808080000b200441d0006a24808080800020" - "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" - "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" - "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" - "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" - "004105470d0020002802042202450d002000280208210303402002418c026a2100" - "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" - "0c020b2000280208210120002802042107200641016a2106200541746a21052000" - "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" - "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" - "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" - "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" - "0041c0006b22052480808080002005200136020c20052000360208200520033602" - "14200520023602102005410236021c200541dc82c0800036021820054202370224" - "2005418180808000ad422086200541106aad843703382005418280808000ad4220" - "86200541086aad843703302005200541306a360220200541186a200410a4808080" - "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" - "41206b2200248080808000200041003602182000410136020c200041ac81c08000" - "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" - "23808080800041206b2202248080808000200241106a200041106a290200370300" - "200241086a200041086a290200370300200241013b011c20022001360218200220" - "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" - "6a280200220241787122006a21030240024020024101710d002002410271450d01" - "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" - "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" - "7136020420012000410172360204200320003602000f0b2001200210a880808000" - "0b024002400240024002400240200328020422024102710d00200341002802f8d2" - "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" - "80002001200220006a2200410172360204200120006a2000360200200141002802" - "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" - "2000410172360204200120006a20003602000b2000418002490d022001200010d7" - "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" - "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" - "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" - "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" - "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" - "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" - "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" - "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" - "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" - "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" - "00220241012000410376742200710d00410020022000723602e4d2c08000200321" - "000c010b200328020821000b200320013602082000200136020c2001200336020c" - "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" - "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" - "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" - "0041206b2203248080808000200341003602102003410136020420034204370208" - "2003200136021c200320003602182003200341186a3602002003200210a4808080" - "00000b840601057f0240024002402000417c6a2203280200220441787122054104" - "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" - "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" - "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" - "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" - "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" - "7871220420056a22052001490d042006200410a880808000200520016b22024110" - "490d0120032001200328020041017172410272360200200720016a220120024103" - "72360204200720056a220520052802044101723602042001200210a98080800020" - "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" - "20016a22052002410372360204200620062802044101723602042005200210a980" - "80800020000f0b20032005200328020041017172410272360200200720056a2202" - "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" - "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" - "200720056a2202200228020441017236020441002102410021010c010b20032001" - "200441017172410272360200200720016a22012002410172360204200720056a22" - "05200236020020052005280204417e713602040b410020013602f4d2c080004100" - "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" - "0240200210848080800022050d0041000f0b20052000417c417820032802002201" - "4103711b20014178716a2201200220012002491b10df808080002102200010a580" - "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" - "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" - "410272360200200720016a2202200520016b2205410172360204410020053602f0" - "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" - "4002402001418002490d002000280218210302400240024020022000470d002000" - "41144110200028021422021b6a28020022010d01410021020c020b200028020822" - "01200236020c200220013602080c010b200041146a200041106a20021b21040340" - "200421052001220241146a200241106a200228021422011b210420024114411020" - "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" - "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" - "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" - "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" - "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" - "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d0020022001360214" - "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" - "4101710d002003410271450d012000280200220320016a21010240200020036b22" - "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" - "d2c0800020022002280204417e7136020420002001410172360204200220013602" - "000c020b2000200310a8808080000b024002400240024020022802042203410271" - "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" - "03417871220310a8808080002000200320016a2201410172360204200020016a20" - "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" - "2003417e7136020420002001410172360204200020016a20013602000b02402001" - "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" - "0240024041002802e4d2c08000220341012001410376742201710d004100200320" - "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" - "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" - "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" - "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" - "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" - "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" - "7e23808080800041306b2203248080808000200320003602002003200136020420" - "03410236020c200341c485c08000360208200342023702142003418380808000ad" - "4220862204200341046aad84370328200320042003ad843703202003200341206a" - "360210200341086a200210a480808000000b110020003502004101200110ad8080" - "80000b7902017f017e23808080800041306b220324808080800020032001360204" - "200320003602002003410236020c200341c882c080003602082003420237021420" - "03418380808000ad42208622042003ad8437032820032004200341046aad843703" - "202003200341206a360210200341086a200210a480808000000bec0203027f017e" - "037f23808080800041306b2203248080808000412721040240024020004290ce00" - "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" - "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" - "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" - "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" - "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" - "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" - "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" - "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" - "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" - "23808080800041206b220124808080800020002802182102200141106a20004110" - "6a290200370300200141086a200041086a2902003703002001200036021c200120" - "0236021820012000290200370300200110d880808000000bcb0501077f02400240" - "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" - "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" - "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" - "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" - "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" - "28021422012000280218220920082002200310b080808000450d0041010f0b2001" - "20042005200928020c11818080800080808080000f0b0240024002400240200028" - "0204220120064b0d00200028021422012000280218220920082002200310b08080" - "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" - "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" - "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" - "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" - "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" - "00202000200736021041000f0b200120042005200928020c118180808000808080" - "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" - "020b20072101410021070c010b20074101762101200741016a41017621070b2001" - "41016a210120002802102106200028021821092000280214210a02400340200141" - "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" - "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" - "020c11818080800080808080000d00410021010340024020072001470d00200720" - "07490f0b200141016a2101200a200620092802101182808080008080808000450d" - "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" - "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" - "200020032004200128020c11818080800080808080000b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c200341e485c08000360208200342023702142003418380808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" - "200028020022040d002003410171450d010b02402003410171450d00200120026a" - "210502400240200028020c22060d0041002107200121080c010b41002107410021" - "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" - "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" - "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" - "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" - "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" - "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" - "2007200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a02402002" - "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" - "0641002103024020012007460d004100210302402009417c4b0d00410021034100" - "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" - "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" - "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" - "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" - "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" - "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" - "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" - "41002108024020054104490d002004200d41f007716a2109410021082004210303" - "40200328020c2207417f7341077620074106767241818284087120032802082207" - "417f7341077620074106767241818284087120032802042207417f734107762007" - "4106767241818284087120032802002207417f7341077620074106767241818284" - "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" - "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" - "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" - "4107762003410676724181828408712103200c4101460d0220082802042207417f" - "7341077620074106767241818284087120036a2103200c4102460d022008280208" - "2208417f7341077620084106767241818284087120036a21030c020b024020020d" - "00410021060c030b2002410371210802400240200241044f0d0041002106410021" - "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" - "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" - "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" - "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" - "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" - "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" - "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" - "024020002d00200e0402000102020b20052103410021050c010b20054101762103" - "200541016a41017621050b200341016a2103200028021021092000280218210820" - "00280214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c118180" - "80800080808080000f0b0240200720012002200828020c11818080800080808080" - "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" - "016a21032007200920082802101182808080008080808000450d000b2003417f6a" - "2005490b140020012000280200200028020410b2808080000b1c00200028020020" - "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" - "306b2203248080808000200341033a002c2003412036021c410021042003410036" - "02282003200136022420032000360220200341003602142003410036020c024002" - "40024002400240200228021022050d00200228020c2200450d0120022802082101" - "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" - "0240200041046a2802002207450d00200328022020002802002007200328022428" - "020c11818080800080808080000d040b20012802002003410c6a20012802041182" - "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" - "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" - "41016a210420022802082109200228020021004100210603400240200041046a28" - "02002201450d00200328022020002802002001200328022428020c118180808000" - "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" - "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" - "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" - "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" - "02102003200b36020c200141046a280200210702400240024020012802000e0301" - "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" - "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" - "2802002003410c6a200128020411828080800080808080000d02200041086a2100" - "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" - "0020044103746a22012802002001280204200328022428020c1181808080008080" - "808000450d010b410121010c010b410021010b200341306a24808080800020010b" - "d70201057f2380808080004180016b220224808080800002400240024002402001" - "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" - "030b41ff00210303402002200322046a22052000410f712203413072200341d700" - "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" - "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" - "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" - "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" - "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" - "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" - "20024180016a24808080800020000b7902017f017e23808080800041306b220324" - "808080800020032000360200200320013602042003410236020c2003419886c080" - "00360208200342023702142003418380808000ad4220862204200341046aad8437" - "0328200320042003ad843703202003200341206a360210200341086a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" - "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" - "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" - "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" - "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" - "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" - "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" - "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" - "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" - "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" - "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" - "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" - "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" - "0010a280808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641a888c0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541b089c080003602302005420537023c20054182" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418480808000ad422086200541286aad843703582005418580808000ad42" - "2086200541246aad843703502005418380808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541f089c080003602302005420337023c2005" - "418280808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418380808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541d088c080003602302005420437023c2005418280" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" - "000d00200128021441d881c080004102200128021828020c118180808000808080" - "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111828080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111828080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11818080800080808080000d010b2004412720011182808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410de808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" - "400240024041c8031084808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" - "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "df80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" - "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" - "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" - "00200028020021002002410036022c2002428080808010370224200241033a0050" - "200241203602402002410036024c200241c0a0c080003602482002410036023820" - "0241003602302002200241246a3602440240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002400240" - "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" - "1314151617180b024002400240024020002d00040e0400010203000b2002200028" - "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" - "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" - "2900e4ccc08000370000200241143602602002200336025c200241143602582002" - "410336026c200241ccccc08000360268200242023702742002418680808000ad42" - "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" - "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" - "8080002103024020022802582204450d00200228025c20041082808080000b2003" - "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" - "013702742002418280808000ad422086200241086aad8437035820022003410274" - "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" - "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" - "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" - "0c190b20002802082203280200200241306a200328020428021011828080800080" - "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" - "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" - "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" - "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" - "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" - "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" - "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" - "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" - "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" - "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" - "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" - "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" - "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" - "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" - "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" - "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" - "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" - "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" - "6a200241246a41086a280200360200200220022902243703582002418380808000" - "36027c2002418380808000360274200241888080800036026c2002410436020c20" - "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" - "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" - "280218200241086a10b5808080002100024020022802582201450d00200228025c" - "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" - "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" - "00280204200028020810b2808080000b4b01017f02402000280200200028020822" - "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" - "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" - "8080800041106b2202248080808000200028020821032000280204210441012105" - "024020012802142206412220012802182207280210220811828080800080808080" - "000d000240024020030d0041002103410021000c010b410021094100210a200421" - "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" - "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" - "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" - "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" - "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" - "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" - "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" - "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" - "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" - "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" - "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" - "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" - "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" - "0d010240024020022d0004418001470d0020062002280208200811828080800080" - "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" - "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" - "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" - "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" - "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" - "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" - "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" - "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" - "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" - "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" - "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" - "200728020c11818080800080808080000d00200641222008118280808000808080" - "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" - "05200128021828020c11818080800080808080000b1e01017f0240200028020022" - "01450d00200028020420011082808080000b0b5301047f02402000280208220120" - "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" - "200441dc00460d0120044120490d012000200141016a220136020820022001470d" - "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" - "0210cf80808000200028020821030b200028020420036a2001200210df80808000" - "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" - "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" - "20026b21074100210503400240024002400240200220056a2d00002208c0220941" - "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" - "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" - "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" - "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" - "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" - "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" - "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" - "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" - "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" - "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" - "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" - "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" - "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" - "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" - "0520042802082108024041141084808080002203450d002003200836020c200341" - "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" - "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" - "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" - "41106a2480808080000b5901017f23808080800041106b22012480808080002001" - "41086a2000200028020041014101410110d4808080000240200128020822004181" - "80808078460d002000200128020c109580808000000b200141106a248080808000" - "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" - "8080000240024020022f01140d0002400240024002400240024020022f01162203" - "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" - "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" - "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" - "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" - "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" - "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" - "2205418080046a210302402001280200200128020822006b41034b0d0020012000" - "410410cf80808000200128020821000b2001200041046a36020820012802042000" - "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" - "002005410676413f71418001723a000220002003410c76413f71418001723a0001" - "410021000c070b200220002802002000280204200028020810838080800041002d" - "00c0cfc080001a200228020421012002280200210341141084808080002200450d" - "042000200336020c20004114360200200020013602100c060b200241086a200028" - "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" - "21012002280208210341141084808080002200450d032000200336020c20004114" - "360200200020013602100c050b200241173602142000200241146a10d080808000" - "21000c040b200241173602142000200241146a10d08080800021000c030b024002" - "4002402003418001490d0002402001280200200128020822046b41034b0d002001" - "2004410410cf80808000200128020821040b200128020420046a21002003418010" - "4f0d0120034106764140722106410221050c020b02402001280208220020012802" - "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" - "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" - "60722106410321050b200020063a00002001200420056a360208200020056a417f" - "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" - "206a24808080800020000b910301057f23808080800041106b2202248080808000" - "02400240024002402001280204220320012802082204490d000240200320046b41" - "034b0d0020012003360208200241086a2001280200200320031083808080004100" - "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" - "0d022001200436020c2001410436020020002001360204200120033602100c030b" - "2001200441046a220536020802402001280200220620046a22012d000141017441" - "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" - "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" - "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" - "001a200228020421032002280200210441141084808080002201450d0220012004" - "36020c2001410c36020020002001360204200120033602100c030b200020013b01" - "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" - "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" - "022480808080000240024002402001280208220320012802042204490d00200241" - "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" - "032002280208210441141084808080002201450d022001200436020c2001410436" - "02002000200136020420012003360210410121010c010b2000200128020020036a" - "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" - "5601017f23808080800041106b2203248080808000200341086a20002001200241" - "01410110d480808000024020032802082202418180808078460d00200220032802" - "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" - "106b2202248080808000200241086a200028020020002802042000280208108380" - "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" - "8080800022000d00000b2000200436020c20002001290200370200200020033602" - "10200041086a200141086a280200360200200241106a24808080800020000b1f00" - "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" - "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" - "00200320016a3602080b200241106a24808080800041000b820101017f02400240" - "024002402003280204450d000240200328020822040d002002450d0341002d00c0" - "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" - "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" - "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" - "8080800041206b2206248080808000024002400240200220036a220320024f0d00" - "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" - "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" - "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" - "20080d00410021020c010b2006200820056c36021c200620012802043602142004" - "21020b20062002360218200641086a20042009200641146a10d380808000024020" - "062802080d00200628020c21022001200736020020012002360204418180808078" - "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" - "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" - "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" - "017120024101746b413e6a21020b200042003702102000200236021c2002410274" - "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" - "00360200200020033602182000200036020c20002000360208410041002802e8d2" - "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" - "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" - "03034020042003411d764104716a41106a22052802002202450d02200341017421" - "032002210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b20052000" - "360200200020043602182000200036020c200020003602080b0b00200010d98080" - "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" - "024002400240024020002802040e020001020b20020d0141012102410021030c02" - "0b20020d00200028020022022802042103200228020021020c010b200141808080" - "80783602002001200036020c2001418980808000200028021c22002d001c20002d" - "001d10da80808000000b20012003360204200120023602002001418a8080800020" - "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" - "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" - "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" - "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" - "086a200020011183808080008080808000000b410041003a0094d3c08000200245" - "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" - "02402002450d000240034020002d0000220420012d00002205470d01200041016a" - "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" - "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" - "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" - "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" - "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" - "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" - "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" - "280200210803402005417c6a220520082003742001280200220820027672360200" - "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" - "210103402005417c6a220520012802003602002001417c6a210120042005490d00" - "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" - "036a210502402003450d0020002104200121080340200420082d00003a00002008" - "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" - "6a210402400240200120036a2206410371450d0020074101480d01200641037422" - "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" - "21080340200520082002762001280200220820037472360200200141046a210120" - "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" - "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" - "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" - "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" - "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" - "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" - "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" - "00410020006b41037122046a210502402004450d00200021032001210603402003" - "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" - "01480d012009410374220641187121022009417c71220a41046a2101410020066b" - "4118712104200a2802002106034020052006200276200128020022062004747236" - "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" - "092101034020052001280200360200200141046a2101200541046a22052003490d" - "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" - "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" - "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" - "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" - "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" - "0a000000150000004b000000450010000a000000160000004b0000004163636f75" - "6e7400450010000a0000001700000033000000450010000a000000180000003300" - "00006361706163697479206f766572666c6f770000009800100011000000616c6c" - "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" - "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" - "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" - "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" - "686520696e6465782069732000150110002000000035011000120000003a200000" - "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" - "7273006c0110001300000066000000170000003078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230323132" - "323233323432353236323732383239333033313332333333343335333633373338" - "333934303431343234333434343534363437343834393530353135323533353435" - "353536353735383539363036313632363336343635363636373638363937303731" - "373237333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939636f72652f7372632f66" - "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" - "000000a40900001a00000072616e676520737461727420696e64657820206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" - "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" - "10000000a202100022000000736c69636520696e64657820737461727473206174" - "202062757420656e64732061742000f4021000160000000a0310000d0000000101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000020202020202" - "020202020202020202020202020202020202020202020202030303030303030303" - "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" - "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" - "000e0000003b041000040000003f041000100000004f0410000100000062797465" - "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" - "7420697320696e7369646520202862797465732029206f66206000700410000b00" - "00007b04100026000000a104100008000000a9041000060000004f041000010000" - "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" - "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" - "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" - "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" - "002c0510001d0000000a0000002b00000000060101030104020507070208080902" - "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" - "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" - "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" - "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" - "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" - "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" - "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" - "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" - "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" - "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" - "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" - "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" - "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" - "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" - "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" - "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" - "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" - "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" - "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" - "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" - "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" - "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" - "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" - "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" - "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" - "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" - "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" - "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" - "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" - "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" - "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" - "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" - "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" - "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" - "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" - "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" - "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" - "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" - "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" - "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" - "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" - "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" - "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" - "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" - "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" - "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" - "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" - "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" - "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" - "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" - "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" - "0239010405010204011402160601013a0101020104080107030a021e013b010101" - "0c01090128010301370101030503010407020b021d013a01020102010301050207" - "020b021c02390201010204080109010a021d014801040102030101080151010207" - "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" - "0202021902040310040d01020206010f01000300031d021e021e02400201070801" - "020b09012d030101750222017603040209010603db0202013a0101070101010102" - "08060a0201301f310430070101050128090c022004020201033801010203010103" - "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" - "04010a200250020001030104011902050197021a120d012608190b2e0330010204" - "020227014306020202020c0108012f01330101030202050201012a020801ee0102" - "01040100010010101000020001e201950500030102050428030401a50200040002" - "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" - "090a0402015f0302010102060102019d010308150239020101010116010e070305" - "c308020301011701510102060101020101020102eb010204060201021b02550802" - "0101026a0101010206010165030204010500090102f5010a020101040190040202" - "0401200a280602040801090602032e0d010200070106010152160207010201027a" - "06030101020107010148020301010100020b023405050101010001060f00053b07" - "00013f0451010002002e0217000101030405080802071e0494030037043208010e" - "011605010f000701110207010201056401a00700013d04000400076d07006080f0" - "002f72757374632f63326637346333663932386165623530336631356234653965" - "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" - "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" - "0e10006000000071010000360000002f72757374632f6332663734633366393238" - "61656235303366313562346539656635373738653737663330353862382f6c6962" - "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" - "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" - "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" - "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" - "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" - "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" - "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" - "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" - "00181d10005f00000058020000300000000d0000000c000000040000000e000000" - "0f00000010000000000000000000000001000000110000006120446973706c6179" - "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" - "20756e65787065637465646c792f72757374632f63326637346333663932386165" - "6235303366313562346539656635373738653737663330353862382f6c69627261" - "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" - "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" - "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" - "207768696c652070617273696e67206120737472696e67454f46207768696c6520" - "70617273696e6720612076616c7565657870656374656420603a60657870656374" - "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" - "78706563746564206964656e7465787065637465642076616c7565657870656374" - "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" - "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" - "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" - "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" - "206120737472696e676b6579206d757374206265206120737472696e67696e7661" - "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" - "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" - "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" - "6164696e6720737572726f6761746520696e206865782065736361706574726169" - "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" - "70656374656420656e64206f662068657820657363617065726563757273696f6e" - "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" - "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" - "4826100001000000000000000000f03f0000000000002440000000000000594000" - "00000000408f40000000000088c34000000000006af8400000000080842e410000" - "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" - "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" - "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" - "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" - "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" - "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" - "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" - "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" - "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" - "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" - "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" - "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" - "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" - "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" - "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" - "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" - "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" - "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" - "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" - "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" - "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" - "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" - "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" - "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" - "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" - "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" - "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" - "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" - "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" - "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" - "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" - "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" - "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" - "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" - "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" - "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" - "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" - "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" - "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" - "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" - "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" - "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" - "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" - "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" - "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" - "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" - "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" - "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" - "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" - "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" - "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" - "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" - "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" - "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" - "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" - "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" - "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" - "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" - "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" - "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" - "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" - "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" - "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" - "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" - "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" - "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" - "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" - "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" - "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" - "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" - "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" - "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" - "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" - "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" - "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" - "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" - "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" - "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" - "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" - "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" - "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" - "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" - "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" - "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" - "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" - "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" - "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" - "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" - "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" - "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" - "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" - "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" - "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" - "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" - "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" - "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" - "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" - "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" - "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" - "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" - "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" - "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" - "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" - "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" - "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" - "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" - "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" - "64656466696c6520746f6f206c617267657265736f757263652062757379657865" - "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" - "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" - "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" - "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" - "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" - "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" - "0048261000010000006f7065726174696f6e207375636365737366756c10000000" - "1100000012000000100000001000000013000000120000000d0000000e00000015" - "0000000c0000000b00000015000000150000000f0000000e000000130000002600" - "00003800000019000000170000000c000000090000000a00000010000000170000" - "00190000000e0000000d00000014000000080000001b0000000e00000010000000" - "16000000150000000b000000160000000d0000000b000000130000005023100060" - "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" - "1000f8231000042410000f24100024241000392410004824100056241000692410" - "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" - "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" - "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" - "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" - "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" - "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" - "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" - "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" - "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" - "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" - "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" - "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" - "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" - "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" - "243137683533326265333033376461316237656445064a5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" - "70617273655f6964656e743137683663353964643731393635353139313045074b" - "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" - "4c54245224475424313270617273655f6e756d6265723137683738336134316134" - "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" - "73657269616c697a6572244c54245224475424313370617273655f646563696d61" - "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" - "70617273655f6578706f6e656e7431376833366464376462643233653461346562" - "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" - "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" - "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" - "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" - "346636345f66726f6d5f7061727473313768633863316239626161613836666637" - "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" - "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" - "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" - "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" - "24313670617273655f616e795f6e756d6265723137683931643533303465356139" - "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" - "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" - "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" - "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" - "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" - "61775f7665633139526177566563244c54245424432441244754243867726f775f" - "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" - "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" - "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" - "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" - "62653863353535633862636433353545143c5f5a4e357365726465326465375669" - "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" - "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" - "68616e646c655f6572726f72313768393762376462643066373264643738384516" - "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" - "35766973697431376838366238393638313662613130613765451781015f5a4e37" - "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" - "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" - "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" - "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" - "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" - "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" - "244754243976697369745f73747231376835356436653830653061376366383938" - "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" - "6363657373244c5424522447542424753230246173247532302473657264652e2e" - "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" - "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" - "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" - "4c54244b24432456244324412447542436696e7365727431376834643164623464" - "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" - "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" - "244b244324562443244124475424247532302461732475323024636f72652e2e6f" - "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" - "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" - "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" - "702e2e5061727469616c4571244754243265713137683162323138393234373831" - "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" - "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" - "475424247532302461732475323024636f72652e2e697465722e2e747261697473" - "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" - "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" - "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" - "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" - "6e646578244754243130696e6465785f696e746f31376864333238633634636161" - "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" - "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" - "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" - "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" - "63617061636974795f6f766572666c6f7731376834393964343832613965643537" - "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" - "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" - "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" - "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" - "70616e69636b696e673570616e6963313768303465656239313764643933633232" - "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" - "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" - "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" - "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "244754243133646973706f73655f6368756e6b3137683665306363636434353836" - "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" - "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" - "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" - "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" - "2475323024666f7224753230247533322447542433666d74313768626633653032" - "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" - "70616e69635f626f756e64735f636865636b313768336436623861613463383034" - "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" - "363431376864353231666136656636613036373261452e11727573745f62656769" - "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" - "327061645f696e74656772616c3137686334656130376130626331333536633445" - "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" - "656772616c313277726974655f7072656669783137686139613433323830623630" - "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" - "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" - "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" - "706164313768343736396165333839333734636335314533495f5a4e34345f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" - "706c61792447542433666d74313768376666346430623836303963323437324534" - "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" - "2e666d742e2e44656275672447542433666d743137683361366261613162623437" - "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" - "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" - "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" - "3024666f7224753230247533322447542433666d74313768353533393862313635" - "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" - "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" - "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" - "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" - "6275675f657874313768656366613566303431373437393039384539345f5a4e34" - "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" - "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" - "6963655f6572726f725f6661696c31376862303364323439386438646362363433" - "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" - "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" - "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" - "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" - "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" - "656275672447542433666d7431376865613566643964626339343936626665453e" - "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" - "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" - "30246933322447542433666d743137686365643930633761363339633031646445" - "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" - "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" - "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" - "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" - "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" - "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" - "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" - "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" - "3130696e736572745f666974313768633861306366353339656666303131314541" - "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" - "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" - "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" - "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" - "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" - "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" - "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768343032353764366634326532" - "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" - "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" - "61792447542433666d74313768636534323236616131663732366331634544615f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" - "74655f73747231376835393964396535373839343664643938452e31393245575f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768623637326562313939633335643138364546555f5a4e35335f244c542463" - "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768663761653238353562323439" - "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" - "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" - "313768376236353738393966393837353963624548475f5a4e313073657264655f" - "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" - "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" - "616c6c6f63337665633136566563244c5424542443244124475424313765787465" - "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" - "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" - "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" - "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" - "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" - "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" - "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" - "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" - "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" - "6f64655f6865785f65736361706531376834376265353936383535663830346461" - "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" - "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" - "63377261775f7665633230526177566563496e6e6572244c542441244754243772" - "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" - "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" - "3472656164356572726f7231376865663535323764333333633963323666455130" - "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" - "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" - "666d742e2e577269746524475424313077726974655f6368617231376832313433" - "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" - "766563313166696e6973685f67726f773137683533383539626133383962373164" - "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" - "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" - "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" - "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" - "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" - "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" - "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" - "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" - "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" - "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" - "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" - "75376424247537642431376865313761333937376638396331313738455a3b5f5a" - "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" - "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" - "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" - "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" - "61735f73747231376865623366373232643232346534326638455c066d656d636d" - "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" - "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" - "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" - "2e726f6461746100550970726f64756365727302086c616e677561676501045275" - "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" - "6768746c79202863326637346333663920323032342d30392d30392900490f7461" - "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::string escrow_tx_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; - - std::vector escrow_tx_json_data( - escrow_tx_json_str.begin(), escrow_tx_json_str.end()); - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasm( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasm( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - } - - void - testEscrowWasmP4() - { - testcase("escrow wasm P4 test"); - auto wasmHex = - "0061736d0100000001791160037f7f7f017f60027f7f017f60017f0060027f7f00" - "60037e7f7f017f60037f7f7f0060067f7f7f7f7f7f017f60017f017f60047f7f7f" - "7f017f60057f7f7f7f7f0060000060057f7f7f7f7f017f60077f7f7f7f7f7f7f01" - "7f60047f7f7f7f0060067f7f7f7f7f7f0060047f7f7f7e0060057f7f7f7e7f0003" - "7c7b01010301040506010202020202010102050001000103010007070303080500" - "090201020a03020500030305020b05050101010001010a0505050c090901010105" - "0903010101030d0d0502050d01030301010d0e020a0a02030101020a0d0d000101" - "0a030302020d03030205050003030f0f1010101009030000000004050170011e1e" - "05030100110619037f01418080c0000b7f004184e0c0000b7f004190e0c0000b07" - "5106066d656d6f7279020008616c6c6f6361746500180a6465616c6c6f63617465" - "001b11636f6d706172655f6163636f756e744944001c0a5f5f646174615f656e64" - "03010b5f5f686561705f6261736503020923010041010b1d210307122f30433134" - "3c3d443e59626708110e500d160942585a5e5f600a9188037b6601017f23808080" - "800041106b220224808080800002400240200028020c450d00200021010c010b20" - "0241086a200041086a280200360200200220002902003703002001200210818080" - "80002101200041141082808080000b200241106a24808080800020010b8c010103" - "7f23808080800041106b2202248080808000200241086a200028020c2000280210" - "200028021410c78080800041002d00e0dbc080001a200228020c21032002280208" - "21040240411410998080800022000d00000b2000200436020c2000200129020037" - "020020002003360210200041086a200141086a280200360200200241106a248080" - "80800020000b7001027f024002402000417c6a2802002202417871220341044108" - "200241037122021b20016a490d0002402002450d002003200141276a4b0d020b20" - "0010a5808080000f0b419db8c08000412e41ccb8c0800010a680808000000b41dc" - "b8c08000412e418cb9c0800010a680808000000be90201057f2380808080004180" - "016b22022480808080000240024002400240200128021c22034110710d00200341" - "20710d0120003100004101200110848080800021000c030b20002d0000210041ff" - "00210303402002200322046a22052000410f712203413072200341d7006a200341" - "0a491b3a00002004417f6a2103200041ff017122064104762100200641104f0d00" - "0c020b0b20002d0000210041ff00210303402002200322046a22052000410f7122" - "03413072200341376a2003410a491b3a00002004417f6a2103200041ff01712206" - "4104762100200641104f0d000b02402004418101490d002004418001419887c080" - "00108580808000000b2001410141a887c0800041022005418101200441016a6b10" - "868080800021000c010b02402004418101490d002004418001419887c080001085" - "80808000000b2001410141a887c0800041022005418101200441016a6b10868080" - "800021000b20024180016a24808080800020000bec0203027f017e037f23808080" - "800041306b2203248080808000412721040240024020004290ce005a0d00200021" - "050c010b412721040340200341096a20046a2206417c6a20004290ce0080220542" - "f0b1037e20007ca7220741ffff037141e4006e220841017441aa87c080006a2f00" - "003b00002006417e6a2008419c7f6c20076a41ffff037141017441aa87c080006a" - "2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22046a" - "2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441aa" - "87c080006a2f00003b00000b024002402006410a490d00200341096a2004417e6a" - "22046a200641017441aa87c080006a2f00003b00000c010b200341096a2004417f" - "6a22046a20064130723a00000b2002200141014100200341096a20046a41272004" - "6b1086808080002104200341306a24808080800020040b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c2003419c8ac08000360208200342023702142003418180808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bcb0501077f0240024020010d00200541016a2106" - "200028021c2107412d21080c010b412b418080c400200028021c22074101712201" - "1b2108200120056a21060b0240024020074104710d00410021020c010b02400240" - "20030d00410021090c010b02402003410371220a0d000c010b4100210920022101" - "0340200920012c000041bf7f4a6a2109200141016a2101200a417f6a220a0d000b" - "0b200920066a21060b024020002802000d00024020002802142201200028021822" - "0920082002200310ac80808000450d0041010f0b200120042005200928020c1180" - "8080800080808080000f0b02400240024002402000280204220120064b0d002000" - "28021422012000280218220920082002200310ac80808000450d0141010f0b2007" - "410871450d01200028021021072000413036021020002d0020210b4101210c2000" - "41013a0020200028021422092000280218220a20082002200310ac808080000d02" - "200120066b41016a2101024003402001417f6a2201450d0120094130200a280210" - "1181808080008080808000450d000b41010f0b0240200920042005200a28020c11" - "80808080008080808000450d0041010f0b2000200b3a0020200020073602104100" - "0f0b200120042005200928020c1180808080008080808000210c0c010b20012006" - "6b210702400240024020002d002022010e0402000100020b20072101410021070c" - "010b20074101762101200741016a41017621070b200141016a2101200028021021" - "06200028021821092000280214210a024003402001417f6a2201450d01200a2006" - "20092802101181808080008080808000450d000b41010f0b4101210c200a200920" - "082002200310ac808080000d00200a20042005200928020c118080808000808080" - "80000d00410021010340024020072001470d0020072007490f0b200141016a2101" - "200a200620092802101181808080008080808000450d000b2001417f6a2007490f" - "0b200c0be70201057f2380808080004180016b2202248080808000024002400240" - "0240200128021c22034110710d0020034120710d01200035020041012001108480" - "80800021000c030b2000280200210041ff00210303402002200322046a22052000" - "410f712203413072200341d7006a2003410a491b3a00002004417f6a2103200041" - "10492106200041047621002006450d000c020b0b2000280200210041ff00210303" - "402002200322046a22052000410f712203413072200341376a2003410a491b3a00" - "002004417f6a210320004110492106200041047621002006450d000b0240200441" - "8101490d002004418001419887c08000108580808000000b2001410141a887c080" - "0041022005418101200441016a6b10868080800021000c010b0240200441810149" - "0d002004418001419887c08000108580808000000b2001410141a887c080004102" - "2005418101200441016a6b10868080800021000b20024180016a24808080800020" - "000b1e01017f024020002802002201450d00200028020420011082808080000b0b" - "970101047f024002400240200028020022002802000e020001020b200028020822" - "01450d01200028020420011082808080000c010b20002d00044103470d00200028" - "0208220128020021020240200128020422032802002204450d0020022004118280" - "80800080808080000b024020032802042203450d00200220031082808080000b20" - "01410c1082808080000b200041141082808080000b6801017f0240024002400240" - "20002d00000e050303030102000b200041046a108b808080000c020b2000280204" - "2201450d01200028020820011082808080000f0b200041046a108c808080002000" - "2802042201450d002000280208200141186c1082808080000f0b0be30501067f23" - "808080800041306b22012480808080004100210241002103024020002802002204" - "450d00200120043602182001410036021420012004360208200141003602042001" - "2000280204220336021c2001200336020c20002802082103410121020b20012003" - "360220200120023602102001200236020002400240024003400240024002400240" - "024020030d002001280200450d0820012802082104200128020422030d01410021" - "00200128020c2203450d06034020042802980321042003417f6a22030d000c070b" - "0b20012003417f6a360220024020024101712203450d0020012802040d00200128" - "02082103200128020c2200450d03034020032802980321032000417f6a22000d00" - "0c040b0b2003450d01200128020421030c030b200421000c050b41a8acc0800010" - "a080808000000b200142003702082001200336020441012102200141013602000b" - "200128020821000240200128020c220520032f019203490d000240034020014124" - "6a2003200010bf8080800020012802242203450d0120012802282100200128022c" - "220520032f019203490d020c000b0b4188a5c0800010a080808000000b20054101" - "6a21040240024020000d002001200436020c20014100360208200120033602040c" - "010b200320044102746a4198036a21040340200428020022064198036a21042000" - "417f6a22000d000b20014200370208200120063602042003450d040b0240200320" - "05410c6c6a418c026a22002802002204450d00200028020420041082808080000b" - "02400240024002402003200541186c6a22032d00000e050303030102000b200341" - "046a108b808080000c020b20032802042200450d01200328020820001082808080" - "000c010b200341046a108c8080800020032802042200450d002003280208200041" - "186c1082808080000b200128022021030c000b0b200421030b0340200141246a20" - "03200010bf8080800020012802242203450d01200128022821000c000b0b200141" - "306a2480808080000b950101027f024020002802082201450d0020002802044104" - "6a2100034002400240024002402000417c6a2d00000e050303030102000b200010" - "8b808080000c020b20002802002202450d01200041046a28020020021082808080" - "000c010b2000108c8080800020002802002202450d00200041046a280200200241" - "186c1082808080000b200041186a21002001417f6a22010d000b0b0b2200200128" - "021441d4a6c080004105200128021828020c11808080800080808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "002000108f808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110908080" - "8000200028020821030b200028020420036a2002410c6a200110fa808080001a20" - "00200320016a3602080b200241106a24808080800041000b5901017f2380808080" - "0041106b2201248080808000200141086a2000200028020041014101410110d280" - "808000024020012802082200418180808078460d002000200128020c109a808080" - "00000b200141106a2480808080000b5601017f23808080800041106b2203248080" - "808000200341086a2000200120024101410110d280808000024020032802082202" - "418180808078460d002002200328020c109a80808000000b200341106a24808080" + "01109c80808000024020012802082200418180808078460d002000200128020c10" + "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" + "03248080808000200341086a200020012002109c80808000024020032802082202" + "418180808078460d002002200328020c109d80808000000b200341106a24808080" "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109080808000200028020821030b200028020420036a2001200210fa808080001a" - "2000200320026a36020841000b1400200120002802042000280208109380808000" - "0bc20b010b7f200028020821030240024002400240200028020022040d00200341" - "0171450d010b02402003410171450d00200120026a210502400240200028020c22" - "060d0041002107200121080c010b41002107410021092001210803402008220320" - "05460d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21080c" - "010b200341046a21080b200820036b20076a21072006200941016a2209470d000b" - "0b20082005460d00024020082c00002203417f4a0d0020034160491a0b02400240" - "2007450d000240200720024f0d00200120076a2c000041bf7f4a0d01410021030c" - "020b20072002460d00410021030c010b200121030b2007200220031b2102200320" - "0120031b21010b024020040d00200028021420012002200028021828020c118080" - "80800080808080000f0b2000280204210a024020024110490d0020022001200141" - "036a417c7122076b22096a220b4103712104410021064100210302402001200746" - "0d004100210302402009417c4b0d00410021034100210503402003200120056a22" - "082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841026a2c000041bf7f" - "4a6a200841036a2c000041bf7f4a6a2103200541046a22050d000b0b2001210803" - "40200320082c000041bf7f4a6a2103200841016a2108200941016a22090d000b0b" - "02402004450d002007200b417c716a22082c000041bf7f4a210620044101460d00" - "200620082c000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a" - "21060b200b4102762105200620036a21060340200721042005450d04200541c001" - "200541c001491b220b410371210c200b410274210d41002108024020054104490d" - "002004200d41f007716a210941002108200421030340200328020c2207417f7341" - "077620074106767241818284087120032802082207417f73410776200741067672" - "41818284087120032802042207417f734107762007410676724181828408712003" - "2802002207417f7341077620074106767241818284087120086a6a6a6a21082003" - "41106a22032009470d000b0b2005200b6b21052004200d6a2107200841087641ff" - "81fc0771200841ff81fc07716a418180046c41107620066a2106200c450d000b20" - "04200b41fc01714102746a22082802002203417f73410776200341067672418182" - "8408712103200c4101460d0220082802042207417f734107762007410676724181" - "8284087120036a2103200c4102460d0220082802082208417f7341077620084106" - "767241818284087120036a21030c020b024020020d00410021060c030b20024103" - "71210802400240200241044f0d0041002106410021090c010b4100210620012103" - "2002410c71220921070340200620032c000041bf7f4a6a200341016a2c000041bf" - "7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a21062003" - "41046a21032007417c6a22070d000b0b2008450d02200120096a21030340200620" - "032c000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11808080800080808080000f0b2003410876" - "41ff811c71200341ff81fc07716a418180046c41107620066a21060b0240024020" - "0a20064d0d00200a20066b21054100210302400240024020002d00200e04020001" - "02020b20052103410021050c010b20054101762103200541016a41017621050b20" - "0341016a210320002802102109200028021821082000280214210703402003417f" - "6a2203450d022007200920082802101181808080008080808000450d000b41010f" - "0b200028021420012002200028021828020c11808080800080808080000f0b0240" - "200720012002200828020c1180808080008080808000450d0041010f0b41002103" - "0340024020052003470d0020052005490f0b200341016a21032007200920082802" - "101181808080008080808000450d000b2003417f6a2005490b890503037f017e03" - "7f23808080800041f0006b220224808080800041002103024020002d0000220420" - "012d0000470d00410121030240024002400240024020040e06050001020304050b" - "20002d000120012d00014621030c040b4100210320002903082205200129030852" - "0d030240024002402005a70e03000102000b200029031020012903105121030c05" - "0b200029031020012903105121030c040b20002b031020012b03106121030c030b" - "41002103200028020c2204200128020c470d0220002802082001280208200410f7" - "808080004521030c020b41002103200028020c2206200128020c470d0120012802" - "08210420002802082100200641016a210103402001417f6a22014521032001450d" - "02200020041094808080002106200441186a2104200041186a210020060d000c02" - "0b0b41002103200028020c2204200128020c470d002002410036026c2002420037" - "026420024100360254200241003602442002410036023020024100360220200220" - "01280208220636025c2002200128020422033602582002200636024c2002200336" - "024820022000280208220636023820022000280204220136023420022006360228" - "2002200136022420022004410020031b3602602002200341004722033602502002" - "200336024020022004410020011b36023c20022001410047220336022c20022003" - "36021c200241c0006a21070340200241106a2002411c6a10958080800041012103" - "20022802102201450d0120022802142104200241086a2007109580808000200228" - "02082200450d0141002103200128020822062000280208470d01200228020c2108" - "20012802042000280204200610f7808080000d01200420081094808080000d000b" - "0b200241f0006a24808080800020030bed0201057f024002400240200128022022" - "020d00410021020c010b20012002417f6a36022002400240024020012802004101" - "470d0020012802040d01200128020821030240200128020c2202450d0003402003" - "2802980321032002417f6a22020d000b0b20014200370208200120033602042001" - "41013602000c020b41c8acc0800010a080808000000b200128020421030b200128" - "0208210202400240200128020c220420032f0192034f0d00200321050c010b0340" - "2003280288022205450d03200241016a210220032f019003210420052103200420" - "052f0192034f0d000b0b200441016a21030240024020020d00200521060c010b20" - "0520034102746a4198036a21030340200328020022064198036a21032002417f6a" - "22020d000b410021030b2001200336020c20014100360208200120063602042005" - "200441186c6a210320052004410c6c6a418c026a21020b20002003360204200020" - "023602000f0b41b8acc0800010a080808000000bae0301057f2380808080004110" - "6b220224808080800041012103024020012802142204419f81c08000410d200128" - "0218220528020c220611808080800080808080000d00024020012d001c4104710d" - "00200441f886c080004103200611808080800080808080000d01200441ac81c080" - "004104200611808080800080808080000d012004418bc2c0800041022006118080" - "80800080808080000d01200420002d0000410274220141dc83c080006a28020020" - "0141c883c080006a280200200611808080800080808080000d012004418187c080" - "0041022006118080808000808080800021030c010b200441fb86c0800041032006" - "11808080800080808080000d002002200536020420022004360200410121032002" - "41013a000f20022002410f6a360208200241ac81c0800041041097808080000d00" - "2002418bc2c0800041021097808080000d00200220002d0000410274220141dc83" - "c080006a280200200141c883c080006a2802001097808080000d00410121032002" - "41fe86c0800041021097808080000d002004418087c08000410120061180808080" - "00808080800021030b200241106a24808080800020030bdf04010c7f2001417f6a" - "210320002802042104200028020021052000280208210641002107410021084100" - "21094100210a02400340200a4101710d0102400240200920024b0d000340200120" - "096a210a0240024002400240200220096b220b41074b0d0020022009470d012002" - "21090c050b02400240200a41036a417c71220c200a6b220d450d00410021000340" - "200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b41786a" - "220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a94" - "a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b2000" - "727141808182847871418081828478470d02200c41086a210c200d41086a220d20" - "0e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b20004101" - "6a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a20" - "0d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a46" - "0d01200b200041016a2200470d000b200221090c030b2000200d6a21000b200020" - "096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d004100" - "210a2009210d200921000c030b200920024d0d000b0b20082002460d024101210a" - "2008210d200221000b0240024020062d0000450d00200541f486c0800041042004" - "28020c11808080800080808080000d010b200020086b210b4100210c0240200020" - "08460d00200320006a2d0000410a46210c0b200120086a21002006200c3a000020" - "0d210820052000200b200428020c1180808080008080808000450d010b0b410121" - "070b20070b4901017f410021010240024020004100480d00024020000d00410121" - "010c020b41002d00e0dbc080001a200010998080800022010d01410121010b2001" - "2000109a80808000000b20010bcb2502087f017e02400240024002400240024002" - "400240200041f501490d0041002101200041cdff7b4f0d052000410b6a22014178" - "71210241002802c4dfc080002203450d04411f21040240200041f4ffff074b0d00" - "2002410620014108766722006b7641017120004101746b413e6a21040b41002002" - "6b21010240200441027441a8dcc080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b742107410021060340" - "02402005220528020441787122082002490d00200820026b220820014f0d002008" - "21012005210620080d004100210120052106200521000c040b2005280214220820" - "00200820052007411d764104716a41106a2802002205471b200020081b21002007" - "41017421072005450d020c000b0b024041002802c0dfc08000220541102000410b" - "6a41f803712000410b491b22024103762201762200410371450d00024002402000" - "417f7341017120016a2207410374220041b8ddc080006a2201200041c0ddc08000" - "6a28020022022802082206460d002006200136020c200120063602080c010b4100" - "2005417e200777713602c0dfc080000b20022000410372360204200220006a2200" - "2000280204410172360204200241086a0f0b200241002802c8dfc080004d0d0302" - "400240024020000d0041002802c4dfc080002200450d0620006841027441a8dcc0" - "80006a280200220628020441787120026b21012006210503400240200628021022" - "000d00200628021422000d0020052802182104024002400240200528020c220020" - "05470d00200541144110200528021422001b6a28020022060d01410021000c020b" - "20052802082206200036020c200020063602080c010b200541146a200541106a20" - "001b21070340200721082006220041146a200041106a200028021422061b210720" - "004114411020061b6a28020022060d000b200841003602000b2004450d04024020" - "0528021c41027441a8dcc080006a22062802002005460d00200441104114200428" - "02102005461b6a20003602002000450d050c040b2006200036020020000d034100" - "41002802c4dfc08000417e200528021c77713602c4dfc080000c040b2000280204" - "41787120026b22062001200620014922061b21012000200520061b210520002106" - "0c000b0b02400240200020017441022001742200410020006b7271682208410374" - "220141b8ddc080006a2206200141c0ddc080006a28020022002802082207460d00" - "2007200636020c200620073602080c010b41002005417e200877713602c0dfc080" - "000b20002002410372360204200020026a2207200120026b220641017236020420" - "0020016a2006360200024041002802c8dfc080002205450d00200541787141b8dd" - "c080006a210141002802d0dfc0800021020240024041002802c0dfc08000220841" - "012005410376742205710d00410020082005723602c0dfc08000200121050c010b" - "200128020821050b200120023602082005200236020c2002200136020c20022005" - "3602080b410020073602d0dfc08000410020063602c8dfc08000200041086a0f0b" - "20002004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b02400240024020" - "014110490d0020052002410372360204200520026a220220014101723602042002" - "20016a200136020041002802c8dfc080002207450d01200741787141b8ddc08000" - "6a210641002802d0dfc0800021000240024041002802c0dfc08000220841012007" - "410376742207710d00410020082007723602c0dfc08000200621070c010b200628" - "020821070b200620003602082007200036020c2000200636020c20002007360208" - "0c010b2005200120026a2200410372360204200520006a22002000280204410172" - "3602040c010b410020023602d0dfc08000410020013602c8dfc080000b20054108" - "6a0f0b024020002006720d004100210641022004742200410020006b7220037122" - "00450d0320006841027441a8dcc080006a28020021000b2000450d010b03402000" - "20062000280204417871220520026b220820014922041b21032005200249210720" - "08200120041b21080240200028021022050d00200028021421050b200620032007" - "1b21062001200820071b21012005210020050d000b0b2006450d00024041002802" - "c8dfc0800022002002490d002001200020026b4f0d010b20062802182104024002" - "400240200628020c22002006470d00200641144110200628021422001b6a280200" - "22050d01410021000c020b20062802082205200036020c200020053602080c010b" - "200641146a200641106a20001b21070340200721082005220041146a200041106a" - "200028021422051b210720004114411020051b6a28020022050d000b2008410036" - "02000b2004450d030240200628021c41027441a8dcc080006a2205280200200646" - "0d0020044110411420042802102006461b6a20003602002000450d040c030b2005" - "200036020020000d02410041002802c4dfc08000417e200628021c77713602c4df" - "c080000c030b02400240024002400240024041002802c8dfc08000220020024f0d" - "00024041002802ccdfc08000220020024b0d0041002101200241af80046a220641" - "107640002200417f4622070d0720004110742205450d07410041002802d8dfc080" - "00410020064180807c7120071b22086a22003602d8dfc08000410041002802dcdf" - "c0800022012000200120004b1b3602dcdfc0800002400240024041002802d4dfc0" - "80002201450d0041a8ddc080002100034020002802002206200028020422076a20" - "05460d02200028020822000d000c030b0b0240024041002802e4dfc08000220045" - "0d00200020054d0d010b410020053602e4dfc080000b410041ff1f3602e8dfc080" - "00410020083602acddc08000410020053602a8ddc08000410041b8ddc080003602" - "c4ddc08000410041c0ddc080003602ccddc08000410041b8ddc080003602c0ddc0" - "8000410041c8ddc080003602d4ddc08000410041c0ddc080003602c8ddc0800041" - "0041d0ddc080003602dcddc08000410041c8ddc080003602d0ddc08000410041d8" - "ddc080003602e4ddc08000410041d0ddc080003602d8ddc08000410041e0ddc080" - "003602ecddc08000410041d8ddc080003602e0ddc08000410041e8ddc080003602" - "f4ddc08000410041e0ddc080003602e8ddc08000410041f0ddc080003602fcddc0" - "8000410041e8ddc080003602f0ddc08000410041003602b4ddc08000410041f8dd" - "c08000360284dec08000410041f0ddc080003602f8ddc08000410041f8ddc08000" - "360280dec0800041004180dec0800036028cdec0800041004180dec08000360288" - "dec0800041004188dec08000360294dec0800041004188dec08000360290dec080" - "0041004190dec0800036029cdec0800041004190dec08000360298dec080004100" - "4198dec080003602a4dec0800041004198dec080003602a0dec08000410041a0de" - "c080003602acdec08000410041a0dec080003602a8dec08000410041a8dec08000" - "3602b4dec08000410041a8dec080003602b0dec08000410041b0dec080003602bc" - "dec08000410041b0dec080003602b8dec08000410041b8dec080003602c4dec080" - "00410041c0dec080003602ccdec08000410041b8dec080003602c0dec080004100" - "41c8dec080003602d4dec08000410041c0dec080003602c8dec08000410041d0de" - "c080003602dcdec08000410041c8dec080003602d0dec08000410041d8dec08000" - "3602e4dec08000410041d0dec080003602d8dec08000410041e0dec080003602ec" - "dec08000410041d8dec080003602e0dec08000410041e8dec080003602f4dec080" - "00410041e0dec080003602e8dec08000410041f0dec080003602fcdec080004100" - "41e8dec080003602f0dec08000410041f8dec08000360284dfc08000410041f0de" - "c080003602f8dec0800041004180dfc0800036028cdfc08000410041f8dec08000" - "360280dfc0800041004188dfc08000360294dfc0800041004180dfc08000360288" - "dfc0800041004190dfc0800036029cdfc0800041004188dfc08000360290dfc080" - "0041004198dfc080003602a4dfc0800041004190dfc08000360298dfc080004100" - "41a0dfc080003602acdfc0800041004198dfc080003602a0dfc08000410041a8df" - "c080003602b4dfc08000410041a0dfc080003602a8dfc08000410041b0dfc08000" - "3602bcdfc08000410041a8dfc080003602b0dfc08000410020053602d4dfc08000" - "410041b0dfc080003602b8dfc080004100200841586a22003602ccdfc080002005" - "2000410172360204200520006a4128360204410041808080013602e0dfc080000c" - "080b200120054f0d00200620014b0d00200028020c450d030b410041002802e4df" - "c080002200200520002005491b3602e4dfc08000200520086a210641a8ddc08000" - "21000240024002400340200028020022072006460d01200028020822000d000c02" - "0b0b200028020c450d010b41a8ddc0800021000240034002402000280200220620" - "014b0d002001200620002802046a2206490d020b200028020821000c000b0b4100" - "20053602d4dfc080004100200841586a22003602ccdfc080002005200041017236" - "0204200520006a4128360204410041808080013602e0dfc080002001200641606a" - "41787141786a22002000200141106a491b2207411b36020441002902a8ddc08000" - "2109200741106a41002902b0ddc0800037020020072009370208410020083602ac" - "ddc08000410020053602a8ddc080004100200741086a3602b0ddc0800041004100" - "3602b4ddc080002007411c6a2100034020004107360200200041046a2200200649" - "0d000b20072001460d0720072007280204417e713602042001200720016b220041" - "01723602042007200036020002402000418002490d002001200010e3808080000c" - "080b200041f8017141b8ddc080006a21060240024041002802c0dfc08000220541" - "012000410376742200710d00410020052000723602c0dfc08000200621000c010b" - "200628020821000b200620013602082000200136020c2001200636020c20012000" - "3602080c070b200020053602002000200028020420086a36020420052002410372" - "3602042007410f6a41787141786a2201200520026a22006b2102200141002802d4" - "dfc08000460d03200141002802d0dfc08000460d04024020012802042206410371" - "4101470d0020012006417871220610a880808000200620026a2102200120066a22" - "0128020421060b20012006417e7136020420002002410172360204200020026a20" - "0236020002402002418002490d002000200210e3808080000c060b200241f80171" - "41b8ddc080006a21010240024041002802c0dfc080002206410120024103767422" - "02710d00410020062002723602c0dfc08000200121020c010b200128020821020b" - "200120003602082002200036020c2000200136020c200020023602080c050b4100" - "200020026b22013602ccdfc08000410041002802d4dfc08000220020026a220636" - "02d4dfc080002006200141017236020420002002410372360204200041086a2101" - "0c060b41002802d0dfc08000210102400240200020026b2206410f4b0d00410041" - "003602d0dfc08000410041003602c8dfc080002001200041037236020420012000" - "6a220020002802044101723602040c010b410020063602c8dfc080004100200120" - "026a22053602d0dfc0800020052006410172360204200120006a20063602002001" - "20024103723602040b200141086a0f0b2000200720086a360204410041002802d4" - "dfc080002200410f6a417871220141786a22063602d4dfc080004100200020016b" - "41002802ccdfc0800020086a22016a41086a22053602ccdfc08000200620054101" - "72360204200020016a4128360204410041808080013602e0dfc080000c030b4100" - "20003602d4dfc08000410041002802ccdfc0800020026a22023602ccdfc0800020" - "0020024101723602040c010b410020003602d0dfc08000410041002802c8dfc080" - "0020026a22023602c8dfc0800020002002410172360204200020026a2002360200" - "0b200541086a0f0b4100210141002802ccdfc08000220020024d0d004100200020" - "026b22013602ccdfc08000410041002802d4dfc08000220020026a22063602d4df" - "c080002006200141017236020420002002410372360204200041086a0f0b20010f" - "0b20002004360218024020062802102205450d0020002005360210200520003602" - "180b20062802142205450d0020002005360214200520003602180b024002402001" - "4110490d0020062002410372360204200620026a22002001410172360204200020" - "016a200136020002402001418002490d002000200110e3808080000c020b200141" - "f8017141b8ddc080006a21020240024041002802c0dfc080002205410120014103" - "76742201710d00410020052001723602c0dfc08000200221010c010b2002280208" - "21010b200220003602082001200036020c2000200236020c200020013602080c01" - "0b2006200120026a2200410372360204200620006a220020002802044101723602" - "040b200641086a0b1000024020000d0010a3808080000b000b140002402001450d" - "00200020011082808080000b0ba20b03087f017e017f2380808080004190016b22" - "04248080808000200441e8006a20002001109d8080800002400240024002400240" - "024002400240024002400240024020042d00684106460d00200441106a200441e8" - "006a41106a2205290300370300200441086a200441e8006a41086a220629030037" - "030020042004290368370300200441e8006a20022003109d8080800020042d0068" - "4106460d01200441186a41106a2005290300370300200441186a41086a20062903" - "003703002004200429036837031841dc81c0800041072004109e80808000220745" - "0d0241dc81c080004107200441186a109e808080002208450d03418482c0800041" - "04200441186a109e808080002206450d0420062d00004103462205450d05410021" - "092006280208410020051b210502400240200628020c220a0e020c00010b410121" - "0920052d000041556a0e030b080b080b20052d0000412b470d06200541016a2105" - "200a410a492106200a417f6a2209210a20060d070c080b2004200428026c36024c" - "41b880c08000412b200441cc006a41e480c0800041bc81c08000109f8080800000" - "0b2004200428026c36024c41b880c08000412b200441cc006a41e480c0800041cc" - "81c08000109f80808000000b41e481c0800010a080808000000b41f481c0800010" - "a080808000000b418882c0800010a080808000000b419882c0800010a080808000" - "000b200a2109200a41094f0d010b41002106034020052d000041506a220a41094b" - "0d02200541016a2105200a2006410a6c6a21062009417f6a22090d000c040b0b41" - "0021060340200a450d0320052d000041506a220b41094b0d01410221092006ad42" - "0a7e220c422088a74100470d02200541016a2105200a417f6a210a200b200ca722" - "0d6a2206200d4f0d000c020b0b410121090b200420093a006841b880c08000412b" - "200441e8006a41a880c0800041a882c08000109f80808000000b20042006360230" - "02400240200720081094808080000d00200441003a00370c010b20042006417f6a" - "220536023002402005450d00200441003a00370c010b200441013a00370b200441" - "0336026c200441d482c08000360268200442023702742004418180808000360258" - "20044182808080003602502004200441cc006a3602702004200441306a36025420" - "04200441376a36024c200441e8006a10a28080800041002d00e0dbc080001a0240" - "02400240024041091099808080002205450d00200520042d00373a000020044100" - "360254200442808080801037024c200441033a0088012004412036027820044100" - "360284012004418080c08000360280012004410036027020044100360268200420" - "0441cc006a36027c20043502304101200441e8006a1084808080000d0120044138" - "6a41086a200441cc006a41086a2802003602002004200429024c37033841002d00" - "e0dbc080001a200428023c210641041099808080002209450d0220092006360000" - "2005200636000120042004280240220a36024841002d00e0dbc080001a20044104" - "3602444104109980808000220b450d032005200a360005200b200a360000200441" - "05360250200441a083c0800036024c200442043702582004418180808000360284" - "01200441818080800036027c200441838080800036027420044184808080003602" - "6c200420063602642004200441e8006a3602542004200441c8006a360280012004" - "200441c4006a3602782004200441e4006a3602702004200441386a360268200441" - "cc006a10a280808000200b41041082808080002009410410828080800020044118" - "6a108a808080002004108a8080800002402003450d00200220031082808080000b" - "02402001450d00200020011082808080000b20044190016a24808080800020050f" - "0b41014109109a80808000000b41c0a5c080004137200441e4006a419880c08000" - "41c4a6c08000109f80808000000b41014104109a80808000000b41014104109a80" - "808000000bea0301057f23808080800041e0006b22032480808080002003410036" - "0228200320023602242003200136022020034180013a002c2003410036021c2003" - "428080808010370214200341c8006a200341146a10e88080800002400240024002" - "4020032d00484106460d00200341306a41106a2204200341c8006a41106a290300" - "370300200341306a41086a2205200341c8006a41086a2903003703002003200329" - "03483703300240024020032802282202200328022422064f0d0020032802202107" - "0340200720026a2d000041776a220141174b0d024101200174419380800471450d" - "022006200241016a2202470d000b200320063602280b2000200329033037030020" - "0041106a2004290300370300200041086a20052903003703002003280214220245" - "0d04200328021820021082808080000c040b20032002360228200341086a200720" - "062006200241016a220220062002491b10c78080800041002d00e0dbc080001a20" - "0328020c21012003280208210641141099808080002202450d012002200636020c" - "2002411636020020002002360204200041063a000020022001360210200341306a" - "108a808080000c020b2000200328024c360204200041063a00000c010b000b2003" - "2802142202450d00200328021820021082808080000b200341e0006a2480808080" - "000be60101077f41002103024020022d00004105470d0020022802042204450d00" - "2002280208210503402004418c026a210220042f0192032206410c6c2107417f21" - "08024002400340024020070d00200621080c020b20022802082103200228020421" - "09200841016a2108200741746a21072002410c6a2102417f200020092001200320" - "012003491b10f7808080002209200120036b20091b220341004720034100481b22" - "034101460d000b200341ff0171450d010b024020050d0041000f0b2005417f6a21" - "05200420084102746a4198036a28020021040c010b0b2004200841186c6a21030b" - "20030b8f0101017f23808080800041c0006b22052480808080002005200136020c" - "2005200036020820052003360214200520023602102005410236021c200541e486" - "c08000360218200542023702242005418580808000ad422086200541106aad8437" - "03382005418680808000ad422086200541086aad843703302005200541306a3602" - "20200541186a200410a480808000000b130041ec84c08000412b200010a6808080" - "00000b11002000350200410120011084808080000bbe0604017f017e037f017e23" - "808080800041c0006b22012480808080002001410636020c200141b0c2c0800036" - "0208024041002d0090dcc080004103460d0010db808080000b0240024002400240" - "024041002903f8dfc0800022024200520d0002404100280280e0c0800022030d00" - "10d5808080004100280280e0c0800021030b20032003280200220441016a360200" - "2004417f4c0d012003450d02200320032802002204417f6a360200200329030821" - "0220044101470d00200310d6808080000b024002400240200241002903e8dbc080" - "00510d0041002d00f4dbc08000210441012103410041013a00f4dbc08000200120" - "043a00182004450d012001420037023420014281808080c00037022c200141d8c3" - "c08000360228200141186a200141286a10d780808000000b024041002802f0dbc0" - "80002203417f460d00200341016a21030c020b41b8c4c08000412641fcc4c08000" - "10b780808000000b410020023703e8dbc080000b410020033602f0dbc080002001" - "41e8dbc0800036021041042103200141043a00182001200141106a360220200141" - "186a41dcb7c08000200010b280808000210020012d001821040240024020000d00" - "420021024117200441ff0171764101710d01200128021c22032802002100024020" - "0341046a28020022042802002205450d002000200511828080800080808080000b" - "024020042802042204450d00200020041082808080000b2003410c108280808000" - "410421030c010b200441ff01714104460d032001290318220642807e8321022006" - "a721030b200128021022002000280208417f6a2204360208024020040d00200041" - "003a000c200042003703000b200341ff01714104470d03200141c0006a24808080" - "80000f0b000b419cb9c0800041de004190bac0800010b780808000000b20014100" - "3602382001410136022c200141a0c3c0800036022820014204370230200141286a" - "41a8c3c0800010a480808000000b200120022003ad42ff01838437031020014102" - "36022c20014190c2c08000360228200142023702342001418780808000ad422086" - "200141106aad843703202001418680808000ad422086200141086aad8437031820" - "01200141186a360230200141286a41a0c2c0800010a480808000000b4701017f23" - "808080800041206b2200248080808000200041003602182000410136020c200041" - "8484c0800036020820004204370210200041086a41a084c0800010a48080800000" - "0b5601017f23808080800041206b2202248080808000200241106a200041106a29" - "0200370300200241086a200041086a290200370300200241013b011c2002200136" - "021820022000290200370300200210ab80808000000bbe0601057f200041786a22" - "012000417c6a280200220241787122006a21030240024020024101710d00200241" - "0271450d012001280200220220006a21000240200120026b220141002802d0dfc0" - "8000470d0020032802044103714103470d01410020003602c8dfc0800020032003" - "280204417e7136020420012000410172360204200320003602000f0b2001200210" - "a8808080000b024002400240024002400240200328020422024102710d00200341" - "002802d4dfc08000460d02200341002802d0dfc08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a200036020020" - "0141002802d0dfc08000470d01410020003602c8dfc080000f0b20032002417e71" - "36020420012000410172360204200120006a20003602000b2000418002490d0220" - "01200010e38080800041002101410041002802e8dfc08000417f6a22003602e8df" - "c0800020000d04024041002802b0ddc080002200450d0041002101034020014101" - "6a2101200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602e8dfc0" - "80000f0b410020013602d4dfc08000410041002802ccdfc0800020006a22003602" - "ccdfc08000200120004101723602040240200141002802d0dfc08000470d004100" - "41003602c8dfc08000410041003602d0dfc080000b200041002802e0dfc0800022" - "044d0d0341002802d4dfc080002200450d034100210241002802ccdfc080002205" - "4129490d0241a8ddc080002101034002402001280200220320004b0d0020002003" - "20012802046a490d040b200128020821010c000b0b410020013602d0dfc0800041" - "0041002802c8dfc0800020006a22003602c8dfc080002001200041017236020420" - "0120006a20003602000f0b200041f8017141b8ddc080006a210302400240410028" - "02c0dfc08000220241012000410376742200710d00410020022000723602c0dfc0" - "8000200321000c010b200328020821000b200320013602082000200136020c2001" - "200336020c200120003602080f0b024041002802b0ddc080002201450d00410021" - "020340200241016a2102200128020822010d000b0b4100200241ff1f200241ff1f" - "4b1b3602e8dfc08000200520044d0d004100417f3602e0dfc080000b0b4d01017f" - "23808080800041206b220324808080800020034100360210200341013602042003" - "42043702082003200136021c200320003602182003200341186a36020020032002" - "10a480808000000b840601057f0240024002402000417c6a220328020022044178" - "71220541044108200441037122061b20016a490d0002402006450d002005200141" - "276a4b0d020b41102002410b6a4178712002410b491b210102400240024020060d" - "002001418002490d0120052001410472490d01200520016b418180084f0d010c02" - "0b200041786a220720056a21060240024002400240200520014f0d002006410028" - "02d4dfc08000460d03200641002802d0dfc08000460d0220062802042204410271" - "0d042004417871220420056a22052001490d042006200410a88080800020052001" - "6b22024110490d0120032001200328020041017172410272360200200720016a22" - "012002410372360204200720056a220520052802044101723602042001200210a9" - "8080800020000f0b200520016b2202410f4d0d0420032001200441017172410272" - "360200200720016a22052002410372360204200620062802044101723602042005" - "200210a98080800020000f0b200320052003280200410171724102723602002007" - "20056a2202200228020441017236020420000f0b41002802c8dfc0800020056a22" - "052001490d0102400240200520016b2202410f4b0d002003200441017120057241" - "0272360200200720056a2202200228020441017236020441002102410021010c01" - "0b20032001200441017172410272360200200720016a2201200241017236020420" - "0720056a2205200236020020052005280204417e713602040b410020013602d0df" - "c08000410020023602c8dfc0800020000f0b41002802ccdfc0800020056a220520" - "014b0d040b0240200210998080800022050d0041000f0b20052000417c41782003" - "28020022014103711b20014178716a2201200220012002491b10fa808080002102" - "200010a580808000200221000b20000f0b419db8c08000412e41ccb8c0800010a6" - "80808000000b41dcb8c08000412e418cb9c0800010a680808000000b2003200120" - "0441017172410272360200200720016a2202200520016b22054101723602044100" - "20053602ccdfc08000410020023602d4dfc0800020000b820301047f200028020c" + "109780808000200028020821030b200028020420036a2001200210d6808080001a" + "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" + "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" + "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" + "200136020820002002410120021b36020420002002453602000b800601057f0240" + "024002402000417c6a22032802002204417871220541044108200441037122061b" + "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" + "712002410b491b210102400240024020060d002001418002490d01200520014104" + "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" + "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" + "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" + "01490d042006200410a780808000200520016b22024110490d0120032001200328" + "020041017172410272360200200720016a22012002410372360204200720056a22" + "0520052802044101723602042001200210a88080800020000f0b200520016b2202" + "410f4d0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210a88080800020000f0b200320" + "05200328020041017172410272360200200720056a220220022802044101723602" + "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" + "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" + "020441017236020441002102410021010c010b2003200120044101717241027236" + "0200200720016a22012002410172360204200720056a2205200236020020052005" + "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" + "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" + "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" + "2201200220012002491b10d6808080002102200010a580808000200221000b2000" + "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" + "0010a680808000000b20032001200441017172410272360200200720016a220220" + "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" + "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" + "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" + "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" + "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" + "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" + "00411920044101766b2004411f461b742107410021060340024020052205280204" + "41787122082002490d00200820026b220820014f0d00200821012005210620080d" + "004100210120052106200521000c040b200528021422082000200820052007411d" + "764104716a41106a2802002205471b200020081b2100200741017421072005450d" + "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" + "491b22024103762201762200410371450d00024002402000417f7341017120016a" + "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" + "2206460d002006200136020c200120063602080c010b41002005417e2007777136" + "0298a2c080000b20022000410372360204200220006a2200200028020441017236" + "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" + "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" + "020441787120026b21012006210503400240200628021022000d00200628021422" + "000d0020052802182104024002400240200528020c22002005470d002005411441" + "10200528021422001b6a28020022060d01410021000c020b200528020822062000" + "36020c200020063602080c010b200541146a200541106a20001b21070340200721" + "082006220041146a200041106a200028021422061b210720004114411020061b6a" + "28020022060d000b200841003602000b2004450d040240200528021c4102744180" + "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" + "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" + "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" + "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" + "0020017441022001742200410020006b727168220841037422014190a0c080006a" + "220620014198a0c080006a28020022002802082207460d002007200636020c2006" + "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" + "360204200020026a2207200120026b2206410172360204200020016a2006360200" + "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" + "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" + "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" + "0120023602082005200236020c2002200136020c200220053602080b4100200736" + "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" + "20052802102206450d0020002006360210200620003602180b2005280214220645" + "0d0020002006360214200620003602180b02400240024020014110490d00200520" + "02410372360204200520026a22022001410172360204200220016a200136020041" + "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" + "c080002100024002404100280298a2c08000220841012007410376742207710d00" + "41002008200772360298a2c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200520012002" + "6a2200410372360204200520006a220020002802044101723602040c010b410020" + "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" + "720d004100210641022004742200410020006b722003712200450d032000684102" + "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" + "71220520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b2106200120082007" + "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" + "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" + "002006470d00200641144110200628021422001b6a28020022050d01410021000c" + "020b20062802082205200036020c200020053602080c010b200641146a20064110" + "6a20001b21070340200721082005220041146a200041106a200028021422051b21" + "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" + "40200628021c41027441809fc080006a22052802002006460d0020044110411420" + "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" + "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" + "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" + "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" + "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" + "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" + "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" + "a0c080002100034020002802002206200028020422076a2005460d022000280208" + "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" + "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" + "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" + "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" + "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" + "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" + "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" + "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" + "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" + "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" + "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" + "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" + "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" + "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" + "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" + "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" + "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" + "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" + "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" + "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" + "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" + "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" + "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" + "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" + "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" + "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" + "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" + "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" + "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" + "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" + "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" + "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" + "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" + "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" + "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" + "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" + "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" + "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" + "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" + "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" + "360204410041808080013602b8a2c080002001200641606a41787141786a220020" + "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" + "290288a0c080003702002007200937020841002008360284a0c080004100200536" + "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" + "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" + "0720072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010d0808080000c080b200041f8017141" + "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" + "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" + "0620013602082000200136020c2001200636020c200120003602080c070b200020" + "053602002000200028020420086a360204200520024103723602042007410f6a41" + "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" + "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" + "417871220610a780808000200620026a2102200120066a220128020421060b2001" + "2006417e7136020420002002410172360204200020026a20023602000240200241" + "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" + "024002404100280298a2c08000220641012002410376742202710d004100200620" + "0272360298a2c08000200121020c010b200128020821020b200120003602082002" + "200036020c2000200136020c200020023602080c050b4100200020026b22013602" + "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" + "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" + "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" + "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" + "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" + "800020052006410172360204200120006a2006360200200120024103723602040b" + "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" + "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" + "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" + "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" + "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" + "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" + "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" + "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" + "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" + "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" + "4020062802102205450d0020002005360210200520003602180b20062802142205" + "450d0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a20013602000240" + "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" + "6a2102024002404100280298a2c08000220541012001410376742201710d004100" + "2005200172360298a2c08000200221010c010b200228020821010b200220003602" + "082001200036020c2000200236020c200020013602080c010b2006200120026a22" + "00410372360204200620006a220020002802044101723602040b200641086a0be9" + "0101037f23808080800041206b2204248080808000024002400240200220036a22" + "0320024f0d00410021020c010b4100210220012802002205410174220620032006" + "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" + "0c010b2004200536021c20042001280204360214410121020b2004200236021820" + "0441086a2003200441146a109980808000024020042802080d00200428020c2102" + "200120033602002001200236020441818080807821020c010b2004280210210120" + "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" + "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" + "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" + "0041052000418680808000419082c0800041052002410c6a418780808000108f80" + "8080002100200241106a24808080800020000be00301097f23808080800041c000" + "6b2202248080808000200028020821032000280204210441012105200128021441" + "b083c080004101200128021828020c118080808000808080800021000240200345" + "0d0041002106034020062107410121062000410171210841012100024020080d00" + "02400240200128021c22084104710d002007410171450d01410121002001280214" + "41e784c080004102200128021828020c1180808080008080808000450d010c020b" + "200128021821092001280214210a024020074101710d0041012100200a41888bc0" + "80004101200928020c11808080800080808080000d020b200241013a001b200220" + "093602102002200a36020c20022008360238200241c884c0800036023420022001" + "2d00203a003c2002200128021036022c2002200129020837022420022001290200" + "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" + "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" + "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" + "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" + "4101200128021828020c118080808000808080800021050b200241c0006a248080" + "80800020050b4a01017f23808080800041106b2202248080808000200220003602" + "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" + "00200241106a24808080800020000b3d00200128021420002802002d0000410274" + "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" + "808080800080808080000be70101017f23808080800041106b2205248080808000" + "20002802142001410d200028021828020c11808080800080808080002101200541" + "003a000d200520013a000c20052000360208200541086a200241042003200410b6" + "80808000210320052d000d220120052d000c2204722100024020014101470d0020" + "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" + "004102200028021828020c118080808000808080800021000c010b200028021441" + "ee84c080004101200028021828020c118080808000808080800021000b20054110" + "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" + "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" + "02400240024002400240024002404107109b808080002201450d00200141036a41" + "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" + "800022022800042103200228000021042002410810878080800020014107108780" + "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" + "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" + "002202280004210520022800002106200241081087808080002001410710878080" + "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" + "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" + "2202280004210720022800002108200241081087808080002001410b1087808080" + "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" + "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" + "108380808000220928000421022009280000210a20094108108780808000200041" + "186a200a200210a48080800002400240024020002d00184101460d002000290320" + "210b02402002450d00200a20021087808080000b20014107108780808000410021" + "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" + "0000200141041082808080002202280000210c2002280004210a20024108108780" + "80800020014104108780808000024002400240200a4100480d000240200a0d0041" + "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" + "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" + "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" + "026b210f4100210103400240024002400240200220016a2d00002209c022104100" + "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" + "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" + "808080202111428080808010211202400240024002400240024002400240024002" + "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" + "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" + "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" + "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" + "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" + "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" + "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" + "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" + "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" + "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" + "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" + "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" + "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" + "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" + "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" + "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" + "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" + "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" + "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" + "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" + "41186a20142011a710a48080800020002d00184101460d01200029032021124100" + "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" + "201641076a41002800878cc08000360000201641002900808cc080003700002016" + "410b10828080800022012800002117200128000421132001410810878080800002" + "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" + "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" + "09201741016a210220134109490d024100210103402009450d0a20022d00004150" + "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" + "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" + "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" + "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" + "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" + "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" + "20090d040b410021010c050b201321092017210220134108490d020b4100210103" + "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" + "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" + "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" + "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" + "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" + "0b1087808080002004200310808080800020062005108080808000200820071080" + "80808000200c200a10808080800020004100360214200042808080801037020c20" + "0041033a003820004120360228200041003602342000418080c080003602302000" + "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" + "1086808080000d00200028020c2102200028021022092000280214108080808000" + "02402002450d00200920021087808080000b201510858080800020011085808080" + "0041002102024020032005470d0020042006200310d58080800045200b20125871" + "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" + "00200c200a1087808080000b02402007450d00200820071087808080000b024020" + "05450d00200620051087808080000b02402003450d00200420031087808080000b" + "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" + "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" + "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" + "80800041106b220324808080800002400240024002400240024002400240024002" + "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" + "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" + "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" + "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" + "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" + "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" + "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" + "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" + "0121010c010b20002005370308410021010b200020013a0000200341106a248080" + "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" + "030240024020024101710d002002410271450d012001280200220220006a210002" + "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" + "410020003602a0a2c0800020032003280204417e71360204200120004101723602" + "04200320003602000f0b2001200210a7808080000b024002400240024002400240" + "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" + "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" + "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" + "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" + "20003602000b2000418002490d022001200010d080808000410021014100410028" + "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" + "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" + "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" + "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" + "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" + "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" + "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b200128020821010c" + "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" + "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" + "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" + "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" + "0320013602082000200136020c2001200336020c200120003602080f0b02404100" + "280288a0c080002201450d00410021020340200241016a2102200128020822010d" + "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" + "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" + "02410036021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110aa80808000000b820301047f200028020c" "21020240024002402001418002490d002000280218210302400240024020022000" "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" "002802082201200236020c200220013602080c010b200041146a200041106a2002" "1b21040340200421052001220241146a200241106a200228021422011b21042002" "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441a8dcc080006a22012802002000460d0020034110411420032802" + "28021c41027441809fc080006a22012802002000460d0020034110411420032802" "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "002802c4dfc08000417e200028021c77713602c4dfc080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b410041002802c0dfc0" - "8000417e200141037677713602c0dfc080000f0b20022003360218024020002802" + "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" + "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" "102201450d0020022001360210200120023602180b20002802142201450d002002" "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802d0dfc08000470d0020022802044103714103470d014100" - "20013602c8dfc0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a8808080000b02400240024002402002280204" - "22034102710d00200241002802d4dfc08000460d02200241002802d0dfc0800046" - "0d0320022003417871220310a8808080002000200320016a220141017236020420" - "0020016a2001360200200041002802d0dfc08000470d01410020013602c8dfc080" + "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" + "20013602a0a2c0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a7808080000b02400240024002402002280204" + "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" + "0d0320022003417871220310a7808080002000200320016a220141017236020420" + "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110e3808080000f0b200141f8017141b8ddc0" - "80006a21020240024041002802c0dfc08000220341012001410376742201710d00" - "410020032001723602c0dfc08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602d4" - "dfc08000410041002802ccdfc0800020016a22013602ccdfc08000200020014101" - "72360204200041002802d0dfc08000470d01410041003602c8dfc0800041004100" - "3602d0dfc080000f0b410020003602d0dfc08000410041002802c8dfc080002001" - "6a22013602c8dfc0800020002001410172360204200020016a20013602000f0b0b" - "7902017f017e23808080800041306b220324808080800020032001360204200320" - "003602002003410236020c200341cc85c080003602082003420237021420034181" - "80808000ad42208622042003ad8437032820032004200341046aad843703202003" - "200341206a360210200341086a200210a480808000000b5d01027f238080808000" - "41206b220124808080800020002802182102200141106a200041106a2902003703" - "00200141086a200041086a2902003703002001200036021c200120023602182001" - "2000290200370300200110e480808000000b490002402002418080c400460d0020" - "00200220012802101181808080008080808000450d0041010f0b024020030d0041" - "000f0b200020032004200128020c11808080800080808080000b7902017f017e23" - "808080800041306b22032480808080002003200036020020032001360204200341" - "0236020c200341bc8ac08000360208200342023702142003418180808000ad4220" - "862204200341046aad84370328200320042003ad843703202003200341206a3602" - "10200341086a200210a480808000000b820302017f017e23808080800041f0006b" - "2203248080808000200341ccb7c0800036020c20032000360208200341ccb7c080" - "00360214200320013602102003410236021c200341dc85c0800036021802402002" - "2802000d002003410336025c2003419086c0800036025820034203370264200341" - "8580808000ad4220862204200341106aad8437034820032004200341086aad8437" - "03402003418680808000ad422086200341186aad843703382003200341386a3602" - "60200341d8006a4184c4c0800010a480808000000b200341206a41106a20024110" - "6a290200370300200341206a41086a200241086a29020037030020032002290200" - "3703202003410436025c200341c486c08000360258200342043702642003418580" - "808000ad4220862204200341106aad8437035020032004200341086aad84370348" - "2003418880808000ad422086200341206aad843703402003418680808000ad4220" - "86200341186aad843703382003200341386a360260200341d8006a4184c4c08000" - "10a480808000000b1c0020002802002001200028020428020c1181808080008080" - "8080000b14002001200028020020002802041093808080000b1400200128021420" - "01280218200010b2808080000bbf05010a7f23808080800041306b220324808080" - "8000200341033a002c2003412036021c4100210420034100360228200320013602" - "2420032000360220200341003602142003410036020c0240024002400240024020" - "0228021022050d00200228020c2200450d01200228020821012000410374210620" - "00417f6a41ffffffff017141016a21042002280200210003400240200041046a28" - "02002207450d00200328022020002802002007200328022428020c118080808000" - "80808080000d040b20012802002003410c6a200128020411818080800080808080" - "000d03200141086a2101200041086a2100200641786a22060d000c020b0b200228" - "02142201450d00200141057421082001417f6a41ffffff3f7141016a2104200228" - "02082109200228020021004100210603400240200041046a2802002201450d0020" - "0328022020002802002001200328022428020c11808080800080808080000d030b" - "2003200520066a220141106a28020036021c20032001411c6a2d00003a002c2003" - "200141186a2802003602282001410c6a28020021074100210a4100210b02400240" - "0240200141086a2802000e03010002010b2007410374210c4100210b2009200c6a" - "220c2802040d01200c28020021070b4101210b0b200320073602102003200b3602" - "0c200141046a280200210702400240024020012802000e03010002010b20074103" - "74210b2009200b6a220b2802040d01200b28020021070b4101210a0b2003200736" - "02182003200a3602142009200141146a2802004103746a22012802002003410c6a" - "200128020411818080800080808080000d02200041086a21002008200641206a22" - "06470d000b0b200420022802044f0d012003280220200228020020044103746a22" - "012802002001280204200328022428020c1180808080008080808000450d010b41" - "0121010c010b410021010b200341306a24808080800020010bd70201057f238080" - "8080004180016b22022480808080000240024002400240200128021c2203411071" - "0d0020034120710d012000ad4101200110848080800021000c030b41ff00210303" - "402002200322046a22052000410f712203413072200341d7006a2003410a491b3a" - "00002004417f6a210320004110492106200041047621002006450d000c020b0b41" - "ff00210303402002200322046a22052000410f712203413072200341376a200341" - "0a491b3a00002004417f6a210320004110492106200041047621002006450d000b" - "02402004418101490d002004418001419887c08000108580808000000b20014101" - "41a887c0800041022005418101200441016a6b10868080800021000c010b024020" - "04418101490d002004418001419887c08000108580808000000b2001410141a887" - "c0800041022005418101200441016a6b10868080800021000b20024180016a2480" - "8080800020000b2200200128021441c284c08000410e200128021828020c118080" - "80800080808080000b6001017f23808080800041306b2200248080808000200041" - "0136020c200041e484c08000360208200042013702142000418980808000ad4220" - "862000412f6aad843703202000200041206a360210200041086a41e8c1c0800010" - "a480808000000b7902017f017e23808080800041306b2203248080808000200320" - "00360200200320013602042003410236020c200341f08ac0800036020820034202" - "3702142003418180808000ad4220862204200341046aad84370328200320042003" - "ad843703202003200341206a360210200341086a200210a480808000000b6a0101" - "7f23808080800041306b22032480808080002003200136020c2003200036020820" - "034101360214200341f0bac080003602102003420137021c2003418680808000ad" - "422086200341086aad843703282003200341286a360218200341106a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441809b" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41809bc080006a280200410b7420024b1b22042004410272220420044102744180" - "9bc080006a280200410b7420024b1b2204200441016a2204200441027441809bc0" - "80006a280200410b7420024b1b2204200441016a2204200441027441809bc08000" - "6a280200410b7420024b1b220441027441809bc080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441809bc080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441fc9ac080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241849cc080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641b284c080006a2d" - "00003a000b20032001410476410f7141b284c080006a2d00003a000f2003200141" - "0876410f7141b284c080006a2d00003a000e20032001410c76410f7141b284c080" - "006a2d00003a000d20032001411076410f7141b284c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141b284c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b2004412141e09ac0800010aa80808000000b200541d70541" - "f09ac0800010aa80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141c48fc08000412c419c90c0800041c40141" - "e091c0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141a295c08000412841f295c080" - "0041a002419298c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641b284c080006a2d00003a001720032001410476410f71" - "41b284c080006a2d00003a001b20032001410876410f7141b284c080006a2d0000" - "3a001a20032001410c76410f7141b284c080006a2d00003a001920032001411076" - "410f7141b284c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141b284c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41b48fc0800010b680808000000b200c200441b48fc0800010ad" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41a48fc080" - "0010a080808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641808dc0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541888ec080003602302005420537023c20054186" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418a80808000ad422086200541286aad843703582005418b80808000ad42" - "2086200541246aad843703502005418180808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541c88ec080003602302005420337023c2005" - "418680808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418180808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541a88dc080003602302005420437023c2005418680" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418180808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "200641f48ec0800010b680808000000b200410a080808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b3808080" - "000d00200128021441b084c080004102200128021828020c118080808000808080" - "80000d002000280204200110b38080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111818080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111818080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11808080800080808080000d010b2004412720011181808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f7620011084808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10f9808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10f9808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410f9808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00e0dbc080001a200128020022032f01920321040240024002" - "400240024041c8031099808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10fa8080" - "80001a20052003200b41186c6a200841186c10fa80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "fa80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810fa80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41a0a4c0800010ad80808000000b41e8a3c0800041284190a4c0800010a68080" - "8000000b2008410c41b0a4c0800010ad80808000000b41e8a3c0800041284190a4" - "c0800010a680808000000b900801017f23808080800041f0006b22022480808080" - "0020002802002100200241003602482002428080808010370240200241033a006c" - "2002412036025c2002410036026820024198a5c080003602642002410036025420" - "02410036024c2002200241c0006a36026002400240024002400240024002400240" - "024002400240024002400240024002400240024002400240024002400240024002" - "400240024020002802000e191718000102030405060708090a0b0c0d0e0f101112" - "13141516170b200241c0006a41d9a6c0800041181091808080000d190c180b2002" - "41c0006a41f1a6c08000411b1091808080000d180c170b200241c0006a418ca7c0" - "8000411a1091808080000d170c160b200241c0006a41a6a7c08000411910918080" - "80000d160c150b200241c0006a41bfa7c08000410c1091808080000d150c140b20" - "0241c0006a41cba7c0800041131091808080000d140c130b200241c0006a41dea7" - "c0800041131091808080000d130c120b200241c0006a41f1a7c08000410e109180" - "8080000d120c110b200241c0006a41ffa7c08000410e1091808080000d110c100b" - "200241c0006a418da8c08000410c1091808080000d100c0f0b200241c0006a4199" - "a8c08000410e1091808080000d0f0c0e0b200241c0006a41a7a8c08000410e1091" - "808080000d0e0c0d0b200241c0006a41b5a8c0800041131091808080000d0d0c0c" - "0b200241c0006a41c8a8c08000411a1091808080000d0c0c0b0b200241c0006a41" - "e2a8c08000413e1091808080000d0b0c0a0b200241c0006a41a0a9c08000411410" - "91808080000d0a0c090b200241c0006a41b4a9c0800041341091808080000d090c" - "080b200241c0006a41e8a9c08000412c1091808080000d080c070b200241c0006a" - "4194aac0800041241091808080000d070c060b200241c0006a41b8aac08000410e" - "1091808080000d060c050b200241c0006a41c6aac0800041131091808080000d05" - "0c040b200241c0006a41d9aac08000411c1091808080000d040c030b200241c000" - "6a41f5aac0800041181091808080000d030c020b200241c0006a20002802042000" - "280208109180808000450d010c020b200041046a200241cc006a10c3808080000d" - "010b200241306a41086a200241c0006a41086a2802003602002002200229024037" - "0330200241818080800036022c20024181808080003602242002418c8080800036" - "021c20024104360204200241a8abc080003602002002420337020c200220004110" - "6a36022820022000410c6a3602202002200241306a3602182002200241186a3602" - "0820012802142001280218200210b2808080002100024020022802302201450d00" - "200228023420011082808080000b200241f0006a24808080800020000f0b41c0a5" - "c080004137200241186a41b0a5c0800041c4a6c08000109f80808000000be50301" - "017f23808080800041c0006b220224808080800002400240024002400240024020" - "002d00000e0400010203000b2002200028020436020441002d00e0dbc080001a41" - "141099808080002200450d04200041106a410028009cc5c0800036000020004108" - "6a4100290094c5c080003700002000410029008cc5c08000370000200241143602" - "102002200036020c200241143602082002410336022c200241bcc1c08000360228" - "200242023702342002418d80808000ad422086200241046aad843703202002418e" - "80808000ad422086200241086aad843703182002200241186a3602302001280214" - "2001280218200241286a10b280808000210020022802082201450d03200228020c" - "20011082808080000c030b20002d000121002002410136022c200241f0bac08000" - "360228200242013702342002418680808000ad422086200241186aad8437030820" - "022000410274220041e0c5c080006a28020036021c200220004184c7c080006a28" - "02003602182002200241086a36023020012802142001280218200241286a10b280" - "80800021000c020b20012000280204220028020020002802041093808080002100" - "0c010b200028020422002802002001200028020428021011818080800080808080" - "0021000b200241c0006a24808080800020000f0b000bd507010d7f238080808000" - "41106b220224808080800020002802082103200028020421044101210502402001" - "2802142206412220012802182207280210220811818080800080808080000d0002" - "40024020030d0041002103410021000c010b410021094100210a2004210b200321" - "0c024002400340200b200c6a210d4100210002400340200b20006a220e2d000022" - "0141817f6a41ff017141a101490d0120014122460d01200141dc00460d01200c20" - "0041016a2200470d000b200a200c6a210a0c030b02400240200e2c00002201417f" - "4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71210b2001" - "411f71210c02402001415f4b0d00200c410674200b722101200e41026a210b0c01" - "0b200b410674200e2d0002413f7172210b0240200141704f0d00200b200c410c74" - "722101200e41036a210b0c010b200b410674200e2d0003413f7172200c41127441" - "8080f00071722101200e41046a210b0b2000200a6a2100200241046a2001418180" - "0410b8808080000240024020022d0004418001460d0020022d000f20022d000e6b" - "41ff01714101460d0020002009490d0302402009450d000240200920034f0d0020" - "0420096a2c000041bf7f4a0d010c050b20092003470d040b02402000450d000240" - "200020034f0d00200420006a2c000041bf7f4c0d050c010b20002003470d040b20" - "06200420096a200020096b200728020c220e11808080800080808080000d010240" - "024020022d0004418001470d002006200228020820081181808080008080808000" - "450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b200e1180" - "8080800080808080000d020b0240024020014180014f0d004101210e0c010b0240" - "20014180104f0d004102210e0c010b41034104200141808004491b210e0b200e20" - "006a21090b0240024020014180014f0d00410121010c010b024020014180104f0d" - "00410221010c010b41034104200141808004491b21010b200120006a210a200d20" - "0b6b220c0d010c030b0b410121050c030b2004200320092000419089c0800010ba" - "80808000000b02402009200a4b0d004100210002402009450d000240200920034f" - "0d0020092100200420096a2c000041bf7f4c0d020c010b2003210020092003470d" - "010b0240200a0d00410021030c020b0240200a20034f0d00200021092004200a6a" - "2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b2004200320" - "09200a41a089c0800010ba80808000000b2006200420006a200320006b20072802" - "0c11808080800080808080000d0020064122200811818080800080808080002105" - "0b200241106a24808080800020050b870102017c017e0240024002402001280200" - "0e03000102000b20004202370308200020012b0308220239031020002002bd42ff" - "ffffffffffffffff00834280808080808080f8ff00534101743a00000f0b200042" - "00370308200041023a0000200020012903083703100f0b200041023a0000200020" - "01290308220337031020002003423f883703080be411020b7f027e238080808000" - "41c0016b2204248080808000024002400240024002400240024002400240024002" - "400240024020012802002205450d00200228020821062002280204210720012802" - "042108024003402005418c026a210920052f019203220a410c6c210b417f210c02" - "40024003400240200b0d00200a210c0c020b2009280208210d2009280204210e20" - "0c41016a210c200b41746a210b2009410c6a2109417f2007200e2006200d200620" - "0d491b10f780808000220e2006200d6b200e1b220d410047200d4100481b220d41" - "01460d000b200d41ff0171450d010b2008450d022008417f6a21082005200c4102" - "746a4198036a28020021050c010b0b20022802002209450d0c2007200910828080" - "80000c0c0b2002290204220fa721092002280200220b418080808078470d032009" - "21050c010b2002290204220fa721052002280200220d418080808078470d010b20" - "01210c0c090b41002d00e0dbc080001a4198031099808080002209450d02200941" - "013b01920320094100360288022009200f422088a7ad4220862005ad8437039002" - "2009200d36028c0220014280808080103702042001200936020020092003290300" - "370300200941086a200341086a290300370300200941106a200341106a29030037" - "03000c010b200f422088a7ad4220862009ad84210f024002400240024002402005" - "2f0192032209410b490d00200441086a21084104210d200c4105490d03200c210d" - "200c417b6a0e020302010b2005418c026a220e200c410c6c6a210d02400240200c" - "41016a220620094d0d00200d200f370204200d200b3602000c010b200e2006410c" - "6c6a200d2009200c6b220e410c6c10f9808080001a200d200f370204200d200b36" - "02002005200641186c6a2005200c41186c6a200e41186c10f9808080001a0b2005" - "200c41186c6a220d41106a200341106a290300370300200d200329030037030020" - "0d41086a200341086a2903003703002005200941016a3b0192030c030b200c4179" - "6a210c200441f8006a21084106210d0c010b4100210c200441f8006a2108410521" - "0d0b41002d00e0dbc080001a4198031099808080002209450d02200941003b0192" - "0320094100360288022009200d417f7320052f01920322076a22063b0192032004" - "4188016a41086a2005200d41186c6a220e41086a29030037030020044188016a41" - "106a200e41106a2903003703002004200e290300370388012006410c4f0d032007" - "200d41016a220e6b2006470d042005418c026a2202200d410c6c6a220729020421" - "10200728020021072009418c026a2002200e410c6c6a2006410c6c10fa80808000" - "1a20092005200e41186c6a200641186c10fa8080800021062005200d3b01920320" - "0441dc006a410c6a20044190016a290300370200200441f0006a20044198016a29" - "030037020020042004290388013702602004200536020820042006360278200828" - "0200220d418c026a200c410c6c6a210602400240200d2f019203220e200c4b0d00" - "2006200f3702042006200b3602000c010b2006410c6a2006200e200c6b2208410c" - "6c10f9808080001a2006200f3702042006200b360200200d200c41186c6a220b41" - "186a200b200841186c10f9808080001a0b200d200c41186c6a220b41106a200341" - "106a290300370300200b2003290300370300200b41086a200341086a2903003703" - "00200d200e41016a3b0192032007418080808078460d00200441c4006a200441dc" - "006a41086a290200370200200441cc006a200441dc006a41106a29020037020020" - "0441306a41246a200441dc006a41186a2802003602002004201037023420042007" - "3602302004200429025c37023c024002400240200528028802220b0d004100210c" - "0c010b200441306a4104722108200441b8016a210220044188016a410472210720" - "0441b0016a2103200441c0006a210e4100210c4100210603402006200c470d0820" - "052f019003210d200b2f019203410b490d02200641016a21060240024002400240" - "024002400240200d4105490d00200d417b6a0e020203010b200441043602800120" - "04200636027c2004200b3602782003210b0c040b20044106360280012004200636" - "027c2004200b360278200d41796a210d0c020b2004410536028001200420063602" - "7c2004200b36027820044188016a200441f8006a10c18080800020042802b00141" - "05200441306a200e200910c080808000200428028801210d200441086a20074124" - "10fa808080001a0c030b20044105360280012004200636027c2004200b36027841" - "00210d0b2002210b0b20044188016a200441f8006a10c180808000200b28020020" - "0d200441306a200e200910c080808000200428028801210d200441086a20074124" - "10fa808080001a0b20042802bc01210c20042802b801210920042802b401210620" - "042802b0012105200d418080808078460d032004200d3602302008200441086a41" - "2410fa808080001a200528028802220b0d000b0b2001280200220b450d0741002d" - "00e0dbc080001a2001280204210641c803109980808000220d450d03200d200b36" - "029803200d41003b019203200d410036028802200b41003b019003200b200d3602" - "88022001200641016a3602042001200d3602002006200c470d08200d2004290330" - "37028c02200d41013b019203200d2004290340370300200d200936029c03200d41" - "94026a200441306a41086a280200360200200d41086a200441c8006a2903003703" - "00200d41106a200441d0006a2903003703002009200d36028802200941013b0190" - "030c010b200b200d200441306a200e200910c0808080000b200120012802084101" - "6a3602080b200041063a00000c070b000b2006410b41a0a4c0800010ad80808000" - "000b41e8a3c0800041284190a4c0800010a680808000000b41c0a4c08000413541" - "f8a4c0800010a680808000000b41bca2c0800010a080808000000b41a7a3c08000" - "413041d8a3c0800010a680808000000b20002005200c41186c6a22092903003703" - "00200041106a200941106a220d290300370300200041086a200941086a220b2903" - "0037030020092003290300370300200b200341086a290300370300200d20034110" - "6a2903003703000b200441c0016a2480808080000be60301057f02400240024002" - "400240024020022003490d00410121044100210520034101480d04200120036a21" - "060240200341034b0d000340200620014d0d062006417f6a22062d0000410a470d" - "000c050b0b024041808284082006417c6a2800002207418a94a8d000736b200772" - "41808182847871418081828478460d000340200620014d0d062006417f6a22062d" - "0000410a470d000c050b0b200320064103716b210720034109490d010340024002" - "4020074108480d004180828408200120076a220641786a2802002208418a94a8d0" - "00736b20087241808182847871418081828478460d010b200120076a21060c040b" - "200741786a210741808284082006417c6a2802002208418a94a8d000736b200872" - "41808182847871418081828478460d000c030b0b2003200241b8adc0800010ad80" - "808000000b200120076a21060340200620014d0d032006417f6a22062d0000410a" - "470d000c020b0b0340200620014d0d022006417f6a22062d0000410a470d000b0b" - "200620016b41016a220520024b0d010b0240200120056a20014d0d004100210620" - "0521070340200620012d0000410a466a2106200141016a21012007417f6a22070d" - "000b200641016a21040b200020043602002000200320056b3602040f0b20052002" - "41c8adc0800010ad80808000000b9b0d02097f017e23808080800041306b220324" - "808080800002400240024002400240024002400240024003400240024020012802" - "08220420012802042205460d00024002400240200420054f0d0020012802002206" - "20046a2d000022074122460d01200741dc00460d0120074120490d012006200441" - "016a22086a21094100200520086b417871220a6b210703402009210b024020070d" - "002001200a20086a360208200110c9808080002001280204210520012802082107" - "0c040b200741086a2107200b41086a2109200b290000220c42a2c48891a2c48891" - "228542fffdfbf7efdfbfff7e7c200c42e0bffffefdfbf7ef5f7c84200c42dcb8f1" - "e2c58b97aedc008542fffdfbf7efdfbfff7e7c84200c427f858342808182848890" - "a0c0807f83220c500d000b2001200b20066b200c7aa74103766a22073602080c02" - "0b2004200541d8adc0800010aa808080000c080b200421070b20072005470d0120" - "0521040b200341086a20012802002004200410c78080800041002d00e0dbc08000" - "1a200328020c210b2003280208210941141099808080002207450d052007200936" - "020c2007410436020020002007360204200041023602002007200b3602100c0a0b" - "024020072005490d002007200541e8adc0800010aa80808000000b024020012802" - "00220b20076a2d0000220941dc00460d00024020094122470d002002280208450d" - "0520072004490d072002200b20046a200720046b10ca808080004101210b200120" - "0741016a360208200341286a20012002280204200228020810cb80808000200328" - "02282207450d032000200328022c3602080c040b2001200741016a220736020820" - "0341106a200b2005200710c78080800041002d00e0dbc080001a2003280214210b" - "2003280210210941141099808080002207450d052007200936020c200741103602" - "0020002007360204200041023602002007200b3602100c0a0b024020072004490d" - "002002200b20046a200720046b10ca808080002001200741016a22093602080240" - "20092005490d00200341206a200b2005200910c78080800041002d00e0dbc08000" - "1a2003280224210b2003280220210941141099808080002207450d062007410436" - "02000c090b2001200741026a220436020802400240024002400240024002400240" - "024002400240200b20096a2d0000220741ed004a0d000240200741e1004a0d0020" - "074122460d032007412f460d04200741dc00470d02024020022802082207200228" - "0200470d002002108f808080000b2002200741016a360208200228020420076a41" - "dc003a0000410021070c0b0b2007419e7f6a0e050401010105010b200741927f6a" - "0e080500000006000708000b200341186a200b2005200410c78080800041002d00" - "e0dbc080001a200328021c210b2003280218210941141099808080002207450d0e" - "2007410c3602000c110b0240200228020822072002280200470d002002108f8080" - "80000b2002200741016a360208200228020420076a41223a0000410021070c070b" - "0240200228020822072002280200470d002002108f808080000b2002200741016a" - "360208200228020420076a412f3a0000410021070c060b02402002280208220720" - "02280200470d002002108f808080000b2002200741016a36020820022802042007" - "6a41083a0000410021070c050b0240200228020822072002280200470d00200210" - "8f808080000b2002200741016a360208200228020420076a410c3a000041002107" - "0c040b0240200228020822072002280200470d002002108f808080000b20022007" - "41016a360208200228020420076a410a3a0000410021070c030b02402002280208" - "22072002280200470d002002108f808080000b2002200741016a36020820022802" - "0420076a410d3a0000410021070c020b0240200228020822072002280200470d00" - "2002108f808080000b2002200741016a360208200228020420076a41093a000041" - "0021070c010b2001200210cc8080800021070b2007450d010c090b0b2004200741" - "98aec0800010b680808000000b4102210b200328022c21070b2000200b36020020" - "0020073602040c060b20072004490d022001200741016a360208200341286a2001" - "200b20046a200720046b10cb808080000240024020032802282207450d00200020" - "0328022c3602084100210b0c010b4102210b200328022c21070b2000200b360200" - "200020073602040c050b000b2004200741f8adc0800010b680808000000b200420" - "074188aec0800010b680808000000b2007200936020c2007200b3602100b200041" - "02360200200020073602040b200341306a2480808080000b5301047f0240200028" - "02082201200028020422024f0d00200028020021030340200320016a2d00002204" - "4122460d01200441dc00460d0120044120490d012000200141016a220136020820" - "022001470d000b0b0b4901017f02402000280200200028020822036b20024f0d00" - "200020032002109080808000200028020821030b200028020420036a2001200210" - "fa808080001a2000200320026a3602080bb10501077f23808080800041106b2204" - "24808080800002402003450d004100200341796a2205200520034b1b2106200241" - "036a417c7120026b21074100210503400240024002400240200220056a2d000022" - "08c022094100480d00200720056b4103710d01200520064f0d020340200220056a" - "2208280204200828020072418081828478710d03200541086a22052006490d000c" - "030b0b0240024002400240024002400240200841808bc080006a2d0000417e6a0e" - "03000102050b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c" - "050b200541016a220a20034f0d032002200a6a2c0000210a02400240200841e001" - "460d00200841ed01460d012009411f6a41ff0171410c490d032009417e71416e47" - "0d05200a4140480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d" - "030c020b200541016a220a20034f0d022002200a6a2c0000210a02400240024002" - "40200841907e6a0e050100000002000b2009410f6a41ff017141024b0d05200a41" - "40480d020c050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d03" - "0b200541026a220820034f0d02200220086a2c000041bf7f4a0d02200541036a22" - "0520034f0d02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b2005" - "41026a220520034f0d00200220056a2c000041bf7f4c0d010b200441086a200128" - "02002001280204200128020810c7808080004100210241002d00e0dbc080001a20" - "0428020c210520042802082108024041141099808080002203450d002003200836" - "020c2003410f360200200320053602100c060b000b200541016a21050c020b2005" - "41016a21050c010b200520034f0d000340200220056a2c00004100480d01200320" - "0541016a2205470d000c030b0b20052003490d000b0b2000200236020020002003" - "360204200441106a2480808080000be20601057f23808080800041206b22022480" - "80808000200241146a200010cd808080000240024020022f01140d000240024002" - "4002400240024020022f011622034180f803714180b803460d0020034180c8006a" - "41ffff03714180f803490d04200241146a200010ce8080800020022d00140d0620" - "022d0015210420002000280208220541016a360208200441dc00470d0320024114" - "6a200010ce8080800020022d00140d0620022d001521042000200541026a360208" - "200441f500470d02200241146a200010cd8080800020022f01140d0620022f0116" - "22044180c0006a41ffff03714180f803490d0120034180d0006a41ffff0371410a" - "7420044180c8006a41ffff0371722205418080046a210302402001280200200128" - "020822006b41034b0d00200120004104109080808000200128020821000b200120" - "0041046a360208200128020420006a2200200341127641f001723a000020004103" - "6a2004413f71418001723a000020002005410676413f71418001723a0002200020" - "03410c76413f71418001723a0001410021000c070b200220002802002000280204" - "200028020810c78080800041002d00e0dbc080001a200228020421012002280200" - "210341141099808080002200450d042000200336020c2000411436020020002001" - "3602100c060b200241086a20002802002000280204200028020810c78080800041" - "002d00e0dbc080001a200228020c21012002280208210341141099808080002200" - "450d032000200336020c20004114360200200020013602100c050b200241173602" - "142000200241146a10cf8080800021000c040b200241173602142000200241146a" - "10cf8080800021000c030b0240024002402003418001490d000240200128020020" - "0128020822046b41034b0d00200120044104109080808000200128020821040b20" - "0128020420046a210020034180104f0d0120034106764140722106410221050c02" - "0b0240200128020822002001280200470d002001108f808080000b200120004101" - "6a360208200128020420006a20033a0000410021000c040b20002003410676413f" - "71418001723a00012003410c764160722106410321050b200020063a0000200120" - "0420056a360208200020056a417f6a2003413f71418001723a0000410021000c02" - "0b000b200228021821000b200241206a24808080800020000b910301057f238080" - "80800041106b220224808080800002400240024002402001280204220320012802" - "082204490d000240200320046b41034b0d0020012003360208200241086a200128" - "02002003200310c78080800041002d00e0dbc080001a200228020c210320022802" - "08210441141099808080002201450d022001200436020c20014104360200200020" - "01360204200120033602100c030b2001200441046a220536020802402001280200" - "220620046a22012d000141017441b8aec080006a2f010020012d000041017441b8" - "b2c080006a2f010072c141087420012d000241017441b8b2c080006a2e01007220" - "012d000341017441b8aec080006a2e0100722201417f4a0d002002200620032005" - "10c78080800041002d00e0dbc080001a2002280204210320022802002104411410" - "99808080002201450d022001200436020c2001410c360200200020013602042001" - "20033602100c030b200020013b0102410021010c030b2004200341a8aec0800010" - "85808080000b000b410121010b200020013b0100200241106a2480808080000bb2" - "0101037f23808080800041106b2202248080808000024002400240200128020822" - "0320012802042204490d00200241086a20012802002004200310c7808080004100" - "2d00e0dbc080001a200228020c2103200228020821044114109980808000220145" - "0d022001200436020c200141043602002000200136020420012003360210410121" - "010c010b2000200128020020036a2d00003a0001410021010b200020013a000020" - "0241106a2480808080000f0b000b8c0101037f23808080800041106b2202248080" - "808000200241086a20002802002000280204200028020810c78080800041002d00" - "e0dbc080001a200228020c2103200228020821040240411410998080800022000d" - "00000b2000200436020c2000200129020037020020002003360210200041086a20" - "0141086a280200360200200241106a24808080800020000b1f0002402001280204" - "0e020000000b200041b8b6c08000200110b2808080000b820101017f0240024002" - "4002402003280204450d000240200328020822040d002002450d0341002d00e0db" - "c080001a0c020b20032802002004200210a78080800021030c030b2002450d0141" - "002d00e0dbc080001a0b200210998080800021030c010b200121030b2000200236" - "020820002003200120031b36020420002003453602000b9f0202047f017e238080" - "80800041206b2206248080808000024002400240200220036a220320024f0d0041" - "0021020c010b41002102200420056a417f6a410020046b71ad4108410420054101" - "461b22072001280200220841017422092003200920034b1b2203200720034b1b22" - "07ad7e220a422088a70d00200aa7220941808080807820046b4b0d010240024020" - "080d00410021020c010b2006200820056c36021c20062001280204360214200421" - "020b20062002360218200641086a20042009200641146a10d18080800002402006" - "2802080d00200628020c2102200120073602002001200236020441818080807821" - "020c010b20062802102103200628020c21020c010b0b2000200336020420002002" - "360200200641206a2480808080000b5901017f23808080800041106b2201248080" - "808000200141086a2000200028020041014108411810d280808000024020012802" - "082200418180808078460d002000200128020c109a80808000000b200141106a24" - "80808080000b4701017f23808080800041206b2200248080808000200041003602" - "182000410136020c200041d8bac0800036020820004204370210200041086a41e0" - "bac0800010a480808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d00e0dbc080001a02400240024041201099808080002201450d" - "0020014102360210200142818080801037030041002903a0dcc080002102034020" - "02427f510d024100200242017c220341002903a0dcc08000220420042002512205" - "1b3703a0dcc08000200421022005450d000b410020033703f8dfc0800020012003" - "3703084100280280e0c08000450d02200041003602182000410136020c200041e0" - "b6c0800036020820004204370210200041086a41b8b7c0800010a4808080000b00" - "0b10d480808000000b41002001360280e0c08000200041206a2480808080000b5b" - "01027f024020002802104101470d002000280214220141003a0000200028021822" - "02450d00200120021082808080000b02402000417f460d00200020002802042201" - "417f6a36020420014101470d00200041201082808080000b0b3a01017f23808080" - "800041106b2202248080808000200241c8b7c0800036020c200220003602082002" - "41086a2002410c6a200110ae80808000000b3000024020002802002d00000d0020" - "01418589c0800041051093808080000f0b2001418a89c080004104109380808000" - "0b14002001200028020420002802081093808080000b7001037f20002802042101" - "0240024020002d0000220041044b0d0020004103470d010b200128020021000240" - "200141046a28020022022802002203450d00200020031182808080008080808000" - "0b024020022802042202450d00200020021082808080000b2001410c1082808080" - "000b0bf10101027f23808080800041206b22002480808080000240024002400240" - "41002d0090dcc080000e0400000301000b410041023a0090dcc0800041002d00e0" - "dbc080001a4180081099808080002201450d01410041033a0090dcc08000410020" - "01360280dcc08000410042808080808080013703f8dbc08000410042003703e8db" - "c08000410041003a0088dcc0800041004100360284dcc08000410041003a00f4db" - "c08000410041003602f0dbc080000b200041206a2480808080000f0b000b200041" - "003602182000410136020c200041d8c5c080003602082000420437021020004108" - "6a41a8c4c0800010a480808000000bb708010a7f23808080800041206b22042480" - "808080000240024002400240024020012802100d002001417f3602102003410020" - "03200241036a417c7120026b22056b41077120032005491b22066b210720032006" - "490d0102402006450d0002400240200220036a2208417f6a22092d0000410a470d" - "002006417f6a21060c010b200220076a220a2009460d0102402008417e6a22092d" - "0000410a470d002006417e6a21060c010b200a2009460d0102402008417d6a2209" - "2d0000410a470d002006417d6a21060c010b200a2009460d0102402008417c6a22" - "092d0000410a470d002006417c6a21060c010b200a2009460d0102402008417b6a" - "22092d0000410a470d002006417b6a21060c010b200a2009460d0102402008417a" - "6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240200841" - "796a22092d0000410a470d00200641796a21060c010b200a2009460d0120064178" - "7221060b200620076a41016a21060c040b20052003200320054b1b210b41002006" - "6b21082002417c6a210c2006417f7320026a210a02400340200a21052008210620" - "072209200b4d0d01200641786a2108200541786a210a4180828408200220094178" - "6a22076a280200220d418a94a8d000736b200d724180828408200c20096a280200" - "220d418a94a8d000736b200d727141808182847871418081828478460d000b0b20" - "0920034b0d0202400340200320066a450d012006417f6a2106200520036a210920" - "05417f6a210520092d0000410a470d000b200320066a41016a21060c040b024002" - "402001411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b0240" - "200128021420066b20034b0d002000200141146a2002200310dd808080000c050b" - "200128021820066a2002200310fa808080001a200041043a00002001411c6a2006" - "20036a3602000c040b10b580808000000b2007200341c889c08000108580808000" - "000b2009200341d889c0800010ad80808000000b0240200320064f0d0020044100" - "3602182004410136020c200441a8bbc0800036020820044204370210200441086a" - "41b0bbc0800010a480808000000b02402001411c6a2802002205450d0002400240" - "200128021420056b20064d0d00200141186a28020020056a2002200610fa808080" - "001a2001411c6a200520066a22053602000c010b200441086a200141146a200220" - "0610dd80808000024020042d00084104460d00200020042903083702000c030b20" - "01411c6a28020021050b2005450d00200141003a00202001411c6a41003602000b" - "200220066a210502402001280214200320066b22064b0d002000200141146a2005" - "200610dd808080000c010b200141186a2802002005200610fa808080001a200041" - "043a00002001411c6a20063602000b2001200128021041016a360210200441206a" - "2480808080000b7101027f20012802002104024020012802082205450d00200420" - "056b20034f0d004100210520014100360208200141003a000c0b0240200420034d" - "0d00200128020420056a2002200310fa808080001a200041043a00002001200520" - "036a3602080f0b20004204370200200141003a000c0bc90103027f017e027f2380" - "8080800041106b2203248080808000200341086a20002802082802002001200210" - "dc80808000024020032d000822024104460d002000280204210420032903082105" - "0240024020002d0000220141044b0d0020014103470d010b200428020021010240" - "200441046a28020022062802002207450d00200120071182808080008080808000" - "0b024020062802042206450d00200120061082808080000b2004410c1082808080" - "000b200020053702000b200341106a24808080800020024104470b9c0303027f01" - "7e037f23808080800041106b220224808080800020024100360204024002400240" - "02402001418001490d002001418010490d012001418080044f0d0220022001413f" - "71418001723a000620022001410c7641e001723a000420022001410676413f7141" - "8001723a0005410321010c030b200220013a0004410121010c020b20022001413f" - "71418001723a00052002200141067641c001723a0004410221010c010b20022001" - "413f71418001723a00072002200141127641f001723a000420022001410676413f" - "71418001723a000620022001410c76413f71418001723a0005410421010b200241" - "086a2000280208280200200241046a200110dc80808000024020022d0008220141" - "04460d0020002802042103200229030821040240024020002d0000220541044b0d" - "0020054103470d010b200328020021050240200341046a28020022062802002207" - "450d002005200711828080800080808080000b024020062802042206450d002005" - "20061082808080000b2003410c1082808080000b200020043702000b200241106a" - "24808080800020014104470b1200200041dcb7c08000200110b2808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b0d00" - "2001410620014108766722026b7641017120024101746b413e6a21020b20004200" - "3702102000200236021c200241027441a8dcc080006a2103024041002802c4dfc0" - "800041012002742204710d0020032000360200200020033602182000200036020c" - "20002000360208410041002802c4dfc080002004723602c4dfc080000f0b024002" - "400240200328020022042802044178712001470d00200421020c010b2001410041" - "1920024101766b2002411f461b742103034020042003411d764104716a41106a22" - "052802002202450d02200341017421032002210420022802044178712001470d00" - "0b0b20022802082203200036020c20022000360208200041003602182000200236" - "020c200020033602080f0b20052000360200200020043602182000200036020c20" - "0020003602080b0b00200010e580808000000bb50101037f23808080800041106b" - "2201248080808000200028020c2102024002400240024020002802040e02000102" - "0b20020d0141012102410021030c020b20020d0020002802002202280204210320" - "0228020021020c010b20014180808080783602002001200036020c2001418f8080" - "8000200028021c22002d001c20002d001d10e680808000000b2001200336020420" - "0120023602002001419080808000200028021c22002d001c20002d001d10e68080" - "8000000b990101027f23808080800041106b22042480808080004100410028029c" - "dcc08000220541016a36029cdcc08000024020054100480d000240024041002d00" - "f0dfc080000d00410041002802ecdfc0800041016a3602ecdfc080004100280298" - "dcc08000417f4a0d010c020b200441086a20002001118380808000808080800000" - "0b410041003a00f0dfc080002002450d0010e180808000000b000b0c0020002001" - "2902003703000bf726020c7f017e2380808080004190036b220224808080800020" - "0128020c2103024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f8006a200320052005200441016a220420" - "052004491b10c78080800041002d00e0dbc080001a200228027c21082002280278" - "2101411410998080800022040d010c190b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602b002200242808080" - "8080013702a80241082109200420054f0d02200241b8016a41086a210a200241b8" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241c0006a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802442104200228024021084114" - "1099808080002206450d1d2006200836020c20064105360200200620043602100c" - "080b200241d0006a200320052005200420052004491b10c78080800041002d00e0" - "dbc080001a200228025421042002280250210841141099808080002206450d1c20" - "06200836020c20064107360200200620043602100c070b20022902ac02210e2002" - "2802a802210641042107410021090c070b200741dd00470d00200241c8006a2003" - "20052005200441016a220420052004491b10c78080800041002d00e0dbc080001a" - "200228024c21042002280248210841141099808080002206450d1a200620083602" - "0c20064115360200200620043602100c050b200241b8016a200110e88080800002" - "4020022d00b80122084106470d0020022802bc0121060c050b200241ec016a4102" - "6a2205200b41026a2d00003a0000200241d8016a41086a2203200a41086a290300" - "3703002002200b2f00003b01ec012002200a2903003703d80120022802bc012107" - "0240200c20022802a802470d00200241a8026a10d3808080000b20022802ac0222" - "09200c41186c6a220420022903d801370308200420083a0000200420022f01ec01" - "3b000120042007360204200441106a2003290300370300200441036a20052d0000" - "3a00002002200c41016a220c3602b0024100210d20012802142204200128021022" - "054f0d020c000b0b2004200136020c200441053602002000200436020420004106" - "3a0000200420083602100c160b200628020021030b200241386a20032005200520" - "0441016a220420052004491b10c78080800041002d00e0dbc080001a200228023c" - "21042002280238210841141099808080002206450d152006200836020c20064102" - "360200200620043602100b200241a8026a108c80808000024020022802a8022204" - "450d002009200441186c1082808080000b200128020c2103200128021421042001" - "280210210541062107410121090b200120012d001841016a3a0018024002402004" - "20054f0d0003400240024002400240024002400240200320046a2d00002208410c" - "4a0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c" - "060b20084120460d052008412c460d01200841dd00460d020b200241186a200320" - "052005200441016a220420052004491b10c78080800041002d00e0dbc080001a20" - "0228021c21082002280218210541141099808080002204450d1b20044116360200" - "0c070b2001200441016a2204360214200420054f0d020340200320046a2d000022" - "0c41776a220841174b0d024101200874419380800471450d022001200441016a22" - "0436021420052004470d000b200521040c020b2001200441016a3602142002200e" - "3703c001200220063602bc01200220073a00b80102402009450d00410621072002" - "41063a00800120022006360284010c160b20024180016a41106a200241b8016a41" - "106a29030037030020024180016a41086a200241b8016a41086a29030037030020" - "0220022903b801220e37038001200ea721070c150b200c41dd00470d0020024130" - "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" - "80001a200228023421082002280230210541141099808080002204450d18200441" - "153602000c040b200241286a200320052005200441016a220420052004491b10c7" - "8080800041002d00e0dbc080001a200228022c2108200228022821054114109980" - "8080002204450d17200441163602000c030b2001200441016a2204360214200520" - "04470d000b200521040b200241206a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802242108200228022021054114" - "1099808080002204450d14200441023602000b2004200536020c20042008360210" - "200220043602d0012002200e3703c001200220063602bc01200220073a00b80102" - "4020090d0041062107200241063a0080012002200436028401200241b8016a108a" - "808080000c100b41062107200241063a0080012002200636028401200410e98080" - "80000c0f0b200241106a200320052005200420052004491b10c78080800041002d" - "00e0dbc080001a200228021421082002280210210141141099808080002204450d" - "122004200136020c2004411836020020002004360204200041063a000020042008" - "3602100c110b200141003602082001200441016a360214200241b8016a20062001" - "10c88080800020022802bc0121080240024020022802b80122054102460d002002" - "2802c0012104024020050d0020024180016a2008200410ea8080800020022d0080" - "014106460d112000200229038001370300200041106a20024180016a41106a2903" - "00370300200041086a20024180016a41086a2903003703000c130b410021010240" - "20044100480d00024020040d0041012101410021050c030b41002d00e0dbc08000" - "1a20042105200410998080800022010d02410121010b20012004109a8080800000" - "0b200041063a0000200020083602040c110b20024180016a41086a220320012008" - "200410fa808080003602002002200536028401200241033a008001200220043602" - "8c01200041106a20024180016a41106a290300370300200041086a200329030037" - "030020002002290380013703000c100b2001200441016a36021420024198016a20" - "01410010eb8080800002402002290398014203510d0020024180016a2002419801" - "6a10c580808000024020022d0080014106460d0020002002290380013703002000" - "41106a20024180016a41106a290300370300200041086a20024180016a41086a29" - "03003703000c110b20022802840120011080808080002104200041063a00002000" - "20043602040c100b200020022802a001360204200041063a00000c0f0b02402007" - "41f3004a0d00200741e600460d04200741ee00470d012001200441016a36021420" - "0141d0dbc08000410310ec808080002204450d02200041063a0000200020043602" - "040c0f0b200741f400460d02200741fb00460d040b200741506a41ff0171410a49" - "0d04200241086a200320052005200441016a220420052004491b10c78080800041" - "002d00e0dbc080001a200228020c21082002280208210541141099808080002204" - "450d0e2004200536020c2004410a3602002004200836021020022004360284010c" - "0b0b200241003a0080012000200229038001370300200041086a20024180016a41" - "086a290300370300200041106a20024180016a41106a2903003703000c0c0b2001" - "200441016a3602140240200141d3dbc08000410310ec808080002204450d002000" - "41063a0000200020043602040c0c0b20024181023b018001200020022903800137" - "0300200041086a20024180016a41086a290300370300200041106a20024180016a" - "41106a2903003703000c0b0b2001200441016a3602140240200141d6dbc0800041" - "0410ec808080002204450d00200041063a0000200020043602040c0b0b20024101" - "3b0180012000200229038001370300200041086a20024180016a41086a29030037" - "0300200041106a20024180016a41106a2903003703000c0a0b200120012d001841" - "7f6a22083a0018200441016a2104200841ff0171450d0520012004360214200220" - "013602f001200241013a00f401200241f8016a200241f0016a10ed808080004100" - "210d410021064100210c024002400240024020022802f80122044180808080786a" - "0e020200010b20022802fc0121060c060b20022902fc01210e2002410036028c02" - "20024100360284022002200e3702ac02200220043602a80220024190026a200241" - "f0016a10ee8080800020022d0090024106460d03200241b8016a20024184026a20" - "0241a8026a20024190026a10c680808000024020022d00b8014106460d00200241" - "b8016a108a808080000b200241a8026a41046a2104200241b8016a41046a210802" - "400340200241ec026a200241f0016a10ed80808000024020022802ec0222054180" - "808080786a0e020204000b20022902f002210e20022802f0022103200241f8026a" - "200241f0016a10ee80808000024020022d00f8024106470d0020022802fc022106" - "2005450d07200320051082808080000c070b200820022903f80237020020084110" - "6a200241f8026a41106a290300370200200841086a200241f8026a41086a290300" - "370200200241a8026a41086a200241b8016a41086a290200370300200241a8026a" - "41106a200241b8016a41106a290200370300200241a8026a41186a200241b8016a" - "41186a280200360200200220022902b8013703a802200220053602c4022002200e" - "3e02c8022002200e4220883e02cc02200241d0026a41106a200441106a29020037" - "0300200241d0026a41086a200441086a290200370300200220042902003703d002" - "200241b8016a20024184026a200241c4026a200241d0026a10c68080800020022d" - "00b8014106460d00200241b8016a108a808080000c000b0b200228028402210620" - "02280288022109200228028c02210c0b410521070c050b20022802f00221060c02" - "0b200241a8016a2001410110eb80808000024020022903a8014203510d00200241" - "80016a200241a8016a10c580808000024020022d0080014106460d002000200229" - "038001370300200041106a20024180016a41106a290300370300200041086a2002" - "4180016a41086a2903003703000c0a0b2002280284012001108080808000210420" - "0041063a0000200020043602040c090b200020022802b001360204200041063a00" - "000c080b20022802940221062004450d00200ea720041082808080000b20024184" - "026a108b808080000b410621074101210d0b200120012d001841016a3a00182001" - "28020c21030240024020012802142204200128021022054f0d0003400240024002" - "4002400240200320046a2d00002208410c4a0d00200841776a4102490d040c010b" - "02402008411f4a0d002008410d470d010c040b20084120460d032008412c460d01" - "200841fd00460d020b200241e0006a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802642108200228026021054114" - "1099808080002204450d0b200441163602000c050b200241f0006a200320052005" - "200441016a220420052004491b10c78080800041002d00e0dbc080001a20022802" - "7421082002280270210541141099808080002204450d0a200441153602000c040b" - "2001200441016a3602140240200d450d0041062107200241063a00800120022006" - "360284010c060b200220073a008001200220022f00a8023b0081012002200c3602" - "8c01200220093602880120022006360284012002200241aa026a2d00003a008301" - "0c050b2001200441016a220436021420052004470d000b200521040b200241e800" - "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" - "80001a200228026c21082002280268210541141099808080002204450d06200441" - "033602000b2004200536020c20042008360210200220073a00b801200220022f00" - "a8023b00b901200220043602d0012002200c3602c401200220093602c001200220" - "063602bc012002200241aa026a2d00003a00bb010240200d0d0041062107200241" - "063a0080012002200436028401200241b8016a108a808080000c020b4106210720" - "0241063a0080012002200636028401200410e9808080000c010b200241d8006a20" - "0320052005200420052004491b10c78080800041002d00e0dbc080001a20022802" - "5c21082002280258210141141099808080002204450d042004200136020c200441" - "1836020020002004360204200041063a0000200420083602100c030b200741ff01" - "714106470d010b20022802840120011080808080002104200041063a0000200020" - "043602040c010b2000200229038001370300200041106a20024180016a41106a29" - "0300370300200041086a20024180016a41086a2903003703000b20024190036a24" - "80808080000f0b000b920101047f02400240024020002802000e020001020b2000" - "2802082201450d01200028020420011082808080000c010b20002d00044103470d" - "002000280208220128020021020240200128020422032802002204450d00200220" - "0411828080800080808080000b024020032802042203450d002002200310828080" - "80000b2001410c1082808080000b200041141082808080000b7901027f41002103" - "0240024020024100480d00024020020d0041002103410121040c020b41002d00e0" - "dbc080001a20022103200210998080800022040d01410121030b20032002109a80" - "808000000b20042001200210fa8080800021012000200236020c20002001360208" - "20002003360204200041033a00000b950502067f017e23808080800041306b2203" - "248080808000200128020c21040240024002400240024002402001280214220520" - "0128021022064f0d002001200541016a2207360214200420056a2d000022084130" - "470d020240200720064f0d00200420076a2d000041506a41ff0171410a490d020b" - "200020012002420010ef808080000c050b200341186a20042006200510c7808080" - "0041002d00e0dbc080001a200328021c2107200328021821044114109980808000" - "2201450d022001200436020c200141053602002000200136020820004203370300" - "200120073602100c040b200341086a200420062006200541026a22012006200149" - "1b10c78080800041002d00e0dbc080001a200328020c2107200328020821044114" - "1099808080002201450d012001200436020c2001410d3602002000200136020820" - "004203370300200120073602100c030b02402008414f6a41ff01714109490d0020" - "0341106a20042006200710c78080800041002d00e0dbc080001a20032802142107" - "2003280210210441141099808080002201450d012001200436020c2001410d3602" - "002000200136020820004203370300200120073602100c030b200841506aad42ff" - "01832109200720064f0d010340200420076a2d000041506a220541ff0171220841" - "0a4f0d020240024020094299b3e6cc99b3e6cc19540d0020094299b3e6cc99b3e6" - "cc19520d01200841054b0d010b2001200741016a22073602142009420a7e2005ad" - "42ff01837c210920062007470d010c030b0b200341206a20012002200910f08080" - "80000240024020032802200d00200020032b0328390308420021090c010b200020" - "03280224360208420321090b200020093703000c020b000b200020012002200910" - "ef808080000b200341306a2480808080000ba20201087f23808080800041106b22" - "032480808080002000280214220420002802102205200420054b1b210620002802" - "0c210702400240024002400340024020020d00410021040c050b20062004460d01" - "2000200441016a22083602142002417f6a2102200720046a210920012d0000210a" - "20082104200141016a2101200a20092d0000460d000b200341086a200720052008" - "10c78080800041002d00e0dbc080001a200328020c210120032802082102411410" - "99808080002204450d01200441093602000c020b200320072005200610c7808080" - "0041002d00e0dbc080001a20032802042101200328020021024114109980808000" - "2204450d00200441053602000c010b000b2004200236020c200420013602100b20" - "0341106a24808080800020040bae0201047f23808080800041106b220224808080" - "8000200241046a200110f680808000024002400240024020022d00040d00024020" - "022d00050d0020004180808080783602000c040b41002103200128020022014100" - "3602082001200128021441016a360214200241046a2001410c6a200110c8808080" - "002002280208210420022802044102460d010240200228020c22014100480d0002" - "4020010d0041012103410021050c040b41002d00e0dbc080001a20012105200110" - "998080800022030d03410121030b20032001109a80808000000b20002002280208" - "36020420004181808080783602000c020b20004181808080783602002000200436" - "02040c010b20032004200110fa8080800021042000200136020820002004360204" - "200020053602000b200241106a2480808080000bdc0201067f2380808080004110" - "6b22022480808080002001280200220328020c2104024002400240024002402003" - "2802142201200341106a28020022054f0d000340200420016a2d0000220641776a" - "220741174b0d024101200774419380800471450d022003200141016a2201360214" - "20052001470d000b200521010b200241086a200420052005200141016a22012005" - "2001491b10c78080800041002d00e0dbc080001a200228020c2107200228020821" - "0541141099808080002201450d03200141033602000c010b02402006413a470d00" - "2003200141016a3602142000200310e8808080000c020b20022004200520052001" - "41016a220120052001491b10c78080800041002d00e0dbc080001a200228020421" - "072002280200210541141099808080002201450d02200141063602000b20012005" - "36020c20002001360204200041063a0000200120073602100b200241106a248080" - "8080000f0b000b970202027f027e23808080800041106b22042480808080000240" - "02400240024002400240024002402001280214220520012802104f0d0020012802" - "0c20056a2d00002205412e460d01200541c500460d02200541e500460d020b2002" - "450d02420121060c050b2004200120022003410010f18080800020042802000d02" - "0c030b2004200120022003410010f2808080002004280200450d02200020042802" - "04360208200042033703000c040b420021060240420020037d22074200590d0042" - "022106200721030c030b2003babd428080808080808080807f8421030c020b2000" - "2004280204360208200042033703000c020b20042903082103420021060b200020" - "03370308200020063703000b200441106a2480808080000bbd0101057f41002104" - "0240024020012802102205200128021422064d0d00200641016a2107200520066b" - "2108200128020c20066a21054100210403400240200520046a2d0000220641506a" - "41ff0171410a490d002006412e460d030240200641c500460d00200641e500470d" - "030b2000200120022003200410f2808080000f0b2001200720046a360214200820" - "0441016a2204470d000b200821040b2000200120022003200410f3808080000f0b" - "2000200120022003200410f1808080000bfa0301097f23808080800041106b2205" - "24808080800020012001280214220641016a220736021402400240024020072001" - "28021022084f0d00200720086b2109200128020c210a4100210602400240034002" - "40200a20076a2d0000220b41506a220c41ff0171220d410a490d00024020060d00" - "2005200a20082008200741016a220720082007491b10c78080800041002d00e0db" - "c080001a200528020421062005280200210c41141099808080002207450d072007" - "200c36020c2007410d360200200020073602042000410136020020072006360210" - "0c060b200620046a2107200b41207241e500470d032000200120022003200710f2" - "808080000c050b024020034298b3e6cc99b3e6cc19580d0020034299b3e6cc99b3" - "e6cc19520d02200d41054b0d020b2001200741016a22073602142006417f6a2106" - "2003420a7e200cad42ff01837c210320072008470d000b200920046a21070c010b" - "2000200120022003200620046a10f4808080000c020b2000200120022003200710" - "f3808080000c010b200541086a200128020c20082008200641026a220720082007" - "491b10c78080800041002d00e0dbc080001a200528020c21062005280208210c41" - "141099808080002207450d012007200c36020c2007410536020020002007360204" - "20004101360200200720063602100b200541106a2480808080000f0b000bb80401" - "077f23808080800041106b22052480808080004101210620012001280214220741" - "016a220836021402402008200128021022094f0d00410121060240024020012802" - "0c20086a2d000041556a0e03010200020b410021060b2001200741026a22083602" - "140b200128020c210a0240024002400240024002400240200820094f0d00200120" - "0841016a2207360214200a20086a2d000041506a41ff01712208410a4f0d010240" - "200720094f0d000340200a20076a2d000041506a41ff0171220b410a4f0d012001" - "200741016a22073602140240200841cb99b3e6004c0d00200841cc99b3e600470d" - "07200b41074b0d070b2008410a6c200b6a210820092007470d000b0b20060d0220" - "0420086b2207411f75418080808078732007200841004a2007200448731b21070c" - "030b200541086a200a2009200810c78080800041002d00e0dbc080001a20052802" - "0c21012005280208210841141099808080002207450d042007200836020c200741" - "053602002000200736020420004101360200200720013602100c050b2005200a20" - "09200710c78080800041002d00e0dbc080001a2005280204210120052802002108" - "41141099808080002207450d032007200836020c2007410d360200200020073602" - "0420004101360200200720013602100c040b200420086a2207411f754180808080" - "7873200720084100482007200448731b21070b2000200120022003200710f38080" - "80000c020b200020012002200350200610f5808080000c010b000b200541106a24" - "80808080000b9f0304017f017c017f017c23808080800041106b22052480808080" - "002003ba2106024002400240024002400240024020042004411f7522077320076b" - "220741b502490d0003402006440000000000000000610d062004417f4a0d022006" - "44a0c8eb85f3cce17fa32106200441b4026a22042004411f7522077320076b2207" - "41b4024b0d000b0b200741037441a8c8c080006a2b030021082004417f4a0d0120" - "062008a321060c040b2005200128020c2001280210200128021410c78080800041" - "002d00e0dbc080001a200528020421072005280200210141141099808080002204" - "450d022004200136020c2004410e36020020002004360204200420073602100c01" - "0b20062008a222069944000000000000f07f620d02200541086a200128020c2001" - "280210200128021410c78080800041002d00e0dbc080001a200528020c21072005" - "280208210141141099808080002204450d012004200136020c2004410e36020020" - "002004360204200420073602100b410121040c020b000b2000200620069a20021b" - "390308410021040b20002004360200200541106a2480808080000b7f01047f0240" - "024020012802142205200128021022064f0d00200128020c210702400340200720" - "056a2d0000220841506a41ff017141094b0d012001200541016a22053602142006" - "2005470d000c020b0b200841207241e500460d010b2000200120022003200410f3" - "808080000f0b2000200120022003200410f2808080000b840201027f2380808080" - "0041106b220524808080800002400240024002402004450d002003450d010b2001" - "2802142204200128021022034f0d01200128020c21060340200620046a2d000041" - "506a41ff0171410a4f0d022001200441016a220436021420032004470d000c020b" - "0b200541086a200128020c2001280210200128021410c78080800041002d00e0db" - "c080001a200528020c210120052802082103024041141099808080002204450d00" - "2004200336020c2004410e3602002000200436020420042001360210410121040c" - "020b000b200044000000000000000044000000000000008020021b390308410021" - "040b20002004360200200541106a2480808080000bb40701077f23808080800041" - "306b22022480808080002001280200220328020c21040240024002400240200328" - "02142205200341106a28020022064f0d000340200420056a2d0000220741776a22" - "0841174b0d024101200874419380800471450d022003200541016a220536021420" - "062005470d000b200621050b41012108200241286a200420062006200541016a22" - "0520062005491b10c78080800041002d00e0dbc080001a200228022c2106200228" - "0228210341141099808080002205450d022005200336020c200541033602002000" - "2005360204200520063602100c010b0240200741fd00470d004100210820004100" - "3a00010c010b02400240024020012d00040d00200541016a21052007412c470d01" - "200320053602140240200520064f0d00034002400240024002400240200420056a" - "2d00002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e0304" - "0102000b2008410d460d03200841fd00460d020b41012108200241086a20042006" - "2006200541016a220520062005491b10c78080800041002d00e0dbc080001a2002" - "28020c21062002280208210341141099808080002205450d092005200336020c20" - "05411136020020002005360204200520063602100c080b200041013a0001410021" - "080c070b41012108200241186a200420062006200541016a220520062005491b10" - "c78080800041002d00e0dbc080001a200228021c21062002280218210341141099" - "808080002205450d072005200336020c2005411536020020002005360204200520" - "063602100c060b2003200541016a220536021420062005470d000b200621050b41" - "012108200241106a200420062006200541016a220520062005491b10c780808000" - "41002d00e0dbc080001a2002280214210620022802102103411410998080800022" - "05450d042005200336020c2005410536020020002005360204200520063602100c" - "030b41002108200141003a0004024020074122460d002002200420062006200541" - "016a220520062005491b10c78080800041002d00e0dbc080001a20022802042108" - "2002280200210641141099808080002205450d042005200636020c200541113602" - "0020002005360204200520083602100c020b200041013a00010c020b200241206a" - "200420062006200520062005491b10c78080800041002d00e0dbc080001a200228" - "022421082002280220210641141099808080002205450d022005200636020c2005" - "410836020020002005360204200520083602100b410121080b200020083a000020" - "0241306a2480808080000f0b000b4a01037f4100210302402002450d0002400340" - "20002d0000220420012d00002205470d01200041016a2100200141016a21012002" - "417f6a2202450d020c000b0b200420056b21030b20030bac0501087f0240024002" - "400240200020016b20024f0d00200120026a2103200020026a2104024020024110" - "4f0d00200021050c030b2004417c7121054100200441037122066b210702402006" - "450d00200120026a417f6a210803402004417f6a220420082d00003a0000200841" - "7f6a210820052004490d000b0b2005200220066b2209417c7122066b2104024020" - "0320076a2207410371450d0020064101480d022007410374220841187121022007" - "417c71220a417c6a2101410020086b4118712103200a280200210803402005417c" - "6a2205200820037420012802002208200276723602002001417c6a210120042005" - "490d000c030b0b20064101480d01200920016a417c6a210103402005417c6a2205" - "20012802003602002001417c6a210120042005490d000c020b0b02400240200241" - "104f0d00200021040c010b2000410020006b41037122036a210502402003450d00" - "20002104200121080340200420082d00003a0000200841016a2108200441016a22" - "042005490d000b0b2005200220036b2209417c7122076a21040240024020012003" - "6a2206410371450d0020074101480d012006410374220841187121022006417c71" - "220a41046a2101410020086b4118712103200a2802002108034020052008200276" - "2001280200220820037472360200200141046a2101200541046a22052004490d00" - "0c020b0b20074101480d0020062101034020052001280200360200200141046a21" - "01200541046a22052004490d000b0b20094103712102200620076a21010b200245" - "0d02200420026a21050340200420012d00003a0000200141016a2101200441016a" - "22042005490d000c030b0b20094103712201450d012007410020066b6a21032004" - "20016b21050b2003417f6a210103402004417f6a220420012d00003a0000200141" - "7f6a210120052004490d000b0b20000b0e0020002001200210f8808080000bc102" - "01087f02400240200241104f0d00200021030c010b2000410020006b4103712204" - "6a210502402004450d0020002103200121060340200320062d00003a0000200641" - "016a2106200341016a22032005490d000b0b2005200220046b2207417c7122086a" - "210302400240200120046a2209410371450d0020084101480d0120094103742206" - "41187121022009417c71220a41046a2101410020066b4118712104200a28020021" - "060340200520062002762001280200220620047472360200200141046a21012005" - "41046a22052003490d000c020b0b20084101480d00200921010340200520012802" - "00360200200141046a2101200541046a22052003490d000b0b2007410371210220" - "0920086a21010b02402002450d00200320026a21050340200320012d00003a0000" - "200141016a2101200341016a22032005490d000b0b20000b0be45b0100418080c0" - "000bda5b110000000c000000040000001200000013000000140000000000000000" - "00000001000000150000000000000001000000010000001600000063616c6c6564" - "2060526573756c743a3a756e77726170282960206f6e20616e2060457272602076" - "616c75650017000000040000000400000018000000456d707479496e76616c6964" - "4469676974506f734f766572666c6f774e65674f766572666c6f775a65726f5061" - "727365496e744572726f726b696e647372632f6c69622e72730000b00010000a00" - "0000200000004b000000b00010000a000000210000004b0000004163636f756e74" - "00b00010000a0000002200000033000000b00010000a0000002300000033000000" - "44617461b00010000a0000002500000030000000b00010000a0000002600000024" - "000000b00010000a00000027000000350000007465737420676f6f64203d202c20" - "636f756e746572203d200a000000380110000c000000440110000c000000500110" - "0001000000746573742064617461202c20706f696e746572203d202c20706f696e" - "7465725f7533325f6c656e203d202c206c656e203d2000006c0110000a00000076" - "0110000c0000008201100014000000960110000800000050011000010000000500" - "00000c0000000b0000000b00000004000000740010007900100085001000900010" - "009b0010006361706163697479206f766572666c6f77000000f001100011000000" - "616c6c6f632f7372632f7261775f7665632e72730c021000140000001800000005" - "0000002e2e30313233343536373839616263646566426f72726f774d7574457272" - "6f72616c726561647920626f72726f7765643a200000500210001200000063616c" - "6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65" - "602076616c7565696e646578206f7574206f6620626f756e64733a20746865206c" - "656e20697320206275742074686520696e64657820697320000000970210002000" - "0000b7021000120000003d3d617373657274696f6e20606c656674202072696768" - "7460206661696c65640a20206c6566743a200a2072696768743a200000de021000" - "10000000ee02100017000000050310000900000020726967687460206661696c65" - "643a200a20206c6566743a20000000de0210001000000028031000100000003803" - "100009000000050310000900000001000000000000000b21100002000000202020" - "20207b20207b0a2c0a7d207d636f72652f7372632f666d742f6e756d2e72730000" - "830310001300000066000000170000003078303030313032303330343035303630" - "373038303931303131313231333134313531363137313831393230323132323233" - "323432353236323732383239333033313332333333343335333633373338333934" - "303431343234333434343534363437343834393530353135323533353435353536" - "353735383539363036313632363336343635363636373638363937303731373237" - "333734373537363737373837393830383138323833383438353836383738383839" - "3930393139323933393439353936393739383939636f72652f7372632f666d742f" - "6d6f642e727366616c736574727565000072041000130000009b09000026000000" - "7204100013000000a40900001a000000636f72652f7372632f736c6963652f6d65" - "6d6368722e7273b004100018000000830000001e000000b0041000180000009f00" + "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" + "80006a2102024002404100280298a2c08000220341012001410376742201710d00" + "41002003200172360298a2c08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" + "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" + "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" + "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" + "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" + "4701017f23808080800041206b2200248080808000200041003602182000410136" + "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" + "80808000000b5601017f23808080800041206b2202248080808000200241106a20" + "0041106a290200370300200241086a200041086a290200370300200241013b011c" + "2002200136021820022000290200370300200210ac80808000000b110020003502" + "00410120011086808080000b5d01027f23808080800041206b2201248080808000" + "20002802182102200141106a200041106a290200370300200141086a200041086a" + "2902003703002001200036021c2001200236021820012000290200370300200110" + "d180808000000b490002402002418080c400460d00200020022001280210118180" + "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" + "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" + "808080800020022000360200200220013602042002410236020c200241f887c080" + "00360208200242023702142002418380808000ad4220862203200241046aad8437" + "0328200220032002ad843703202002200241206a360210200241086a419487c080" + "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" + "0022040d002003410171450d010b02402003410171450d00200120026a21050240" + "0240200028020c22060d0041002107200121080c010b4100210741002109200121" + "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" + "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" + "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" + "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" + "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" + "20031b21022003200120031b21010b024020040d00200028021420012002200028" + "021828020c11808080800080808080000f0b2000280204210a024020024110490d" + "0020022001200141036a417c7122076b22096a220b410371210441002106410021" + "03024020012007460d004100210302402009417c4b0d0041002103410021050340" + "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" + "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" + "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" + "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" + "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" + "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" + "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002004200d41f007716a210941002108200421030340200328" + "020c2207417f7341077620074106767241818284087120032802082207417f7341" + "077620074106767241818284087120032802042207417f73410776200741067672" + "41818284087120032802002207417f734107762007410676724181828408712008" + "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" + "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" + "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" + "03410676724181828408712103200c4101460d0220082802042207417f73410776" + "20074106767241818284087120036a2103200c4102460d0220082802082208417f" + "7341077620084106767241818284087120036a21030c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" + "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" + "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" + "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" + "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" + "0d000c030b0b200028021420012002200028021828020c11808080800080808080" + "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" + "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" + "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a210320002802102109200028021821082000280214" + "210703402003417f6a2203450d0220072009200828021011818080800080808080" + "00450d000b41010f0b200028021420012002200028021828020c11808080800080" + "808080000f0b0240200720012002200828020c1180808080008080808000450d00" + "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" + "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" + "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" + "36020c20032000360208200341b08dc08000360214200320013602102003410236" + "021c200341b183c08000360218024020022802000d002003410336025c200341e4" + "83c08000360258200342033702642003418180808000ad4220862204200341106a" + "ad8437034820032004200341086aad843703402003418280808000ad4220862003" + "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" + "808000000b200341206a41106a200241106a290200370300200341206a41086a20" + "0241086a290200370300200320022902003703202003410436025c2003419884c0" + "8000360258200342043702642003418180808000ad4220862204200341106aad84" + "37035020032004200341086aad843703482003418980808000ad42208620034120" + "6aad843703402003418280808000ad422086200341186aad843703382003200341" + "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" + "01200028020428020c11818080800080808080000b140020012000280200200028" + "020410af808080000b14002001280214200128021820001091808080000b220020" + "01280214418883c08000410e200128021828020c11808080800080808080000b60" + "01017f23808080800041306b22002480808080002000410136020c200041a883c0" + "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" + "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" + "057f017e23808080800041c0006b220524808080800041012106024020002d0004" + "0d0020002d0005210702402000280200220828021c22094104710d004101210620" + "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" + "28021828020c11808080800080808080000d012008280214200120022008280218" + "28020c11808080800080808080000d01200828021441ef97c08000410220082802" + "1828020c11808080800080808080000d0120032008200411818080800080808080" + "0021060c010b41012106024020074101710d00200828021441e984c08000410320" + "0828021828020c11808080800080808080000d01200828021c21090b4101210620" + "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" + "6a360214200520082902083702242008290200210a200520093602382005200828" + "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" + "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" + "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" + "84c080004102200528023428020c118080808000808080800021060b200041013a" + "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" + "6a2103200028020421042000280200210520002802082106410021074100210841" + "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" + "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" + "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" + "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" + "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" + "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" + "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" + "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" + "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" + "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" + "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" + "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" + "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" + "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" + "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" + "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" + "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" + "21070b20070b6001027f2000280204210220002802002103024020002802082200" + "2d0000450d00200341e084c080004104200228020c118080808000808080800045" + "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" + "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" + "41306b22032480808080002003200136020c200320003602082003410136021420" + "0341d490c080003602102003420137021c2003418280808000ad42208620034108" + "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" + "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" + "808080000b830201087f2380808080004180016b22022480808080002001280204" + "21032001280200210420002802002100200128021c220521060240200541047145" + "0d002005410872210620040d0020014281808080a0013702000b20012006410472" + "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" + "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" + "09450d000b02402007418101490d002007418001418885c08000108b8080800000" + "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" + "01200536021c200120033602042001200436020020024180016a24808080800020" + "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" + "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" + "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" + "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" + "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" + "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" + "006b22012480808080002001410636020c2001419498c08000360208024041002d" + "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" + "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" + "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" + "2003450d02200320032802002204417f6a3602002003290308210220044101470d" + "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" + "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" + "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" + "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" + "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" + "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" + "021041042103200141043a00182001200141106a360220200141186a41c08dc080" + "002000109180808000210020012d001821040240024020000d0042002102411720" + "0441ff0171764101710d01200128021c220328020021000240200341046a280200" + "22042802002205450d002000200511828080800080808080000b02402004280204" + "2204450d00200020041087808080000b2003410c108780808000410421030c010b" + "200441ff01714104460d032001290318220642807e8321022006a721030b200128" + "021022002000280208417f6a2204360208024020040d00200041003a000c200042" + "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" + "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" + "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" + "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" + "97c08000360228200142023702342001418c80808000ad422086200141106aad84" + "3703202001418280808000ad422086200141086aad843703182001200141186a36" + "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" + "6b22022480808080002002200036020c20024102360214200241a88bc080003602" + "102002420137021c2002418b8080800036022c2002200241286a36021820022002" + "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" + "808080000b200241306a2480808080000b4701017f23808080800041206b220024" + "8080808000200041003602182000410136020c200041bc90c08000360208200042" + "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" + "808080800041206b220024808080800041002d00b89ec080001a02400240024041" + "20109b808080002201450d00200141023602102001428180808010370300410029" + "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" + "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" + "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" + "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" + "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" + "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" + "41003a000020002802182202450d00200120021087808080000b02402000417f46" + "0d00200020002802042201417f6a36020420014101470d00200041201087808080" + "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" + "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" + "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" + "c08000410410af808080000be50301017f23808080800041c0006b220224808080" + "800002400240024002400240024020002d00000e0400010203000b200220002802" + "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" + "002800809bc08000360000200041086a41002900f89ac080003700002000410029" + "00f09ac08000370000200241143602102002200036020c20024114360208200241" + "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" + "86200241046aad843703202002418e80808000ad422086200241086aad84370318" + "2002200241186a36023020012802142001280218200241286a1091808080002100" + "20022802082201450d03200228020c20011087808080000c030b20002d00012100" + "2002410136022c200241d490c08000360228200242013702342002418280808000" + "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" + "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" + "02142001280218200241286a10918080800021000c020b20012000280204220028" + "0200200028020410af8080800021000c010b200028020422002802002001200028" + "0204280210118180808000808080800021000b200241c0006a2480808080002000" + "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" + "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" + "000240200141046a28020022022802002203450d00200020031182808080008080" + "8080000b024020022802042202450d00200020021087808080000b2001410c1087" + "808080000b0bf10101027f23808080800041206b22002480808080000240024002" + "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" + "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" + "410020013602d89ec08000410042808080808080013703d09ec080004100420037" + "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" + "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" + "200041003602182000410136020c200041bc9bc080003602082000420437021020" + "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" + "042480808080000240024002400240024020012802100d002001417f3602102003" + "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" + "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" + "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" + "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" + "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" + "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" + "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" + "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" + "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" + "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" + "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" + "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" + "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" + "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" + "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" + "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" + "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" + "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" + "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" + "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" + "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" + "2004410136020c2004418c91c0800036020820044204370210200441086a419491" + "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" + "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" + "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" + "80808000024020042d00084104460d00200020042903083702000c030b2001411c" + "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" + "066a210502402001280214200320066b22064b0d002000200141146a2005200610" + "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" + "002001411c6a20063602000b2001200128021041016a360210200441206a248080" + "8080000b7101027f20012802002104024020012802082205450d00200420056b20" + "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" + "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" + "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" + "0041106b2203248080808000200341086a20002802082802002001200210c98080" + "8000024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" + "046a28020022062802002207450d002001200711828080800080808080000b0240" + "20062802042206450d00200120061087808080000b2004410c1087808080000b20" + "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" + "23808080800041106b220224808080800020024100360204024002400240024020" + "01418001490d002001418010490d012001418080044f0d0220022001413f714180" + "01723a000620022001410c7641e001723a000420022001410676413f7141800172" + "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" + "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" + "418001723a00072002200141127641f001723a000420022001410676413f714180" + "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" + "00280208280200200241046a200110c980808000024020022d000822014104460d" + "0020002802042103200229030821040240024020002d0000220541044b0d002005" + "4103470d010b200328020021050240200341046a28020022062802002207450d00" + "2005200711828080800080808080000b024020062802042206450d002005200610" + "87808080000b2003410c1087808080000b200020043702000b200241106a248080" + "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" + "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" + "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" + "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" + "012002742204710d0020032000360200200020033602182000200036020c200020" + "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" + "200328020022042802044178712001470d00200421020c010b2001410041192002" + "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" + "002202450d02200341017421032002210420022802044178712001470d000b0b20" + "022802082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20002000" + "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" + "8080808000200028020c2102024002400240024020002802040e020001020b2002" + "0d0141012102410021030c020b20020d0020002802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c2001418f8080800020" + "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" + "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" + "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" + "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" + "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" + "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" + "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" + "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" + "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" + "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" + "0c010b2000410020006b41037122046a210502402004450d002000210320012106" + "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" + "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" + "0020084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a28020021060340200520062002762001280200220620" + "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" + "480d0020092101034020052001280200360200200141046a2101200541046a2205" + "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" + "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" + "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" + "067e22072003422088220820067e22062005200142208822097e7c22054220867c" + "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" + "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" + "00000c000000040000001200000013000000140000000000000000000000010000" + "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" + "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" + "2f6332663734633366393238616562353033663135623465396566353737386537" + "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" + "2e727300005f0010004b000000060a00000e000000000000000100000001000000" + "16000000170000001400000004000000180000004572726f72557466384572726f" + "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" + "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" + "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" + "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" + "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" + "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" + "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" + "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" + "000000da0110000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000b301100010000000fc011000100000000c02100009000000da0110" + "00090000000100000000000000ef0b100002000000000000000c00000004000000" + "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" + "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" + "000030783030303130323033303430353036303730383039313031313132313331" + "343135313631373138313932303231323232333234323532363237323832393330" + "333133323333333433353336333733383339343034313432343334343435343634" + "373438343935303531353235333534353535363537353835393630363136323633" + "363436353636363736383639373037313732373337343735373637373738373938" + "303831383238333834383538363837383838393930393139323933393439353936" + "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" + "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820e804100012000000" - "fa0410002200000072616e676520656e6420696e646578202c05100010000000fa" - "04100022000000736c69636520696e646578207374617274732061742020627574" - "20656e647320617420004c05100016000000620510000d00000001010101010101" + "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" + "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" + "031000220000000101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010000000000000000000000" + "010101000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000202020202020202020202" - "020202020202020202020202020202020202020303030303030303030303030303" - "0303040404040400000000000000000000005b2e2e2e5d626567696e203c3d2065" - "6e642028203c3d2029207768656e20736c6963696e67206060850610000e000000" - "93061000040000009706100010000000a7061000010000006279746520696e6465" - "7820206973206e6f742061206368617220626f756e646172793b20697420697320" - "696e7369646520202862797465732029206f66206000c80610000b000000d30610" - "0026000000f9061000080000000107100006000000a70610000100000020697320" - "6f7574206f6620626f756e6473206f6620600000c80610000b0000003007100016" - "000000a706100001000000636f72652f7372632f7374722f6d6f642e7273006007" - "100013000000f00000002c000000636f72652f7372632f756e69636f64652f7072" - "696e7461626c652e7273000000840710001d0000001a0000003600000084071000" - "1d0000000a0000002b000000000601010301040205070702080809020a050b020e" - "041001110212051311140115021702190d1c051d081f0124016a046b02af03b102" - "bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb" - "010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418" - "363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f6465" - "5cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f" - "5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c15" - "1d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a48" - "4a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e" - "227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06" - "240424042808340b4e43813709160a08183b45390363080930160521031b050140" - "38044b052f040a070907402027040c0936033a051a07040c07504937330d33072e" - "080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b42" - "3e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a06" - "0a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937" - "030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d8430" - "10168faa8247a1b98239072a045c06260a460a28051382b05b654b043907114005" - "0b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092" - "604709743c80f60a73087015467a140c140c570919808781470385420f1584501f" - "060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a" - "04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c04" - "0907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81" - "540c1d03090736080e040907090780cb250a840600010305050606020706080709" - "110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c02" - "1f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05fd02fe03ff" - "09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192" - "a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4ba" - "bbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d" - "11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084" - "b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e" - "5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f" - "7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74" - "7596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a5b07080f10" - "272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df0482" - "44081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a" - "500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b" - "0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582" - "b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c04" - "0103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582" - "ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be" - "22740c80d61a81100580df0bf29e033709815c1480b80880cb050a183b030a0638" - "0846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a104" - "81da26070c050580a61081f50701202a064c04808d0480be031b030f0d636f7265" - "2f7372632f756e69636f64652f756e69636f64655f646174612e7273003f0d1000" - "2000000050000000280000003f0d1000200000005c000000160000000003000083" - "042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8" - "602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a1" - "39301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a153" - "00da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a0070000700" - "2d0101010201020101480b30151001650702060202010423011e1b5b0b3a090901" - "18040109010301052b033c082a180120370101010408040103070a021d013a0101" - "010204080109010a021a010202390104020402020303011e0203010b0239010405" - "010204011402160601013a0101020104080107030a021e013b0101010c01090128" - "010301370101030503010407020b021d013a01020102010301050207020b021c02" - "390201010204080109010a021d0148010401020301010801510102070c08620102" - "090b0749021b0101010101370e01050102050b0124090166040106010202021902" - "040310040d01020206010f01000300031d021e021e02400201070801020b09012d" - "030101750222017603040209010603db0202013a010107010101010208060a0201" - "301f310430070101050128090c0220040202010338010102030101033a08020298" - "03010d0107040106010302c6400001c32100038d016020000669020004010a2002" - "50020001030104011902050197021a120d012608190b2e03300102040202270143" - "06020202020c0108012f01330101030202050201012a020801ee01020104010001" - "0010101000020001e201950500030102050428030401a502000400025003460b31" - "047b01360f290102020a033104020207013d03240501083e010c0234090a040201" - "5f0302010102060102019d010308150239020101010116010e070305c308020301" - "011701510102060101020101020102eb010204060201021b025508020101026a01" - "01010206010165030204010500090102f5010a0201010401900402020401200a28" - "0602040801090602032e0d010200070106010152160207010201027a0603010102" - "0107010148020301010100020b023405050101010001060f00053b0700013f0451" - "010002002e0217000101030405080802071e0494030037043208010e011605010f" - "000701110207010201056401a00700013d04000400076d07006080f0002f727573" - "74632f633266373463336639323861656235303366313562346539656635373738" - "653737663330353862382f6c6962726172792f616c6c6f632f7372632f636f6c6c" - "656374696f6e732f62747265652f6d61702f656e7472792e727300db1010006000" - "000071010000360000002f72757374632f63326637346333663932386165623530" - "3366313562346539656635373738653737663330353862382f6c6962726172792f" - "616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e" - "7273617373657274696f6e206661696c65643a20656467652e686569676874203d" - "3d2073656c662e686569676874202d2031004c1110005b000000af020000090000" - "00617373657274696f6e206661696c65643a207372632e6c656e2829203d3d2064" - "73742e6c656e28294c1110005b0000002f070000050000004c1110005b000000af" - "040000230000004c1110005b000000ef04000024000000617373657274696f6e20" - "6661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e" - "686569676874202d20310000004c1110005b000000f003000009000000c8151000" - "5f0000005802000030000000110000000c00000004000000120000001300000014" - "000000000000000000000001000000150000006120446973706c617920696d706c" - "656d656e746174696f6e2072657475726e656420616e206572726f7220756e6578" - "7065637465646c792f72757374632f633266373463336639323861656235303366" - "313562346539656635373738653737663330353862382f6c6962726172792f616c" - "6c6f632f7372632f737472696e672e72730000f71210004b000000060a00000e00" - "00004572726f72454f46207768696c652070617273696e672061206c697374454f" - "46207768696c652070617273696e6720616e206f626a656374454f46207768696c" - "652070617273696e67206120737472696e67454f46207768696c65207061727369" - "6e6720612076616c7565657870656374656420603a60657870656374656420602c" - "60206f7220605d60657870656374656420602c60206f7220607d60657870656374" - "6564206964656e7465787065637465642076616c75656578706563746564206022" - "60696e76616c696420657363617065696e76616c6964206e756d6265726e756d62" - "6572206f7574206f662072616e6765696e76616c696420756e69636f646520636f" - "646520706f696e74636f6e74726f6c2063686172616374657220285c7530303030" - "2d5c75303031462920666f756e64207768696c652070617273696e672061207374" - "72696e676b6579206d757374206265206120737472696e67696e76616c69642076" - "616c75653a206578706563746564206b657920746f2062652061206e756d626572" - "20696e2071756f746573666c6f6174206b6579206d7573742062652066696e6974" - "652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c656164696e67" - "20737572726f6761746520696e2068657820657363617065747261696c696e6720" - "636f6d6d61747261696c696e672063686172616374657273756e65787065637465" - "6420656e64206f662068657820657363617065726563757273696f6e206c696d69" - "742065786365656465644572726f72282c206c696e653a202c20636f6c756d6e3a" - "200000008d1510000600000093151000080000009b1510000a000000b820100001" - "0000002f72757374632f6332663734633366393238616562353033663135623465" - "39656635373738653737663330353862382f6c6962726172792f616c6c6f632f73" - "72632f636f6c6c656374696f6e732f62747265652f6e617669676174652e727300" - "c81510005f000000c600000027000000c81510005f000000160200002f000000c8" - "1510005f000000a1000000240000002f686f6d652f7077616e672f2e636172676f" - "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631" - "376432326262613135303031662f73657264655f6a736f6e2d312e302e3133352f" - "7372632f726561642e727300581610005f000000a001000045000000581610005f" - "000000a50100003d000000581610005f000000ad0100001a000000581610005f00" - "0000fa01000013000000581610005f000000030200003e000000581610005f0000" - "00ff01000033000000581610005f000000090200003a000000581610005f000000" - "6802000019000000ffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffff0000010002000300040005000600070008000900ffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffff0000100020003000400050" - "006000700080009000ffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000f000" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffff110000000c00000004000000120000001300000014000000" - "7265656e7472616e7420696e69740000501b10000e0000002f72757374632f6332" - "663734633366393238616562353033663135623465396566353737386537376633" - "30353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63652e" - "7273000000681b10004d0000002301000042000000000000000000000004000000" - "04000000190000001a0000000c000000040000001b0000001c0000001d0000002f" - "727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c6d61" - "6c6c6f632e7273617373657274696f6e206661696c65643a207073697a65203e3d" - "2073697a65202b206d696e5f6f7665726865616400f41b100029000000a8040000" - "09000000617373657274696f6e206661696c65643a207073697a65203c3d207369" - "7a65202b206d61785f6f766572686561640000f41b100029000000ae0400000d00" - "0000757365206f66207374643a3a7468726561643a3a63757272656e7428292069" - "73206e6f7420706f737369626c6520616674657220746865207468726561642773" - "206c6f63616c206461746120686173206265656e2064657374726f796564737464" - "2f7372632f7468726561642f6d6f642e727300fa1c100015000000f10200001300" - "00006661696c656420746f2067656e657261746520756e69717565207468726561" - "642049443a2062697473706163652065786861757374656400201d100037000000" - "fa1c100015000000c40400000d00000001000000000000007374642f7372632f69" - "6f2f62756666657265642f6c696e657772697465727368696d2e72736d6964203e" - "206c656e00009d1d100009000000781d1000250000000f01000029000000656e74" - "697479206e6f7420666f756e647065726d697373696f6e2064656e696564636f6e" - "6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574686f" - "737420756e726561636861626c656e6574776f726b20756e726561636861626c65" - "636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e65637465646164" - "647265737320696e2075736561646472657373206e6f7420617661696c61626c65" - "6e6574776f726b20646f776e62726f6b656e2070697065656e7469747920616c72" - "65616479206578697374736f7065726174696f6e20776f756c6420626c6f636b6e" - "6f742061206469726563746f727969732061206469726563746f72796469726563" - "746f7279206e6f7420656d707479726561642d6f6e6c792066696c657379737465" - "6d206f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e2073796d6c" - "696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e646c" - "65696e76616c696420696e70757420706172616d65746572696e76616c69642064" - "61746174696d6564206f75747772697465207a65726f6e6f2073746f7261676520" - "73706163657365656b206f6e20756e7365656b61626c652066696c6566696c6573" - "797374656d2071756f746120657863656564656466696c6520746f6f206c617267" - "657265736f75726365206275737965786563757461626c652066696c6520627573" - "79646561646c6f636b63726f73732d646576696365206c696e6b206f722072656e" - "616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e616d65" - "617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e2069" - "6e746572727570746564756e737570706f72746564756e65787065637465642065" - "6e64206f662066696c656f7574206f66206d656d6f72796f74686572206572726f" - "72756e63617465676f72697a6564206572726f7220286f73206572726f72202900" - "00000100000000000000ad2010000b000000b8201000010000007374642f737263" - "2f696f2f737464696f2e727300d4201000130000002c030000140000006661696c" - "6564207072696e74696e6720746f203a20000000f8201000130000000b21100002" - "000000d4201000130000005d040000090000007374646f75747374642f7372632f" - "696f2f6d6f642e72736120666f726d617474696e6720747261697420696d706c65" - "6d656e746174696f6e2072657475726e656420616e206572726f72207768656e20" - "74686520756e6465726c79696e672073747265616d20646964206e6f7400000047" - "211000560000003621100011000000280700001500000063616e6e6f7420726563" - "7572736976656c792061637175697265206d75746578b821100020000000737464" - "2f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e7273" - "e02110002400000014000000090000007374642f7372632f73796e632f6f6e6365" - "2e72731422100014000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465787374642f7372632f73" - "796e632f7265656e7472616e745f6c6f636b2e72735e2210001e00000022010000" - "2d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d6520" - "696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f726d" - "6564207265637572736976656c79a0221000380000001000000011000000120000" - "00100000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e00000013000000260000003800000019" - "000000170000000c000000090000000a0000001000000017000000190000000e00" - "00000d00000014000000080000001b0000000e0000001000000016000000150000" - "000b000000160000000d0000000b00000013000000c01d1000d01d1000e11d1000" - "f31d1000031e1000131e1000261e1000381e1000451e1000531e1000681e100074" - "1e10007f1e1000941e1000a91e1000b81e1000c61e1000d91e1000ff1e1000371f" - "1000501f1000671f1000731f10007c1f1000861f1000961f1000ad1f1000c61f10" - "00d41f1000e11f1000f51f1000fd1f10001820100026201000362010004c201000" - "612010006c201000822010008f2010009a201000000000000000f03f0000000000" - "00244000000000000059400000000000408f40000000000088c34000000000006a" - "f8400000000080842e4100000000d01263410000000084d797410000000065cdcd" - "41000000205fa00242000000e876483742000000a2941a6d42000040e59c30a242" - "0000901ec4bcd64200003426f56b0c430080e03779c3414300a0d8855734764300" - "c84e676dc1ab43003d9160e458e143408cb5781daf154450efe2d6e41a4b4492d5" - "4d06cff08044f64ae1c7022db544b49dd9794378ea449102282c2a8b2045350332" - "b7f4ad54450284fee471d9894581121f2fe727c04521d7e6fae031f445ea8ca039" - "593e294624b00888ef8d5f46176e05b5b5b893469cc94622e3a6c846037cd8ea9b" - "d0fe46824dc77261423347e32079cff91268471b695743b8179e47b1a1162ad3ce" - "d2471d4a9cf487820748a55cc3f129633d48e7191a37fa5d724861a0e0c478f5a6" - "4879c818f6d6b2dc484c7dcf59c6ef11499e5c43f0b76b4649c63354eca5067c49" - "5ca0b4b32784b14973c8a1a031e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0" - "fddd76d261854a307d951447baba4a3e6edd6c6cb4f04acec9148887e1244b41fc" - "196ae9195a4ba93d50e23150904b134de45a3e64c44b57609df14d7df94b6db804" - "6ea1dc2f4c44f3c2e4e4e9634c15b0f31d5ee4984c1b9c70a5751dcf4c91616687" - "6972034df5f93fe9034f384d72f88fe3c4626e4d47fb390ebbfda24d197ac8d129" - "bdd74d9f983a4674ac0d4e649fe4abc88b424e3dc7ddd6ba2e774e0c39958c69fa" - "ac4ea743ddf7811ce24e9194d475a2a3164fb5b949138b4c4c4f11140eecd6af81" - "4f169911a7cc1bb64f5bffd5d0bfa2eb4f99bf85e2b74521507f2f27db25975550" - "5ffbf051effc8a501b9d369315dec050624404f89a15f5507b5505b6015b2a516d" - "55c311e1786051c82a3456199794517a35c1abdfbcc9516cc158cb0b160052c7f1" - "2ebe8e1b345239aeba6d72226952c75929090f6b9f521dd8b965e9a2d352244e28" - "bfa38b0853ad61f2ae8cae3e530c7d57ed172d73534f5cade85df8a75363b3d862" - "75f6dd531e70c75d09ba1254254c39b58b6847542e9f87a2ae427d547dc39425ad" - "49b2545cf4f96e18dce6547371b88a1e931c55e846b316f3db5155a21860dcef52" - "8655ca1e78d3abe7bb553f132b64cb70f1550ed8353dfecc2556124e83cc3d405b" - "56cb10d29f26089156fe94c647304ac5563d3ab859bc9cfa56662413b8f5a13057" - "80ed172673ca6457e0e89def0ffd99578cb1c2f5293ed057ef5d3373b44d04586b" - "35009021613958c54200f469b96f58bb298038e2d3a3582a34a0c6dac8d8583541" - "487811fb0e59c1282debea5c4359f172f8a525347859ad8f760f2f41ae59cc19aa" - "69bde8e2593fa014c4eca2175a4fc819f5a78b4d5a321d30f94877825a7e247c37" - "1b15b75a9e2d5b0562daec5a82fc58437d08225ba33b2f949c8a565b8c0a3bb943" - "2d8c5b97e6c4534a9cc15b3d20b6e85c03f65b4da8e32234842b5c3049ce95a032" - "615c7cdb41bb487f955c5b5212ea1adfca5c79734bd270cb005d5750de064dfe34" - "5d6de49548e03d6a5dc4ae5d2dac66a05d751ab5385780d45d1261e2066da0095e" - "ab7c4d244404405ed6db602d5505745ecc12b978aa06a95e7f57e7165548df5eaf" - "96502e358d135f5bbce4798270485f72eb5d18a38c7e5f27b33aefe517b35ff15f" - "096bdfdde75fedb7cb4557d51d60f4529f8b56a55260b127872eac4e87609df128" - "3a5722bd60029759847635f260c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd" - "35c89161d65c8f2c433ac6610c34b3f7d3c8fb618700d07a845d3162a9008499e5" - "b46562d400e5ff1e229b628420ef5f53f5d062a5e8ea37a8320563cfa2e545527f" - "3a63c185af6b938f706332679b4678b3a463fe40425856e0d9639f6829f7352c10" - "64c6c2f3744337446478b330521445796456e0bc665996af64360c36e0f7bde364" - "438f43d875ad18651473544ed3d84e65ecc7f41084478365e8f931156519b86561" - "787e5abe1fee653d0b8ff8d6d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0" - "bbeedf62c266389d6aea97fbf666864405e57dba2c67d44a23af8ef46167891dec" - "5ab2719667eb24a7f11e0ecc6713770857d3880168d794ca2c08eb35680d3afd37" - "ca656b684844fe629e1fa1685ad5bdfb8567d568b14aad7a67c10a69af4eacace0" - "b840695a62d7d718e77469f13acd0ddf20aa69d644a0688b54e0690c56c842ae69" - "146a8f6b7ad31984496a7306594820e57f6a08a4372d34efb36a0a8d853801ebe8" - "6a4cf0a686c1251f6b305628f49877536bbb6b32317f55886baa067ffdde6abe6b" - "2a646f5ecb02f36b353d0b367ec3276c820c8ec35db45d6cd1c7389aba90926cc6" - "f9c640e934c76c37b8f8902302fd6c23739b3a5621326deb4f42c9aba9666de6e3" - "92bb16549c6d70ce3b358eb4d16d0cc28ac2b121066e8f722d331eaa3b6e9967fc" - "df524a716e7f81fb97e79ca56edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a" - "3a1b456f948306b508627a6f3d122471457db06fcc166dcd969ce46f7f5cc880bc" - "c31970cf397dd0551a507043889c44eb20847054aac3152629b970e994349b6f73" - "ef7011dd00c125a82371561441312f9258716b5991fdbab68e71e3d77ade3432c3" - "71dc8d1916c2fef77153f19f9b72fe2d72d4f643a107bf627289f49489c96e9772" - "ab31faeb7b4acd720b5f7c738d4e0273cd765bd030e2367381547204bd9a6c73d0" - "74c722b6e0a173045279abe358d67386a657961cef0b7414c8f6dd71754174187a" - "7455ced275749e98d1ea8147ab7463ffc232b10ce1743cbf737fdd4f15750baf50" - "dfd4a34a75676d920b65a68075c008774efecfb475f1ca14e2fd03ea75d6fe4cad" - "7e4220768c3ea0581e5354762f4ec8eee5678976bb617a6adfc1bf76157d8ca22b" - "d9f3765a9c2f8b76cf28777083fb2d54035f772632bd9c14629377b07eecc3993a" - "c8775c9ee7344049fe77f9c21021c8ed3278b8f354293aa96778a530aab388939d" - "78675e4a70357cd27801f65ccc421b07798233747f13e23c7931a0a82f4c0d7279" - "3dc8923b9f90a6794d7a770ac734dc7970ac8a66fca0117a8c572d803b09467a6f" - "ad38608a8b7b7a656c237c3637b17a7f472c1b0485e57a5e59f72145e61a7bdb97" - "3a35ebcf507bd23d8902e603857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a" - "9ece85247cf687184642a7597cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8" - "560df97cf8f19066ac502f7d3b971ac06b92637d0a3d21b00677987d4c8c295cc8" - "94ce7db0f79939fd1c037e9c7500883ce4377e039300aa4bdd6d7ee25b404a4faa" - "a27eda72d01ce354d77e908f04e41b2a0d7fbad9826e513a427f299023cae5c876" - "7f3374ac3c1f7bac7fa0c8eb85f3cce17f756c6c727565616c736500c04a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01884a7b003d5f5a4e313073657264" - "655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e31" - "3768386631666565323432343761346639634501435f5a4e313073657264655f6a" - "736f6e3264653231446573657269616c697a6572244c5424522447542435657272" - "6f723137683438663764306565626231623836343145020e5f5f727573745f6465" - "616c6c6f63035b5f5a4e34636f726533666d74336e756d34395f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e44656275672475323024666f72247532" - "302475382447542433666d74313768346234323333323664643863616231354504" - "305f5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "3532316661366566366130363732614505445f5a4e34636f726535736c69636535" - "696e6465783236736c6963655f73746172745f696e6465785f6c656e5f6661696c" - "313768663931613361666538376231643434334506385f5a4e34636f726533666d" - "7439466f726d617474657231327061645f696e74656772616c3137686334656130" - "376130626331333536633445075c5f5a4e34636f726533666d74336e756d35305f" - "244c5424696d706c2475323024636f72652e2e666d742e2e446562756724753230" - "24666f7224753230247533322447542433666d7431376835353339386231363535" - "30643532376545084c5f5a4e34636f726533707472343264726f705f696e5f706c" - "616365244c5424616c6c6f632e2e737472696e672e2e537472696e672447542431" - "37683738323934613239653363373833306445094f5f5a4e34636f726533707472" - "343564726f705f696e5f706c616365244c542473657264655f6a736f6e2e2e6572" - "726f722e2e4572726f722447542431376866383763386436646339616234626335" - "450a4f5f5a4e34636f726533707472343564726f705f696e5f706c616365244c54" - "2473657264655f6a736f6e2e2e76616c75652e2e56616c75652447542431376835" - "333262653330333764613162376564450b81015f5a4e39395f244c5424616c6c6f" - "632e2e636f6c6c656374696f6e732e2e62747265652e2e6d61702e2e4254726565" - "4d6170244c54244b24432456244324412447542424753230246173247532302463" - "6f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031376835" - "346633306630323133646334313362450c645f5a4e37305f244c5424616c6c6f63" - "2e2e7665632e2e566563244c542454244324412447542424753230246173247532" - "3024636f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031" - "376864313538343863353832316334666665450d525f5a4e35335f244c5424636f" - "72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376866376165323835356232343964" - "626335450e5f5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "000000020202020202020202020202020202020202020202020202020202020202" + "030303030303030303030303030303030404040404000000000000000000000000" + "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" + "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" + "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" + "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" + "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" + "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" + "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" + "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" + "000000690000001600000042616c616e636500b8051000360000007e0000001600" + "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" + "633266373463336639323861656235303366313562346539656635373738653737" + "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" + "652e72730000004c0610004d000000230100004200000000000000000000000400" + "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" + "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" + "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" + "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" + "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" + "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" + "206973206e6f7420706f737369626c652061667465722074686520746872656164" + "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" + "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" + "130000006661696c656420746f2067656e657261746520756e6971756520746872" + "6561642049443a2062697473706163652065786861757374656400040810003700" + "0000de07100015000000c40400000d00000001000000000000007374642f737263" + "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e000081081000090000005c081000250000000f0100002900000065" + "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" + "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" + "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" + "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" + "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" + "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" + "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" + "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" + "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" + "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" + "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" + "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" + "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" + "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" + "7267657265736f75726365206275737965786563757461626c652066696c652062" + "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" + "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" + "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" + "20696e746572727570746564756e737570706f72746564756e6578706563746564" + "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" + "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" + "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" + "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" + "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" + "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" + "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" + "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" + "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" + "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" + "65637572736976656c792061637175697265206d757465789c0c10002000000073" + "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" + "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" + "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" + "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" + "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" + "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" + "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" + "726d6564207265637572736976656c79840d100038000000100000001100000012" + "000000100000001000000013000000120000000d0000000e000000150000000c00" + "00000b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a000000100000001700000019000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600000015" + "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" + "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" + "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" + "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" + "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" + "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" + "000b000000040000004305100048051000540510005f0510006a05100000c62e04" + "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" + "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" + "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" + "6c6962313067657454784669656c64313768623836623962643665383439353163" + "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" + "43757272656e744c6564676572456e7472794669656c6431376861346138303037" + "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" + "6c696231396765744c6564676572456e7472794669656c64313768633661326634" + "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" + "5f6c69623139676574506172656e744c656467657254696d653137683731643366" + "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" + "696e745f6e756d626572313768343432633966366462343461613636374506305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" + "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" + "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" + "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" + "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" + "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376833326438343961303132376564636461450b445f" + "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" + "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" + "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" + "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" + "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683562646335303561663532336432393945" + "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" + "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" + "7a652447542433666d7431376836336361623039386234313233343130450f465f" + "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" + "63745f6669656c64325f66696e6973683137683135666166363733326663303964" + "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" + "313768396461663134643536353865323530364511265f5a4e34636f726533666d" + "743577726974653137683933353534653462653731663263376145124c5f5a4e34" + "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67244754243137683230373631353664386431" + "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" + "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" + "7224475424313768323066303937633266353863396661374514525f5a4e35335f" + "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" + "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" + "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" + "577269746524475424313077726974655f63686172313768323134333931636238" + "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" + "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" + "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" + "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" + "6573657276655f616e645f68616e646c6531376862356335336362636666396436" + "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "475424313077726974655f63686172313768323134333931636238656231353263" - "36450f435f5a4e35616c6c6f63377261775f7665633139526177566563244c5424" - "5424432441244754243867726f775f6f6e65313768363666383634616630346265" - "6432623245105a5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c5424412447542437726573657276653231646f5f72657365727665" - "5f616e645f68616e646c653137683766656665376563326164336435616245115d" - "5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475" - "32302461732475323024636f72652e2e666d742e2e577269746524475424397772" - "6974655f737472313768353939643965353738393436646439384512595f5a4e36" - "305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532302461" - "732475323024636f72652e2e666d742e2e446973706c61792447542433666d7431" - "37686365343232366161316637323663316345132e5f5a4e34636f726533666d74" - "39466f726d61747465723370616431376834373639616533383933373463633531" - "45145d5f5a4e36355f244c542473657264655f6a736f6e2e2e76616c75652e2e56" - "616c7565247532302461732475323024636f72652e2e636d702e2e506172746961" - "6c4571244754243265713137683162323138393234373831393663383045158b01" - "5f5a4e3130385f244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e6274" - "7265652e2e6d61702e2e49746572244c54244b2443245624475424247532302461" - "732475323024636f72652e2e697465722e2e7472616974732e2e6974657261746f" - "722e2e4974657261746f7224475424346e65787431376835363664323036316535" - "6139376461644516615f5a4e36385f244c5424636f72652e2e6e756d2e2e657272" - "6f722e2e5061727365496e744572726f72247532302461732475323024636f7265" - "2e2e666d742e2e44656275672447542433666d7431376863383736363338616561" - "6230633031664517675f5a4e36385f244c5424636f72652e2e666d742e2e627569" - "6c646572732e2e50616441646170746572247532302461732475323024636f7265" - "2e2e666d742e2e5772697465244754243977726974655f73747231376838313862" - "343965376536396132366664451808616c6c6f6361746519435f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542436" - "6d616c6c6f6331376865363539333961346338393763633135451a335f5a4e3561" - "6c6c6f63377261775f766563313268616e646c655f6572726f7231376839376237" - "646264306637326464373838451b0a6465616c6c6f636174651c11636f6d706172" - "655f6163636f756e7449441d325f5a4e313073657264655f6a736f6e3264653130" - "66726f6d5f736c69636531376831316365303837373634633961376230451e5c5f" - "5a4e35355f244c542473747224753230246173247532302473657264655f6a736f" - "6e2e2e76616c75652e2e696e6465782e2e496e646578244754243130696e646578" - "5f696e746f31376864333238633634636161396431376163451f325f5a4e34636f" - "726536726573756c743133756e777261705f6661696c6564313768663839396364" - "303037373637303035314520325f5a4e34636f7265366f7074696f6e3133756e77" - "7261705f6661696c6564313768333535313964653938613737363134664521625f" - "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" - "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" - "7533322447542433666d743137686266336530323238343833653337356145222b" - "5f5a4e3373746432696f35737464696f365f7072696e7431376838316334373231" - "3636303436663066634523385f5a4e35616c6c6f63377261775f76656331376361" - "7061636974795f6f766572666c6f77313768343939643438326139656435373135" - "614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d7431" - "3768363534306363623264356664633361624525415f5a4e38646c6d616c6c6f63" - "38646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243466726565" - "3137683339383334616161616533653839343645262c5f5a4e34636f7265397061" - "6e69636b696e673570616e69633137683034656562393137646439336332323945" - "270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c696e6b" - "5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447" - "54243133646973706f73655f6368756e6b31376836653063636364343538363537" - "343633452a3a5f5a4e34636f72653970616e69636b696e67313870616e69635f62" - "6f756e64735f636865636b31376833643662386161346338303439363632452b11" - "727573745f626567696e5f756e77696e642c465f5a4e34636f726533666d743946" - "6f726d617474657231327061645f696e74656772616c313277726974655f707265" - "66697831376861396134333238306236303036643132452d425f5a4e34636f7265" - "35736c69636535696e6465783234736c6963655f656e645f696e6465785f6c656e" - "5f6661696c31376830383862353665323939626561616166452e3b5f5a4e34636f" - "72653970616e69636b696e6731396173736572745f6661696c65645f696e6e6572" - "31376836663765333235376438346135303432452f475f5a4e34325f244c542424" - "52462454247532302461732475323024636f72652e2e666d742e2e446562756724" - "47542433666d74313768336136626161316262343761643230344530495f5a4e34" - "345f244c54242452462454247532302461732475323024636f72652e2e666d742e" - "2e446973706c61792447542433666d743137683766663464306238363039633234" - "37324531585f5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e" - "7473247532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768363861336538653530396361666336344532265f5a4e34" - "636f726533666d7435777269746531376839333535346534626537316632633761" - "45335f5f5a4e34636f726533666d74336e756d35305f244c5424696d706c247532" - "3024636f72652e2e666d742e2e44656275672475323024666f7224753230247533" - "322447542433666d7431376835353339386231363535306435323765452e323534" - "5c5f5a4e36335f244c5424636f72652e2e63656c6c2e2e426f72726f774d757445" - "72726f72247532302461732475323024636f72652e2e666d742e2e446562756724" - "47542433666d74313768313564336433343334626464636363384535395f5a4e34" - "636f72653463656c6c323270616e69635f616c72656164795f626f72726f776564" - "313768333134623532613162633436626665344536405f5a4e34636f726535736c" - "69636535696e6465783232736c6963655f696e6465785f6f726465725f6661696c" - "313768353862336536383666653333373030654537325f5a4e34636f7265366f70" - "74696f6e31336578706563745f6661696c65643137686630386139396532643733" - "33366336614538535f5a4e34636f72653463686172376d6574686f647332325f24" - "4c5424696d706c2475323024636861722447542431366573636170655f64656275" - "675f657874313768656366613566303431373437393039384539345f5a4e34636f" - "726537756e69636f6465397072696e7461626c6535636865636b31376836646136" - "346638306663313630633761453a325f5a4e34636f7265337374723136736c6963" - "655f6572726f725f6661696c31376862303364323439386438646362363433453b" - "355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c5f72" - "7431376832616462643139306563313832373933453c645f5a4e37315f244c5424" - "636f72652e2e6f70732e2e72616e67652e2e52616e6765244c5424496478244754" - "24247532302461732475323024636f72652e2e666d742e2e446562756724475424" - "33666d7431376836636632383632303536616535653233453d465f5a4e34315f24" - "4c542463686172247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376865613566643964626339343936626665453e625f" - "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" - "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" - "6933322447542433666d7431376863656439306337613633396330316464453fce" - "015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f64" - "653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e672443244b24" - "432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e" - "6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c2447542432" - "316465616c6c6f636174655f616e645f617363656e643137683538396137326639" - "343233626663656245409a025f5a4e35616c6c6f633131636f6c6c656374696f6e" - "73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e2e63" - "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f646552656624" - "4c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" - "652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e2e63" - "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e" - "496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e45646765244754243130" - "696e736572745f6669743137686338613063663533396566663031313145419202" - "5f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f6465" - "32313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e" - "62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e636f" - "6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4d" - "75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e" - "62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c24475424" - "244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" - "652e2e6d61726b65722e2e4b56244754243573706c697431376864303961343862" - "37613831363331616145425a5f5a4e36315f244c542473657264655f6a736f6e2e" - "2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e666d" - "742e2e44656275672447542433666d743137683430323537643666343265323962" - "37344543595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e4572" - "726f72247532302461732475323024636f72652e2e666d742e2e446973706c6179" - "2447542433666d74313768393032373163376232613663653833394544575f5a4e" - "35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475323024" - "61732475323024636f72652e2e666d742e2e44656275672447542433666d743137" - "686236373265623139396333356431383645453a5f5a4e313073657264655f6a73" - "6f6e32646531325061727365724e756d6265723576697369743137683836623839" - "36383136626131306137654546565f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565336d6170323542547265654d6170244c54244b2443245624" - "4324412447542436696e7365727431376834643164623464613838343264346665" - "4547455f5a4e313073657264655f6a736f6e347265616439536c69636552656164" - "3137706f736974696f6e5f6f665f696e6465783137683236623431383938353234" - "38333239364548695f5a4e37305f244c542473657264655f6a736f6e2e2e726561" - "642e2e536c6963655265616424753230246173247532302473657264655f6a736f" - "6e2e2e726561642e2e52656164244754243970617273655f737472313768616265" - "386335353563386263643335354549475f5a4e313073657264655f6a736f6e3472" - "65616439536c696365526561643139736b69705f746f5f6573636170655f736c6f" - "7731376834373836633665323234666132336632454a465f5a4e35616c6c6f6333" - "7665633136566563244c54245424432441244754243137657874656e645f66726f" - "6d5f736c69636531376864626131346637346638653232366463454b2f5f5a4e31" - "3073657264655f6a736f6e34726561643661735f73747231376866636436626234" - "313731373865366635454c3e5f5a4e313073657264655f6a736f6e347265616432" - "3070617273655f756e69636f64655f657363617065313768393634306663636162" - "64303034613064454d725f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e526561642447542431376465636f64655f6865785f65" - "736361706531376834376265353936383535663830346461454e355f5a4e313073" - "657264655f6a736f6e347265616431317065656b5f6f725f656f66313768373363" - "62313436306531616339386135454f2e5f5a4e313073657264655f6a736f6e3472" - "656164356572726f72313768656635353237643333336339633236664550305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376861333165" - "6164363637646336373865304551325f5a4e35616c6c6f63377261775f76656331" - "3166696e6973685f67726f77313768353338353962613338396237316433354552" - "4b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e6572244c" - "54244124475424313467726f775f616d6f7274697a656431376839386333363466" - "6334356633643132344553435f5a4e35616c6c6f63377261775f76656331395261" - "77566563244c54245424432441244754243867726f775f6f6e6531376866373333" - "3137633566643665626336364554395f5a4e337374643674687265616438546872" - "6561644964336e6577396578686175737465643137683333366266376131343838" - "30343463384555425f5a4e34636f72653463656c6c346f6e636531374f6e636543" - "656c6c244c54245424475424387472795f696e6974313768636536336266323238" - "3531393165373145563e5f5a4e35616c6c6f633473796e633136417263244c5424" - "5424432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394557355f5a4e34636f72653970616e69636b696e6731336173736572" - "745f6661696c6564313768323332363266326333633738623661624558475f5a4e" - "34325f244c54242452462454247532302461732475323024636f72652e2e666d74" - "2e2e44656275672447542433666d74313768653138373433383865303762666532" - "3545595d5f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53747269" - "6e67247532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d7431376863653432323661613166373236633163452e3238335a7a" - "5f5a4e34636f726533707472383864726f705f696e5f706c616365244c54247374" - "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" - "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447542424" - "47542431376831363664633631616230333334633165455b495f5a4e3373746434" - "73796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424" - "3130696e697469616c697a6531376837663563353038646139653162303962455c" - "605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e5374646f7574" - "4c6f636b2475323024617324753230247374642e2e696f2e2e5772697465244754" - "243977726974655f616c6c31376832346238323631303436316432353666455d55" - "5f5a4e3373746432696f3862756666657265643962756677726974657231384275" - "66577269746572244c54245724475424313477726974655f616c6c5f636f6c6431" - "376835383462646262616562306662316262455e735f5a4e38305f244c54247374" - "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" - "4c54245424475424247532302461732475323024636f72652e2e666d742e2e5772" - "697465244754243977726974655f73747231376837666163663562633065666364" - "383038455f325f5a4e34636f726533666d74355772697465313077726974655f63" - "686172313768663062336265316563313964653565374560305f5a4e34636f7265" - "33666d743557726974653977726974655f666d7431376866383830386630646630" - "65343531336445610a727573745f70616e696362375f5a4e34636f72653570616e" - "6963313250616e69635061796c6f61643661735f73747231376836313439663134" - "3264396132653032654563505f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c542441244754243138696e736572745f6c61726765" - "5f6368756e6b313768656665383531613237353832646137624564455f5a4e3373" - "746433737973396261636b747261636532365f5f727573745f656e645f73686f72" - "745f6261636b747261636531376834646333646534376432323032316239456558" - "5f5a4e337374643970616e69636b696e673139626567696e5f70616e69635f6861" - "6e646c657232385f24753762242475376224636c6f737572652475376424247537" - "64243137686531376133393737663839633131373845663b5f5a4e337374643970" - "616e69636b696e673230727573745f70616e69635f776974685f686f6f6b313768" - "37373665373963396636353931626535456783015f5a4e39395f244c5424737464" - "2e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e646c65722e" - "2e5374617469635374725061796c6f6164247532302461732475323024636f7265" - "2e2e70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638456888015f5a4e313073657264655f" - "6a736f6e3576616c756532646537375f244c5424696d706c247532302473657264" - "652e2e64652e2e446573657269616c697a652475323024666f7224753230247365" - "7264655f6a736f6e2e2e76616c75652e2e56616c75652447542431316465736572" - "69616c697a65313768333165353137383163383336383735394569535f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "39616234626335452e3331316a3c5f5a4e3573657264653264653756697369746f" - "72313876697369745f626f72726f7765645f737472313768343564373131633837" - "31363863326636456b4f5f5a4e313073657264655f6a736f6e3264653231446573" - "657269616c697a6572244c54245224475424313670617273655f616e795f6e756d" - "62657231376839316435333034653561396363663531456c4a5f5a4e3130736572" - "64655f6a736f6e3264653231446573657269616c697a6572244c54245224475424" - "313170617273655f6964656e743137683663353964643731393635353139313045" - "6d735f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d61704163" - "63657373244c5424522447542424753230246173247532302473657264652e2e64" - "652e2e4d61704163636573732447542431336e6578745f6b65795f736565643137" - "6865363235636133323138363233653036456e755f5a4e37355f244c5424736572" - "64655f6a736f6e2e2e64652e2e4d6170416363657373244c542452244754242475" - "3230246173247532302473657264652e2e64652e2e4d6170416363657373244754" - "2431356e6578745f76616c75655f73656564313768656338353637376538303165" - "39393133456f4b5f5a4e313073657264655f6a736f6e3264653231446573657269" - "616c697a6572244c54245224475424313270617273655f6e756d62657231376837" - "3833613431613462393130646432304570515f5a4e313073657264655f6a736f6e" - "3264653231446573657269616c697a6572244c5424522447542431387061727365" - "5f6c6f6e675f696e74656765723137686438313037386634613331633262653245" - "714c5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a65" - "72244c54245224475424313370617273655f646563696d616c3137683661306333" - "363832326663336530306145724d5f5a4e313073657264655f6a736f6e32646532" - "31446573657269616c697a6572244c54245224475424313470617273655f657870" - "6f6e656e743137683336646437646264323365346134656245734d5f5a4e313073" - "657264655f6a736f6e3264653231446573657269616c697a6572244c5424522447" - "542431346636345f66726f6d5f7061727473313768633863316239626161613836" - "666637334574555f5a4e313073657264655f6a736f6e3264653231446573657269" - "616c697a6572244c54245224475424323270617273655f646563696d616c5f6f76" - "6572666c6f77313768336130306563656466383630313864334575565f5a4e3130" - "73657264655f6a736f6e3264653231446573657269616c697a6572244c54245224" - "475424323370617273655f6578706f6e656e745f6f766572666c6f773137683034" - "3762396637333562616463666138457681015f5a4e37355f244c54247365726465" - "5f6a736f6e2e2e64652e2e4d6170416363657373244c5424522447542424753230" - "246173247532302473657264652e2e64652e2e4d61704163636573732447542431" - "336e6578745f6b65795f7365656431326861735f6e6578745f6b65793137683564" - "61326634303536653538313464394577066d656d636d7078365f5a4e3137636f6d" - "70696c65725f6275696c74696e73336d656d376d656d6d6f766531376863383366" - "3931363866353238616565364579076d656d6d6f76657a066d656d637079071201" - "000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100550970" - "726f64756365727302086c616e6775616765010452757374000c70726f63657373" - "65642d62790105727573746325312e38332e302d6e696768746c79202863326637" - "346333663920323032342d30392d30392900490f7461726765745f666561747572" - "6573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b" - "0f7265666572656e63652d74797065732b087369676e2d657874"; + "4754243977726974655f7374723137683539396439653537383934366464393845" + "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" + "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" + "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" + "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" + "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" + "6563313268616e646c655f6572726f723137683937623764626430663732646437" + "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" + "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683132313861313631643933363438653945" + "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" + "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768613636623539636339336533383537344520615f" + "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" + "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768633837363633386165616230633031664521475f" + "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376839393432316563653462383633" + "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" + "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" + "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" + "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" + "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" + "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" + "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" + "653970616e69636b696e673570616e696331376830346565623931376464393363" + "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" + "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" + "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" + "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" + "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" + "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" + "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" + "6b696e673970616e69635f666d7431376836353430636362326435666463336162" + "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" + "753230247533322447542433666d74313768626633653032323834383365333735" + "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" + "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" + "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" + "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" + "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" + "4e34636f726533666d7439466f726d617474657233706164313768343736396165" + "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" + "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" + "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" + "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" + "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" + "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" + "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" + "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" + "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" + "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" + "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" + "72656164795f626f72726f77656431376833313462353261316263343662666534" + "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" + "72756374356669656c64313768333531353864666637643465616633354537675f" + "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" + "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" + "7465244754243977726974655f7374723137683831386234396537653639613236" + "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" + "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" + "742e2e577269746524475424313077726974655f63686172313768393437396266" + "363162306130356661314539305f5a4e34636f726533666d743557726974653977" + "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" + "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" + "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" + "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" + "706c61792475323024666f7224753230246933322447542433666d743137686365" + "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" + "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376834366435353230663839333131346633453d0861" + "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" + "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" + "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" + "73746564313768333336626637613134383830343463384541425f5a4e34636f72" + "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" + "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" + "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" + "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" + "653970616e69636b696e6731336173736572745f6661696c656431376832333236" + "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768653138373433383865303762666532354545595f5a4e36305f244c542473" + "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" + "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" + "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" + "2e2e446973706c61792447542433666d7431376863653432323661613166373236" + "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" + "242447542424475424313768313636646336316162303333346331654548495f5a" + "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" + "2454244754243130696e697469616c697a65313768376635633530386461396531" + "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" + "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" + "697465244754243977726974655f616c6c31376832346238323631303436316432" + "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" + "65723138427566577269746572244c54245724475424313477726974655f616c6c" + "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c54245424475424247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376837666163663562" + "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" + "726974655f6368617231376866306233626531656331396465356537454d305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376866383830" + "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" + "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" + "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" + "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" + "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" + "645f73686f72745f6261636b747261636531376834646333646534376432323032" + "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" + "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" + "37642424753764243137686531376133393737663839633131373845533b5f5a4e" + "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" + "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" + "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" + "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" + "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" + "735f737472313768656233663732326432323465343266384555066d656d636d70" + "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" + "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d627901057275737463" + "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" + "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" + "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" + "797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::string escrow_tx_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; - std::vector escrow_tx_json_data( - escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + // let sender = get_tx_account_id(); + // let owner = get_current_escrow_account_id(); + // let dest = get_current_escrow_destination(); + // let dest_balance = get_account_balance(dest); + // let escrow_data = get_current_escrow_data(); + // let ed_str = String::from_utf8(escrow_data).unwrap(); + // let threshold_balance = ed_str.parse::().unwrap(); + // let pl_time = host_lib::getParentLedgerTime(); + // let e_time = get_current_escrow_finish_after(); + // sender == owner && dest_balance <= threshold_balance && + // pl_time >= e_time + using namespace test::jtx; + struct TestHostFunctions : public HostFunctions { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", - "Data" : "02" - })"; + Env* env; + Bytes accountID; + Bytes data; + int clock_drift = 0; - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasmP4( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) + public: + explicit TestHostFunctions(Env* env, int cd = 0) + : env(env), clock_drift(cd) { - auto reValue = re.value(); - // std::cout << reValue.first << " " << - // reValue.second - // << std::endl; - BEAST_EXPECT(!reValue.first); - BEAST_EXPECT(reValue.second == "1"); + std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + accountID = Bytes{s.begin(), s.end()}; + std::string t = "10000"; + data = Bytes{t.begin(), t.end()}; } - } - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", - "Data" : "1" - })"; - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasmP4( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) + int32_t + getLedgerSqn() override { - auto reValue = re.value(); - // std::cout << reValue.first << " " << - // reValue.second - // << std::endl; - BEAST_EXPECT(reValue.first); - BEAST_EXPECT(reValue.second == "0"); + return (int32_t)env->current()->seq(); } - } - } - void - testEscrowWasmP5() - { - testcase("escrow wasm P5 test"); - auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + int32_t + getParentLedgerTime() override + { + return env->current() + ->parentCloseTime() + .time_since_epoch() + .count() + + clock_drift; + } - using namespace test::jtx; - struct TestLedgerDataProvider : public LedgerDataProvider - { - Env* env; + std::optional + getTxField(std::string const& fname) override + { + return accountID; + } - public: - TestLedgerDataProvider(Env* env) : env(env) + std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) override { + return data; } - int32_t - get_ledger_sqn() override + std::optional + getCurrentLedgerEntryField(std::string const& fname) override { - return (int32_t)env->current()->seq(); + if (fname == "Destination" || fname == "Account") + return accountID; + else if (fname == "Data") + return data; + else if (fname == "FinishAfter") + { + auto t = env->current() + ->parentCloseTime() + .time_since_epoch() + .count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return std::nullopt; } }; + Env env{*this}; - TestLedgerDataProvider ledgerDataProvider(&env); - std::string funcName("ready"); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); + + { + TestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re.value().result); + std::cout << "good case result " << re.value().result + << " cost: " << re.value().cost << std::endl; + } + } env.close(); env.close(); env.close(); env.close(); - re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - - void - testEscrowWasmP6() - { - testcase("escrow wasm P6 test"); - auto wasmHex = - "0061736d010000000109026000017f60017f0002150108686f73745f6c69620863" - "6f6e7374496e74000003030201010405017001010105030100100619037f014180" - "80c0000b7f00418080c0000b7f00418080c0000b073e05066d656d6f7279020007" - "6c6f6f70696e6700010c6c6f6f70696e675f686f737400020a5f5f646174615f65" - "6e6403010b5f5f686561705f6261736503020a1a0202000b150003401080808080" - "001a2000417f6a22000d000b0b0077046e616d65000e0d7761736d5f6c69622e77" - "61736d014c0300325f5a4e387761736d5f6c696238686f73745f6c696238636f6e" - "7374496e74313768643939653133366665323437376662344501076c6f6f70696e" - "67020c6c6f6f70696e675f686f7374071201000f5f5f737461636b5f706f696e74" - "657200550970726f64756365727302086c616e6775616765010452757374000c70" - "726f6365737365642d62790105727573746325312e38332e302d6e696768746c79" - "202863326637346333663920323032342d30392d30392900490f7461726765745f" - "6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c" - "6f62616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - - { - std::string funcName("looping"); - auto re = runEscrowWasm(wasm, funcName, 1000, 500); + { // fail because current time < escrow_finish_after time + TestHostFunctions nfs(&env); + nfs.clock_drift = -1; + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re.value().result); - std::cout << re.value().cost << std::endl; + BEAST_EXPECT(!re.value().result); + std::cout << "bad case (current time < escrow_finish_after " + "time) result " + << re.value().result << " cost: " << re.value().cost + << std::endl; } } - { - std::string funcName("looping_host"); - auto re = runEscrowWasm(wasm, funcName, 1000, 50); - BEAST_EXPECT(!re.has_value()); + + { // fail because trying to access nonexistent field + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + { + } + std::optional + getTxField(std::string const& fname) override + { + return std::nullopt; + } + }; + BadTestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (access nonexistent field) result " + << re.error() << std::endl; + } + + { // fail because trying to allocate more than MAX_PAGES memory + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + { + } + std::optional + getTxField(std::string const& fname) override + { + return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); + } + }; + BadTestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (more than MAX_PAGES) result " << re.error() + << std::endl; + } + + { // fail because recursion too deep + auto wasmHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(&env); + std::string funcName("recursive"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (deep recursion) result " << re.error() + << std::endl; } } @@ -4734,15 +2153,9 @@ struct Wasm_test : public beast::unit_test::suite run() override { using namespace test::jtx; - testWasmtimeLib(); - testEscrowWasmP0(); testBadWasm(); - testEscrowWasmP1(); - testEscrowWasmP2P3(); - testEscrowWasmP4(); - testEscrowWasmP5(); - testEscrowWasmP6(); + testEscrowWasmDN1(); } }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp new file mode 100644 index 00000000000..9ecbe22f31d --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include "xrpld/app/misc/WasmHostFuncImpl.h" + +#include "xrpl/protocol/digest.h" + +namespace ripple { + +int32_t +WasmHostFunctionsImpl::getLedgerSqn() +{ + return ctx.view().seq(); +} + +int32_t +WasmHostFunctionsImpl::getParentLedgerTime() +{ + return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try +} + +// TODO remove json code after deciding encoding scheme + +std::optional +WasmHostFunctionsImpl::getTxField(const std::string& fname) +{ + auto js = ctx.tx.getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +std::optional +WasmHostFunctionsImpl::getLedgerEntryField( + int32_t type, + Bytes const& kdata, + const std::string& fname) +{ + auto kl = [&]() -> std::optional { + if (type == ltACCOUNT_ROOT) + { + std::string s(kdata.begin(), kdata.end()); + auto const account = parseBase58(s); + if (account) + { + return keylet::account(account.value()); + } + } + return std::nullopt; + }(); + + if (!kl || !ctx.view().exists(kl.value())) + return std::nullopt; + + auto js = ctx.view().read(kl.value())->getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +std::optional +WasmHostFunctionsImpl::getCurrentLedgerEntryField(const std::string& fname) +{ + if (!ctx.view().exists(leKey)) + return std::nullopt; + + auto js = ctx.view().read(leKey)->getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +bool +WasmHostFunctionsImpl::updateData(const Bytes& data) +{ + if (!ctx.view().exists(leKey)) + return false; + auto sle = ctx.view().peek(leKey); + sle->setFieldVL(sfData, data); + ctx.view().update(sle); + return true; +} + +Hash +WasmHostFunctionsImpl::computeSha512HalfHash(const Bytes& data) +{ + auto const hash = sha512Half(data); + return uint256::fromVoid(hash.data()); +} +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h new file mode 100644 index 00000000000..a311073d7b6 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED +#define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED + +#include +#include + +#include "xrpl/basics/base_uint.h" +#include "xrpld/app/misc/WasmVM.h" +#include "xrpld/app/tx/detail/ApplyContext.h" +#include + +namespace ripple { +class WasmHostFunctionsImpl : public HostFunctions +{ +public: + WasmHostFunctionsImpl(ApplyContext& ctx, Keylet leKey) + : ctx(ctx), leKey(leKey) + { + } + + int32_t + getLedgerSqn() override; + + int32_t + getParentLedgerTime() override; + + std::optional + getTxField(std::string const& fname) override; + + std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) override; + + std::optional + getCurrentLedgerEntryField(std::string const& fname) override; + + bool + updateData(Bytes const& data) override; + + Hash + computeSha512HalfHash(Bytes const& data) override; + +private: + ApplyContext& ctx; + Keylet leKey; +}; + +} // namespace ripple +#endif // RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index d94135646b0..22ac65479fb 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -19,496 +19,275 @@ #include -// WasmVM::WasmVM(beast::Journal j) -// : j_(j) -//{ -// } +#include "xrpl/protocol/AccountID.h" +#include "xrpl/protocol/LedgerFormats.h" namespace ripple { -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t input) + +WasmEdge_Result +getLedgerSqn( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; - WasmEdge_Value Returns[1]; - WasmEdge_String FuncName = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( - VMCxt, - wasmCode.data(), - wasmCode.size(), - FuncName, - Params, - 1, - Returns, - 1); - - bool ok = WasmEdge_ResultOK(Res); - bool re = false; - if (ok) - { - auto result = WasmEdge_ValueGetI32(Returns[0]); - // printf("Get the result: %d\n", result); - if (result != 0) - re = true; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); - } + out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); + return WasmEdge_Result_Success; +} - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); +WasmEdge_Result +getParentLedgerTime( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) +{ + out[0] = + WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); + return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID) +Expected +getParameterData( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) { - auto dataLen = (int32_t)accountID.size(); - // printf("accountID size: %d\n", dataLen); - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - WasmEdge_Result allocRes = WasmEdge_VMRunWasmFromBuffer( - VMCxt, - wasmCode.data(), - wasmCode.size(), - allocFunc, - allocParams, - 1, - allocReturns, - 1); - - bool ok = WasmEdge_ResultOK(allocRes); - bool re = false; - if (ok) + auto fnameOffset = (uint32_t)WasmEdge_ValueGetI32(in[index]); + auto fnameLen = (uint32_t)WasmEdge_ValueGetI32(in[index + 1]); + Bytes fname(fnameLen, char{0}); + WasmEdge_MemoryInstanceContext* mem = + WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + WasmEdge_Result Res = WasmEdge_MemoryInstanceGetData( + mem, (uint8_t*)(fname.data()), fnameOffset, fnameLen); + if (WasmEdge_ResultOK(Res)) { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("Alloc pointer: %d\n", pointer); - - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, accountID.data(), pointer, dataLen); - - ok = WasmEdge_ResultOK(setRes); - if (ok) - { - // printf("Set data ok\n"); - - WasmEdge_Value params[2] = { - WasmEdge_ValueGenI32(pointer), WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = - WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 2, returns, 1); - - ok = WasmEdge_ResultOK(funcRes); - if (ok) - { - // printf("func ok\n"); - re = (WasmEdge_ValueGetI32(returns[0]) == 1); - } - else - { - printf( - "Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } - } - else - { - printf( - "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); - } + return fname; } else { - printf( - "Alloc error message: %s\n", WasmEdge_ResultGetMessage(allocRes)); + return Unexpected(Res); } - - WasmEdge_VMDelete(VMCxt); - // TODO free everything - // WasmEdge_StringDelete(FuncName); - if (ok) - { - // printf("runEscrowWasm ok, result %d\n", re); - return re; - } - else - return Unexpected(tecFAILED_PROCESSING); } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data) +Expected +getFieldName( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) + auto dataRes = getParameterData(fm, in, index); + if (dataRes) { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { - auto dataLen = (int32_t)data.size(); - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - - WasmEdge_Result allocRes = WasmEdge_VMExecute( - VMCxt, allocFunc, allocParams, 1, allocReturns, 1); - - if (WasmEdge_ResultOK(allocRes)) - { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("alloc ptr %d, len %d\n", pointer, dataLen); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, data.data(), pointer, dataLen); - if (WasmEdge_ResultOK(setRes)) - { - return pointer; - } - } - - return 0; - }; - - auto tx_ptr = wasmAlloc(escrow_tx_json_data); - auto lo_ptr = wasmAlloc(escrow_lo_json_data); - if (tx_ptr == 0 || lo_ptr == 0) - { - printf("data error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto txLen = (int32_t)escrow_tx_json_data.size(); - auto loLen = (int32_t)escrow_lo_json_data.size(); - - WasmEdge_Value params[4] = { - WasmEdge_ValueGenI32(tx_ptr), - WasmEdge_ValueGenI32(txLen), - WasmEdge_ValueGenI32(lo_ptr), - WasmEdge_ValueGenI32(loLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); - - if (WasmEdge_ResultOK(funcRes)) - { - // printf("func ok\n"); - return WasmEdge_ValueGetI32(returns[0]) == 1; + return std::string(dataRes.value().begin(), dataRes->end()); } else { - printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - return Unexpected(tecFAILED_PROCESSING); + return Unexpected(dataRes.error()); } } -Expected, TER> -runEscrowWasmP4( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data) +Expected +setData(const WasmEdge_CallingFrameContext* fm, Bytes const& data) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { - auto dataLen = (int32_t)data.size(); - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; + auto alloc = [fm](int32_t dataLen) -> int32_t { WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - - WasmEdge_Result allocRes = WasmEdge_VMExecute( - VMCxt, allocFunc, allocParams, 1, allocReturns, 1); - - if (WasmEdge_ResultOK(allocRes)) + auto mod = WasmEdge_CallingFrameGetModuleInstance(fm); + WasmEdge_FunctionInstanceContext* func = + WasmEdge_ModuleInstanceFindFunction(mod, allocFunc); + WasmEdge_Value allocParams[1] = { + WasmEdge_ValueGenI32(dataLen)}; // 4 for prepend the data size + WasmEdge_Value allocReturns[1]; + auto executor = WasmEdge_CallingFrameGetExecutor(fm); + auto res = WasmEdge_ExecutorInvoke( + executor, func, allocParams, 1, allocReturns, 1); + if (WasmEdge_ResultOK(res)) { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("alloc ptr %d, len %d\n", pointer, dataLen); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, data.data(), pointer, dataLen); - if (WasmEdge_ResultOK(setRes)) - { - return pointer; - } + return WasmEdge_ValueGetI32(allocReturns[0]); + } + else + { + return 0; } - - return 0; }; - auto tx_ptr = wasmAlloc(escrow_tx_json_data); - auto lo_ptr = wasmAlloc(escrow_lo_json_data); - if (tx_ptr == 0 || lo_ptr == 0) - { - printf("data error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto txLen = (int32_t)escrow_tx_json_data.size(); - auto loLen = (int32_t)escrow_lo_json_data.size(); - - WasmEdge_Value params[4] = { - WasmEdge_ValueGenI32(tx_ptr), - WasmEdge_ValueGenI32(txLen), - WasmEdge_ValueGenI32(lo_ptr), - WasmEdge_ValueGenI32(loLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); - - if (WasmEdge_ResultOK(funcRes)) + auto dataLen = (int32_t)data.size(); + auto dataPtr = alloc(dataLen); + auto retPtr = alloc(8); + if (dataPtr && retPtr) { - auto pointer = WasmEdge_ValueGetI32(returns[0]); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - uint8_t buff[9]; - WasmEdge_Result getRes = - WasmEdge_MemoryInstanceGetData(mi, buff, pointer, 9); - if (!WasmEdge_ResultOK(getRes)) + auto mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + auto res = + WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); + if (WasmEdge_ResultOK(res)) { - printf( - "re mem get message: %s\n", WasmEdge_ResultGetMessage(getRes)); - return Unexpected(tecFAILED_PROCESSING); - } - auto flag = buff[0]; + unsigned char intBuf[8]; // little-endian + for (size_t i = 0; i < 4; ++i) + { + intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; + } + for (size_t i = 0; i < 4; ++i) + { + intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; + } - auto leToInt32 = [](const uint8_t* d) -> uint32_t { - uint32_t r = 0; - for (int i = 0; i < 4; ++i) + res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); + if (WasmEdge_ResultOK(res)) { - r |= static_cast(d[i]) << (i * 8); - // printf("leToInt32 %d\n", r); + return WasmEdge_ValueGenI32(retPtr); } - return r; - }; - auto ret_pointer = - leToInt32(reinterpret_cast(&buff[1])); - auto ret_len = leToInt32(reinterpret_cast(&buff[5])); - // printf("re flag %d, ptr %d, len %d\n", flag, ret_pointer, - // ret_len); - - std::vector buff2(ret_len); - getRes = WasmEdge_MemoryInstanceGetData( - mi, buff2.data(), ret_pointer, ret_len); - if (!WasmEdge_ResultOK(getRes)) - { - printf( - "re 2 mem get message: %s\n", - WasmEdge_ResultGetMessage(getRes)); - return Unexpected(tecFAILED_PROCESSING); } + } + return Unexpected(WasmEdge_Result_Fail); +} - std::string newData(buff2.begin(), buff2.end()); +WasmEdge_Result +getTxField( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getFieldName(fm, in, 0); + if (!fname) + return fname.error(); - // free - WasmEdge_String freeFunc = WasmEdge_StringCreateByCString("deallocate"); - WasmEdge_Value freeParams[2] = { - WasmEdge_ValueGenI32(ret_pointer), WasmEdge_ValueGenI32(ret_len)}; - WasmEdge_Value freeReturns[0]; - WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); - // free pointer too, with len = 9 too - freeParams[0] = WasmEdge_ValueGenI32(pointer); - freeParams[1] = WasmEdge_ValueGenI32(9); - WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + auto fieldData = ((HostFunctions*)data)->getTxField(fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; - return std::pair(flag == 1, newData); - } - else - { - printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - return Unexpected(tecFAILED_PROCESSING); - } + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return WasmEdge_Result_Success; } WasmEdge_Result -get_ledger_sqn( +getLedgerEntryField( void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value* In, - WasmEdge_Value* Out) + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - Out[0] = - WasmEdge_ValueGenI32(((LedgerDataProvider*)data)->get_ledger_sqn()); + auto type = WasmEdge_ValueGetI32(in[0]); + auto lkData = getParameterData(fm, in, 1); + if (!lkData) + return lkData.error(); + + auto fname = getFieldName(fm, in, 3); + if (!fname) + return fname.error(); + + auto fieldData = + ((HostFunctions*)data) + ->getLedgerEntryField(type, lkData.value(), fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - LedgerDataProvider* ledgerDataProvider) +WasmEdge_Result +getCurrentLedgerEntryField( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - { // register host function - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate( - HostFType, get_ledger_sqn, ledgerDataProvider, 0); - WasmEdge_FunctionTypeDelete(HostFType); - - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); - - WasmEdge_String HostFuncName = - WasmEdge_StringCreateByCString("get_ledger_sqn"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); + auto fname = getFieldName(fm, in, 0); + if (!fname) + return fname.error(); - WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); - if (!WasmEdge_ResultOK(regRe)) - { - printf("host func reg error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - } - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } + auto fieldData = + ((HostFunctions*)data)->getCurrentLedgerEntryField(fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; - WasmEdge_Value funcReturns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return WasmEdge_Result_Success; +} - bool ok = WasmEdge_ResultOK(funcRes); - bool re = false; - if (ok) - { - auto result = WasmEdge_ValueGetI32(funcReturns[0]); - if (result != 0) - re = true; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } +WasmEdge_Result +updateData( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getParameterData(fm, in, 0); + if (!fname) + return fname.error(); - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(func); - if (ok) - return re; + if (((HostFunctions*)data)->updateData(fname.value())) + return WasmEdge_Result_Success; else - return Unexpected(tecFAILED_PROCESSING); + return WasmEdge_Result_Fail; } WasmEdge_Result -constInt( +computeSha512HalfHash( void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value* In, - WasmEdge_Value* Out) + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getParameterData(fm, in, 0); + if (!fname) + return fname.error(); + + auto hres = ((HostFunctions*)data)->computeSha512HalfHash(fname.value()); + Bytes digest{hres.begin(), hres.end()}; + auto pointer = setData(fm, digest); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32(32); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +print( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - Out[0] = WasmEdge_ValueGenI32(5); + auto f = getParameterData(fm, in, 0); + if (!f) + return f.error(); + std::string s(f.value().begin(), f.value().end()); + std::cout << s << std::endl; return WasmEdge_Result_Success; } -Expected +Expected runEscrowWasm( std::vector const& wasmCode, std::string const& funcName, - int32_t gasLimit, - int32_t input) + HostFunctions* hfs, + uint64_t gasLimit) { + // WasmEdge_LogOff(); + // TODO deletes + // create VM and set cost limit WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); + WasmEdge_ConfigureSetMaxMemoryPage(conf, MAX_PAGES); WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); WasmEdge_StatisticsContext* StatCxt = @@ -516,36 +295,168 @@ runEscrowWasm( WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); { // register host function - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate(HostFType, constInt, nullptr, 100); - WasmEdge_FunctionTypeDelete(HostFType); - - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); - - WasmEdge_String HostFuncName = - WasmEdge_StringCreateByCString("constInt"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); + // module + WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* hostMod = + WasmEdge_ModuleInstanceCreate(libName); + WasmEdge_StringDelete(libName); + // getLedgerSqn + { + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getLedgerSqn, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getLedgerSqn"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + // WasmEdge_FunctionInstanceDelete(hostFunc); + } + + // getParentLedgerTime + { + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getParentLedgerTime, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getParentLedgerTime"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + // WasmEdge_FunctionInstanceDelete(hostFunc); + } + + // getTxField + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getTxField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getTxField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // getLedgerEntryField + { + WasmEdge_ValType inputList[5] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 5, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getLedgerEntryField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getLedgerEntryField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // getCurrentLedgerEntryField + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getCurrentLedgerEntryField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getCurrentLedgerEntryField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // updateData + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, updateData, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("updateData"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // computeSha512HalfHash + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, computeSha512HalfHash, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("computeSha512HalfHash"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // print + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate(hostFuncType, print, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = WasmEdge_StringCreateByCString("print"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + WasmEdge_VMRegisterModuleFromImport(VMCxt, hostMod); if (!WasmEdge_ResultOK(regRe)) { printf("host func reg error\n"); return Unexpected(tecFAILED_PROCESSING); } } + WasmEdge_Result loadRes = WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); if (!WasmEdge_ResultOK(loadRes)) { - printf("load error\n"); + printf("load error, %p, %d\n", wasmCode.data(), wasmCode.size()); return Unexpected(tecFAILED_PROCESSING); } WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); @@ -560,20 +471,23 @@ runEscrowWasm( printf("instantiate error\n"); return Unexpected(tecFAILED_PROCESSING); } - + WasmEdge_Value funcReturns[1]; WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, Params, 1, NULL, 0); + WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); bool ok = WasmEdge_ResultOK(funcRes); - EscrowResultP6 re; + EscrowResult re; if (ok) { auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); re.cost = WasmEdge_StatisticsGetTotalCost(sc); // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount - re.result = true; + auto result = WasmEdge_ValueGetI32(funcReturns[0]); + if (result != 0) + re.result = true; + else + re.result = false; } else { @@ -588,5 +502,4 @@ runEscrowWasm( else return Unexpected(tecFAILED_PROCESSING); } - } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 37988a97e3a..d1e14e4246e 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -20,78 +20,81 @@ #define RIPPLE_APP_MISC_WASMVM_H_INLCUDED #include -// #include #include +#include "xrpl/basics/base_uint.h" #include namespace ripple { +const uint32_t MAX_PAGES = 128; // 8MB = 64KB*128 -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t input); - -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID); - -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data); +typedef std::vector Bytes; +typedef ripple::uint256 Hash; -Expected, TER> -runEscrowWasmP4( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data); +template +struct WasmResult +{ + T result; + uint64_t cost; +}; +typedef WasmResult EscrowResult; -struct LedgerDataProvider +struct HostFunctions { virtual int32_t - get_ledger_sqn() + getLedgerSqn() { return 1; } - virtual ~LedgerDataProvider() = default; -}; + virtual int32_t + getParentLedgerTime() + { + return 1; + } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - LedgerDataProvider* ledgerDataProvider); + virtual std::optional + getTxField(std::string const& fname) + { + return Bytes{}; + } -struct EscrowResultP6 -{ - bool result; - int32_t cost; + virtual std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) + { + return Bytes{}; + } + + virtual std::optional + getCurrentLedgerEntryField(std::string const& fname) + { + return Bytes{}; + } + + virtual bool + updateData(Bytes const& data) + { + return true; + } + + virtual Hash + computeSha512HalfHash(Bytes const& data) + { + return Hash{}; + } + + virtual ~HostFunctions() = default; }; -Expected +Expected runEscrowWasm( std::vector const& wasmCode, std::string const& funcName, - int32_t gasLimit, - int32_t input); + HostFunctions* hfs, + uint64_t gasLimit); } // namespace ripple #endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED - -// class WasmVM final -//{ -// public: -// explicit WasmVM(beast::Journal j); -// ~WasmVM() = default; -// -// private: -// beast::Journal j_; -// }; \ No newline at end of file diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 165a6df5f43..89eace193a3 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -434,22 +435,6 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } -struct EscrowLedgerDataProvider : public LedgerDataProvider -{ - ApplyView& view_; - -public: - EscrowLedgerDataProvider(ApplyView& view) : view_(view) - { - } - - int32_t - get_ledger_sqn() override - { - return (int32_t)view_.seq(); - } -}; - TER EscrowFinish::doApply() { @@ -601,14 +586,15 @@ EscrowFinish::doApply() std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); - EscrowLedgerDataProvider ledgerDataProvider(ctx_.view()); + WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, 100000); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { - auto reValue = re.value(); - JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue); + auto reValue = re.value().result; + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) + << ", cost: " << re.value().cost; if (!reValue) { // ctx_.view().update(slep); From 177cdaf550c56f1e8a819ac84efbde68c6a5cfb1 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Mar 2025 10:55:33 -0400 Subject: [PATCH 04/73] Connect votable gas limit into VM (#5360) * [WIP] add gas limit * [WIP] host function escrow tests * finish test * uncomment out tests --- src/test/app/Escrow_test.cpp | 1190 +++++++++++++++++++++++ src/test/jtx/TestHelpers.h | 26 + src/xrpld/app/misc/AMMUtils.h | 6 +- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 4 +- src/xrpld/app/misc/WasmVM.h | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 3 +- 6 files changed, 1224 insertions(+), 7 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 0ac8bba8a0e..6c0e32179e8 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2022,6 +2022,1195 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testAllHostFunctions() + { + testcase("Test all host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: figure out how to make this a fixture in a separate file + auto wasmHex = + "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" + "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" + "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" + "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" + "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" + "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" + "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" + "745f6c696213676574506172656e744c656467657254696d650005035453020603" + "070101080901010a01000202010102080008000b0c030101010104050802030303" + "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" + "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" + "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" + "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" + "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" + "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" + "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" + "14200142808080801037020c200141033a00382001412036022820014100360234" + "2001418080c08000360230200141003602202001410036021820012001410c6a36" + "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" + "808080000d00200128020c21002001280210220220012802141080808080000240" + "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" + "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" + "027f017e037f23808080800041306b220324808080800041272104024002402000" + "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" + "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" + "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" + "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" + "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" + "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" + "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" + "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" + "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" + "41096a20046a412720046b108c808080002104200341306a24808080800020040b" + "6c01027f024002402000417c6a2802002202417871220341044108200241037122" + "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" + "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" + "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" + "2005200136020c2005200036020820052003360214200520023602102005410236" + "021c200541b884c08000360218200542023702242005418180808000ad42208620" + "0541106aad843703382005418280808000ad422086200541086aad843703302005" + "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" + "0041c0006b220224808080800002400240200028020022032d00000d0020012802" + "14419582c080004104200128021828020c118080808000808080800021000c010b" + "4101210020012802142204419982c0800041042001280218220528020c22061180" + "8080800080808080000d00200341016a210302400240200128021c22074104710d" + "0041012100200441f184c080004101200611808080800080808080000d02200320" + "01108a80808000450d010c020b200441f284c08000410220061180808080008080" + "8080000d0141012100200241013a001b200220053602102002200436020c200220" + "07360238200241c884c08000360234200220012d00203a003c2002200128021036" + "022c200220012902083702242002200129020037021c20022002411b6a36021420" + "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" + "80004102200228023428020c11808080800080808080000d010b2001280214419c" + "97c080004101200128021828020c118080808000808080800021000b200241c000" + "6a24808080800020000be90201057f2380808080004180016b2202248080808000" + "0240024002400240200128021c22034110710d0020034120710d01200031000041" + "01200110868080800021000c030b20002d0000210041ff00210303402002200322" + "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" + "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" + "0041ff00210303402002200322046a22052000410f712203413072200341376a20" + "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" + "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" + "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" + "02402004418101490d002004418001418885c08000108b80808000000b20014101" + "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" + "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" + "20032000360200200320013602042003410236020c200341d887c0800036020820" + "0342023702142003418380808000ad4220862204200341046aad84370328200320" + "042003ad843703202003200341206a360210200341086a200210aa80808000000b" + "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" + "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" + "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" + "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" + "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" + "2802000d000240200028021422012000280218220920082002200310ad80808000" + "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" + "0240024002402000280204220120064b0d00200028021422012000280218220920" + "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" + "2000413036021020002d0020210b4101210c200041013a00202000280214220920" + "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" + "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" + "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" + "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" + "1180808080008080808000210c0c010b200120066b210702400240024020002d00" + "2022010e0402000100020b20072101410021070c010b2007410176210120074101" + "6a41017621070b200141016a210120002802102106200028021821092000280214" + "210a024003402001417f6a2201450d01200a200620092802101181808080008080" + "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" + "200a20042005200928020c11808080800080808080000d00410021010340024020" + "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" + "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" + "0041106b220224808080800020022000280200220041046a36020c200141e181c0" + "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" + "418580808000108f808080002100200241106a24808080800020000be70201057f" + "2380808080004180016b22022480808080000240024002400240200128021c2203" + "4110710d0020034120710d0120003502004101200110868080800021000c030b20" + "00280200210041ff00210303402002200322046a22052000410f71220341307220" + "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" + "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" + "004110492106200041047621002006450d000b02402004418101490d0020044180" + "01418885c08000108b80808000000b20014101419885c080004102200541810120" + "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" + "85c08000108b80808000000b20014101419885c080004102200541810120044101" + "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" + "8080800041106b220b248080808000200028021420012002200028021828020c11" + "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" + "200b41086a200320042005200610b680808000200720082009200a10b680808000" + "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" + "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" + "0028021828020c118080808000808080800021000c010b200028021441ee84c080" + "004101200028021828020c118080808000808080800021000b200b41106a248080" + "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" + "23808080800041306b2203248080808000200341033a002c2003412036021c4100" + "210420034100360228200320013602242003200036022020034100360214200341" + "0036020c02400240024002400240200228021022050d00200228020c2200450d01" + "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" + "280200210003400240200041046a2802002207450d002003280220200028020020" + "07200328022428020c11808080800080808080000d040b20012802002003410c6a" + "200128020411818080800080808080000d03200141086a2101200041086a210020" + "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" + "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" + "40200041046a2802002201450d0020032802202000280200200120032802242802" + "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" + "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" + "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" + "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" + "0b0b200320073602102003200b36020c200141046a280200210702400240024020" + "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" + "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a200128020411818080800080808080000d02" + "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" + "280220200228020020044103746a22012802002001280204200328022428020c11" + "80808080008080808000450d010b410121010c010b410021010b200341306a2480" + "8080800020010b1e01017f024020002802002201450d0020002802042001108780" + "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" + "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" + "808080000be30201027f23808080800041106b2202248080808000024002400240" + "02402001418001490d002002410036020c2001418010490d010240200141808004" + "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" + "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" + "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" + "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" + "032000280200470d0020001096808080000b2000200341016a3602082000280204" + "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" + "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" + "20032001109780808000200028020821030b200028020420036a2002410c6a2001" + "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "01109c80808000024020012802082200418180808078460d002000200128020c10" + "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" + "03248080808000200341086a200020012002109c80808000024020032802082202" + "418180808078460d002002200328020c109d80808000000b200341106a24808080" + "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" + "109780808000200028020821030b200028020420036a2001200210d6808080001a" + "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" + "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" + "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" + "200136020820002002410120021b36020420002002453602000b800601057f0240" + "024002402000417c6a22032802002204417871220541044108200441037122061b" + "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" + "712002410b491b210102400240024020060d002001418002490d01200520014104" + "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" + "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" + "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" + "01490d042006200410a780808000200520016b22024110490d0120032001200328" + "020041017172410272360200200720016a22012002410372360204200720056a22" + "0520052802044101723602042001200210a88080800020000f0b200520016b2202" + "410f4d0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210a88080800020000f0b200320" + "05200328020041017172410272360200200720056a220220022802044101723602" + "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" + "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" + "020441017236020441002102410021010c010b2003200120044101717241027236" + "0200200720016a22012002410172360204200720056a2205200236020020052005" + "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" + "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" + "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" + "2201200220012002491b10d6808080002102200010a580808000200221000b2000" + "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" + "0010a680808000000b20032001200441017172410272360200200720016a220220" + "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" + "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" + "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" + "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" + "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" + "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" + "00411920044101766b2004411f461b742107410021060340024020052205280204" + "41787122082002490d00200820026b220820014f0d00200821012005210620080d" + "004100210120052106200521000c040b200528021422082000200820052007411d" + "764104716a41106a2802002205471b200020081b2100200741017421072005450d" + "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" + "491b22024103762201762200410371450d00024002402000417f7341017120016a" + "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" + "2206460d002006200136020c200120063602080c010b41002005417e2007777136" + "0298a2c080000b20022000410372360204200220006a2200200028020441017236" + "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" + "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" + "020441787120026b21012006210503400240200628021022000d00200628021422" + "000d0020052802182104024002400240200528020c22002005470d002005411441" + "10200528021422001b6a28020022060d01410021000c020b200528020822062000" + "36020c200020063602080c010b200541146a200541106a20001b21070340200721" + "082006220041146a200041106a200028021422061b210720004114411020061b6a" + "28020022060d000b200841003602000b2004450d040240200528021c4102744180" + "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" + "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" + "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" + "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" + "0020017441022001742200410020006b727168220841037422014190a0c080006a" + "220620014198a0c080006a28020022002802082207460d002007200636020c2006" + "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" + "360204200020026a2207200120026b2206410172360204200020016a2006360200" + "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" + "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" + "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" + "0120023602082005200236020c2002200136020c200220053602080b4100200736" + "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" + "20052802102206450d0020002006360210200620003602180b2005280214220645" + "0d0020002006360214200620003602180b02400240024020014110490d00200520" + "02410372360204200520026a22022001410172360204200220016a200136020041" + "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" + "c080002100024002404100280298a2c08000220841012007410376742207710d00" + "41002008200772360298a2c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200520012002" + "6a2200410372360204200520006a220020002802044101723602040c010b410020" + "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" + "720d004100210641022004742200410020006b722003712200450d032000684102" + "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" + "71220520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b2106200120082007" + "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" + "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" + "002006470d00200641144110200628021422001b6a28020022050d01410021000c" + "020b20062802082205200036020c200020053602080c010b200641146a20064110" + "6a20001b21070340200721082005220041146a200041106a200028021422051b21" + "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" + "40200628021c41027441809fc080006a22052802002006460d0020044110411420" + "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" + "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" + "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" + "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" + "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" + "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" + "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" + "a0c080002100034020002802002206200028020422076a2005460d022000280208" + "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" + "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" + "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" + "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" + "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" + "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" + "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" + "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" + "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" + "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" + "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" + "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" + "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" + "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" + "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" + "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" + "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" + "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" + "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" + "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" + "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" + "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" + "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" + "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" + "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" + "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" + "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" + "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" + "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" + "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" + "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" + "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" + "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" + "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" + "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" + "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" + "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" + "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" + "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" + "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" + "360204410041808080013602b8a2c080002001200641606a41787141786a220020" + "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" + "290288a0c080003702002007200937020841002008360284a0c080004100200536" + "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" + "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" + "0720072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010d0808080000c080b200041f8017141" + "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" + "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" + "0620013602082000200136020c2001200636020c200120003602080c070b200020" + "053602002000200028020420086a360204200520024103723602042007410f6a41" + "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" + "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" + "417871220610a780808000200620026a2102200120066a220128020421060b2001" + "2006417e7136020420002002410172360204200020026a20023602000240200241" + "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" + "024002404100280298a2c08000220641012002410376742202710d004100200620" + "0272360298a2c08000200121020c010b200128020821020b200120003602082002" + "200036020c2000200136020c200020023602080c050b4100200020026b22013602" + "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" + "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" + "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" + "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" + "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" + "800020052006410172360204200120006a2006360200200120024103723602040b" + "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" + "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" + "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" + "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" + "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" + "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" + "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" + "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" + "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" + "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" + "4020062802102205450d0020002005360210200520003602180b20062802142205" + "450d0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a20013602000240" + "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" + "6a2102024002404100280298a2c08000220541012001410376742201710d004100" + "2005200172360298a2c08000200221010c010b200228020821010b200220003602" + "082001200036020c2000200236020c200020013602080c010b2006200120026a22" + "00410372360204200620006a220020002802044101723602040b200641086a0be9" + "0101037f23808080800041206b2204248080808000024002400240200220036a22" + "0320024f0d00410021020c010b4100210220012802002205410174220620032006" + "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" + "0c010b2004200536021c20042001280204360214410121020b2004200236021820" + "0441086a2003200441146a109980808000024020042802080d00200428020c2102" + "200120033602002001200236020441818080807821020c010b2004280210210120" + "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" + "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" + "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" + "0041052000418680808000419082c0800041052002410c6a418780808000108f80" + "8080002100200241106a24808080800020000be00301097f23808080800041c000" + "6b2202248080808000200028020821032000280204210441012105200128021441" + "b083c080004101200128021828020c118080808000808080800021000240200345" + "0d0041002106034020062107410121062000410171210841012100024020080d00" + "02400240200128021c22084104710d002007410171450d01410121002001280214" + "41e784c080004102200128021828020c1180808080008080808000450d010c020b" + "200128021821092001280214210a024020074101710d0041012100200a41888bc0" + "80004101200928020c11808080800080808080000d020b200241013a001b200220" + "093602102002200a36020c20022008360238200241c884c0800036023420022001" + "2d00203a003c2002200128021036022c2002200129020837022420022001290200" + "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" + "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" + "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" + "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" + "4101200128021828020c118080808000808080800021050b200241c0006a248080" + "80800020050b4a01017f23808080800041106b2202248080808000200220003602" + "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" + "00200241106a24808080800020000b3d00200128021420002802002d0000410274" + "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" + "808080800080808080000be70101017f23808080800041106b2205248080808000" + "20002802142001410d200028021828020c11808080800080808080002101200541" + "003a000d200520013a000c20052000360208200541086a200241042003200410b6" + "80808000210320052d000d220120052d000c2204722100024020014101470d0020" + "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" + "004102200028021828020c118080808000808080800021000c010b200028021441" + "ee84c080004101200028021828020c118080808000808080800021000b20054110" + "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" + "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" + "02400240024002400240024002404107109b808080002201450d00200141036a41" + "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" + "800022022800042103200228000021042002410810878080800020014107108780" + "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" + "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" + "002202280004210520022800002106200241081087808080002001410710878080" + "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" + "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" + "2202280004210720022800002108200241081087808080002001410b1087808080" + "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" + "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" + "108380808000220928000421022009280000210a20094108108780808000200041" + "186a200a200210a48080800002400240024020002d00184101460d002000290320" + "210b02402002450d00200a20021087808080000b20014107108780808000410021" + "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" + "0000200141041082808080002202280000210c2002280004210a20024108108780" + "80800020014104108780808000024002400240200a4100480d000240200a0d0041" + "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" + "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" + "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" + "026b210f4100210103400240024002400240200220016a2d00002209c022104100" + "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" + "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" + "808080202111428080808010211202400240024002400240024002400240024002" + "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" + "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" + "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" + "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" + "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" + "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" + "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" + "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" + "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" + "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" + "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" + "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" + "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" + "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" + "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" + "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" + "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" + "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" + "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" + "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" + "41186a20142011a710a48080800020002d00184101460d01200029032021124100" + "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" + "201641076a41002800878cc08000360000201641002900808cc080003700002016" + "410b10828080800022012800002117200128000421132001410810878080800002" + "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" + "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" + "09201741016a210220134109490d024100210103402009450d0a20022d00004150" + "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" + "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" + "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" + "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" + "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" + "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" + "20090d040b410021010c050b201321092017210220134108490d020b4100210103" + "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" + "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" + "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" + "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" + "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" + "0b1087808080002004200310808080800020062005108080808000200820071080" + "80808000200c200a10808080800020004100360214200042808080801037020c20" + "0041033a003820004120360228200041003602342000418080c080003602302000" + "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" + "1086808080000d00200028020c2102200028021022092000280214108080808000" + "02402002450d00200920021087808080000b201510858080800020011085808080" + "0041002102024020032005470d0020042006200310d58080800045200b20125871" + "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" + "00200c200a1087808080000b02402007450d00200820071087808080000b024020" + "05450d00200620051087808080000b02402003450d00200420031087808080000b" + "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" + "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" + "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" + "80800041106b220324808080800002400240024002400240024002400240024002" + "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" + "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" + "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" + "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" + "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" + "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" + "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" + "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" + "0121010c010b20002005370308410021010b200020013a0000200341106a248080" + "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" + "030240024020024101710d002002410271450d012001280200220220006a210002" + "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" + "410020003602a0a2c0800020032003280204417e71360204200120004101723602" + "04200320003602000f0b2001200210a7808080000b024002400240024002400240" + "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" + "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" + "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" + "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" + "20003602000b2000418002490d022001200010d080808000410021014100410028" + "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" + "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" + "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" + "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" + "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" + "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" + "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b200128020821010c" + "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" + "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" + "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" + "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" + "0320013602082000200136020c2001200336020c200120003602080f0b02404100" + "280288a0c080002201450d00410021020340200241016a2102200128020822010d" + "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" + "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" + "02410036021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110aa80808000000b820301047f200028020c" + "21020240024002402001418002490d002000280218210302400240024020022000" + "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" + "002802082201200236020c200220013602080c010b200041146a200041106a2002" + "1b21040340200421052001220241146a200241106a200228021422011b21042002" + "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" + "28021c41027441809fc080006a22012802002000460d0020034110411420032802" + "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" + "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" + "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" + "102201450d0020022001360210200120023602180b20002802142201450d002002" + "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" + "28020422034101710d002003410271450d012000280200220320016a2101024020" + "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" + "20013602a0a2c0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a7808080000b02400240024002402002280204" + "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" + "0d0320022003417871220310a7808080002000200320016a220141017236020420" + "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" + "000f0b20022003417e7136020420002001410172360204200020016a2001360200" + "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" + "80006a2102024002404100280298a2c08000220341012001410376742201710d00" + "41002003200172360298a2c08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" + "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" + "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" + "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" + "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" + "4701017f23808080800041206b2200248080808000200041003602182000410136" + "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" + "80808000000b5601017f23808080800041206b2202248080808000200241106a20" + "0041106a290200370300200241086a200041086a290200370300200241013b011c" + "2002200136021820022000290200370300200210ac80808000000b110020003502" + "00410120011086808080000b5d01027f23808080800041206b2201248080808000" + "20002802182102200141106a200041106a290200370300200141086a200041086a" + "2902003703002001200036021c2001200236021820012000290200370300200110" + "d180808000000b490002402002418080c400460d00200020022001280210118180" + "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" + "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" + "808080800020022000360200200220013602042002410236020c200241f887c080" + "00360208200242023702142002418380808000ad4220862203200241046aad8437" + "0328200220032002ad843703202002200241206a360210200241086a419487c080" + "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" + "0022040d002003410171450d010b02402003410171450d00200120026a21050240" + "0240200028020c22060d0041002107200121080c010b4100210741002109200121" + "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" + "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" + "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" + "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" + "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" + "20031b21022003200120031b21010b024020040d00200028021420012002200028" + "021828020c11808080800080808080000f0b2000280204210a024020024110490d" + "0020022001200141036a417c7122076b22096a220b410371210441002106410021" + "03024020012007460d004100210302402009417c4b0d0041002103410021050340" + "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" + "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" + "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" + "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" + "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" + "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" + "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002004200d41f007716a210941002108200421030340200328" + "020c2207417f7341077620074106767241818284087120032802082207417f7341" + "077620074106767241818284087120032802042207417f73410776200741067672" + "41818284087120032802002207417f734107762007410676724181828408712008" + "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" + "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" + "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" + "03410676724181828408712103200c4101460d0220082802042207417f73410776" + "20074106767241818284087120036a2103200c4102460d0220082802082208417f" + "7341077620084106767241818284087120036a21030c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" + "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" + "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" + "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" + "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" + "0d000c030b0b200028021420012002200028021828020c11808080800080808080" + "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" + "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" + "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a210320002802102109200028021821082000280214" + "210703402003417f6a2203450d0220072009200828021011818080800080808080" + "00450d000b41010f0b200028021420012002200028021828020c11808080800080" + "808080000f0b0240200720012002200828020c1180808080008080808000450d00" + "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" + "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" + "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" + "36020c20032000360208200341b08dc08000360214200320013602102003410236" + "021c200341b183c08000360218024020022802000d002003410336025c200341e4" + "83c08000360258200342033702642003418180808000ad4220862204200341106a" + "ad8437034820032004200341086aad843703402003418280808000ad4220862003" + "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" + "808000000b200341206a41106a200241106a290200370300200341206a41086a20" + "0241086a290200370300200320022902003703202003410436025c2003419884c0" + "8000360258200342043702642003418180808000ad4220862204200341106aad84" + "37035020032004200341086aad843703482003418980808000ad42208620034120" + "6aad843703402003418280808000ad422086200341186aad843703382003200341" + "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" + "01200028020428020c11818080800080808080000b140020012000280200200028" + "020410af808080000b14002001280214200128021820001091808080000b220020" + "01280214418883c08000410e200128021828020c11808080800080808080000b60" + "01017f23808080800041306b22002480808080002000410136020c200041a883c0" + "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" + "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" + "057f017e23808080800041c0006b220524808080800041012106024020002d0004" + "0d0020002d0005210702402000280200220828021c22094104710d004101210620" + "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" + "28021828020c11808080800080808080000d012008280214200120022008280218" + "28020c11808080800080808080000d01200828021441ef97c08000410220082802" + "1828020c11808080800080808080000d0120032008200411818080800080808080" + "0021060c010b41012106024020074101710d00200828021441e984c08000410320" + "0828021828020c11808080800080808080000d01200828021c21090b4101210620" + "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" + "6a360214200520082902083702242008290200210a200520093602382005200828" + "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" + "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" + "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" + "84c080004102200528023428020c118080808000808080800021060b200041013a" + "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" + "6a2103200028020421042000280200210520002802082106410021074100210841" + "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" + "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" + "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" + "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" + "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" + "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" + "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" + "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" + "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" + "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" + "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" + "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" + "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" + "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" + "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" + "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" + "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" + "21070b20070b6001027f2000280204210220002802002103024020002802082200" + "2d0000450d00200341e084c080004104200228020c118080808000808080800045" + "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" + "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" + "41306b22032480808080002003200136020c200320003602082003410136021420" + "0341d490c080003602102003420137021c2003418280808000ad42208620034108" + "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" + "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" + "808080000b830201087f2380808080004180016b22022480808080002001280204" + "21032001280200210420002802002100200128021c220521060240200541047145" + "0d002005410872210620040d0020014281808080a0013702000b20012006410472" + "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" + "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" + "09450d000b02402007418101490d002007418001418885c08000108b8080800000" + "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" + "01200536021c200120033602042001200436020020024180016a24808080800020" + "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" + "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" + "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" + "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" + "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" + "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" + "006b22012480808080002001410636020c2001419498c08000360208024041002d" + "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" + "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" + "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" + "2003450d02200320032802002204417f6a3602002003290308210220044101470d" + "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" + "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" + "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" + "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" + "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" + "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" + "021041042103200141043a00182001200141106a360220200141186a41c08dc080" + "002000109180808000210020012d001821040240024020000d0042002102411720" + "0441ff0171764101710d01200128021c220328020021000240200341046a280200" + "22042802002205450d002000200511828080800080808080000b02402004280204" + "2204450d00200020041087808080000b2003410c108780808000410421030c010b" + "200441ff01714104460d032001290318220642807e8321022006a721030b200128" + "021022002000280208417f6a2204360208024020040d00200041003a000c200042" + "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" + "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" + "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" + "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" + "97c08000360228200142023702342001418c80808000ad422086200141106aad84" + "3703202001418280808000ad422086200141086aad843703182001200141186a36" + "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" + "6b22022480808080002002200036020c20024102360214200241a88bc080003602" + "102002420137021c2002418b8080800036022c2002200241286a36021820022002" + "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" + "808080000b200241306a2480808080000b4701017f23808080800041206b220024" + "8080808000200041003602182000410136020c200041bc90c08000360208200042" + "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" + "808080800041206b220024808080800041002d00b89ec080001a02400240024041" + "20109b808080002201450d00200141023602102001428180808010370300410029" + "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" + "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" + "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" + "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" + "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" + "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" + "41003a000020002802182202450d00200120021087808080000b02402000417f46" + "0d00200020002802042201417f6a36020420014101470d00200041201087808080" + "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" + "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" + "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" + "c08000410410af808080000be50301017f23808080800041c0006b220224808080" + "800002400240024002400240024020002d00000e0400010203000b200220002802" + "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" + "002800809bc08000360000200041086a41002900f89ac080003700002000410029" + "00f09ac08000370000200241143602102002200036020c20024114360208200241" + "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" + "86200241046aad843703202002418e80808000ad422086200241086aad84370318" + "2002200241186a36023020012802142001280218200241286a1091808080002100" + "20022802082201450d03200228020c20011087808080000c030b20002d00012100" + "2002410136022c200241d490c08000360228200242013702342002418280808000" + "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" + "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" + "02142001280218200241286a10918080800021000c020b20012000280204220028" + "0200200028020410af8080800021000c010b200028020422002802002001200028" + "0204280210118180808000808080800021000b200241c0006a2480808080002000" + "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" + "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" + "000240200141046a28020022022802002203450d00200020031182808080008080" + "8080000b024020022802042202450d00200020021087808080000b2001410c1087" + "808080000b0bf10101027f23808080800041206b22002480808080000240024002" + "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" + "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" + "410020013602d89ec08000410042808080808080013703d09ec080004100420037" + "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" + "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" + "200041003602182000410136020c200041bc9bc080003602082000420437021020" + "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" + "042480808080000240024002400240024020012802100d002001417f3602102003" + "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" + "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" + "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" + "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" + "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" + "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" + "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" + "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" + "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" + "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" + "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" + "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" + "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" + "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" + "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" + "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" + "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" + "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" + "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" + "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" + "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" + "2004410136020c2004418c91c0800036020820044204370210200441086a419491" + "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" + "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" + "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" + "80808000024020042d00084104460d00200020042903083702000c030b2001411c" + "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" + "066a210502402001280214200320066b22064b0d002000200141146a2005200610" + "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" + "002001411c6a20063602000b2001200128021041016a360210200441206a248080" + "8080000b7101027f20012802002104024020012802082205450d00200420056b20" + "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" + "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" + "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" + "0041106b2203248080808000200341086a20002802082802002001200210c98080" + "8000024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" + "046a28020022062802002207450d002001200711828080800080808080000b0240" + "20062802042206450d00200120061087808080000b2004410c1087808080000b20" + "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" + "23808080800041106b220224808080800020024100360204024002400240024020" + "01418001490d002001418010490d012001418080044f0d0220022001413f714180" + "01723a000620022001410c7641e001723a000420022001410676413f7141800172" + "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" + "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" + "418001723a00072002200141127641f001723a000420022001410676413f714180" + "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" + "00280208280200200241046a200110c980808000024020022d000822014104460d" + "0020002802042103200229030821040240024020002d0000220541044b0d002005" + "4103470d010b200328020021050240200341046a28020022062802002207450d00" + "2005200711828080800080808080000b024020062802042206450d002005200610" + "87808080000b2003410c1087808080000b200020043702000b200241106a248080" + "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" + "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" + "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" + "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" + "012002742204710d0020032000360200200020033602182000200036020c200020" + "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" + "200328020022042802044178712001470d00200421020c010b2001410041192002" + "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" + "002202450d02200341017421032002210420022802044178712001470d000b0b20" + "022802082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20002000" + "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" + "8080808000200028020c2102024002400240024020002802040e020001020b2002" + "0d0141012102410021030c020b20020d0020002802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c2001418f8080800020" + "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" + "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" + "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" + "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" + "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" + "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" + "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" + "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" + "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" + "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" + "0c010b2000410020006b41037122046a210502402004450d002000210320012106" + "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" + "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" + "0020084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a28020021060340200520062002762001280200220620" + "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" + "480d0020092101034020052001280200360200200141046a2101200541046a2205" + "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" + "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" + "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" + "067e22072003422088220820067e22062005200142208822097e7c22054220867c" + "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" + "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" + "00000c000000040000001200000013000000140000000000000000000000010000" + "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" + "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" + "2f6332663734633366393238616562353033663135623465396566353737386537" + "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" + "2e727300005f0010004b000000060a00000e000000000000000100000001000000" + "16000000170000001400000004000000180000004572726f72557466384572726f" + "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" + "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" + "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" + "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" + "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" + "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" + "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" + "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" + "000000da0110000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000b301100010000000fc011000100000000c02100009000000da0110" + "00090000000100000000000000ef0b100002000000000000000c00000004000000" + "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" + "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" + "000030783030303130323033303430353036303730383039313031313132313331" + "343135313631373138313932303231323232333234323532363237323832393330" + "333133323333333433353336333733383339343034313432343334343435343634" + "373438343935303531353235333534353535363537353835393630363136323633" + "363436353636363736383639373037313732373337343735373637373738373938" + "303831383238333834383538363837383838393930393139323933393439353936" + "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" + "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" + "00000900000072616e676520737461727420696e64657820206f7574206f662072" + "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" + "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" + "031000220000000101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000020202020202020202020202020202020202020202020202020202020202" + "030303030303030303030303030303030404040404000000000000000000000000" + "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" + "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" + "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" + "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" + "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" + "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" + "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" + "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" + "000000690000001600000042616c616e636500b8051000360000007e0000001600" + "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" + "633266373463336639323861656235303366313562346539656635373738653737" + "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" + "652e72730000004c0610004d000000230100004200000000000000000000000400" + "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" + "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" + "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" + "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" + "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" + "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" + "206973206e6f7420706f737369626c652061667465722074686520746872656164" + "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" + "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" + "130000006661696c656420746f2067656e657261746520756e6971756520746872" + "6561642049443a2062697473706163652065786861757374656400040810003700" + "0000de07100015000000c40400000d00000001000000000000007374642f737263" + "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e000081081000090000005c081000250000000f0100002900000065" + "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" + "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" + "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" + "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" + "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" + "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" + "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" + "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" + "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" + "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" + "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" + "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" + "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" + "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" + "7267657265736f75726365206275737965786563757461626c652066696c652062" + "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" + "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" + "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" + "20696e746572727570746564756e737570706f72746564756e6578706563746564" + "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" + "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" + "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" + "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" + "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" + "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" + "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" + "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" + "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" + "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" + "65637572736976656c792061637175697265206d757465789c0c10002000000073" + "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" + "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" + "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" + "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" + "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" + "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" + "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" + "726d6564207265637572736976656c79840d100038000000100000001100000012" + "000000100000001000000013000000120000000d0000000e000000150000000c00" + "00000b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a000000100000001700000019000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600000015" + "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" + "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" + "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" + "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" + "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" + "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" + "000b000000040000004305100048051000540510005f0510006a05100000c62e04" + "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" + "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" + "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" + "6c6962313067657454784669656c64313768623836623962643665383439353163" + "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" + "43757272656e744c6564676572456e7472794669656c6431376861346138303037" + "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" + "6c696231396765744c6564676572456e7472794669656c64313768633661326634" + "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" + "5f6c69623139676574506172656e744c656467657254696d653137683731643366" + "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" + "696e745f6e756d626572313768343432633966366462343461613636374506305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" + "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" + "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" + "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" + "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" + "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376833326438343961303132376564636461450b445f" + "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" + "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" + "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" + "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" + "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683562646335303561663532336432393945" + "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" + "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" + "7a652447542433666d7431376836336361623039386234313233343130450f465f" + "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" + "63745f6669656c64325f66696e6973683137683135666166363733326663303964" + "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" + "313768396461663134643536353865323530364511265f5a4e34636f726533666d" + "743577726974653137683933353534653462653731663263376145124c5f5a4e34" + "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67244754243137683230373631353664386431" + "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" + "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" + "7224475424313768323066303937633266353863396661374514525f5a4e35335f" + "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" + "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" + "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" + "577269746524475424313077726974655f63686172313768323134333931636238" + "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" + "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" + "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" + "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" + "6573657276655f616e645f68616e646c6531376862356335336362636666396436" + "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" + "4754243977726974655f7374723137683539396439653537383934366464393845" + "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" + "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" + "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" + "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" + "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" + "6563313268616e646c655f6572726f723137683937623764626430663732646437" + "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" + "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683132313861313631643933363438653945" + "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" + "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768613636623539636339336533383537344520615f" + "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" + "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768633837363633386165616230633031664521475f" + "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376839393432316563653462383633" + "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" + "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" + "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" + "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" + "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" + "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" + "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" + "653970616e69636b696e673570616e696331376830346565623931376464393363" + "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" + "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" + "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" + "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" + "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" + "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" + "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" + "6b696e673970616e69635f666d7431376836353430636362326435666463336162" + "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" + "753230247533322447542433666d74313768626633653032323834383365333735" + "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" + "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" + "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" + "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" + "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" + "4e34636f726533666d7439466f726d617474657233706164313768343736396165" + "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" + "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" + "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" + "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" + "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" + "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" + "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" + "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" + "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" + "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" + "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" + "72656164795f626f72726f77656431376833313462353261316263343662666534" + "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" + "72756374356669656c64313768333531353864666637643465616633354537675f" + "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" + "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" + "7465244754243977726974655f7374723137683831386234396537653639613236" + "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" + "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" + "742e2e577269746524475424313077726974655f63686172313768393437396266" + "363162306130356661314539305f5a4e34636f726533666d743557726974653977" + "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" + "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" + "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" + "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" + "706c61792475323024666f7224753230246933322447542433666d743137686365" + "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" + "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376834366435353230663839333131346633453d0861" + "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" + "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" + "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" + "73746564313768333336626637613134383830343463384541425f5a4e34636f72" + "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" + "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" + "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" + "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" + "653970616e69636b696e6731336173736572745f6661696c656431376832333236" + "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768653138373433383865303762666532354545595f5a4e36305f244c542473" + "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" + "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" + "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" + "2e2e446973706c61792447542433666d7431376863653432323661613166373236" + "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" + "242447542424475424313768313636646336316162303333346331654548495f5a" + "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" + "2454244754243130696e697469616c697a65313768376635633530386461396531" + "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" + "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" + "697465244754243977726974655f616c6c31376832346238323631303436316432" + "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" + "65723138427566577269746572244c54245724475424313477726974655f616c6c" + "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c54245424475424247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376837666163663562" + "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" + "726974655f6368617231376866306233626531656331396465356537454d305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376866383830" + "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" + "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" + "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" + "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" + "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" + "645f73686f72745f6261636b747261636531376834646333646534376432323032" + "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" + "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" + "37642424753764243137686531376133393737663839633131373845533b5f5a4e" + "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" + "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" + "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" + "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" + "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" + "735f737472313768656233663732326432323465343266384555066d656d636d70" + "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" + "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d627901057275737463" + "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" + "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" + "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" + "797065732b087369676e2d657874"; + // let sender = get_tx_account_id(); + // let owner = get_current_escrow_account_id(); + // let dest = get_current_escrow_destination(); + // let dest_balance = get_account_balance(dest); + // let escrow_data = get_current_escrow_data(); + // let ed_str = String::from_utf8(escrow_data).unwrap(); + // let threshold_balance = ed_str.parse::().unwrap(); + // let pl_time = host_lib::getParentLedgerTime(); + // let e_time = get_current_escrow_finish_after(); + // sender == owner && dest_balance <= threshold_balance && + // pl_time >= e_time + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + // basic FinishFunction situation + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 11s), + cancel_time(env.now() + 100s), + data("1000000000"), // 1000 XRP in drops + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // FinishAfter time hasn't passed + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecNO_PERMISSION)); + env.close(); + + // tx sender not escrow creator (alice) + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + + // destination balance is too high + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + + env.close(); + + // reduce the destination balance + env(pay(carol, alice, XRP(4500))); + env.close(); + + // tx sender not escrow creator (alice) + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + + env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + } + void run() override { @@ -2039,6 +3228,7 @@ struct Escrow_test : public beast::unit_test::suite testCredentials(); testFinishFunctionPreflight(); testFinishFunction(); + testAllHostFunctions(); } }; diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 16bb966317d..8a5e30a0011 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -372,6 +372,32 @@ struct finish_function } }; +struct data +{ +private: + std::string value_; + +public: + explicit data(std::string func) : value_(func) + { + } + + explicit data(Slice const& func) : value_(strHex(func)) + { + } + + template + explicit data(std::array const& f) : data(makeSlice(f)) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfData.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/xrpld/app/misc/AMMUtils.h b/src/xrpld/app/misc/AMMUtils.h index ebc28341097..b2c0007dc77 100644 --- a/src/xrpld/app/misc/AMMUtils.h +++ b/src/xrpld/app/misc/AMMUtils.h @@ -17,8 +17,8 @@ */ //============================================================================== -#ifndef RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED -#define RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED +#ifndef RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED +#define RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED #include @@ -127,4 +127,4 @@ isOnlyLiquidityProvider( } // namespace ripple -#endif // RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED +#endif // RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 9ecbe22f31d..fe1b02a53b2 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include "xrpld/app/misc/WasmHostFuncImpl.h" +#include -#include "xrpl/protocol/digest.h" +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index d1e14e4246e..796c1ee6bb9 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2023 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 89eace193a3..055fbc14995 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -588,7 +588,8 @@ EscrowFinish::doApply() WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, 100000); + std::uint32_t gasLimit = ctx_.app.config().FEES.extension_compute_limit; + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, gasLimit); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From f37d52d8e95ab2c819f230007b5c476f911be39f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 24 Apr 2025 08:47:13 -0400 Subject: [PATCH 05/73] Set up fees for WASM processing (#5393) * set up fields * throw error if allowance is too high * votable gas price * fix comments * hook everything together * make test less flaky (hopefully) * fix other tests * fix some tests * fix tests * clean up * add more tests * uncomment other tests * respond to comments * fix build * respond to comments --- cfg/rippled-example.cfg | 11 +- include/xrpl/protocol/Fees.h | 3 + include/xrpl/protocol/TER.h | 2 + .../xrpl/protocol/detail/ledger_entries.macro | 1 + include/xrpl/protocol/detail/sfields.macro | 2 + .../xrpl/protocol/detail/transactions.macro | 6 +- include/xrpl/protocol/jss.h | 1 + src/libxrpl/protocol/STValidation.cpp | 1 + src/libxrpl/protocol/TER.cpp | 2 + src/test/app/Escrow_test.cpp | 211 ++++++++++++++++-- src/test/app/FeeVote_test.cpp | 17 +- src/test/app/PseudoTx_test.cpp | 1 + src/test/jtx/TestHelpers.h | 17 ++ src/test/jtx/impl/envconfig.cpp | 3 + src/xrpld/app/ledger/Ledger.cpp | 11 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 9 +- src/xrpld/app/misc/NetworkOPs.cpp | 7 + src/xrpld/app/tx/detail/Change.cpp | 7 +- src/xrpld/app/tx/detail/Escrow.cpp | 72 +++++- src/xrpld/core/Config.h | 3 + src/xrpld/core/detail/Config.cpp | 2 + 21 files changed, 342 insertions(+), 47 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 7affa212ab9..6da68410526 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1271,8 +1271,17 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_compute_limit = 2000000 # 2 million gas +# extension_size_limit = 2000000 # 2 mb +# +# gas_price = # +# The gas price is the conversion between WASM gas and its price in drops. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# gas_price = 2000000 # 2 drops per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index a89bd4e4863..1a1ecacb362 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -24,6 +24,8 @@ namespace ripple { +constexpr std::uint32_t MICRO_DROPS_PER_DROP{1'000'000}; + /** Reflects the fee settings for a particular ledger. The fees are always the same for any transactions applied @@ -37,6 +39,7 @@ struct Fees std::uint32_t extensionComputeLimit{ 0}; // Extension compute limit (instructions) std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) + std::uint32_t gasPrice{0}; // price of WASM gas (micro-drops) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 4f544963f03..caf05daf766 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -185,6 +185,8 @@ enum TEFcodes : TERUnderlyingType { tefNO_TICKET, tefNFTOKEN_IS_NOT_TRANSFERABLE, tefINVALID_LEDGER_FIX_TYPE, + tefNO_WASM, + tefWASM_FIELD_NOT_INCLUDED, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 2d4a3453eaa..08849f0fa6c 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -319,6 +319,7 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ // New fields {sfExtensionComputeLimit, soeOPTIONAL}, {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 42a706c4de1..65a4bfcbc1e 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -114,6 +114,8 @@ TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 52) TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 53) +TYPED_SFIELD(sfGasPrice, UINT32, 54) +TYPED_SFIELD(sfComputationAllowance, UINT32, 55) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index 19c31d439b5..f9d70ea6dbb 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -59,6 +59,7 @@ TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, ({ {sfFulfillment, soeOPTIONAL}, {sfCondition, soeOPTIONAL}, {sfCredentialIDs, soeOPTIONAL}, + {sfComputationAllowance, soeOPTIONAL}, })) @@ -490,8 +491,9 @@ TRANSACTION(ttFEE, 101, SetFee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, - {sfExtensionComputeLimit, soeOPTIONAL}, - {sfExtensionSizeLimit, soeOPTIONAL}, + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index fa34cf800b7..96aefb07880 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -267,6 +267,7 @@ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info JSS(extension_compute); // out: NetworkOps JSS(extension_size); // out: NetworkOps +JSS(gas_price); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 948a47f0ac9..3a9d16445e4 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -81,6 +81,7 @@ STValidation::validationFormat() // featureSmartEscrow {sfExtensionComputeLimit, soeOPTIONAL}, {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, }; // clang-format on diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 3766f33c548..6a2387035bf 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -147,6 +147,8 @@ transResults() MAKE_ERROR(tefNO_TICKET, "Ticket is not in ledger."), MAKE_ERROR(tefNFTOKEN_IS_NOT_TRANSFERABLE, "The specified NFToken is not transferable."), MAKE_ERROR(tefINVALID_LEDGER_FIX_TYPE, "The LedgerFixType field has an invalid value."), + MAKE_ERROR(tefNO_WASM, "There is no WASM code to run, but a WASM-specific field was included."), + MAKE_ERROR(tefWASM_FIELD_NOT_INCLUDED, "WASM code requires a field to be included that was not included."), MAKE_ERROR(telLOCAL_ERROR, "Local failure."), MAKE_ERROR(telBAD_DOMAIN, "Domain too long."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6c0e32179e8..6b25da63631 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1659,7 +1659,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishFunctionPreflight() + testCreateFinishFunctionPreflight() { testcase("Test preflight checks involving FinishFunction"); @@ -1703,12 +1703,37 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } - Env env(*this); + { + // FinishFunction > max length + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + })); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow(alice, carol, XRP(500)); + + // 11-byte string + std::string longWasmHex = "00112233445566778899AA"; + env(escrowCreate, + finish_function(longWasmHex), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + })); XRPAmount const txnFees = env.current()->fees().base + 1000; // create escrow env.fund(XRP(5000), alice, carol); - auto escrowCreate = escrow(alice, carol, XRP(1000)); + auto escrowCreate = escrow(alice, carol, XRP(500)); // Success situations { @@ -1794,23 +1819,132 @@ struct Escrow_test : public beast::unit_test::suite ter(temMALFORMED)); env.close(); } - // { - // // FinishFunction > max length - // std::string longWasmHex = "00"; - // // TODO: fix to use the config setting - // // TODO: make this test more efficient - // // uncomment when that's done - // for (int i = 0; i < 4294967295; i++) - // { - // longWasmHex += "11"; - // } - // env(escrowCreate, - // finish_function(longWasmHex), - // cancel_time(env.now() + 100s), - // fee(txnFees), - // ter(temMALFORMED)); - // env.close(); + } + + void + testFinishWasmFailures() + { + testcase("EscrowFinish Smart Escrow failures"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5} // } + static auto wasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; + + { + // featureSmartEscrow disabled + Env env(*this, supported_amendments() - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + env(finish(carol, alice, 1), + fee(txnFees), + comp_allowance(110), + ter(temDISABLED)); + env.close(); + } + + { + // ComputationAllowance > max compute limit + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + })); + env.fund(XRP(5000), alice, carol); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + auto const allowance = 1'001; + env(finish(carol, alice, 1), + fee(env.current()->fees().base + allowance), + comp_allowance(allowance), + ter(temBAD_LIMIT)); + } + + Env env(*this); + + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + XRPAmount const txnFees = env.current()->fees().base + 1000; + env.fund(XRP(5000), alice, carol); + + // create escrow + auto const seq = env.seq(alice); + env(escrow(alice, carol, XRP(500)), + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + { + // no ComputationAllowance field + env(finish(carol, alice, seq), ter(tefWASM_FIELD_NOT_INCLUDED)); + } + + { + // not enough fees + // This function takes 110 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 109; + env(finish(carol, alice, seq), + fee(finishFee), + comp_allowance(110), + ter(telINSUF_FEE_P)); + } + + { + // not enough gas + // This function takes 110 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 108; + env(finish(carol, alice, seq), + fee(finishFee), + comp_allowance(108), + ter(tecFAILED_PROCESSING)); + } + + { + // ComputationAllowance field included w/no FinishFunction on + // escrow + auto const seq2 = env.seq(alice); + env(escrow(alice, carol, XRP(500)), + finish_time(env.now() + 10s), + cancel_time(env.now() + 100s)); + env.close(); + + auto const allowance = 100; + env(finish(carol, alice, seq2), + fee(env.current()->fees().base + allowance), + comp_allowance(allowance), + ter(tefNO_WASM)); + } } void @@ -1865,22 +1999,30 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(carol, XRP(5000))); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); - env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(alice, alice, seq), + fee(txnFees), + comp_allowance(110), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -1910,29 +2052,34 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(finish(carol, alice, seq), condition(cb1), fulfillment(fb1), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // no fulfillment provided, function succeeds env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb2), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb1), + comp_allowance(110), fee(txnFees), ter(tesSUCCESS)); env.close(); @@ -1965,16 +2112,19 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 1), ter(tesSUCCESS)); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2004,17 +2154,22 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // finish time has passed, function succeeds, tx succeeds - env(finish(carol, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(carol, alice, seq), + comp_allowance(110), + fee(txnFees), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -3175,19 +3330,24 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); + auto const allowance = 40'000; + // FinishAfter time hasn't passed env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // tx sender not escrow creator (alice) env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); // destination balance is too high env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); @@ -3199,11 +3359,15 @@ struct Escrow_test : public beast::unit_test::suite // tx sender not escrow creator (alice) env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); - env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(alice, alice, seq), + comp_allowance(allowance), + fee(txnFees), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -3226,7 +3390,8 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(); testEscrowWithTickets(); testCredentials(); - testFinishFunctionPreflight(); + testCreateFinishFunctionPreflight(); + testFinishWasmFailures(); testFinishFunction(); testAllHostFunctions(); } diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 73bb539a222..8e333b27eae 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -43,6 +43,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; @@ -51,13 +52,15 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = 1234567", "owner_reserve = 1234", "extension_compute_limit = 100", - "extension_size_limit = 200"}); + "extension_size_limit = 200", + " gas_price = 300"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); BEAST_EXPECT(setup.extension_compute_limit == 100); BEAST_EXPECT(setup.extension_size_limit == 200); + BEAST_EXPECT(setup.gas_price == 300); } { Section config; @@ -66,7 +69,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = yada", "owner_reserve = foo", "extension_compute_limit = bar", - "extension_size_limit = baz"}); + "extension_size_limit = baz", + "gas_price = qux"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -78,6 +82,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; @@ -86,7 +91,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = -1234567", "owner_reserve = -1234", "extension_compute_limit = -100", - "extension_size_limit = -200"}); + "extension_size_limit = -200", + "gas_price = -300"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -99,6 +105,7 @@ class FeeVote_test : public beast::unit_test::suite static_cast(-100)); BEAST_EXPECT( setup.extension_size_limit == static_cast(-200)); + BEAST_EXPECT(setup.gas_price == static_cast(-300)); } { const auto big64 = std::to_string( @@ -111,7 +118,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = " + big64, "owner_reserve = " + big64, "extension_compute_limit = " + big64, - "extension_size_limit = " + big64}); + "extension_size_limit = " + big64, + "gas_price = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -123,6 +131,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 1101f56c699..0ba7b0e5ba3 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -54,6 +54,7 @@ struct PseudoTx_test : public beast::unit_test::suite { obj[sfExtensionComputeLimit] = 0; obj[sfExtensionSizeLimit] = 0; + obj[sfGasPrice] = 0; } })); diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 8a5e30a0011..b77b00b00c1 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -398,6 +398,23 @@ struct data } }; +struct comp_allowance +{ +private: + std::uint32_t value_; + +public: + explicit comp_allowance(std::uint32_t const& value) : value_(value) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfComputationAllowance.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index b94c79ccb85..ab0969c6cb8 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -33,11 +33,14 @@ setupConfigForUnitTests(Config& cfg) using namespace jtx; // Default fees to old values, so tests don't have to worry about changes in // Config.h + // NOTE: For new `FEES` fields, you need to wait for the first flag ledger + // to close for the values to be activated. cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); cfg.FEES.extension_compute_limit = 4294967295; cfg.FEES.extension_size_limit = 4294967295; + cfg.FEES.gas_price = 1000000; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index d3c59fbeb69..d9a0dce1513 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -228,6 +228,7 @@ Ledger::Ledger( sle->at(sfExtensionComputeLimit) = config.FEES.extension_compute_limit; sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + sle->at(sfGasPrice) = config.FEES.gas_price; } rawInsert(sle); } @@ -659,6 +660,7 @@ Ledger::setup() auto const extensionComputeLimit = sle->at(~sfExtensionComputeLimit); auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + auto const gasPrice = sle->at(~sfGasPrice); auto assign = [](std::uint32_t& dest, std::optional const& src) { @@ -669,7 +671,9 @@ Ledger::setup() }; assign(fees_.extensionComputeLimit, extensionComputeLimit); assign(fees_.extensionSizeLimit, extensionSizeLimit); - extensionFees = extensionComputeLimit || extensionSizeLimit; + assign(fees_.gasPrice, gasPrice); + extensionFees = + extensionComputeLimit || extensionSizeLimit || gasPrice; } if (oldFees && newFees) // Should be all of one or the other, but not both @@ -701,7 +705,8 @@ Ledger::defaultFees(Config const& config) { assert( fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && - fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0); + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0 && + fees_.gasPrice == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) @@ -710,6 +715,8 @@ Ledger::defaultFees(Config const& config) fees_.extensionComputeLimit = config.FEES.extension_compute_limit; if (fees_.extensionSizeLimit == 0) fees_.extensionSizeLimit = config.FEES.extension_size_limit; + if (fees_.gasPrice == 0) + fees_.gasPrice = config.FEES.gas_price; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index e312ab042f8..6c6e2f08655 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -216,6 +216,7 @@ FeeVoteImpl::doValidation( target_.extension_size_limit, "extension size limit", sfExtensionSizeLimit); + vote(lastFees.gasPrice, target_.gas_price, "gas price", sfGasPrice); } } @@ -247,6 +248,9 @@ FeeVoteImpl::doVoting( lastClosedLedger->fees().extensionSizeLimit, target_.extension_size_limit); + detail::VotableValue gasPriceVote( + lastClosedLedger->fees().gasPrice, target_.gas_price); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { @@ -332,6 +336,7 @@ FeeVoteImpl::doVoting( continue; doVote(val, extensionComputeVote, sfExtensionComputeLimit); doVote(val, extensionSizeVote, sfExtensionSizeLimit); + doVote(val, gasPriceVote, sfGasPrice); } } @@ -344,12 +349,13 @@ FeeVoteImpl::doVoting( auto const incReserve = incReserveVote.getVotes(); auto const extensionCompute = extensionComputeVote.getVotes(); auto const extensionSize = extensionSizeVote.getVotes(); + auto const gasPrice = gasPriceVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position if (baseFee.second || baseReserve.second || incReserve.second || - extensionCompute.second || extensionSize.second) + extensionCompute.second || extensionSize.second || gasPrice.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -381,6 +387,7 @@ FeeVoteImpl::doVoting( { obj[sfExtensionComputeLimit] = extensionCompute.first; obj[sfExtensionSizeLimit] = extensionSize.first; + obj[sfGasPrice] = gasPrice.first; } }); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index b721c80bfde..049a47bc232 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2295,6 +2295,9 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) extensionSizeLimit) jvObj[jss::extension_size] = *extensionSizeLimit; + if (auto const gasPrice = ~val->at(~sfGasPrice); gasPrice) + jvObj[jss::gas_price] = *gasPrice; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2758,6 +2761,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); @@ -2773,6 +2777,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; } if (auto const closeOffset = app_.timeKeeper().closeOffset(); @@ -2965,6 +2970,7 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().extensionComputeLimit; jvObj[jss::extension_size] = lpAccepted->fees().extensionSizeLimit; + jvObj[jss::gas_price] = lpAccepted->fees().gasPrice; } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -4007,6 +4013,7 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + jvResult[jss::gas_price] = lpClosed->fees().gasPrice; } } diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index e40e61ff94e..7d84e003fb5 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -133,13 +133,15 @@ Change::preclaim(PreclaimContext const& ctx) if (ctx.view.rules().enabled(featureSmartEscrow)) { if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || - !ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + !ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + !ctx.tx.isFieldPresent(sfGasPrice)) return temMALFORMED; } else { if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || - ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + ctx.tx.isFieldPresent(sfGasPrice)) return temDISABLED; } return tesSUCCESS; @@ -393,6 +395,7 @@ Change::applyFee() { set(feeObject, ctx_.tx, sfExtensionComputeLimit); set(feeObject, ctx_.tx, sfExtensionSizeLimit); + set(feeObject, ctx_.tx, sfGasPrice); } view().update(feeObject); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 055fbc14995..ab91274326d 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -34,6 +34,8 @@ #include #include +#include + // During an EscrowFinish, the transaction must specify both // a condition and a fulfillment. We track whether that // fulfillment matches and validates the condition. @@ -361,6 +363,13 @@ EscrowFinish::preflight(PreflightContext const& ctx) !ctx.rules.enabled(featureCredentials)) return temDISABLED; + if (ctx.tx.isFieldPresent(sfComputationAllowance) && + !ctx.rules.enabled(featureSmartEscrow)) + { + JLOG(ctx.j.debug()) << "SmartEscrow not enabled"; + return temDISABLED; + } + if (auto const ret = preflight1(ctx); !isTesSuccess(ret)) return ret; @@ -402,6 +411,16 @@ EscrowFinish::preflight(PreflightContext const& ctx) } } + if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) + { + if (*allowance > ctx.app.config().FEES.extension_compute_limit) + { + JLOG(ctx.j.debug()) + << "ComputationAllowance too large: " << *allowance; + return temBAD_LIMIT; + } + } + if (auto const err = credentials::checkFields(ctx); !isTesSuccess(err)) return err; @@ -417,8 +436,10 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } - // TODO: make this fee increase based on the extra compute run - + if (auto const allowance = tx[~sfComputationAllowance]; allowance) + { + extraFee += (*allowance) * view.fees().gasPrice / MICRO_DROPS_PER_DROP; + } return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -428,6 +449,34 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) if (!ctx.view.rules().enabled(featureCredentials)) return Transactor::preclaim(ctx); + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + // this check is done in doApply before this amendment is enabled + auto const k = keylet::escrow(ctx.tx[sfOwner], ctx.tx[sfOfferSequence]); + auto const slep = ctx.view.read(k); + if (!slep) + return tecNO_TARGET; + + if (slep->isFieldPresent(sfFinishFunction)) + { + if (!ctx.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(ctx.j.debug()) + << "FinishFunction requires ComputationAllowance"; + return tefWASM_FIELD_NOT_INCLUDED; + } + } + else + { + if (ctx.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(ctx.j.debug()) << "FinishFunction not present, " + "ComputationAllowance present"; + return tefNO_WASM; + } + } + } + if (auto const err = credentials::valid(ctx, ctx.tx[sfAccount]); !isTesSuccess(err)) return err; @@ -441,7 +490,8 @@ EscrowFinish::doApply() auto const k = keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); auto const slep = ctx_.view().peek(k); if (!slep) - return tecNO_TARGET; + return ctx_.view().rules().enabled(featureSmartEscrow) ? tecINTERNAL + : tecNO_TARGET; // Order of processing the release conditions (in order of performance): // FinishAfter/CancelAfter @@ -579,17 +629,15 @@ EscrowFinish::doApply() std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("ready"); - auto const escrowTx = - ctx_.tx.getJson(JsonOptions::none).toStyledString(); - auto const escrowObj = - slep->getJson(JsonOptions::none).toStyledString(); - std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); - std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); - WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - std::uint32_t gasLimit = ctx_.app.config().FEES.extension_compute_limit; - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, gasLimit); + if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) + { + // already checked above, this check is just in case + return tecINTERNAL; + } + std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 8e29ecdcf41..4b297c8610d 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -79,6 +79,9 @@ struct FeeSetup /** The WASM size limit for Feature Extensions. */ std::uint32_t extension_size_limit{4294967295}; + /** The price of 1 WASM gas, in micro-drops. */ + std::uint32_t gas_price{1000000}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index fb4a4aab211..97d6d5fd9d5 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1108,6 +1108,8 @@ setup_FeeVote(Section const& section) setup.extension_compute_limit = temp; if (set(temp, "extension_size_limit", section)) setup.extension_size_limit = temp; + if (set(temp, "gas_price", section)) + setup.gas_price = temp; } return setup; } From f8b2fe4dd5f24f6b91b727147e21017bc43f66d3 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 28 Apr 2025 17:43:15 -0400 Subject: [PATCH 06/73] fix imports --- src/xrpld/rpc/handlers/PayChanClaim.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xrpld/rpc/handlers/PayChanClaim.cpp b/src/xrpld/rpc/handlers/PayChanClaim.cpp index 084f41db85d..b62f5e54e55 100644 --- a/src/xrpld/rpc/handlers/PayChanClaim.cpp +++ b/src/xrpld/rpc/handlers/PayChanClaim.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include #include From f03b5883bd87440bdc4d2996d8e3bcc5a84e8dad Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 12:39:12 -0400 Subject: [PATCH 07/73] More host functions (#5411) * getNFT * escrow keylet * account keylet * credential keylet * oracle keylet * hook everything in * fix stuff --- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 115 +++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 19 ++ src/xrpld/app/misc/WasmVM.cpp | 241 ++++++++++++++++++++++++ src/xrpld/app/misc/WasmVM.h | 33 ++++ 4 files changed, 408 insertions(+) diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index fe1b02a53b2..0383b15662b 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include #include @@ -98,6 +99,33 @@ WasmHostFunctionsImpl::getCurrentLedgerEntryField(const std::string& fname) return std::nullopt; } +std::optional +WasmHostFunctionsImpl::getNFT( + const std::string& account, + const std::string& nftId) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + uint256 nftHash; + if (!nftHash.parseHex(nftId)) + { + return std::nullopt; + } + + auto jv = nft::findToken(ctx.view(), accountId.value(), nftHash); + if (!jv) + { + return std::nullopt; + } + + Slice const s = (*jv)[sfURI]; + return Bytes{s.begin(), s.end()}; +} + bool WasmHostFunctionsImpl::updateData(const Bytes& data) { @@ -115,4 +143,91 @@ WasmHostFunctionsImpl::computeSha512HalfHash(const Bytes& data) auto const hash = sha512Half(data); return uint256::fromVoid(hash.data()); } + +std::optional +WasmHostFunctionsImpl::accountKeylet(const std::string& account) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::account(*accountId).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::credentialKeylet( + const std::string& subject, + const std::string& issuer, + const std::string& credentialType) +{ + auto const subjectId = parseBase58(subject); + if (!subjectId || subjectId->isZero()) + { + return std::nullopt; + } + + auto const issuerId = parseBase58(issuer); + if (!issuerId || issuerId->isZero()) + { + return std::nullopt; + } + + auto keylet = + keylet::credential(*subjectId, *issuerId, makeSlice(credentialType)) + .key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::escrowKeylet( + const std::string& account, + const std::uint32_t& seq) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::escrow(*accountId, seq).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::oracleKeylet( + const std::string& account, + const std::uint32_t& documentId) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::oracle(*accountId, documentId).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a311073d7b6..aa42f79ff6b 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -54,12 +54,31 @@ class WasmHostFunctionsImpl : public HostFunctions std::optional getCurrentLedgerEntryField(std::string const& fname) override; + std::optional + getNFT(std::string const& account, std::string const& nftId) override; + bool updateData(Bytes const& data) override; Hash computeSha512HalfHash(Bytes const& data) override; + std::optional + accountKeylet(std::string const& account) override; + + std::optional + credentialKeylet( + std::string const& subject, + std::string const& issuer, + std::string const& credentialType) override; + + std::optional + escrowKeylet(std::string const& account, std::uint32_t const& seq) override; + + std::optional + oracleKeylet(std::string const& account, std::uint32_t const& documentId) + override; + private: ApplyContext& ctx; Keylet leKey; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 22ac65479fb..1764734db36 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -220,6 +220,148 @@ getCurrentLedgerEntryField( return WasmEdge_Result_Success; } +WasmEdge_Result +getNFT( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto nftId = getFieldName(fm, in, 2); + if (!nftId) + return nftId.error(); + + auto nftURI = + ((HostFunctions*)data)->getNFT(account.value(), nftId.value()); + if (!nftURI) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, nftURI.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +accountKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto keylet = ((HostFunctions*)data)->accountKeylet(account.value()); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +credentialKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto subject = getFieldName(fm, in, 0); + if (!subject) + return subject.error(); + + auto issuer = getFieldName(fm, in, 2); + if (!issuer) + return issuer.error(); + + auto credentialType = getFieldName(fm, in, 4); + if (!credentialType) + return credentialType.error(); + + auto keylet = + ((HostFunctions*)data) + ->credentialKeylet( + subject.value(), issuer.value(), credentialType.value()); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +escrowKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto sequence = WasmEdge_ValueGetI32(in[2]); + + auto keylet = + ((HostFunctions*)data)->escrowKeylet(account.value(), sequence); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +oracleKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto documentId = WasmEdge_ValueGetI32(in[2]); + + auto keylet = + ((HostFunctions*)data)->escrowKeylet(account.value(), documentId); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + WasmEdge_Result updateData( void* data, @@ -393,6 +535,25 @@ runEscrowWasm( WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); // WasmEdge_StringDelete(fName); } + // getNFT + { + WasmEdge_ValType inputList[4] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate(hostFuncType, getNFT, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = WasmEdge_StringCreateByCString("getNFT"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } // updateData { WasmEdge_ValType inputList[2] = { @@ -428,6 +589,86 @@ runEscrowWasm( WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); // WasmEdge_StringDelete(fName); } + // accountKeylet + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, accountKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("accountKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // credentialKeylet + { + WasmEdge_ValType inputList[6] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 6, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, credentialKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + WasmEdge_String fName = + WasmEdge_StringCreateByCString("credentialKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // escrowKeylet + { + WasmEdge_ValType inputList[3] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, escrowKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("escrowKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // oracleKeylet + { + WasmEdge_ValType inputList[3] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, oracleKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("oracleKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } // print { WasmEdge_ValType inputList[2] = { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 796c1ee6bb9..b0839dc76de 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -74,6 +74,12 @@ struct HostFunctions return Bytes{}; } + virtual std::optional + getNFT(std::string const& account, std::string const& nftId) + { + return Bytes{}; + } + virtual bool updateData(Bytes const& data) { @@ -86,6 +92,33 @@ struct HostFunctions return Hash{}; } + virtual std::optional + accountKeylet(std::string const& account) + { + return Bytes{}; + } + + virtual std::optional + credentialKeylet( + std::string const& subject, + std::string const& issuer, + std::string const& credentialType) + { + return Bytes{}; + } + + virtual std::optional + escrowKeylet(std::string const& account, std::uint32_t const& seq) + { + return Bytes{}; + } + + virtual std::optional + oracleKeylet(std::string const& account, std::uint32_t const& docId) + { + return Bytes{}; + } + virtual ~HostFunctions() = default; }; From 4670b373c10f2e093ff8670557af882e535d6a3f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 14:10:27 -0400 Subject: [PATCH 08/73] try to fix tests --- src/test/app/Escrow_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 81f1f9724e6..da62a590c17 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1756,7 +1756,7 @@ struct Escrow_test : public beast::unit_test::suite cfg->START_UP = Config::FRESH; return cfg; })); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -2064,7 +2064,7 @@ struct Escrow_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto escrowCreate = escrow(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = env.current()->fees().base * 10 + 1000; env(escrowCreate, finish_function(wasmHex), condition(cb1), From 9c0204906c4c82b3a1a4f201fa375abc6abc50d2 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 15:25:00 -0400 Subject: [PATCH 09/73] fix reference fee tests --- src/test/app/Escrow_test.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index da62a590c17..52a077615f6 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1977,7 +1977,7 @@ struct Escrow_test : public beast::unit_test::suite void testFinishFunction() { - testcase("PoC escrow function"); + testcase("Example escrow function"); using namespace jtx; using namespace std::chrono; @@ -2059,24 +2059,27 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + Condition Env env(*this); - // create escrow env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto const seq = env.seq(alice); + // create escrow auto escrowCreate = escrow(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + 1000; + XRPAmount const createFee = env.current()->fees().base + 1000; env(escrowCreate, finish_function(wasmHex), condition(cb1), cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); + XRPAmount const txnFees = + env.current()->fees().base * 34 + 1000; + // no fulfillment provided, function fails env(finish(carol, alice, seq), comp_allowance(110), From bb9bc764bcc2990b534554a596c0f69d338dd402 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 1 May 2025 18:02:06 -0400 Subject: [PATCH 10/73] Switch to WAMR (#5416) * Switch to WAMR --- .github/actions/dependencies/action.yml | 1 + .github/workflows/nix.yml | 1 + BUILD.md | 11 + CMakeLists.txt | 2 +- cmake/RippledCore.cmake | 2 +- conanfile.py | 2 +- external/wamr/conandata.yml | 6 + external/wamr/conanfile.py | 90 +++ external/wamr/patches/ripp_metering.patch | 417 ++++++++++++ src/test/app/Escrow_test.cpp | 7 +- src/test/app/Wasm_test.cpp | 154 ++--- src/xrpld/app/misc/WamrVM.cpp | 754 ++++++++++++++++++++ src/xrpld/app/misc/WamrVM.h | 264 +++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 8 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 392 +++++++++++ src/xrpld/app/misc/WasmHostFuncWrapper.h | 113 +++ src/xrpld/app/misc/WasmVM.cpp | 756 ++------------------- src/xrpld/app/misc/WasmVM.h | 249 ++++++- 18 files changed, 2427 insertions(+), 802 deletions(-) create mode 100644 external/wamr/conandata.yml create mode 100644 external/wamr/conanfile.py create mode 100644 external/wamr/patches/ripp_metering.patch create mode 100644 src/xrpld/app/misc/WamrVM.cpp create mode 100644 src/xrpld/app/misc/WamrVM.h create mode 100644 src/xrpld/app/misc/WasmHostFuncWrapper.cpp create mode 100644 src/xrpld/app/misc/WasmHostFuncWrapper.h diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index afce1557d3b..c251daa9369 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -17,6 +17,7 @@ runs: conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ + conan export -k external/wamr wamr/2.2.0@ - name: add Ripple Conan remote shell: bash run: | diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index d9a67a63e95..2ea9b325448 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -351,6 +351,7 @@ jobs: conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default conan export external/snappy snappy/1.1.10@ conan export external/soci soci/4.0.3@ + conan export -k external/wamr wamr/2.2.0@ - name: build dependencies run: | diff --git a/BUILD.md b/BUILD.md index fd985dce817..d348f2d670d 100644 --- a/BUILD.md +++ b/BUILD.md @@ -204,6 +204,17 @@ It fixes some source files to add missing `#include`s. conan export --version 2.0.8 external/nudb ``` +Export our [Conan recipe for WAMR](./external/wamr). +It add metering and expose some internal structures. + + + ``` + # Conan 1.x + conan export external/wamr wamr/2.2.0@ + # Conan 2.x + conan export --version 2.2.0 external/wamr + ``` + ### Build and Test 1. Create a build directory and move into it. diff --git a/CMakeLists.txt b/CMakeLists.txt index 28cfd2322a1..702cb41a0a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) -find_package(wasmedge REQUIRED) +find_package(wamr REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index d4ff75434ea..ec56323926b 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,7 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> - wasmedge::wasmedge + wamr::wamr ) include(add_module) diff --git a/conanfile.py b/conanfile.py index d49f45903e0..a0b1602daa6 100644 --- a/conanfile.py +++ b/conanfile.py @@ -33,7 +33,7 @@ class Xrpl(ConanFile): 'soci/4.0.3', 'xxhash/0.8.2', 'zlib/1.3.1', - 'wasmedge/0.14.1', + 'wamr/2.2.0', ] tool_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml new file mode 100644 index 00000000000..6c49946ecab --- /dev/null +++ b/external/wamr/conandata.yml @@ -0,0 +1,6 @@ +patches: + 2.2.0: + - patch_description: add metering to iwasm interpreter + patch_file: patches/ripp_metering.patch + patch_type: conan + diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py new file mode 100644 index 00000000000..d54bb6f98fb --- /dev/null +++ b/external/wamr/conanfile.py @@ -0,0 +1,90 @@ +from conans import ConanFile, tools +from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, copy +import os +import json + +required_conan_version = ">=1.55.0" + +class WamrConan(ConanFile): + name = "wamr" + version = "2.2.0" + license = "Apache License v2.0" + url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" + description = "Webassembly micro runtime" + package_type = "library" + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + generators = "CMakeToolchain", "CMakeDeps" + #requires = [("llvm/20.1.1@")] + + def export_sources(self): + export_conandata_patches(self) + pass + + + #def build_requirements(self): + # self.tool_requires("llvm/20.1.1") + + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + + + def layout(self): + cmake_layout(self, src_folder="src") + + + def source(self): + git = tools.Git() + git.clone("https://github.com/bytecodealliance/wasm-micro-runtime.git", "c883fafead005e87ad3122b05409886f507c1cb0",shallow=True) + #get(self, **self.conan_data["sources"][self.version], strip_root=True) + + + def generate(self): + tc = CMakeToolchain(self) + + tc.variables["WAMR_BUILD_INTERP"] = 1 + tc.variables["WAMR_BUILD_FAST_INTERP"] = 1 + tc.variables["WAMR_BUILD_INSTRUCTION_METERING"] = 1 + tc.variables["WAMR_BUILD_AOT"] = 0 + tc.variables["WAMR_BUILD_JIT"] = 0 + tc.variables["WAMR_BUILD_FAST_JIT"] = 0 + tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 + tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 + #tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 + #ll_dep = self.dependencies["llvm"] + #self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") + #tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.generate() + + # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder + deps = CMakeDeps(self) + deps.generate() + + + def build(self): + apply_conandata_patches(self) + cmake = CMake(self) + cmake.verbose = True + cmake.configure() + cmake.build() + #self.run(f'echo {self.source_folder}') + # Explicit way: + # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) + # self.run("cmake --build . %s" % cmake.build_config) + + + def package(self): + cmake = CMake(self) + cmake.verbose = True + cmake.install() + + + def package_info(self): + self.cpp_info.libs = ["iwasm"] + self.cpp_info.names["cmake_find_package"] = "wamr" + self.cpp_info.names["cmake_find_package_multi"] = "wamr" + diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch new file mode 100644 index 00000000000..7cc3544b685 --- /dev/null +++ b/external/wamr/patches/ripp_metering.patch @@ -0,0 +1,417 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 551991f8..5f48a0b8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,7 +1,7 @@ + # Copyright (C) 2019 Intel Corporation. All rights reserved. + # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +-cmake_minimum_required (VERSION 3.14) ++cmake_minimum_required (VERSION 3.20) + + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + +diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake +index 1cb50235..bd103022 100644 +--- a/build-scripts/config_common.cmake ++++ b/build-scripts/config_common.cmake +@@ -669,6 +669,10 @@ if (WAMR_BUILD_AOT_VALIDATOR EQUAL 1) + message (" AOT validator enabled") + add_definitions (-DWASM_ENABLE_AOT_VALIDATOR=1) + endif () ++if (WAMR_BUILD_INSTRUCTION_METERING EQUAL 1) ++ message (" Instruction metering enabled") ++ add_definitions (-DWASM_ENABLE_INSTRUCTION_METERING=1) ++endif () + + ######################################## + # Show Phase4 Wasm proposals status. +diff --git a/core/config.h b/core/config.h +index cb1189c9..a4e1499e 100644 +--- a/core/config.h ++++ b/core/config.h +@@ -716,4 +716,8 @@ unless used elsewhere */ + #define WASM_ENABLE_AOT_VALIDATOR 0 + #endif + ++#ifndef WASM_ENABLE_INSTRUCTION_METERING ++#define WASM_ENABLE_INSTRUCTION_METERING 0 ++#endif ++ + #endif /* end of _CONFIG_H_ */ +diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c +index 269ec577..bc6fd01b 100644 +--- a/core/iwasm/common/wasm_c_api.c ++++ b/core/iwasm/common/wasm_c_api.c +@@ -5389,3 +5389,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, + return -1.0; + #endif + } ++ ++wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*instance) ++{ ++ return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); ++} +diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c +index e33fd9f3..d1ff9c41 100644 +--- a/core/iwasm/common/wasm_exec_env.c ++++ b/core/iwasm/common/wasm_exec_env.c +@@ -85,6 +85,12 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, + wasm_runtime_dump_exec_env_mem_consumption(exec_env); + #endif + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ exec_env->instructions_to_execute = -1; ++ for(int i = 0; i < 256; ++i) ++ exec_env->instructions_schedule[i] = 1; ++#endif ++ + return exec_env; + + #ifdef OS_ENABLE_HW_BOUND_CHECK +diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h +index ce0c1fa7..2713a092 100644 +--- a/core/iwasm/common/wasm_exec_env.h ++++ b/core/iwasm/common/wasm_exec_env.h +@@ -87,6 +87,12 @@ typedef struct WASMExecEnv { + uint8 *bottom; + } wasm_stack; + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ /* instructions to execute */ ++ int64 instructions_to_execute; ++ int64 instructions_schedule[256]; ++#endif ++ + #if WASM_ENABLE_FAST_JIT != 0 + /** + * Cache for +diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c +index d33c0272..900fb536 100644 +--- a/core/iwasm/common/wasm_runtime_common.c ++++ b/core/iwasm/common/wasm_runtime_common.c +@@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() + } + #endif + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ ++void ++wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, ++ int64 instructions_to_execute) ++{ ++ exec_env->instructions_to_execute = instructions_to_execute; ++} ++ ++int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) ++{ ++ return exec_env->instructions_to_execute; ++} ++ ++void ++wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, ++ int64 const *instructions_schedule) ++{ ++ for(int i = 0; i < 256; ++i) ++ exec_env->instructions_schedule[i] = instructions_schedule[i]; ++} ++ ++#endif ++ + WASMFuncType * + wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, + uint32 module_type) +@@ -7803,7 +7828,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; + boundary = boundary + page_size * guard_page_count; + #endif +- if ((uint8 *)&boundary < boundary) { ++ if (((uint8 *)&boundary < boundary) && ((uint8 *)&boundary > exec_env->native_stack_boundary)){ + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), + "native stack overflow"); + return false; +diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h +index 8ac032bf..5ca5d489 100644 +--- a/core/iwasm/common/wasm_runtime_common.h ++++ b/core/iwasm/common/wasm_runtime_common.h +@@ -791,9 +791,25 @@ WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, + uint8 *native_stack_boundary); + +-#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ + /* See wasm_export.h for description */ + WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, ++ int64 instructions_to_execute); ++WASM_RUNTIME_API_EXTERN int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, ++ int64 const *instructions_schedule); ++ ++#endif ++ ++#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 ++/* See wasm_export.h for description */ ++WASM_RUNTIME_API_EXTERN ++void + wasm_runtime_set_bounds_checks(WASMModuleInstanceCommon *module_inst, + bool enable); + +diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h +index 241a0eec..82e048c0 100644 +--- a/core/iwasm/include/wasm_c_api.h ++++ b/core/iwasm/include/wasm_c_api.h +@@ -701,6 +701,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); + // func_name. If the function is not found, return 0. + WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); + ++struct WASMExecEnv; ++typedef struct WASMExecEnv *wasm_exec_env_t; ++ ++WASM_API_EXTERN wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*); ++ + /////////////////////////////////////////////////////////////////////////////// + // Convenience + +diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h +index b73a0364..f7e20b24 100644 +--- a/core/iwasm/include/wasm_export.h ++++ b/core/iwasm/include/wasm_export.h +@@ -1821,6 +1821,27 @@ WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, + uint8_t *native_stack_boundary); + ++/** ++ * Set the instruction count limit to the execution environment. ++ * By default the instruction count limit is -1, which means no limit. ++ * However, if the instruction count limit is set to a positive value, ++ * the execution will be terminated when the instruction count reaches ++ * the limit. ++ * ++ * @param exec_env the execution environment ++ * @param instruction_count the instruction count limit ++ */ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, ++ int64_t instruction_count); ++ ++WASM_RUNTIME_API_EXTERN int64_t ++wasm_runtime_get_instruction_count_limit(wasm_exec_env_t exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, ++ int64_t const *instructions_schedule); ++ + /** + * Dump runtime memory consumption, including: + * Exec env memory consumption +diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c +index 41ac4c72..1aa1fe1c 100644 +--- a/core/iwasm/interpreter/wasm_interp_classic.c ++++ b/core/iwasm/interpreter/wasm_interp_classic.c +@@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, + } \ + os_mutex_unlock(&exec_env->wait_lock); \ + } \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *handle_table[*frame_ip++]; \ + } while (0) + #else +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ FETCH_OPCODE_AND_DISPATCH() + #endif + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ +@@ -1542,9 +1545,12 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, + } \ + os_mutex_unlock(&exec_env->wait_lock); \ + } \ ++ CHECK_INSTRUCTION_LIMIT(); \ + continue; + #else +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue; + #endif + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ +@@ -1562,6 +1568,18 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #endif + } + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute == 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ else if (instructions_to_execute > 0) \ ++ instructions_to_execute--; ++#else ++#define CHECK_INSTRUCTION_LIMIT() (void)0 ++#endif ++ + static void + wasm_interp_call_func_bytecode(WASMModuleInstance *module, + WASMExecEnv *exec_env, +@@ -1605,6 +1623,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint32 local_idx, local_offset, global_idx; + uint8 local_type, *global_addr; + uint32 cache_index, type_index, param_cell_num, cell_num; ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ int64 instructions_to_execute = -1; ++ if(exec_env) ++ instructions_to_execute = exec_env->instructions_to_execute; ++#endif ++ + #if WASM_ENABLE_EXCE_HANDLING != 0 + int32_t exception_tag_index; + #endif +@@ -6859,6 +6884,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + if (!prev_frame->ip) { + /* Called from native. */ + return; +@@ -6899,6 +6929,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + #endif + SYNC_ALL_TO_FRAME(); ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c +index f33ad60e..a7078fe8 100644 +--- a/core/iwasm/interpreter/wasm_interp_fast.c ++++ b/core/iwasm/interpreter/wasm_interp_fast.c +@@ -105,6 +105,20 @@ typedef float64 CellType_F64; + goto unaligned_atomic; \ + } while (0) + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) \ ++ { \ ++ instructions_to_execute -= instructions_schedule[opc]; \ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } ++#else ++#define CHECK_INSTRUCTION_LIMIT() (void)0 ++#endif ++ + static inline uint32 + rotl32(uint32 n, uint32 c) + { +@@ -1439,8 +1453,10 @@ wasm_interp_dump_op_count() + #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 + #define FETCH_OPCODE_AND_DISPATCH() \ + do { \ ++ const uint64 opc = *frame_ip; \ + const void *p_label_addr = *(void **)frame_ip; \ + frame_ip += sizeof(void *); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1450,8 +1466,10 @@ wasm_interp_dump_op_count() + const void *p_label_addr; \ + bh_assert(((uintptr_t)frame_ip & 1) == 0); \ + /* int32 relative offset was emitted in 64-bit target */ \ ++ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ + p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1460,8 +1478,10 @@ wasm_interp_dump_op_count() + const void *p_label_addr; \ + bh_assert(((uintptr_t)frame_ip & 1) == 0); \ + /* uint32 label address was emitted in 32-bit target */ \ ++ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ + p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #endif +@@ -1538,6 +1558,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint8 *maddr = NULL; + uint32 local_idx, local_offset, global_idx; + uint8 opcode = 0, local_type, *global_addr; ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ int64 instructions_to_execute = -1; ++ int64 const *instructions_schedule = NULL; ++ if(exec_env) ++ { ++ instructions_to_execute = exec_env->instructions_to_execute; ++ instructions_schedule = exec_env->instructions_schedule; ++ } ++#endif ++ + #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ + || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 + #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 +@@ -7761,6 +7792,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + if (!prev_frame->ip) + /* Called from native. */ + return; +@@ -7789,6 +7825,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + + got_exception: + SYNC_ALL_TO_FRAME(); ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/doc/build_wamr.md b/doc/build_wamr.md +index 6425450b..94dd9628 100644 +--- a/doc/build_wamr.md ++++ b/doc/build_wamr.md +@@ -327,6 +327,10 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared + - **WAMR_BUILD_SHRUNK_MEMORY**=1/0, default to enable if not set + > Note: When enabled, this feature will reduce memory usage by decreasing the size of the linear memory, particularly when the `memory.grow` opcode is not used and memory usage is somewhat predictable. + ++## **Instruction metering** ++- **WAMR_BUILD_INSTRUCTION_METERING**=1/0, default to disable if not set ++> Note: Enabling this feature allows limiting the number of instructions a wasm module instance can execute. Use the `wasm_runtime_set_instruction_count_limit(...)` API before calling `wasm_runtime_call_*(...)` APIs to enforce this limit. ++ + ## **Combination of configurations:** + + We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6b25da63631..75467fc7c81 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -19,6 +19,7 @@ #include +#include #include #include @@ -1921,12 +1922,12 @@ struct Escrow_test : public beast::unit_test::suite { // not enough gas - // This function takes 110 gas + // This function takes 4 gas // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 108; + auto const finishFee = env.current()->fees().base + 4; env(finish(carol, alice, seq), fee(finishFee), - comp_allowance(108), + comp_allowance(2), ter(tecFAILED_PROCESSING)); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index ce8d836269c..a46d71a5699 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -21,105 +21,21 @@ #include -#include - -#include +#include namespace ripple { namespace test { /* Host function body definition. */ -WasmEdge_Result -Add(void* Data, - const WasmEdge_CallingFrameContext* CallFrameCxt, - const WasmEdge_Value* In, - WasmEdge_Value* Out) +using Add_proto = int32_t(int32_t, int32_t); +wasm_trap_t* +Add(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) { - int32_t Val1 = WasmEdge_ValueGetI32(In[0]); - int32_t Val2 = WasmEdge_ValueGetI32(In[1]); + int32_t Val1 = params->data[0].of.i32; + int32_t Val2 = params->data[1].of.i32; // printf("Host function \"Add\": %d + %d\n", Val1, Val2); - Out[0] = WasmEdge_ValueGenI32(Val1 + Val2); - return WasmEdge_Result_Success; -} - -void -invokeAdd() -{ - /* Create the VM context. */ - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - // clang-format off - /* The WASM module buffer. */ - uint8_t WASM[] = {/* WASM header */ - 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, - /* Type section */ - 0x01, 0x07, 0x01, - /* function type {i32, i32} -> {i32} */ - 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, - /* Import section */ - 0x02, 0x13, 0x01, - /* module name: "extern" */ - 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, - /* extern name: "func-add" */ - 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, - /* import desc: func 0 */ - 0x00, 0x00, - /* Function section */ - 0x03, 0x02, 0x01, 0x00, - /* Export section */ - 0x07, 0x0A, 0x01, - /* export name: "addTwo" */ - 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, - /* export desc: func 0 */ - 0x00, 0x01, - /* Code section */ - 0x0A, 0x0A, 0x01, - /* code body */ - 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; - // clang-format on - - /* Create the module instance. */ - WasmEdge_String ExportName = WasmEdge_StringCreateByCString("extern"); - WasmEdge_ModuleInstanceContext* HostModCxt = - WasmEdge_ModuleInstanceCreate(ExportName); - WasmEdge_ValType ParamList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(ParamList, 2, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate(HostFType, Add, NULL, 0); - WasmEdge_FunctionTypeDelete(HostFType); - WasmEdge_String HostFuncName = WasmEdge_StringCreateByCString("func-add"); - WasmEdge_ModuleInstanceAddFunction(HostModCxt, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); - - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostModCxt); - - /* The parameters and returns arrays. */ - WasmEdge_Value Params[2] = { - WasmEdge_ValueGenI32(1234), WasmEdge_ValueGenI32(5678)}; - WasmEdge_Value Returns[1]; - /* Function name. */ - WasmEdge_String FuncName = WasmEdge_StringCreateByCString("addTwo"); - /* Run the WASM function from buffer. */ - WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( - VMCxt, WASM, sizeof(WASM), FuncName, Params, 2, Returns, 1); - - if (WasmEdge_ResultOK(Res)) - { - // printf("invokeAdd get the result: %d\n", - // WasmEdge_ValueGetI32(Returns[0])); - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); - } - - /* Resources deallocations. */ - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - WasmEdge_ModuleInstanceDelete(HostModCxt); + results->data[0] = WASM_I32_VAL(Val1 + Val2); + return nullptr; } struct Wasm_test : public beast::unit_test::suite @@ -128,8 +44,46 @@ struct Wasm_test : public beast::unit_test::suite testWasmtimeLib() { testcase("wasmtime lib test"); - invokeAdd(); - BEAST_EXPECT(true); + // clang-format off + /* The WASM module buffer. */ + wbytes const wasm = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + auto& vm = WasmEngine::instance(); + + std::vector imports; + WasmImpFunc( + imports, "func-add", reinterpret_cast(&Add)); + + auto res = vm.run(wasm, "addTwo", imports, wasmParams(1234, 5678)); + + // if (res) printf("invokeAdd get the result: %d\n", res.value()); + + BEAST_EXPECT(res.has_value() && res.value() == 6912); } void @@ -1412,9 +1366,9 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(&env); std::string funcName("ready"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); - BEAST_EXPECT(re.error()); - std::cout << "bad case (more than MAX_PAGES) result " << re.error() - << std::endl; + if (BEAST_EXPECT(!re)) + std::cout << "bad case (more than MAX_PAGES) result " + << re.error() << std::endl; } { // fail because recursion too deep @@ -2143,9 +2097,9 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions nfs(&env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); - BEAST_EXPECT(re.error()); - std::cout << "bad case (deep recursion) result " << re.error() - << std::endl; + if (BEAST_EXPECT(re.error())) + std::cout << "bad case (deep recursion) result " << re.error() + << std::endl; } } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp new file mode 100644 index 00000000000..a92d8e463e4 --- /dev/null +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -0,0 +1,754 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +namespace ripple { + +////////////////////////////////////////////////////////////////////////////////////////// + +namespace { + +static void +print_wasm_error(const char* message, wasm_trap_t* trap) +{ + fprintf(stderr, "WAMR error: %s\n", message); + wasm_byte_vec_t error_message; + + if (trap) + { + wasm_trap_message(trap, &error_message); + wasm_trap_delete(trap); + fprintf( + stderr, + "WAMR trap: %.*s\n", + (int)error_message.size, + error_message.data); + wasm_byte_vec_delete(&error_message); + } +} + +} // namespace + +InstancePtr +InstanceWrapper::init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports) +{ + wasm_trap_t* trap = nullptr; + InstantiationArgs inst_args{ + 128 * 1024, + 256 * 1024, + static_cast(maxPages > 0 ? maxPages : 0)}; + + InstancePtr mi = InstancePtr( + wasm_instance_new_with_args_ex(s, m, &imports, &trap, &inst_args), + &wasm_instance_delete); + + if (!mi || trap) + { + print_wasm_error("can't create instance", trap); + throw std::runtime_error("WAMR: can't create instance"); + } + wasm_instance_exports(mi.get(), expt); + return mi; +} + +InstanceWrapper::InstanceWrapper() + : exports{0, nullptr, 0, 0, nullptr} + , mod_inst(nullptr, &wasm_instance_delete) +{ +} + +InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) + : exports{0, nullptr, 0, 0, nullptr} + , mod_inst(nullptr, &wasm_instance_delete) +{ + *this = std::move(o); +} + +InstanceWrapper& +InstanceWrapper::operator=(InstanceWrapper&& o) +{ + if (this == &o) + return *this; + + if (exports.size) + wasm_extern_vec_delete(&exports); + exports = o.exports; + o.exports = {0, nullptr, 0, 0, nullptr}; + + mod_inst = std::move(o.mod_inst); + + return *this; +} + +InstanceWrapper::InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t const& imports) + : exports WASM_EMPTY_VEC, mod_inst(init(s, m, maxPages, &exports, imports)) +{ +} + +InstanceWrapper::~InstanceWrapper() +{ + if (exports.size) + wasm_extern_vec_delete(&exports); +} + +InstanceWrapper::operator bool() const +{ + return static_cast(mod_inst); +} + +wasm_func_t* +InstanceWrapper::getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const +{ + wasm_func_t* f = nullptr; + + if (!export_types.size) + throw std::runtime_error("WAMR: no export"); + if (export_types.size != exports.size) + throw std::runtime_error("WAMR: invalid export"); + + for (unsigned i = 0; i < export_types.size; ++i) + { + auto const* exp_type(export_types.data[i]); + + wasm_name_t const* name = wasm_exporttype_name(exp_type); + const wasm_externtype_t* exn_type = wasm_exporttype_type(exp_type); + if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC) + { + if (funcName == std::string_view(name->data, name->size - 1)) + { + auto* exn(exports.data[i]); + if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) + throw std::runtime_error("WAMR: invalid export"); + + f = wasm_extern_as_func(exn); + break; + } + } + } + + if (!f) + throw std::runtime_error( + "WAMR: can't find function " + std::string(funcName)); + + return f; +} + +wmem +InstanceWrapper::getMem() const +{ + wasm_memory_t* mem = nullptr; + for (unsigned i = 0; i < exports.size; ++i) + { + auto* e(exports.data[i]); + if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) + { + mem = wasm_extern_as_memory(e); + break; + } + } + + if (!mem) + throw std::runtime_error("WAMR: no memory exported"); + + return { + reinterpret_cast(wasm_memory_data(mem)), + wasm_memory_data_size(mem)}; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ModulePtr +ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) +{ + wasm_byte_vec_t const code{ + wasmBin.size(), + (char*)(wasmBin.data()), + wasmBin.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + return m; +} + +ModuleWrapper::ModuleWrapper() + : module(nullptr, &wasm_module_delete) + , export_types{0, nullptr, 0, 0, nullptr} +{ +} + +ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) + : module(nullptr, &wasm_module_delete) + , export_types{0, nullptr, 0, 0, nullptr} +{ + *this = std::move(o); +} + +ModuleWrapper& +ModuleWrapper::operator=(ModuleWrapper&& o) +{ + if (this == &o) + return *this; + + module = std::move(o.module); + mod_inst = std::move(o.mod_inst); + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); + export_types = o.export_types; + o.export_types = {0, nullptr, 0, 0, nullptr}; + exec_env = o.exec_env; + o.exec_env = nullptr; + return *this; +} + +ModuleWrapper::ModuleWrapper( + wasm_store_t* s, + wbytes const& wasmBin, + bool instantiate, + int32_t maxPages, + std::vector const& imports) + : module(init(s, wasmBin)), export_types{0, nullptr, 0, 0, nullptr} +{ + if (!module) + throw std::runtime_error("WAMR: can't create module"); + + wasm_module_exports(module.get(), &export_types); + if (instantiate) + { + auto wimports = buildImports(s, imports); + addInstance(s, maxPages, wimports); + } +} + +ModuleWrapper::~ModuleWrapper() +{ + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); +} + +ModuleWrapper::operator bool() const +{ + return mod_inst; +} + +void +ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + auto const paramSize = imp.params.size(); + + if (paramSize) + { + wasm_valtype_vec_new(&v, paramSize, nullptr); + v.num_elems = paramSize; + } + else + v = WASM_EMPTY_VEC; + for (unsigned i = 0; i < paramSize; ++i) + { + auto const vt = imp.params[i]; + switch (vt) + { + case WT_I32: + v.data[i] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[i] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[i] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[i] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("Invalid import type"); + } + } +} + +void +ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + if (imp.result) + { + wasm_valtype_vec_new(&v, 1, nullptr); + v.num_elems = 1; + switch (*imp.result) + { + case WT_I32: + v.data[0] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[0] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[0] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[0] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("Invalid return type"); + } + } + else + v = WASM_EMPTY_VEC; +} + +wasm_extern_vec_t +ModuleWrapper::buildImports( + wasm_store_t* s, + std::vector const& imports) +{ + wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; + wasm_module_imports(module.get(), &importTypes); + std:: + unique_ptr + itDeleter(&importTypes, &wasm_importtype_vec_delete); + + wasm_extern_vec_t wimports = WASM_EMPTY_VEC; + if (!importTypes.num_elems) + return wimports; + + wasm_extern_vec_new(&wimports, importTypes.size, nullptr); + wimports.num_elems = importTypes.num_elems; + + for (unsigned i = 0; i < importTypes.num_elems; ++i) + { + wasm_importtype_t const* importtype = importTypes.data[i]; + if (wasm_importtype_is_linked(importtype)) + { + // create a placeholder + wimports.data[i] = wasm_extern_new_empty( + s, wasm_externtype_kind(wasm_importtype_type(importtype))); + continue; + } + + // wasm_name_t const* mn = wasm_importtype_module(importtype); + // auto modName = std::string_view(mn->data, mn->num_elems - 1); + wasm_name_t const* fn = wasm_importtype_name(importtype); + auto fieldName = std::string_view(fn->data, fn->num_elems - 1); + + // for multi-module support + // if ((W_ENV != modName) && (W_HOST_LIB != modName)) + // continue; + + for (auto const& imp : imports) + { + if (imp.name != fieldName) + continue; + + wasm_valtype_vec_t params, results; + makeImpReturn(results, imp); + makeImpParams(params, imp); + + using ftype_ptr = std:: + unique_ptr; + ftype_ptr ftype( + wasm_functype_new(¶ms, &results), &wasm_functype_delete); + wasm_func_t* func = wasm_func_new_with_env( + s, + ftype.get(), + reinterpret_cast(imp.wrap), + imp.udata, + nullptr); + + wimports.data[i] = wasm_func_as_extern(func); + break; + } + } + + return wimports; +} + +wasm_func_t* +ModuleWrapper::getFunc(std::string_view funcName) const +{ + return mod_inst.getFunc(funcName, export_types); +} + +wmem +ModuleWrapper::getMem() const +{ + return mod_inst.getMem(); +} + +int +ModuleWrapper::addInstance( + wasm_store_t* s, + int32_t maxPages, + wasm_extern_vec_t const& imports) +{ + mod_inst = {s, module.get(), maxPages, imports}; + exec_env = wasm_instance_exec_env(mod_inst.mod_inst.get()); + + return 0; +} + +// int +// my_module_t::delInstance(int i) +// { +// if (i >= mod_inst.size()) +// return -1; +// if (!mod_inst[i]) +// mod_inst[i] = my_mod_inst_t(); +// return i; +// } + +std::int64_t +ModuleWrapper::setGas(std::int64_t gas) +{ + if (exec_env) + { + wasm_runtime_set_instruction_count_limit(exec_env, gas); + return gas; + } + return 0; +} + +std::int64_t +ModuleWrapper::getGas() +{ + return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// void +// WamrEngine::clearModules() +// { +// modules.clear(); +// store.reset(); // to free the memory before creating new store +// store = {wasm_store_new(engine.get()), &wasm_store_delete}; +// } + +WamrEngine::WamrEngine() + : engine(wasm_engine_new(), &wasm_engine_delete) + , store(nullptr, &wasm_store_delete) +{ + wasm_runtime_set_default_running_mode(Mode_Interp); + wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); + // wasm_runtime_set_log_level(WASM_LOG_LEVEL_VERBOSE); +} + +int +WamrEngine::addModule( + wbytes const& wasmCode, + bool instantiate, + std::vector const& imports) +{ + module.reset(); + store.reset(); // to free the memory before creating new store + store = {wasm_store_new(engine.get()), &wasm_store_delete}; + module = std::make_unique( + store.get(), wasmCode, instantiate, defMaxPages, imports); + setGas(defGas); + return module ? 0 : -1; +} + +int +WamrEngine::addInstance() +{ + return module->addInstance(store.get(), defMaxPages); +} + +wasm_func_t* +WamrEngine::getFunc(std::string_view funcName) +{ + return module->getFunc(funcName); +} + +std::vector +WamrEngine::convertParams(std::vector const& params) +{ + std::vector v; + v.reserve(params.size()); + for (auto const& p : params) + { + switch (p.type) + { + case WT_I32: + v.push_back(WASM_I32_VAL(p.of.i32)); + break; + case WT_I64: + v.push_back(WASM_I64_VAL(p.of.i64)); + break; + case WT_F32: + v.push_back(WASM_F32_VAL(p.of.f32)); + break; + case WT_F64: + v.push_back(WASM_F64_VAL(p.of.f64)); + break; + default: + break; + } + } + + return v; +} + +void +WamrEngine::add_param(std::vector& in, int32_t p) +{ + in.emplace_back(); + auto& el(in.back()); + memset(&el, 0, sizeof(el)); + el = WASM_I32_VAL(p); // WASM_I32; +} + +void +WamrEngine::add_param(std::vector& in, int64_t p) +{ + in.emplace_back(); + auto& el(in.back()); + el = WASM_I64_VAL(p); +} + +template +WamrResult +WamrEngine::call(std::string_view func, Types... args) +{ + // Lookup our export function + auto* f = getFunc(func); + return call(f, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(wasm_func_t* func, Types... args) +{ + std::vector in; + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(wasm_func_t* func, std::vector& in) +{ + // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; + WamrResult ret(NR); + // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // + // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } + + wasm_val_vec_t const inv = in.empty() + ? wasm_val_vec_t WASM_EMPTY_VEC + : wasm_val_vec_t{ + in.size(), + in.data(), + in.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + trap = wasm_func_call(func, &inv, &ret.r); + if (trap) + print_wasm_error("failed to call func", trap); + + // assert(results[0].kind == WASM_I32); + // if (NR) printf("Result P5: %d\n", ret[0].of.i32); + + return ret; +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + std::int32_t p, + Types... args) +{ + add_param(in, p); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + + std::vector& in, + std::int64_t p, + Types... args) +{ + add_param(in, p); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types... args) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + + if (trap || (res.r.data[0].kind != WASM_I32)) + return {}; + auto const ptr = res.r.data[0].of.i32; + if (!ptr) + throw std::runtime_error( + "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); + + auto mem = getMem(); + memcpy(mem.p + ptr, d, sz); + + add_param(in, ptr); + add_param(in, static_cast(sz)); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + wbytes const& p, + Types... args) +{ + return call(func, in, p.data(), p.size(), std::forward(args)...); +} + +Expected +WamrEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + try + { + return runHlp(wasmCode, funcName, imports, params); + } + catch (std::exception const&) + { + } + catch (...) + { + } + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +WamrEngine::runHlp( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + // Create and instantiate the module. + if (!wasmCode.empty()) + { + int const m = addModule(wasmCode, true, imports); + if (m < 0) + return Unexpected(tecFAILED_PROCESSING); + } + + if (!module) + return Unexpected(tecFAILED_PROCESSING); + + // Call main + auto* f = getFunc(!funcName.empty() ? funcName : "_start"); + auto p = convertParams(params); + auto res = call<1>(f, p); + if (!res.r.size || trap) + return Unexpected(tecFAILED_PROCESSING); + + assert(res.r.data[0].kind == WASM_I32); + // printf("Result: %d\n", results[0].of.i32); + // return res.r.data[0].of.i32 != 0; + return res.r.data[0].of.i32; +} + +std::int64_t +WamrEngine::initGas(std::int64_t def) +{ + defGas = def; + return def; +} + +std::int32_t +WamrEngine::initMaxPages(std::int32_t def) +{ + defMaxPages = def; + return def; +} + +std::int64_t +WamrEngine::setGas(std::int64_t gas) +{ + if (module) + { + module->setGas(gas); + return gas; + } + return 0; +} + +std::int64_t +WamrEngine::getGas() +{ + return module ? module->getGas() : 0; +} + +wmem +WamrEngine::getMem() const +{ + return module ? module->getMem() : wmem(); +} + +int32_t +WamrEngine::allocate(int32_t sz) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + if (trap || (res.r.data[0].kind != WASM_I32)) + return {}; + auto const ptr = res.r.data[0].of.i32; + if (!ptr) + throw std::runtime_error( + "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); + return ptr; +} + +wasm_trap_t* +WamrEngine::newTrap(std::string_view txt) +{ + wasm_message_t msg = WASM_EMPTY_VEC; + + if (!txt.empty()) + wasm_name_new(&msg, txt.size(), txt.data()); + + return wasm_trap_new(store.get(), &msg); +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h new file mode 100644 index 00000000000..113fcf88866 --- /dev/null +++ b/src/xrpld/app/misc/WamrVM.h @@ -0,0 +1,264 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include + +namespace ripple { + +// clang-format off + +struct WamrResult +{ + wasm_val_vec_t r; + WamrResult(unsigned N = 0):r{0, nullptr, 0, 0, nullptr} {if (N) wasm_val_vec_new_uninitialized(&r, N);} + ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } + WamrResult(WamrResult const &) = delete; + WamrResult& operator=(WamrResult const &) = delete; + + WamrResult(WamrResult &&o) {*this = std::move(o);} + WamrResult& operator=(WamrResult &&o){r = o.r; o.r = {0, nullptr, 0, 0, nullptr}; return *this;} + //operator wasm_val_vec_t &() {return r;} +}; + +using ModulePtr = std::unique_ptr; +using InstancePtr = std::unique_ptr; + +// clang-format on + +struct InstanceWrapper +{ + wasm_extern_vec_t exports; + InstancePtr mod_inst; + +private: + static InstancePtr + init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + +public: + InstanceWrapper(); + + InstanceWrapper(InstanceWrapper&& o); + + InstanceWrapper& + operator=(InstanceWrapper&& o); + + InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + ~InstanceWrapper(); + + operator bool() const; + + wasm_func_t* + getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const; + + wmem + getMem() const; +}; + +struct ModuleWrapper +{ + ModulePtr module; + wasm_exec_env_t exec_env = nullptr; + InstanceWrapper mod_inst; + wasm_exporttype_vec_t export_types; + +private: + static ModulePtr + init(wasm_store_t* s, wbytes const& wasmBin); + +public: + ModuleWrapper(); + ModuleWrapper(ModuleWrapper&& o); + ModuleWrapper& + operator=(ModuleWrapper&& o); + ModuleWrapper( + wasm_store_t* s, + wbytes const& wasmBin, + bool instantiate, + int32_t maxPages, + std::vector const& imports = {}); + ~ModuleWrapper(); + + operator bool() const; + + wasm_func_t* + getFunc(std::string_view funcName) const; + wmem + getMem() const; + + int + addInstance( + wasm_store_t* s, + int32_t maxPages, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + std::int64_t + setGas(std::int64_t gas); + + std::int64_t + getGas(); + +private: + static void + makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + static void + makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + wasm_extern_vec_t + buildImports(wasm_store_t* s, std::vector const& imports); +}; + +class WamrEngine +{ + std::unique_ptr engine; + std::unique_ptr store; + std::unique_ptr module; + wasm_trap_t* trap = nullptr; + std::int64_t defGas = -1; + std::int32_t defMaxPages = -1; + +public: + WamrEngine(); + ~WamrEngine() = default; + + Expected + run(wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params); + + std::int64_t + initGas(std::int64_t def); + + std::int64_t + setGas(std::int64_t gas); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + getGas(); + + // Host functions helper functionality + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + wasm_trap_t* + newTrap(std::string_view msg); + +private: + Expected + runHlp( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params); + + int + addModule( + wbytes const& wasmCode, + bool instantiate, + std::vector const& imports); + void + clearModules(); + int + addInstance(); + int32_t + runFunc(std::string_view const funcName, int32_t p); + + int32_t + makeModule( + wbytes const& wasmCode, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + wasm_func_t* + getFunc(std::string_view funcName); + + std::vector + convertParams(std::vector const& params); + + void + add_param(std::vector& in, int32_t p); + void + add_param(std::vector& in, int64_t p); + + template + inline WamrResult + call(std::string_view func, Types... args); + + template + inline WamrResult + call(wasm_func_t* func, Types... args); + + template + inline WamrResult + call(wasm_func_t* f, std::vector& in); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + std::int32_t p, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + std::int64_t p, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + wbytes const& p, + Types... args); +}; + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index aa42f79ff6b..e1943244e70 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -19,14 +19,12 @@ #ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED #define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED +#include +#include + #include #include -#include "xrpl/basics/base_uint.h" -#include "xrpld/app/misc/WasmVM.h" -#include "xrpld/app/tx/detail/ApplyContext.h" -#include - namespace ripple { class WasmHostFunctionsImpl : public HostFunctions { diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp new file mode 100644 index 00000000000..d893a938890 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -0,0 +1,392 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include + +namespace ripple { + +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + int32_t const sqn = hf->getLedgerSqn(); + results->data[0] = WASM_I32_VAL(sqn); + + return nullptr; +} + +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + int32_t const ltime = hf->getParentLedgerTime(); + results->data[0] = WASM_I32_VAL(ltime); + return nullptr; +} + +static Expected +getParameterData(wasm_val_vec_t const* params, size_t index) +{ + auto& vm = WasmEngine::instance(); + auto fnameOffset = params->data[index].of.i32; + auto fnameLen = params->data[index + 1].of.i32; + auto mem = vm.getMem(); + if (!mem.s) + return Unexpected("No memory exported"); + + if (mem.s <= fnameOffset + fnameLen) + return Unexpected("Memory access failed"); + Bytes fname(mem.p + fnameOffset, mem.p + fnameOffset + fnameLen); + return fname; +} + +static Expected +getFieldName(wasm_val_vec_t const* params, size_t index) +{ + auto const dataRes = getParameterData(params, index); + if (dataRes) + { + return std::string(dataRes->begin(), dataRes->end()); + } + else + { + auto& vm = WasmEngine::instance(); + return Unexpected( + reinterpret_cast(vm.newTrap(dataRes.error()))); + } +} + +static Expected +setData(Bytes const& data) +{ + auto& vm = WasmEngine::instance(); + auto mem = vm.getMem(); + if (!mem.s) + return Unexpected("No memory exported"); + + int32_t const dataLen = static_cast(data.size()); + int32_t const dataPtr = vm.allocate(dataLen); + if (!dataPtr) + return Unexpected("Allocation error"); + memcpy(mem.p + dataPtr, data.data(), dataLen); + + auto retPtr = vm.allocate(8); + if (!retPtr) + return Unexpected("Allocation error"); + int32_t* retData = reinterpret_cast(mem.p + retPtr); + retData[0] = dataPtr; + retData[1] = dataLen; + + return retPtr; +} + +wasm_trap_t* +getTxField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getFieldName(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = hf->getTxField(fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap("Field not found")); + + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + int32_t const type = params->data[0].of.i32; + auto lkData = getParameterData(params, 1); + if (!lkData) + return reinterpret_cast(vm.newTrap()); + + auto fname = getFieldName(params, 3); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = + hf->getLedgerEntryField(type, lkData.value(), fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap()); + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getCurrentLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getFieldName(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = hf->getCurrentLedgerEntryField(fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getNFT_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto nftId = getFieldName(params, 2); + if (!nftId) + return reinterpret_cast(vm.newTrap()); + + auto nftURI = hf->getNFT(account.value(), nftId.value()); + if (!nftURI) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(nftURI.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +accountKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto keylet = hf->accountKeylet(account.value()); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +credentialKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto subject = getFieldName(params, 0); + if (!subject) + return reinterpret_cast(vm.newTrap()); + + auto issuer = getFieldName(params, 2); + if (!issuer) + return reinterpret_cast(vm.newTrap()); + + auto credentialType = getFieldName(params, 4); + if (!credentialType) + return reinterpret_cast(vm.newTrap()); + + auto keylet = hf->credentialKeylet( + subject.value(), issuer.value(), credentialType.value()); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +escrowKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + int32_t const sequence = params->data[2].of.i32; + + auto keylet = hf->escrowKeylet(account.value(), sequence); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +oracleKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto documentId = params->data[2].of.i32; + + auto keylet = hf->escrowKeylet(account.value(), documentId); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +updateData_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getParameterData(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + if (!hf->updateData(fname.value())) + return reinterpret_cast(vm.newTrap()); + + return nullptr; +} + +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getParameterData(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto hres = hf->computeSha512HalfHash(fname.value()); + Bytes digest{hres.begin(), hres.end()}; + auto pointer = setData(digest); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32(32); + return nullptr; +} + +wasm_trap_t* +print_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + // auto* hf = reinterpret_cast(env); + + auto f = getParameterData(params, 0); + if (!f) + return reinterpret_cast(vm.newTrap()); + std::string s(f->begin(), f->end()); + if (s.size() < 4096) + std::cout << s << std::endl; + return nullptr; +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h new file mode 100644 index 00000000000..c3f5bb11a97 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +namespace ripple { + +using getLedgerSqn_proto = int32_t(); +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getParentLedgerTime_proto = int32_t(); +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxField_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +getTxField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getLedgerEntryField_proto = + uint32_t*(int32_t, uint8_t const*, int32_t, char const*, int32_t); +wasm_trap_t* +getLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getCurrentLedgerEntryField_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +getCurrentLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getNFT_proto = uint32_t*(char const*, int32_t, char const*, int32_t); +wasm_trap_t* +getNFT_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results); + +using accountKeylet_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +accountKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using credentialKeylet_proto = + uint32_t*(char const*, int32_t, char const*, int32_t, char const*, int32_t); +wasm_trap_t* +credentialKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using escrowKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +wasm_trap_t* +escrowKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using oracleKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +wasm_trap_t* +oracleKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using updateData_proto = void(uint8_t const*, int32_t); +wasm_trap_t* +updateData_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using computeSha512HalfHash_proto = uint32_t*(uint8_t const*, int32_t); +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using print_proto = void(char const*, int32_t); +wasm_trap_t* +print_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results); + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 1764734db36..d786cae7fbe 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -17,730 +17,118 @@ */ //============================================================================== -#include +#include +#include -#include "xrpl/protocol/AccountID.h" -#include "xrpl/protocol/LedgerFormats.h" +#include +#include -namespace ripple { +#include -WasmEdge_Result -getLedgerSqn( - void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value*, - WasmEdge_Value* out) -{ - out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getParentLedgerTime( - void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value*, - WasmEdge_Value* out) -{ - out[0] = - WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); - return WasmEdge_Result_Success; -} +namespace ripple { -Expected -getParameterData( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) +Expected +runEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + HostFunctions* hfs, + uint64_t gasLimit) { - auto fnameOffset = (uint32_t)WasmEdge_ValueGetI32(in[index]); - auto fnameLen = (uint32_t)WasmEdge_ValueGetI32(in[index + 1]); - Bytes fname(fnameLen, char{0}); - WasmEdge_MemoryInstanceContext* mem = - WasmEdge_CallingFrameGetMemoryInstance(fm, 0); - WasmEdge_Result Res = WasmEdge_MemoryInstanceGetData( - mem, (uint8_t*)(fname.data()), fnameOffset, fnameLen); - if (WasmEdge_ResultOK(Res)) - { - return fname; - } - else - { - return Unexpected(Res); - } -} + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initGas(gasLimit); + vm.initMaxPages(MAX_PAGES); -Expected -getFieldName( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) -{ - auto dataRes = getParameterData(fm, in, index); - if (dataRes) - { - return std::string(dataRes.value().begin(), dataRes->end()); - } - else - { - return Unexpected(dataRes.error()); - } -} + std::vector imports; -Expected -setData(const WasmEdge_CallingFrameContext* fm, Bytes const& data) -{ - auto alloc = [fm](int32_t dataLen) -> int32_t { - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - auto mod = WasmEdge_CallingFrameGetModuleInstance(fm); - WasmEdge_FunctionInstanceContext* func = - WasmEdge_ModuleInstanceFindFunction(mod, allocFunc); - WasmEdge_Value allocParams[1] = { - WasmEdge_ValueGenI32(dataLen)}; // 4 for prepend the data size - WasmEdge_Value allocReturns[1]; - auto executor = WasmEdge_CallingFrameGetExecutor(fm); - auto res = WasmEdge_ExecutorInvoke( - executor, func, allocParams, 1, allocReturns, 1); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGetI32(allocReturns[0]); - } - else - { - return 0; - } - }; + WASM_IMPORT_FUNC(imports, getLedgerSqn, hfs) + WASM_IMPORT_FUNC(imports, getParentLedgerTime, hfs) + WASM_IMPORT_FUNC(imports, getTxField, hfs) + WASM_IMPORT_FUNC(imports, getLedgerEntryField, hfs) + WASM_IMPORT_FUNC(imports, getCurrentLedgerEntryField, hfs) + WASM_IMPORT_FUNC(imports, getNFT, hfs) + WASM_IMPORT_FUNC(imports, accountKeylet, hfs) + WASM_IMPORT_FUNC(imports, credentialKeylet, hfs) + WASM_IMPORT_FUNC(imports, escrowKeylet, hfs) + WASM_IMPORT_FUNC(imports, oracleKeylet, hfs) + WASM_IMPORT_FUNC(imports, updateData, hfs) + WASM_IMPORT_FUNC(imports, computeSha512HalfHash, hfs) + WASM_IMPORT_FUNC(imports, print, hfs) - auto dataLen = (int32_t)data.size(); - auto dataPtr = alloc(dataLen); - auto retPtr = alloc(8); - if (dataPtr && retPtr) - { - auto mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); - auto res = - WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); - if (WasmEdge_ResultOK(res)) - { - unsigned char intBuf[8]; // little-endian - for (size_t i = 0; i < 4; ++i) - { - intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; - } - for (size_t i = 0; i < 4; ++i) - { - intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; - } + std::int64_t const sgas = gasLimit; // vm.getGas(); + auto ret = vm.run(wasmCode, funcName, imports); + if (!ret.has_value()) + return Unexpected(ret.error()); + std::int64_t const egas = vm.getGas(); + std::uint64_t const spent = static_cast(sgas - egas); - res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGenI32(retPtr); - } - } - } - return Unexpected(WasmEdge_Result_Fail); + return EscrowResult{static_cast(ret.value()), spent}; } -WasmEdge_Result -getTxField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto fname = getFieldName(fm, in, 0); - if (!fname) - return fname.error(); - - auto fieldData = ((HostFunctions*)data)->getTxField(fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getLedgerEntryField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +WasmEngine::WasmEngine() : impl(std::make_unique()) { - auto type = WasmEdge_ValueGetI32(in[0]); - auto lkData = getParameterData(fm, in, 1); - if (!lkData) - return lkData.error(); - - auto fname = getFieldName(fm, in, 3); - if (!fname) - return fname.error(); - - auto fieldData = - ((HostFunctions*)data) - ->getLedgerEntryField(type, lkData.value(), fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; } -WasmEdge_Result -getCurrentLedgerEntryField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +WasmEngine& +WasmEngine::instance() { - auto fname = getFieldName(fm, in, 0); - if (!fname) - return fname.error(); - - auto fieldData = - ((HostFunctions*)data)->getCurrentLedgerEntryField(fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; + static WasmEngine e; + return e; } -WasmEdge_Result -getNFT( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +Expected +WasmEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto nftId = getFieldName(fm, in, 2); - if (!nftId) - return nftId.error(); - - auto nftURI = - ((HostFunctions*)data)->getNFT(account.value(), nftId.value()); - if (!nftURI) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, nftURI.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->run(wasmCode, funcName, imports, params); } -WasmEdge_Result -accountKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +std::int64_t +WasmEngine::initGas(std::int64_t def) { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto keylet = ((HostFunctions*)data)->accountKeylet(account.value()); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->initGas(def); } -WasmEdge_Result -credentialKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +std::int32_t +WasmEngine::initMaxPages(std::int32_t def) { - auto subject = getFieldName(fm, in, 0); - if (!subject) - return subject.error(); - - auto issuer = getFieldName(fm, in, 2); - if (!issuer) - return issuer.error(); - - auto credentialType = getFieldName(fm, in, 4); - if (!credentialType) - return credentialType.error(); - - auto keylet = - ((HostFunctions*)data) - ->credentialKeylet( - subject.value(), issuer.value(), credentialType.value()); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->initMaxPages(def); } -WasmEdge_Result -escrowKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +// gas = 1'000'000'000LL +std::int64_t +WasmEngine::setGas(std::int64_t gas) { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto sequence = WasmEdge_ValueGetI32(in[2]); - - auto keylet = - ((HostFunctions*)data)->escrowKeylet(account.value(), sequence); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->setGas(gas); } -WasmEdge_Result -oracleKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +std::int64_t +WasmEngine::getGas() { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto documentId = WasmEdge_ValueGetI32(in[2]); - - auto keylet = - ((HostFunctions*)data)->escrowKeylet(account.value(), documentId); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->getGas(); } -WasmEdge_Result -updateData( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +wmem +WasmEngine::getMem() const { - auto fname = getParameterData(fm, in, 0); - if (!fname) - return fname.error(); - - if (((HostFunctions*)data)->updateData(fname.value())) - return WasmEdge_Result_Success; - else - return WasmEdge_Result_Fail; + return impl->getMem(); } -WasmEdge_Result -computeSha512HalfHash( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +int32_t +WasmEngine::allocate(int32_t size) { - auto fname = getParameterData(fm, in, 0); - if (!fname) - return fname.error(); - - auto hres = ((HostFunctions*)data)->computeSha512HalfHash(fname.value()); - Bytes digest{hres.begin(), hres.end()}; - auto pointer = setData(fm, digest); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32(32); - return WasmEdge_Result_Success; + return impl->allocate(size); } -WasmEdge_Result -print( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +void* +WasmEngine::newTrap(std::string_view msg) { - auto f = getParameterData(fm, in, 0); - if (!f) - return f.error(); - std::string s(f.value().begin(), f.value().end()); - std::cout << s << std::endl; - return WasmEdge_Result_Success; + return impl->newTrap(msg); } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - HostFunctions* hfs, - uint64_t gasLimit) -{ - // WasmEdge_LogOff(); - // TODO deletes - // create VM and set cost limit - WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); - WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); - WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); - WasmEdge_ConfigureSetMaxMemoryPage(conf, MAX_PAGES); - - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); - WasmEdge_StatisticsContext* StatCxt = - WasmEdge_VMGetStatisticsContext(VMCxt); - WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); - - { // register host function - // module - WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* hostMod = - WasmEdge_ModuleInstanceCreate(libName); - WasmEdge_StringDelete(libName); - - // getLedgerSqn - { - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getLedgerSqn, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getLedgerSqn"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - // WasmEdge_FunctionInstanceDelete(hostFunc); - } - - // getParentLedgerTime - { - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getParentLedgerTime, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getParentLedgerTime"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - // WasmEdge_FunctionInstanceDelete(hostFunc); - } - - // getTxField - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getTxField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getTxField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getLedgerEntryField - { - WasmEdge_ValType inputList[5] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 5, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getLedgerEntryField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getLedgerEntryField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getCurrentLedgerEntryField - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getCurrentLedgerEntryField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getCurrentLedgerEntryField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getNFT - { - WasmEdge_ValType inputList[4] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate(hostFuncType, getNFT, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = WasmEdge_StringCreateByCString("getNFT"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // updateData - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, updateData, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("updateData"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // computeSha512HalfHash - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, computeSha512HalfHash, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("computeSha512HalfHash"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // accountKeylet - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, accountKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("accountKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // credentialKeylet - { - WasmEdge_ValType inputList[6] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 6, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, credentialKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - WasmEdge_String fName = - WasmEdge_StringCreateByCString("credentialKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // escrowKeylet - { - WasmEdge_ValType inputList[3] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, escrowKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("escrowKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // oracleKeylet - { - WasmEdge_ValType inputList[3] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, oracleKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("oracleKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // print - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate(hostFuncType, print, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = WasmEdge_StringCreateByCString("print"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, hostMod); - if (!WasmEdge_ResultOK(regRe)) - { - printf("host func reg error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - } - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error, %p, %d\n", wasmCode.data(), wasmCode.size()); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Value funcReturns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); - - bool ok = WasmEdge_ResultOK(funcRes); - EscrowResult re; - if (ok) - { - auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); - re.cost = WasmEdge_StatisticsGetTotalCost(sc); - // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount - auto result = WasmEdge_ValueGetI32(funcReturns[0]); - if (result != 0) - re.result = true; - else - re.result = false; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } - - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(func); - // delete other obj allocated - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); -} } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b0839dc76de..b383bba37d8 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -16,16 +16,43 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#ifndef RIPPLE_APP_MISC_WASMVM_H_INLCUDED -#define RIPPLE_APP_MISC_WASMVM_H_INLCUDED +#pragma once #include +#include +#include #include -#include "xrpl/basics/base_uint.h" -#include +#include +#include +#include +#include + +// #include + +#include + +namespace bft = boost::function_types; namespace ripple { + +static const std::string_view W_ENV = "env"; +static const std::string_view W_HOST_LIB = "host_lib"; +static const std::string_view W_MEM = "memory"; +static const std::string_view W_STORE = "store"; +static const std::string_view W_LOAD = "load"; +static const std::string_view W_SIZE = "size"; +static const std::string_view W_ALLOC = "allocate"; +static const std::string_view W_DEALLOC = "deallocate"; +static const std::string_view W_PROC_EXIT = "proc_exit"; + +using wbytes = std::vector; +struct wmem +{ + std::uint8_t* p = nullptr; + std::size_t s = 0; +}; + const uint32_t MAX_PAGES = 128; // 8MB = 64KB*128 typedef std::vector Bytes; @@ -122,12 +149,220 @@ struct HostFunctions virtual ~HostFunctions() = default; }; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64 }; + +struct WasmImportFunc +{ + std::string name; + std::optional result; + std::vector params; + void* udata = nullptr; + // wasm_func_callback_with_env_t + void* wrap = nullptr; +}; + +#define WASM_IMPORT_FUNC(v, f, ...) \ + WasmImpFunc( \ + v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__); + +template +void +WasmImpArgs(WasmImportFunc& e) +{ + if constexpr (N < C) + { + using at = typename boost::mpl::at_c::type; + if constexpr (std::is_pointer_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I64); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F64); + else + static_assert(std::is_pointer_v, "Unsupported argument type"); + + return WasmImpArgs(e); + } + return; +} + +template +void +WasmImpRet(WasmImportFunc& e) +{ + if constexpr (std::is_pointer_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I64; + else if constexpr (std::is_same_v) + e.result = WT_F32; + else if constexpr (std::is_same_v) + e.result = WT_F64; + else if constexpr (std::is_void_v) + e.result.reset(); +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ + ((defined(__clang_major__)) && (__clang_major__ >= 18)) + else + static_assert(false, "Unsupported return type"); +#endif +} + +template +void +WasmImpFuncHelper(WasmImportFunc& e) +{ + using rt = typename bft::result_type::type; + using pt = typename bft::parameter_types::type; + // typename boost::mpl::at_c::type + + WasmImpRet(e); + WasmImpArgs<0, bft::function_arity::value, pt>(e); + // WasmImpWrap(e, std::forward(f)); +} + +template +void +WasmImpFunc( + std::vector& v, + std::string_view imp_name, + void* f_wrap, + void* data = nullptr) +{ + WasmImportFunc e; + e.name = imp_name; + e.udata = data; + e.wrap = f_wrap; + WasmImpFuncHelper(e); + v.push_back(std::move(e)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct WasmParam +{ + WasmTypes type = WT_I32; + union + { + std::int32_t i32; + std::int64_t i64 = 0; + float f32; + double f64; + } of; +}; + +template +inline std::vector +wasmParams(Types... args) +{ + std::vector v; + v.reserve(sizeof...(args)); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, std::int32_t p, Types... args) +{ + v.push_back({.type = WT_I32, .of = {.i32 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, std::int64_t p, Types... args) +{ + v.push_back({.type = WT_I64, .of = {.i64 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, float p, Types... args) +{ + v.push_back({.type = WT_F32, .of = {.f32 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, double p, Types... args) +{ + v.push_back({.type = WT_F64, .of = {.f64 = p}}); + return wasmParams(v, std::forward(args)...); +} + +inline std::vector +wasmParams(std::vector& v) +{ + return v; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class WamrEngine; +class WasmEngine +{ + std::unique_ptr const impl; + + WasmEngine(); + + WasmEngine(WasmEngine const&) = delete; + WasmEngine(WasmEngine&&) = delete; + WasmEngine& + operator=(WasmEngine const&) = delete; + WasmEngine& + operator=(WasmEngine&&) = delete; + +public: + ~WasmEngine() = default; + + static WasmEngine& + instance(); + + Expected + run(wbytes const& wasmCode, + std::string_view funcName = {}, + std::vector const& imports = {}, + std::vector const& params = {}); + + std::int64_t + initGas(std::int64_t def = 1'000'000'000'000LL); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + setGas(std::int64_t gas); + + std::int64_t + getGas(); + + // for host functions usage + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + void* + newTrap(std::string_view msg = {}); +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Expected runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, + Bytes const& wasmCode, + std::string_view funcName, HostFunctions* hfs, uint64_t gasLimit); } // namespace ripple -#endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED From c533abd8b61995e00995a2ec0f1bf83c5d8b9d3d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 1 May 2025 18:41:51 -0400 Subject: [PATCH 11/73] Update size and compute cap defaults (#5417) --- cfg/rippled-example.cfg | 6 +++--- src/test/jtx/impl/envconfig.cpp | 6 +++--- src/xrpld/core/Config.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 6da68410526..bd2b044c4c5 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1259,7 +1259,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_compute_limit = 2000000 # 2 million gas +# extension_compute_limit = 1000000 # 1 million gas # # extension_size_limit = # @@ -1271,7 +1271,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_size_limit = 2000000 # 2 mb +# extension_size_limit = 100000 # 100 kb # # gas_price = # @@ -1281,7 +1281,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# gas_price = 2000000 # 2 drops per gas +# gas_price = 1000000 # 1 drop per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index ab0969c6cb8..79643a8bb9e 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -38,9 +38,9 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); - cfg.FEES.extension_compute_limit = 4294967295; - cfg.FEES.extension_size_limit = 4294967295; - cfg.FEES.gas_price = 1000000; + cfg.FEES.extension_compute_limit = 1'000'000; + cfg.FEES.extension_size_limit = 100'000; + cfg.FEES.gas_price = 1'000'000; // 1 drop = 1,000,000 micro-drops // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 4b297c8610d..c1b143b799c 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -74,13 +74,13 @@ struct FeeSetup XRPAmount owner_reserve{2 * DROPS_PER_XRP}; /** The compute limit for Feature Extensions. */ - std::uint32_t extension_compute_limit{4294967295}; + std::uint32_t extension_compute_limit{1'000'000}; /** The WASM size limit for Feature Extensions. */ - std::uint32_t extension_size_limit{4294967295}; + std::uint32_t extension_size_limit{100'000}; /** The price of 1 WASM gas, in micro-drops. */ - std::uint32_t gas_price{1000000}; + std::uint32_t gas_price{1'000'000}; /* (Remember to update the example cfg files when changing any of these * values.) */ From 1e9ff88a00500621a187fa5c1ab9fa1a9ef4be98 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 8 May 2025 12:39:37 -0400 Subject: [PATCH 12/73] Fix CI build issues * Mac build fix * Windows build fix * Windows instruction counter fix --- external/wamr/patches/ripp_metering.patch | 193 ++++++++++++++-------- src/xrpld/app/misc/WamrVM.cpp | 3 +- src/xrpld/app/misc/WasmVM.cpp | 9 + 3 files changed, 134 insertions(+), 71 deletions(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 7cc3544b685..a2abf37a57c 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -87,7 +87,7 @@ index ce0c1fa7..2713a092 100644 /** * Cache for diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index d33c0272..900fb536 100644 +index d33c0272..21bfdf29 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() @@ -122,15 +122,39 @@ index d33c0272..900fb536 100644 WASMFuncType * wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, uint32 module_type) -@@ -7803,7 +7828,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7792,13 +7817,14 @@ wasm_runtime_get_module_name(wasm_module_t module) + bool + wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + { ++#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 + uint8 *boundary = exec_env->native_stack_boundary; + RECORD_STACK_USAGE(exec_env, (uint8 *)&boundary); + if (boundary == NULL) { + /* the platform doesn't support os_thread_get_stack_boundary */ + return true; + } +-#if defined(OS_ENABLE_HW_BOUND_CHECK) && WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 ++#if defined(OS_ENABLE_HW_BOUND_CHECK) + uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; - #endif -- if ((uint8 *)&boundary < boundary) { -+ if (((uint8 *)&boundary < boundary) && ((uint8 *)&boundary > exec_env->native_stack_boundary)){ - wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +@@ -7808,6 +7834,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; + } ++#endif + return true; + } + +@@ -7830,7 +7857,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, + boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; + if ((uint8 *)&boundary < boundary) { + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +- "native stack overflow"); ++ "native s stack overflow"); + return false; + } + return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index 8ac032bf..5ca5d489 100644 --- a/core/iwasm/common/wasm_runtime_common.h @@ -163,10 +187,22 @@ index 8ac032bf..5ca5d489 100644 bool enable); diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h -index 241a0eec..82e048c0 100644 +index 241a0eec..9eb0dde1 100644 --- a/core/iwasm/include/wasm_c_api.h +++ b/core/iwasm/include/wasm_c_api.h -@@ -701,6 +701,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); +@@ -19,8 +19,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_API_EXTERN + #endif + #else + #define WASM_API_EXTERN +@@ -701,6 +703,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); // func_name. If the function is not found, return 0. WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); @@ -179,10 +215,22 @@ index 241a0eec..82e048c0 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b73a0364..f7e20b24 100644 +index b73a0364..3fd0949f 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h -@@ -1821,6 +1821,27 @@ WASM_RUNTIME_API_EXTERN void +@@ -20,8 +20,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_RUNTIME_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_RUNTIME_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_RUNTIME_API_EXTERN + #endif + #elif defined(__GNUC__) || defined(__clang__) + #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) +@@ -1821,6 +1823,27 @@ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, uint8_t *native_stack_boundary); @@ -211,7 +259,7 @@ index b73a0364..f7e20b24 100644 * Dump runtime memory consumption, including: * Exec env memory consumption diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 41ac4c72..1aa1fe1c 100644 +index 41ac4c72..bd8f714a 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, @@ -243,18 +291,20 @@ index 41ac4c72..1aa1fe1c 100644 #endif #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1562,6 +1568,18 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) +@@ -1562,6 +1568,20 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) #endif } +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute == 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ else if (instructions_to_execute > 0) \ -+ instructions_to_execute--; ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) \ ++ { \ ++ instructions_to_execute -= instructions_schedule[opcode];\ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } +#else +#define CHECK_INSTRUCTION_LIMIT() (void)0 +#endif @@ -262,21 +312,25 @@ index 41ac4c72..1aa1fe1c 100644 static void wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMExecEnv *exec_env, -@@ -1605,6 +1623,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1605,6 +1625,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 local_idx, local_offset, global_idx; uint8 local_type, *global_addr; uint32 cache_index, type_index, param_cell_num, cell_num; + +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + int64 instructions_to_execute = -1; ++ int64 const *instructions_schedule = NULL; + if(exec_env) ++ { + instructions_to_execute = exec_env->instructions_to_execute; ++ instructions_schedule = exec_env->instructions_schedule; ++ } +#endif + #if WASM_ENABLE_EXCE_HANDLING != 0 int32_t exception_tag_index; #endif -@@ -6859,6 +6884,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6859,6 +6890,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -288,7 +342,7 @@ index 41ac4c72..1aa1fe1c 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6899,6 +6929,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6899,6 +6935,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -302,22 +356,21 @@ index 41ac4c72..1aa1fe1c 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index f33ad60e..a7078fe8 100644 +index f33ad60e..9cbf2010 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -105,6 +105,20 @@ typedef float64 CellType_F64; +@@ -105,6 +105,19 @@ typedef float64 CellType_F64; goto unaligned_atomic; \ } while (0) +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) \ -+ { \ -+ instructions_to_execute -= instructions_schedule[opc]; \ -+ if (instructions_to_execute < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) { \ ++ instructions_to_execute -= instructions_schedule[opcode]; \ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ + } +#else +#define CHECK_INSTRUCTION_LIMIT() (void)0 @@ -326,40 +379,24 @@ index f33ad60e..a7078fe8 100644 static inline uint32 rotl32(uint32 n, uint32 c) { -@@ -1439,8 +1453,10 @@ wasm_interp_dump_op_count() - #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 - #define FETCH_OPCODE_AND_DISPATCH() \ - do { \ -+ const uint64 opc = *frame_ip; \ - const void *p_label_addr = *(void **)frame_ip; \ - frame_ip += sizeof(void *); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1450,8 +1466,10 @@ wasm_interp_dump_op_count() - const void *p_label_addr; \ - bh_assert(((uintptr_t)frame_ip & 1) == 0); \ - /* int32 relative offset was emitted in 64-bit target */ \ -+ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ - p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1460,8 +1478,10 @@ wasm_interp_dump_op_count() - const void *p_label_addr; \ - bh_assert(((uintptr_t)frame_ip & 1) == 0); \ - /* uint32 label address was emitted in 32-bit target */ \ -+ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ - p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ +@@ -1466,12 +1479,14 @@ wasm_interp_dump_op_count() } while (0) #endif -@@ -1538,6 +1558,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() CHECK_INSTRUCTION_LIMIT(); FETCH_OPCODE_AND_DISPATCH() + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ + + #define HANDLE_OP(opcode) case opcode: +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ + +@@ -1538,6 +1553,16 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 *maddr = NULL; uint32 local_idx, local_offset, global_idx; uint8 opcode = 0, local_type, *global_addr; @@ -367,8 +404,7 @@ index f33ad60e..a7078fe8 100644 +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + int64 instructions_to_execute = -1; + int64 const *instructions_schedule = NULL; -+ if(exec_env) -+ { ++ if (exec_env) { + instructions_to_execute = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; + } @@ -377,29 +413,46 @@ index f33ad60e..a7078fe8 100644 #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -@@ -7761,6 +7792,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7761,6 +7786,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) ++ if (exec_env) + exec_env->instructions_to_execute = instructions_to_execute; +#endif + if (!prev_frame->ip) /* Called from native. */ return; -@@ -7789,6 +7825,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7789,6 +7819,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) ++ if (exec_env) + exec_env->instructions_to_execute = instructions_to_execute; +#endif return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h +index ac1a95ea..e23b500e 100644 +--- a/core/shared/platform/include/platform_wasi_types.h ++++ b/core/shared/platform/include/platform_wasi_types.h +@@ -36,7 +36,11 @@ extern "C" { + #if WASM_ENABLE_UVWASI != 0 || WASM_ENABLE_LIBC_WASI == 0 + #define assert_wasi_layout(expr, message) /* nothing */ + #else +-#define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #ifndef _MSC_VER ++ #define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #else ++ #define assert_wasi_layout(expr, message) static_assert(expr, message) ++ #endif + #endif + + assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 6425450b..94dd9628 100644 --- a/doc/build_wamr.md diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index a92d8e463e4..a781aadea9c 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -31,10 +31,11 @@ static void print_wasm_error(const char* message, wasm_trap_t* trap) { fprintf(stderr, "WAMR error: %s\n", message); - wasm_byte_vec_t error_message; if (trap) { + wasm_byte_vec_t error_message; + wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); fprintf( diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index d786cae7fbe..46267d55b57 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -57,11 +57,20 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports); + + // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + if (!ret.has_value()) + { + // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); + } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); + // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From 5b43ec7f7386ede320bea75080117f8e12187ebe Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 20 May 2025 16:12:19 -0400 Subject: [PATCH 13/73] refactor: switch function name from `ready` to `finish` (#5430) --- src/test/app/Escrow_test.cpp | 1161 +--------------- src/test/app/Wasm_test.cpp | 1839 +------------------------ src/test/app/wasm_fixtures/fixtures.h | 1569 +++++++++++++++++++++ src/xrpld/app/misc/WasmVM.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 2 +- 5 files changed, 1589 insertions(+), 2984 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixtures.h diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 94e71cfdcfb..4e39ac298f4 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -29,6 +30,7 @@ #include #include +#include #include namespace ripple { @@ -1699,23 +1701,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // featureSmartEscrow disabled @@ -1862,23 +1851,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // featureSmartEscrow disabled @@ -1988,23 +1964,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // basic FinishFunction situation @@ -2217,1113 +2180,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: figure out how to make this a fixture in a separate file - auto wasmHex = - "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" - "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" - "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" - "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" - "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" - "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" - "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" - "745f6c696213676574506172656e744c656467657254696d650005035453020603" - "070101080901010a01000202010102080008000b0c030101010104050802030303" - "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" - "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" - "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" - "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" - "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" - "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" - "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" - "14200142808080801037020c200141033a00382001412036022820014100360234" - "2001418080c08000360230200141003602202001410036021820012001410c6a36" - "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" - "808080000d00200128020c21002001280210220220012802141080808080000240" - "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" - "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" - "027f017e037f23808080800041306b220324808080800041272104024002402000" - "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" - "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" - "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" - "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" - "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" - "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" - "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" - "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" - "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" - "41096a20046a412720046b108c808080002104200341306a24808080800020040b" - "6c01027f024002402000417c6a2802002202417871220341044108200241037122" - "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" - "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" - "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" - "2005200136020c2005200036020820052003360214200520023602102005410236" - "021c200541b884c08000360218200542023702242005418180808000ad42208620" - "0541106aad843703382005418280808000ad422086200541086aad843703302005" - "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" - "0041c0006b220224808080800002400240200028020022032d00000d0020012802" - "14419582c080004104200128021828020c118080808000808080800021000c010b" - "4101210020012802142204419982c0800041042001280218220528020c22061180" - "8080800080808080000d00200341016a210302400240200128021c22074104710d" - "0041012100200441f184c080004101200611808080800080808080000d02200320" - "01108a80808000450d010c020b200441f284c08000410220061180808080008080" - "8080000d0141012100200241013a001b200220053602102002200436020c200220" - "07360238200241c884c08000360234200220012d00203a003c2002200128021036" - "022c200220012902083702242002200129020037021c20022002411b6a36021420" - "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" - "80004102200228023428020c11808080800080808080000d010b2001280214419c" - "97c080004101200128021828020c118080808000808080800021000b200241c000" - "6a24808080800020000be90201057f2380808080004180016b2202248080808000" - "0240024002400240200128021c22034110710d0020034120710d01200031000041" - "01200110868080800021000c030b20002d0000210041ff00210303402002200322" - "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" - "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" - "0041ff00210303402002200322046a22052000410f712203413072200341376a20" - "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" - "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" - "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" - "02402004418101490d002004418001418885c08000108b80808000000b20014101" - "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" - "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" - "20032000360200200320013602042003410236020c200341d887c0800036020820" - "0342023702142003418380808000ad4220862204200341046aad84370328200320" - "042003ad843703202003200341206a360210200341086a200210aa80808000000b" - "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" - "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" - "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" - "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" - "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" - "2802000d000240200028021422012000280218220920082002200310ad80808000" - "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" - "0240024002402000280204220120064b0d00200028021422012000280218220920" - "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" - "2000413036021020002d0020210b4101210c200041013a00202000280214220920" - "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" - "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" - "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" - "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" - "1180808080008080808000210c0c010b200120066b210702400240024020002d00" - "2022010e0402000100020b20072101410021070c010b2007410176210120074101" - "6a41017621070b200141016a210120002802102106200028021821092000280214" - "210a024003402001417f6a2201450d01200a200620092802101181808080008080" - "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" - "200a20042005200928020c11808080800080808080000d00410021010340024020" - "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" - "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" - "0041106b220224808080800020022000280200220041046a36020c200141e181c0" - "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" - "418580808000108f808080002100200241106a24808080800020000be70201057f" - "2380808080004180016b22022480808080000240024002400240200128021c2203" - "4110710d0020034120710d0120003502004101200110868080800021000c030b20" - "00280200210041ff00210303402002200322046a22052000410f71220341307220" - "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" - "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" - "004110492106200041047621002006450d000b02402004418101490d0020044180" - "01418885c08000108b80808000000b20014101419885c080004102200541810120" - "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" - "85c08000108b80808000000b20014101419885c080004102200541810120044101" - "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" - "8080800041106b220b248080808000200028021420012002200028021828020c11" - "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" - "200b41086a200320042005200610b680808000200720082009200a10b680808000" - "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" - "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" - "0028021828020c118080808000808080800021000c010b200028021441ee84c080" - "004101200028021828020c118080808000808080800021000b200b41106a248080" - "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" - "23808080800041306b2203248080808000200341033a002c2003412036021c4100" - "210420034100360228200320013602242003200036022020034100360214200341" - "0036020c02400240024002400240200228021022050d00200228020c2200450d01" - "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" - "280200210003400240200041046a2802002207450d002003280220200028020020" - "07200328022428020c11808080800080808080000d040b20012802002003410c6a" - "200128020411818080800080808080000d03200141086a2101200041086a210020" - "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" - "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" - "40200041046a2802002201450d0020032802202000280200200120032802242802" - "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" - "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" - "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" - "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" - "0b0b200320073602102003200b36020c200141046a280200210702400240024020" - "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" - "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a200128020411818080800080808080000d02" - "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" - "280220200228020020044103746a22012802002001280204200328022428020c11" - "80808080008080808000450d010b410121010c010b410021010b200341306a2480" - "8080800020010b1e01017f024020002802002201450d0020002802042001108780" - "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" - "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" - "808080000be30201027f23808080800041106b2202248080808000024002400240" - "02402001418001490d002002410036020c2001418010490d010240200141808004" - "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" - "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" - "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" - "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" - "032000280200470d0020001096808080000b2000200341016a3602082000280204" - "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" - "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" - "20032001109780808000200028020821030b200028020420036a2002410c6a2001" - "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "01109c80808000024020012802082200418180808078460d002000200128020c10" - "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" - "03248080808000200341086a200020012002109c80808000024020032802082202" - "418180808078460d002002200328020c109d80808000000b200341106a24808080" - "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109780808000200028020821030b200028020420036a2001200210d6808080001a" - "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" - "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" - "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" - "200136020820002002410120021b36020420002002453602000b800601057f0240" - "024002402000417c6a22032802002204417871220541044108200441037122061b" - "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" - "712002410b491b210102400240024020060d002001418002490d01200520014104" - "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" - "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" - "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" - "01490d042006200410a780808000200520016b22024110490d0120032001200328" - "020041017172410272360200200720016a22012002410372360204200720056a22" - "0520052802044101723602042001200210a88080800020000f0b200520016b2202" - "410f4d0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210a88080800020000f0b200320" - "05200328020041017172410272360200200720056a220220022802044101723602" - "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" - "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" - "020441017236020441002102410021010c010b2003200120044101717241027236" - "0200200720016a22012002410172360204200720056a2205200236020020052005" - "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" - "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" - "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" - "2201200220012002491b10d6808080002102200010a580808000200221000b2000" - "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" - "0010a680808000000b20032001200441017172410272360200200720016a220220" - "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" - "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" - "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" - "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" - "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" - "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" - "00411920044101766b2004411f461b742107410021060340024020052205280204" - "41787122082002490d00200820026b220820014f0d00200821012005210620080d" - "004100210120052106200521000c040b200528021422082000200820052007411d" - "764104716a41106a2802002205471b200020081b2100200741017421072005450d" - "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" - "491b22024103762201762200410371450d00024002402000417f7341017120016a" - "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" - "2206460d002006200136020c200120063602080c010b41002005417e2007777136" - "0298a2c080000b20022000410372360204200220006a2200200028020441017236" - "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" - "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" - "020441787120026b21012006210503400240200628021022000d00200628021422" - "000d0020052802182104024002400240200528020c22002005470d002005411441" - "10200528021422001b6a28020022060d01410021000c020b200528020822062000" - "36020c200020063602080c010b200541146a200541106a20001b21070340200721" - "082006220041146a200041106a200028021422061b210720004114411020061b6a" - "28020022060d000b200841003602000b2004450d040240200528021c4102744180" - "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" - "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" - "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" - "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" - "0020017441022001742200410020006b727168220841037422014190a0c080006a" - "220620014198a0c080006a28020022002802082207460d002007200636020c2006" - "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" - "360204200020026a2207200120026b2206410172360204200020016a2006360200" - "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" - "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" - "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" - "0120023602082005200236020c2002200136020c200220053602080b4100200736" - "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" - "20052802102206450d0020002006360210200620003602180b2005280214220645" - "0d0020002006360214200620003602180b02400240024020014110490d00200520" - "02410372360204200520026a22022001410172360204200220016a200136020041" - "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" - "c080002100024002404100280298a2c08000220841012007410376742207710d00" - "41002008200772360298a2c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200520012002" - "6a2200410372360204200520006a220020002802044101723602040c010b410020" - "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" - "720d004100210641022004742200410020006b722003712200450d032000684102" - "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" - "71220520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b2106200120082007" - "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" - "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" - "002006470d00200641144110200628021422001b6a28020022050d01410021000c" - "020b20062802082205200036020c200020053602080c010b200641146a20064110" - "6a20001b21070340200721082005220041146a200041106a200028021422051b21" - "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" - "40200628021c41027441809fc080006a22052802002006460d0020044110411420" - "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" - "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" - "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" - "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" - "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" - "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" - "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" - "a0c080002100034020002802002206200028020422076a2005460d022000280208" - "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" - "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" - "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" - "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" - "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" - "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" - "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" - "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" - "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" - "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" - "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" - "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" - "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" - "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" - "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" - "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" - "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" - "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" - "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" - "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" - "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" - "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" - "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" - "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" - "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" - "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" - "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" - "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" - "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" - "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" - "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" - "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" - "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" - "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" - "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" - "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" - "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" - "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" - "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" - "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" - "360204410041808080013602b8a2c080002001200641606a41787141786a220020" - "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" - "290288a0c080003702002007200937020841002008360284a0c080004100200536" - "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" - "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" - "0720072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010d0808080000c080b200041f8017141" - "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" - "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" - "0620013602082000200136020c2001200636020c200120003602080c070b200020" - "053602002000200028020420086a360204200520024103723602042007410f6a41" - "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" - "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" - "417871220610a780808000200620026a2102200120066a220128020421060b2001" - "2006417e7136020420002002410172360204200020026a20023602000240200241" - "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" - "024002404100280298a2c08000220641012002410376742202710d004100200620" - "0272360298a2c08000200121020c010b200128020821020b200120003602082002" - "200036020c2000200136020c200020023602080c050b4100200020026b22013602" - "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" - "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" - "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" - "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" - "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" - "800020052006410172360204200120006a2006360200200120024103723602040b" - "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" - "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" - "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" - "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" - "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" - "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" - "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" - "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" - "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" - "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" - "4020062802102205450d0020002005360210200520003602180b20062802142205" - "450d0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a20013602000240" - "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" - "6a2102024002404100280298a2c08000220541012001410376742201710d004100" - "2005200172360298a2c08000200221010c010b200228020821010b200220003602" - "082001200036020c2000200236020c200020013602080c010b2006200120026a22" - "00410372360204200620006a220020002802044101723602040b200641086a0be9" - "0101037f23808080800041206b2204248080808000024002400240200220036a22" - "0320024f0d00410021020c010b4100210220012802002205410174220620032006" - "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" - "0c010b2004200536021c20042001280204360214410121020b2004200236021820" - "0441086a2003200441146a109980808000024020042802080d00200428020c2102" - "200120033602002001200236020441818080807821020c010b2004280210210120" - "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" - "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" - "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" - "0041052000418680808000419082c0800041052002410c6a418780808000108f80" - "8080002100200241106a24808080800020000be00301097f23808080800041c000" - "6b2202248080808000200028020821032000280204210441012105200128021441" - "b083c080004101200128021828020c118080808000808080800021000240200345" - "0d0041002106034020062107410121062000410171210841012100024020080d00" - "02400240200128021c22084104710d002007410171450d01410121002001280214" - "41e784c080004102200128021828020c1180808080008080808000450d010c020b" - "200128021821092001280214210a024020074101710d0041012100200a41888bc0" - "80004101200928020c11808080800080808080000d020b200241013a001b200220" - "093602102002200a36020c20022008360238200241c884c0800036023420022001" - "2d00203a003c2002200128021036022c2002200129020837022420022001290200" - "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" - "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" - "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" - "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" - "4101200128021828020c118080808000808080800021050b200241c0006a248080" - "80800020050b4a01017f23808080800041106b2202248080808000200220003602" - "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" - "00200241106a24808080800020000b3d00200128021420002802002d0000410274" - "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" - "808080800080808080000be70101017f23808080800041106b2205248080808000" - "20002802142001410d200028021828020c11808080800080808080002101200541" - "003a000d200520013a000c20052000360208200541086a200241042003200410b6" - "80808000210320052d000d220120052d000c2204722100024020014101470d0020" - "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" - "004102200028021828020c118080808000808080800021000c010b200028021441" - "ee84c080004101200028021828020c118080808000808080800021000b20054110" - "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" - "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" - "02400240024002400240024002404107109b808080002201450d00200141036a41" - "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" - "800022022800042103200228000021042002410810878080800020014107108780" - "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" - "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" - "002202280004210520022800002106200241081087808080002001410710878080" - "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" - "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" - "2202280004210720022800002108200241081087808080002001410b1087808080" - "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" - "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" - "108380808000220928000421022009280000210a20094108108780808000200041" - "186a200a200210a48080800002400240024020002d00184101460d002000290320" - "210b02402002450d00200a20021087808080000b20014107108780808000410021" - "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" - "0000200141041082808080002202280000210c2002280004210a20024108108780" - "80800020014104108780808000024002400240200a4100480d000240200a0d0041" - "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" - "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" - "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" - "026b210f4100210103400240024002400240200220016a2d00002209c022104100" - "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" - "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" - "808080202111428080808010211202400240024002400240024002400240024002" - "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" - "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" - "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" - "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" - "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" - "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" - "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" - "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" - "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" - "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" - "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" - "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" - "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" - "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" - "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" - "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" - "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" - "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" - "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" - "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" - "41186a20142011a710a48080800020002d00184101460d01200029032021124100" - "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" - "201641076a41002800878cc08000360000201641002900808cc080003700002016" - "410b10828080800022012800002117200128000421132001410810878080800002" - "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" - "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" - "09201741016a210220134109490d024100210103402009450d0a20022d00004150" - "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" - "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" - "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" - "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" - "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" - "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" - "20090d040b410021010c050b201321092017210220134108490d020b4100210103" - "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" - "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" - "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" - "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" - "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" - "0b1087808080002004200310808080800020062005108080808000200820071080" - "80808000200c200a10808080800020004100360214200042808080801037020c20" - "0041033a003820004120360228200041003602342000418080c080003602302000" - "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" - "1086808080000d00200028020c2102200028021022092000280214108080808000" - "02402002450d00200920021087808080000b201510858080800020011085808080" - "0041002102024020032005470d0020042006200310d58080800045200b20125871" - "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" - "00200c200a1087808080000b02402007450d00200820071087808080000b024020" - "05450d00200620051087808080000b02402003450d00200420031087808080000b" - "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" - "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" - "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" - "80800041106b220324808080800002400240024002400240024002400240024002" - "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" - "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" - "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" - "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" - "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" - "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" - "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" - "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" - "0121010c010b20002005370308410021010b200020013a0000200341106a248080" - "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" - "030240024020024101710d002002410271450d012001280200220220006a210002" - "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" - "410020003602a0a2c0800020032003280204417e71360204200120004101723602" - "04200320003602000f0b2001200210a7808080000b024002400240024002400240" - "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" - "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" - "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" - "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" - "20003602000b2000418002490d022001200010d080808000410021014100410028" - "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" - "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" - "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" - "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" - "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" - "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" - "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b200128020821010c" - "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" - "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" - "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" - "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" - "0320013602082000200136020c2001200336020c200120003602080f0b02404100" - "280288a0c080002201450d00410021020340200241016a2102200128020822010d" - "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" - "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" - "02410036021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110aa80808000000b820301047f200028020c" - "21020240024002402001418002490d002000280218210302400240024020022000" - "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" - "002802082201200236020c200220013602080c010b200041146a200041106a2002" - "1b21040340200421052001220241146a200241106a200228021422011b21042002" - "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441809fc080006a22012802002000460d0020034110411420032802" - "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" - "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" - "102201450d0020022001360210200120023602180b20002802142201450d002002" - "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" - "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" - "20013602a0a2c0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a7808080000b02400240024002402002280204" - "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" - "0d0320022003417871220310a7808080002000200320016a220141017236020420" - "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" - "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" - "80006a2102024002404100280298a2c08000220341012001410376742201710d00" - "41002003200172360298a2c08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" - "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" - "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" - "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" - "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" - "4701017f23808080800041206b2200248080808000200041003602182000410136" - "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" - "80808000000b5601017f23808080800041206b2202248080808000200241106a20" - "0041106a290200370300200241086a200041086a290200370300200241013b011c" - "2002200136021820022000290200370300200210ac80808000000b110020003502" - "00410120011086808080000b5d01027f23808080800041206b2201248080808000" - "20002802182102200141106a200041106a290200370300200141086a200041086a" - "2902003703002001200036021c2001200236021820012000290200370300200110" - "d180808000000b490002402002418080c400460d00200020022001280210118180" - "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" - "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" - "808080800020022000360200200220013602042002410236020c200241f887c080" - "00360208200242023702142002418380808000ad4220862203200241046aad8437" - "0328200220032002ad843703202002200241206a360210200241086a419487c080" - "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" - "0022040d002003410171450d010b02402003410171450d00200120026a21050240" - "0240200028020c22060d0041002107200121080c010b4100210741002109200121" - "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" - "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" - "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" - "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" - "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" - "20031b21022003200120031b21010b024020040d00200028021420012002200028" - "021828020c11808080800080808080000f0b2000280204210a024020024110490d" - "0020022001200141036a417c7122076b22096a220b410371210441002106410021" - "03024020012007460d004100210302402009417c4b0d0041002103410021050340" - "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" - "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" - "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" - "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" - "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" - "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" - "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002004200d41f007716a210941002108200421030340200328" - "020c2207417f7341077620074106767241818284087120032802082207417f7341" - "077620074106767241818284087120032802042207417f73410776200741067672" - "41818284087120032802002207417f734107762007410676724181828408712008" - "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" - "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" - "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" - "03410676724181828408712103200c4101460d0220082802042207417f73410776" - "20074106767241818284087120036a2103200c4102460d0220082802082208417f" - "7341077620084106767241818284087120036a21030c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" - "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" - "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" - "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" - "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" - "0d000c030b0b200028021420012002200028021828020c11808080800080808080" - "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" - "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" - "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a210320002802102109200028021821082000280214" - "210703402003417f6a2203450d0220072009200828021011818080800080808080" - "00450d000b41010f0b200028021420012002200028021828020c11808080800080" - "808080000f0b0240200720012002200828020c1180808080008080808000450d00" - "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" - "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" - "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" - "36020c20032000360208200341b08dc08000360214200320013602102003410236" - "021c200341b183c08000360218024020022802000d002003410336025c200341e4" - "83c08000360258200342033702642003418180808000ad4220862204200341106a" - "ad8437034820032004200341086aad843703402003418280808000ad4220862003" - "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" - "808000000b200341206a41106a200241106a290200370300200341206a41086a20" - "0241086a290200370300200320022902003703202003410436025c2003419884c0" - "8000360258200342043702642003418180808000ad4220862204200341106aad84" - "37035020032004200341086aad843703482003418980808000ad42208620034120" - "6aad843703402003418280808000ad422086200341186aad843703382003200341" - "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" - "01200028020428020c11818080800080808080000b140020012000280200200028" - "020410af808080000b14002001280214200128021820001091808080000b220020" - "01280214418883c08000410e200128021828020c11808080800080808080000b60" - "01017f23808080800041306b22002480808080002000410136020c200041a883c0" - "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" - "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" - "057f017e23808080800041c0006b220524808080800041012106024020002d0004" - "0d0020002d0005210702402000280200220828021c22094104710d004101210620" - "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" - "28021828020c11808080800080808080000d012008280214200120022008280218" - "28020c11808080800080808080000d01200828021441ef97c08000410220082802" - "1828020c11808080800080808080000d0120032008200411818080800080808080" - "0021060c010b41012106024020074101710d00200828021441e984c08000410320" - "0828021828020c11808080800080808080000d01200828021c21090b4101210620" - "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" - "6a360214200520082902083702242008290200210a200520093602382005200828" - "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" - "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" - "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" - "84c080004102200528023428020c118080808000808080800021060b200041013a" - "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" - "6a2103200028020421042000280200210520002802082106410021074100210841" - "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" - "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" - "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" - "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" - "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" - "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" - "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" - "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" - "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" - "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" - "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" - "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" - "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" - "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" - "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" - "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" - "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" - "21070b20070b6001027f2000280204210220002802002103024020002802082200" - "2d0000450d00200341e084c080004104200228020c118080808000808080800045" - "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" - "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" - "41306b22032480808080002003200136020c200320003602082003410136021420" - "0341d490c080003602102003420137021c2003418280808000ad42208620034108" - "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" - "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" - "808080000b830201087f2380808080004180016b22022480808080002001280204" - "21032001280200210420002802002100200128021c220521060240200541047145" - "0d002005410872210620040d0020014281808080a0013702000b20012006410472" - "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" - "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" - "09450d000b02402007418101490d002007418001418885c08000108b8080800000" - "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" - "01200536021c200120033602042001200436020020024180016a24808080800020" - "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" - "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" - "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" - "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" - "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" - "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" - "006b22012480808080002001410636020c2001419498c08000360208024041002d" - "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" - "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" - "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" - "2003450d02200320032802002204417f6a3602002003290308210220044101470d" - "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" - "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" - "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" - "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" - "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" - "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" - "021041042103200141043a00182001200141106a360220200141186a41c08dc080" - "002000109180808000210020012d001821040240024020000d0042002102411720" - "0441ff0171764101710d01200128021c220328020021000240200341046a280200" - "22042802002205450d002000200511828080800080808080000b02402004280204" - "2204450d00200020041087808080000b2003410c108780808000410421030c010b" - "200441ff01714104460d032001290318220642807e8321022006a721030b200128" - "021022002000280208417f6a2204360208024020040d00200041003a000c200042" - "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" - "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" - "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" - "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" - "97c08000360228200142023702342001418c80808000ad422086200141106aad84" - "3703202001418280808000ad422086200141086aad843703182001200141186a36" - "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" - "6b22022480808080002002200036020c20024102360214200241a88bc080003602" - "102002420137021c2002418b8080800036022c2002200241286a36021820022002" - "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" - "808080000b200241306a2480808080000b4701017f23808080800041206b220024" - "8080808000200041003602182000410136020c200041bc90c08000360208200042" - "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" - "808080800041206b220024808080800041002d00b89ec080001a02400240024041" - "20109b808080002201450d00200141023602102001428180808010370300410029" - "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" - "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" - "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" - "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" - "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" - "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" - "41003a000020002802182202450d00200120021087808080000b02402000417f46" - "0d00200020002802042201417f6a36020420014101470d00200041201087808080" - "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" - "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" - "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" - "c08000410410af808080000be50301017f23808080800041c0006b220224808080" - "800002400240024002400240024020002d00000e0400010203000b200220002802" - "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" - "002800809bc08000360000200041086a41002900f89ac080003700002000410029" - "00f09ac08000370000200241143602102002200036020c20024114360208200241" - "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" - "86200241046aad843703202002418e80808000ad422086200241086aad84370318" - "2002200241186a36023020012802142001280218200241286a1091808080002100" - "20022802082201450d03200228020c20011087808080000c030b20002d00012100" - "2002410136022c200241d490c08000360228200242013702342002418280808000" - "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" - "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" - "02142001280218200241286a10918080800021000c020b20012000280204220028" - "0200200028020410af8080800021000c010b200028020422002802002001200028" - "0204280210118180808000808080800021000b200241c0006a2480808080002000" - "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" - "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" - "000240200141046a28020022022802002203450d00200020031182808080008080" - "8080000b024020022802042202450d00200020021087808080000b2001410c1087" - "808080000b0bf10101027f23808080800041206b22002480808080000240024002" - "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" - "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" - "410020013602d89ec08000410042808080808080013703d09ec080004100420037" - "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" - "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" - "200041003602182000410136020c200041bc9bc080003602082000420437021020" - "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" - "042480808080000240024002400240024020012802100d002001417f3602102003" - "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" - "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" - "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" - "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" - "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" - "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" - "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" - "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" - "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" - "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" - "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" - "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" - "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" - "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" - "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" - "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" - "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" - "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" - "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" - "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" - "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" - "2004410136020c2004418c91c0800036020820044204370210200441086a419491" - "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" - "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" - "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" - "80808000024020042d00084104460d00200020042903083702000c030b2001411c" - "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" - "066a210502402001280214200320066b22064b0d002000200141146a2005200610" - "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" - "002001411c6a20063602000b2001200128021041016a360210200441206a248080" - "8080000b7101027f20012802002104024020012802082205450d00200420056b20" - "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" - "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" - "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" - "0041106b2203248080808000200341086a20002802082802002001200210c98080" - "8000024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" - "046a28020022062802002207450d002001200711828080800080808080000b0240" - "20062802042206450d00200120061087808080000b2004410c1087808080000b20" - "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" - "23808080800041106b220224808080800020024100360204024002400240024020" - "01418001490d002001418010490d012001418080044f0d0220022001413f714180" - "01723a000620022001410c7641e001723a000420022001410676413f7141800172" - "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" - "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" - "418001723a00072002200141127641f001723a000420022001410676413f714180" - "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" - "00280208280200200241046a200110c980808000024020022d000822014104460d" - "0020002802042103200229030821040240024020002d0000220541044b0d002005" - "4103470d010b200328020021050240200341046a28020022062802002207450d00" - "2005200711828080800080808080000b024020062802042206450d002005200610" - "87808080000b2003410c1087808080000b200020043702000b200241106a248080" - "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" - "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" - "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" - "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" - "012002742204710d0020032000360200200020033602182000200036020c200020" - "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" - "200328020022042802044178712001470d00200421020c010b2001410041192002" - "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" - "002202450d02200341017421032002210420022802044178712001470d000b0b20" - "022802082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20002000" - "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" - "8080808000200028020c2102024002400240024020002802040e020001020b2002" - "0d0141012102410021030c020b20020d0020002802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c2001418f8080800020" - "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" - "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" - "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" - "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" - "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" - "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" - "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" - "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" - "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" - "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" - "0c010b2000410020006b41037122046a210502402004450d002000210320012106" - "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" - "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" - "0020084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a28020021060340200520062002762001280200220620" - "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" - "480d0020092101034020052001280200360200200141046a2101200541046a2205" - "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" - "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" - "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" - "067e22072003422088220820067e22062005200142208822097e7c22054220867c" - "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" - "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" - "00000c000000040000001200000013000000140000000000000000000000010000" - "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" - "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" - "2f6332663734633366393238616562353033663135623465396566353737386537" - "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" - "2e727300005f0010004b000000060a00000e000000000000000100000001000000" - "16000000170000001400000004000000180000004572726f72557466384572726f" - "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" - "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" - "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" - "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" - "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" - "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" - "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" - "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" - "000000da0110000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000b301100010000000fc011000100000000c02100009000000da0110" - "00090000000100000000000000ef0b100002000000000000000c00000004000000" - "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" - "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" - "000030783030303130323033303430353036303730383039313031313132313331" - "343135313631373138313932303231323232333234323532363237323832393330" - "333133323333333433353336333733383339343034313432343334343435343634" - "373438343935303531353235333534353535363537353835393630363136323633" - "363436353636363736383639373037313732373337343735373637373738373938" - "303831383238333834383538363837383838393930393139323933393439353936" - "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" - "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" - "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" - "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" - "031000220000000101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000020202020202020202020202020202020202020202020202020202020202" - "030303030303030303030303030303030404040404000000000000000000000000" - "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" - "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" - "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" - "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" - "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" - "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" - "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" - "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" - "000000690000001600000042616c616e636500b8051000360000007e0000001600" - "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" - "633266373463336639323861656235303366313562346539656635373738653737" - "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" - "652e72730000004c0610004d000000230100004200000000000000000000000400" - "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" - "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" - "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" - "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" - "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" - "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" - "206973206e6f7420706f737369626c652061667465722074686520746872656164" - "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" - "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" - "130000006661696c656420746f2067656e657261746520756e6971756520746872" - "6561642049443a2062697473706163652065786861757374656400040810003700" - "0000de07100015000000c40400000d00000001000000000000007374642f737263" - "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e000081081000090000005c081000250000000f0100002900000065" - "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" - "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" - "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" - "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" - "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" - "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" - "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" - "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" - "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" - "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" - "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" - "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" - "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" - "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" - "7267657265736f75726365206275737965786563757461626c652066696c652062" - "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" - "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" - "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" - "20696e746572727570746564756e737570706f72746564756e6578706563746564" - "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" - "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" - "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" - "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" - "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" - "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" - "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" - "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" - "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" - "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" - "65637572736976656c792061637175697265206d757465789c0c10002000000073" - "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" - "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" - "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" - "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" - "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" - "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" - "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" - "726d6564207265637572736976656c79840d100038000000100000001100000012" - "000000100000001000000013000000120000000d0000000e000000150000000c00" - "00000b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a000000100000001700000019000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600000015" - "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" - "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" - "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" - "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" - "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" - "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" - "000b000000040000004305100048051000540510005f0510006a05100000c62e04" - "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" - "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" - "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" - "6c6962313067657454784669656c64313768623836623962643665383439353163" - "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" - "43757272656e744c6564676572456e7472794669656c6431376861346138303037" - "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" - "6c696231396765744c6564676572456e7472794669656c64313768633661326634" - "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" - "5f6c69623139676574506172656e744c656467657254696d653137683731643366" - "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" - "696e745f6e756d626572313768343432633966366462343461613636374506305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" - "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" - "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" - "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" - "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" - "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376833326438343961303132376564636461450b445f" - "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" - "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" - "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" - "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" - "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683562646335303561663532336432393945" - "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" - "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" - "7a652447542433666d7431376836336361623039386234313233343130450f465f" - "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" - "63745f6669656c64325f66696e6973683137683135666166363733326663303964" - "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" - "313768396461663134643536353865323530364511265f5a4e34636f726533666d" - "743577726974653137683933353534653462653731663263376145124c5f5a4e34" - "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67244754243137683230373631353664386431" - "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" - "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" - "7224475424313768323066303937633266353863396661374514525f5a4e35335f" - "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" - "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" - "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" - "577269746524475424313077726974655f63686172313768323134333931636238" - "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" - "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" - "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" - "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" - "6573657276655f616e645f68616e646c6531376862356335336362636666396436" - "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" - "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "4754243977726974655f7374723137683539396439653537383934366464393845" - "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" - "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" - "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" - "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" - "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" - "6563313268616e646c655f6572726f723137683937623764626430663732646437" - "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" - "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683132313861313631643933363438653945" - "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" - "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768613636623539636339336533383537344520615f" - "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" - "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768633837363633386165616230633031664521475f" - "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376839393432316563653462383633" - "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" - "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" - "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" - "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" - "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" - "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" - "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" - "653970616e69636b696e673570616e696331376830346565623931376464393363" - "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" - "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" - "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" - "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" - "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" - "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" - "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" - "6b696e673970616e69635f666d7431376836353430636362326435666463336162" - "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" - "753230247533322447542433666d74313768626633653032323834383365333735" - "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" - "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" - "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" - "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" - "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" - "4e34636f726533666d7439466f726d617474657233706164313768343736396165" - "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" - "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" - "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" - "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" - "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" - "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" - "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" - "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" - "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" - "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" - "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" - "72656164795f626f72726f77656431376833313462353261316263343662666534" - "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" - "72756374356669656c64313768333531353864666637643465616633354537675f" - "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" - "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" - "7465244754243977726974655f7374723137683831386234396537653639613236" - "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" - "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" - "742e2e577269746524475424313077726974655f63686172313768393437396266" - "363162306130356661314539305f5a4e34636f726533666d743557726974653977" - "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" - "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" - "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" - "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" - "706c61792475323024666f7224753230246933322447542433666d743137686365" - "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" - "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376834366435353230663839333131346633453d0861" - "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" - "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" - "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" - "73746564313768333336626637613134383830343463384541425f5a4e34636f72" - "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" - "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" - "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" - "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" - "653970616e69636b696e6731336173736572745f6661696c656431376832333236" - "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768653138373433383865303762666532354545595f5a4e36305f244c542473" - "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" - "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" - "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" - "2e2e446973706c61792447542433666d7431376863653432323661613166373236" - "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" - "242447542424475424313768313636646336316162303333346331654548495f5a" - "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" - "2454244754243130696e697469616c697a65313768376635633530386461396531" - "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" - "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" - "697465244754243977726974655f616c6c31376832346238323631303436316432" - "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" - "65723138427566577269746572244c54245724475424313477726974655f616c6c" - "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c54245424475424247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376837666163663562" - "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" - "726974655f6368617231376866306233626531656331396465356537454d305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376866383830" - "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" - "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" - "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" - "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" - "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" - "645f73686f72745f6261636b747261636531376834646333646534376432323032" - "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" - "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" - "37642424753764243137686531376133393737663839633131373845533b5f5a4e" - "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" - "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" - "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" - "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" - "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" - "735f737472313768656233663732326432323465343266384555066d656d636d70" - "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" - "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d627901057275737463" - "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" - "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" - "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" - "797065732b087369676e2d657874"; + static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); // let dest = get_current_escrow_destination(); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index a46d71a5699..5c9c0afc9c2 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -17,12 +17,15 @@ */ //============================================================================== +#include #include #include #include +#include + namespace ripple { namespace test { @@ -104,1113 +107,7 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN1() { testcase("escrow wasm devnet 1 test"); - auto wasmHex = - "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" - "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" - "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" - "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" - "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" - "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" - "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" - "745f6c696213676574506172656e744c656467657254696d650005035453020603" - "070101080901010a01000202010102080008000b0c030101010104050802030303" - "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" - "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" - "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" - "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" - "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" - "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" - "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" - "14200142808080801037020c200141033a00382001412036022820014100360234" - "2001418080c08000360230200141003602202001410036021820012001410c6a36" - "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" - "808080000d00200128020c21002001280210220220012802141080808080000240" - "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" - "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" - "027f017e037f23808080800041306b220324808080800041272104024002402000" - "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" - "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" - "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" - "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" - "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" - "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" - "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" - "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" - "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" - "41096a20046a412720046b108c808080002104200341306a24808080800020040b" - "6c01027f024002402000417c6a2802002202417871220341044108200241037122" - "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" - "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" - "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" - "2005200136020c2005200036020820052003360214200520023602102005410236" - "021c200541b884c08000360218200542023702242005418180808000ad42208620" - "0541106aad843703382005418280808000ad422086200541086aad843703302005" - "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" - "0041c0006b220224808080800002400240200028020022032d00000d0020012802" - "14419582c080004104200128021828020c118080808000808080800021000c010b" - "4101210020012802142204419982c0800041042001280218220528020c22061180" - "8080800080808080000d00200341016a210302400240200128021c22074104710d" - "0041012100200441f184c080004101200611808080800080808080000d02200320" - "01108a80808000450d010c020b200441f284c08000410220061180808080008080" - "8080000d0141012100200241013a001b200220053602102002200436020c200220" - "07360238200241c884c08000360234200220012d00203a003c2002200128021036" - "022c200220012902083702242002200129020037021c20022002411b6a36021420" - "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" - "80004102200228023428020c11808080800080808080000d010b2001280214419c" - "97c080004101200128021828020c118080808000808080800021000b200241c000" - "6a24808080800020000be90201057f2380808080004180016b2202248080808000" - "0240024002400240200128021c22034110710d0020034120710d01200031000041" - "01200110868080800021000c030b20002d0000210041ff00210303402002200322" - "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" - "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" - "0041ff00210303402002200322046a22052000410f712203413072200341376a20" - "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" - "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" - "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" - "02402004418101490d002004418001418885c08000108b80808000000b20014101" - "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" - "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" - "20032000360200200320013602042003410236020c200341d887c0800036020820" - "0342023702142003418380808000ad4220862204200341046aad84370328200320" - "042003ad843703202003200341206a360210200341086a200210aa80808000000b" - "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" - "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" - "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" - "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" - "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" - "2802000d000240200028021422012000280218220920082002200310ad80808000" - "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" - "0240024002402000280204220120064b0d00200028021422012000280218220920" - "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" - "2000413036021020002d0020210b4101210c200041013a00202000280214220920" - "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" - "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" - "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" - "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" - "1180808080008080808000210c0c010b200120066b210702400240024020002d00" - "2022010e0402000100020b20072101410021070c010b2007410176210120074101" - "6a41017621070b200141016a210120002802102106200028021821092000280214" - "210a024003402001417f6a2201450d01200a200620092802101181808080008080" - "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" - "200a20042005200928020c11808080800080808080000d00410021010340024020" - "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" - "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" - "0041106b220224808080800020022000280200220041046a36020c200141e181c0" - "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" - "418580808000108f808080002100200241106a24808080800020000be70201057f" - "2380808080004180016b22022480808080000240024002400240200128021c2203" - "4110710d0020034120710d0120003502004101200110868080800021000c030b20" - "00280200210041ff00210303402002200322046a22052000410f71220341307220" - "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" - "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" - "004110492106200041047621002006450d000b02402004418101490d0020044180" - "01418885c08000108b80808000000b20014101419885c080004102200541810120" - "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" - "85c08000108b80808000000b20014101419885c080004102200541810120044101" - "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" - "8080800041106b220b248080808000200028021420012002200028021828020c11" - "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" - "200b41086a200320042005200610b680808000200720082009200a10b680808000" - "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" - "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" - "0028021828020c118080808000808080800021000c010b200028021441ee84c080" - "004101200028021828020c118080808000808080800021000b200b41106a248080" - "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" - "23808080800041306b2203248080808000200341033a002c2003412036021c4100" - "210420034100360228200320013602242003200036022020034100360214200341" - "0036020c02400240024002400240200228021022050d00200228020c2200450d01" - "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" - "280200210003400240200041046a2802002207450d002003280220200028020020" - "07200328022428020c11808080800080808080000d040b20012802002003410c6a" - "200128020411818080800080808080000d03200141086a2101200041086a210020" - "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" - "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" - "40200041046a2802002201450d0020032802202000280200200120032802242802" - "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" - "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" - "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" - "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" - "0b0b200320073602102003200b36020c200141046a280200210702400240024020" - "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" - "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a200128020411818080800080808080000d02" - "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" - "280220200228020020044103746a22012802002001280204200328022428020c11" - "80808080008080808000450d010b410121010c010b410021010b200341306a2480" - "8080800020010b1e01017f024020002802002201450d0020002802042001108780" - "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" - "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" - "808080000be30201027f23808080800041106b2202248080808000024002400240" - "02402001418001490d002002410036020c2001418010490d010240200141808004" - "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" - "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" - "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" - "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" - "032000280200470d0020001096808080000b2000200341016a3602082000280204" - "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" - "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" - "20032001109780808000200028020821030b200028020420036a2002410c6a2001" - "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "01109c80808000024020012802082200418180808078460d002000200128020c10" - "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" - "03248080808000200341086a200020012002109c80808000024020032802082202" - "418180808078460d002002200328020c109d80808000000b200341106a24808080" - "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109780808000200028020821030b200028020420036a2001200210d6808080001a" - "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" - "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" - "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" - "200136020820002002410120021b36020420002002453602000b800601057f0240" - "024002402000417c6a22032802002204417871220541044108200441037122061b" - "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" - "712002410b491b210102400240024020060d002001418002490d01200520014104" - "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" - "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" - "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" - "01490d042006200410a780808000200520016b22024110490d0120032001200328" - "020041017172410272360200200720016a22012002410372360204200720056a22" - "0520052802044101723602042001200210a88080800020000f0b200520016b2202" - "410f4d0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210a88080800020000f0b200320" - "05200328020041017172410272360200200720056a220220022802044101723602" - "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" - "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" - "020441017236020441002102410021010c010b2003200120044101717241027236" - "0200200720016a22012002410172360204200720056a2205200236020020052005" - "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" - "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" - "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" - "2201200220012002491b10d6808080002102200010a580808000200221000b2000" - "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" - "0010a680808000000b20032001200441017172410272360200200720016a220220" - "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" - "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" - "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" - "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" - "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" - "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" - "00411920044101766b2004411f461b742107410021060340024020052205280204" - "41787122082002490d00200820026b220820014f0d00200821012005210620080d" - "004100210120052106200521000c040b200528021422082000200820052007411d" - "764104716a41106a2802002205471b200020081b2100200741017421072005450d" - "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" - "491b22024103762201762200410371450d00024002402000417f7341017120016a" - "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" - "2206460d002006200136020c200120063602080c010b41002005417e2007777136" - "0298a2c080000b20022000410372360204200220006a2200200028020441017236" - "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" - "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" - "020441787120026b21012006210503400240200628021022000d00200628021422" - "000d0020052802182104024002400240200528020c22002005470d002005411441" - "10200528021422001b6a28020022060d01410021000c020b200528020822062000" - "36020c200020063602080c010b200541146a200541106a20001b21070340200721" - "082006220041146a200041106a200028021422061b210720004114411020061b6a" - "28020022060d000b200841003602000b2004450d040240200528021c4102744180" - "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" - "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" - "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" - "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" - "0020017441022001742200410020006b727168220841037422014190a0c080006a" - "220620014198a0c080006a28020022002802082207460d002007200636020c2006" - "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" - "360204200020026a2207200120026b2206410172360204200020016a2006360200" - "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" - "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" - "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" - "0120023602082005200236020c2002200136020c200220053602080b4100200736" - "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" - "20052802102206450d0020002006360210200620003602180b2005280214220645" - "0d0020002006360214200620003602180b02400240024020014110490d00200520" - "02410372360204200520026a22022001410172360204200220016a200136020041" - "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" - "c080002100024002404100280298a2c08000220841012007410376742207710d00" - "41002008200772360298a2c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200520012002" - "6a2200410372360204200520006a220020002802044101723602040c010b410020" - "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" - "720d004100210641022004742200410020006b722003712200450d032000684102" - "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" - "71220520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b2106200120082007" - "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" - "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" - "002006470d00200641144110200628021422001b6a28020022050d01410021000c" - "020b20062802082205200036020c200020053602080c010b200641146a20064110" - "6a20001b21070340200721082005220041146a200041106a200028021422051b21" - "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" - "40200628021c41027441809fc080006a22052802002006460d0020044110411420" - "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" - "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" - "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" - "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" - "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" - "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" - "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" - "a0c080002100034020002802002206200028020422076a2005460d022000280208" - "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" - "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" - "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" - "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" - "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" - "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" - "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" - "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" - "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" - "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" - "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" - "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" - "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" - "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" - "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" - "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" - "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" - "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" - "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" - "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" - "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" - "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" - "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" - "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" - "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" - "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" - "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" - "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" - "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" - "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" - "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" - "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" - "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" - "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" - "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" - "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" - "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" - "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" - "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" - "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" - "360204410041808080013602b8a2c080002001200641606a41787141786a220020" - "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" - "290288a0c080003702002007200937020841002008360284a0c080004100200536" - "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" - "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" - "0720072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010d0808080000c080b200041f8017141" - "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" - "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" - "0620013602082000200136020c2001200636020c200120003602080c070b200020" - "053602002000200028020420086a360204200520024103723602042007410f6a41" - "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" - "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" - "417871220610a780808000200620026a2102200120066a220128020421060b2001" - "2006417e7136020420002002410172360204200020026a20023602000240200241" - "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" - "024002404100280298a2c08000220641012002410376742202710d004100200620" - "0272360298a2c08000200121020c010b200128020821020b200120003602082002" - "200036020c2000200136020c200020023602080c050b4100200020026b22013602" - "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" - "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" - "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" - "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" - "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" - "800020052006410172360204200120006a2006360200200120024103723602040b" - "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" - "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" - "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" - "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" - "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" - "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" - "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" - "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" - "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" - "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" - "4020062802102205450d0020002005360210200520003602180b20062802142205" - "450d0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a20013602000240" - "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" - "6a2102024002404100280298a2c08000220541012001410376742201710d004100" - "2005200172360298a2c08000200221010c010b200228020821010b200220003602" - "082001200036020c2000200236020c200020013602080c010b2006200120026a22" - "00410372360204200620006a220020002802044101723602040b200641086a0be9" - "0101037f23808080800041206b2204248080808000024002400240200220036a22" - "0320024f0d00410021020c010b4100210220012802002205410174220620032006" - "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" - "0c010b2004200536021c20042001280204360214410121020b2004200236021820" - "0441086a2003200441146a109980808000024020042802080d00200428020c2102" - "200120033602002001200236020441818080807821020c010b2004280210210120" - "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" - "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" - "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" - "0041052000418680808000419082c0800041052002410c6a418780808000108f80" - "8080002100200241106a24808080800020000be00301097f23808080800041c000" - "6b2202248080808000200028020821032000280204210441012105200128021441" - "b083c080004101200128021828020c118080808000808080800021000240200345" - "0d0041002106034020062107410121062000410171210841012100024020080d00" - "02400240200128021c22084104710d002007410171450d01410121002001280214" - "41e784c080004102200128021828020c1180808080008080808000450d010c020b" - "200128021821092001280214210a024020074101710d0041012100200a41888bc0" - "80004101200928020c11808080800080808080000d020b200241013a001b200220" - "093602102002200a36020c20022008360238200241c884c0800036023420022001" - "2d00203a003c2002200128021036022c2002200129020837022420022001290200" - "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" - "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" - "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" - "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" - "4101200128021828020c118080808000808080800021050b200241c0006a248080" - "80800020050b4a01017f23808080800041106b2202248080808000200220003602" - "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" - "00200241106a24808080800020000b3d00200128021420002802002d0000410274" - "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" - "808080800080808080000be70101017f23808080800041106b2205248080808000" - "20002802142001410d200028021828020c11808080800080808080002101200541" - "003a000d200520013a000c20052000360208200541086a200241042003200410b6" - "80808000210320052d000d220120052d000c2204722100024020014101470d0020" - "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" - "004102200028021828020c118080808000808080800021000c010b200028021441" - "ee84c080004101200028021828020c118080808000808080800021000b20054110" - "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" - "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" - "02400240024002400240024002404107109b808080002201450d00200141036a41" - "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" - "800022022800042103200228000021042002410810878080800020014107108780" - "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" - "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" - "002202280004210520022800002106200241081087808080002001410710878080" - "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" - "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" - "2202280004210720022800002108200241081087808080002001410b1087808080" - "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" - "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" - "108380808000220928000421022009280000210a20094108108780808000200041" - "186a200a200210a48080800002400240024020002d00184101460d002000290320" - "210b02402002450d00200a20021087808080000b20014107108780808000410021" - "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" - "0000200141041082808080002202280000210c2002280004210a20024108108780" - "80800020014104108780808000024002400240200a4100480d000240200a0d0041" - "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" - "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" - "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" - "026b210f4100210103400240024002400240200220016a2d00002209c022104100" - "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" - "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" - "808080202111428080808010211202400240024002400240024002400240024002" - "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" - "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" - "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" - "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" - "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" - "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" - "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" - "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" - "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" - "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" - "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" - "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" - "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" - "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" - "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" - "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" - "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" - "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" - "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" - "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" - "41186a20142011a710a48080800020002d00184101460d01200029032021124100" - "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" - "201641076a41002800878cc08000360000201641002900808cc080003700002016" - "410b10828080800022012800002117200128000421132001410810878080800002" - "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" - "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" - "09201741016a210220134109490d024100210103402009450d0a20022d00004150" - "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" - "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" - "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" - "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" - "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" - "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" - "20090d040b410021010c050b201321092017210220134108490d020b4100210103" - "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" - "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" - "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" - "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" - "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" - "0b1087808080002004200310808080800020062005108080808000200820071080" - "80808000200c200a10808080800020004100360214200042808080801037020c20" - "0041033a003820004120360228200041003602342000418080c080003602302000" - "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" - "1086808080000d00200028020c2102200028021022092000280214108080808000" - "02402002450d00200920021087808080000b201510858080800020011085808080" - "0041002102024020032005470d0020042006200310d58080800045200b20125871" - "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" - "00200c200a1087808080000b02402007450d00200820071087808080000b024020" - "05450d00200620051087808080000b02402003450d00200420031087808080000b" - "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" - "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" - "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" - "80800041106b220324808080800002400240024002400240024002400240024002" - "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" - "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" - "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" - "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" - "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" - "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" - "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" - "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" - "0121010c010b20002005370308410021010b200020013a0000200341106a248080" - "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" - "030240024020024101710d002002410271450d012001280200220220006a210002" - "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" - "410020003602a0a2c0800020032003280204417e71360204200120004101723602" - "04200320003602000f0b2001200210a7808080000b024002400240024002400240" - "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" - "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" - "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" - "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" - "20003602000b2000418002490d022001200010d080808000410021014100410028" - "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" - "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" - "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" - "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" - "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" - "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" - "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b200128020821010c" - "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" - "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" - "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" - "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" - "0320013602082000200136020c2001200336020c200120003602080f0b02404100" - "280288a0c080002201450d00410021020340200241016a2102200128020822010d" - "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" - "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" - "02410036021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110aa80808000000b820301047f200028020c" - "21020240024002402001418002490d002000280218210302400240024020022000" - "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" - "002802082201200236020c200220013602080c010b200041146a200041106a2002" - "1b21040340200421052001220241146a200241106a200228021422011b21042002" - "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441809fc080006a22012802002000460d0020034110411420032802" - "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" - "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" - "102201450d0020022001360210200120023602180b20002802142201450d002002" - "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" - "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" - "20013602a0a2c0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a7808080000b02400240024002402002280204" - "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" - "0d0320022003417871220310a7808080002000200320016a220141017236020420" - "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" - "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" - "80006a2102024002404100280298a2c08000220341012001410376742201710d00" - "41002003200172360298a2c08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" - "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" - "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" - "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" - "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" - "4701017f23808080800041206b2200248080808000200041003602182000410136" - "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" - "80808000000b5601017f23808080800041206b2202248080808000200241106a20" - "0041106a290200370300200241086a200041086a290200370300200241013b011c" - "2002200136021820022000290200370300200210ac80808000000b110020003502" - "00410120011086808080000b5d01027f23808080800041206b2201248080808000" - "20002802182102200141106a200041106a290200370300200141086a200041086a" - "2902003703002001200036021c2001200236021820012000290200370300200110" - "d180808000000b490002402002418080c400460d00200020022001280210118180" - "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" - "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" - "808080800020022000360200200220013602042002410236020c200241f887c080" - "00360208200242023702142002418380808000ad4220862203200241046aad8437" - "0328200220032002ad843703202002200241206a360210200241086a419487c080" - "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" - "0022040d002003410171450d010b02402003410171450d00200120026a21050240" - "0240200028020c22060d0041002107200121080c010b4100210741002109200121" - "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" - "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" - "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" - "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" - "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" - "20031b21022003200120031b21010b024020040d00200028021420012002200028" - "021828020c11808080800080808080000f0b2000280204210a024020024110490d" - "0020022001200141036a417c7122076b22096a220b410371210441002106410021" - "03024020012007460d004100210302402009417c4b0d0041002103410021050340" - "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" - "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" - "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" - "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" - "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" - "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" - "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002004200d41f007716a210941002108200421030340200328" - "020c2207417f7341077620074106767241818284087120032802082207417f7341" - "077620074106767241818284087120032802042207417f73410776200741067672" - "41818284087120032802002207417f734107762007410676724181828408712008" - "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" - "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" - "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" - "03410676724181828408712103200c4101460d0220082802042207417f73410776" - "20074106767241818284087120036a2103200c4102460d0220082802082208417f" - "7341077620084106767241818284087120036a21030c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" - "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" - "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" - "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" - "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" - "0d000c030b0b200028021420012002200028021828020c11808080800080808080" - "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" - "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" - "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a210320002802102109200028021821082000280214" - "210703402003417f6a2203450d0220072009200828021011818080800080808080" - "00450d000b41010f0b200028021420012002200028021828020c11808080800080" - "808080000f0b0240200720012002200828020c1180808080008080808000450d00" - "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" - "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" - "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" - "36020c20032000360208200341b08dc08000360214200320013602102003410236" - "021c200341b183c08000360218024020022802000d002003410336025c200341e4" - "83c08000360258200342033702642003418180808000ad4220862204200341106a" - "ad8437034820032004200341086aad843703402003418280808000ad4220862003" - "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" - "808000000b200341206a41106a200241106a290200370300200341206a41086a20" - "0241086a290200370300200320022902003703202003410436025c2003419884c0" - "8000360258200342043702642003418180808000ad4220862204200341106aad84" - "37035020032004200341086aad843703482003418980808000ad42208620034120" - "6aad843703402003418280808000ad422086200341186aad843703382003200341" - "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" - "01200028020428020c11818080800080808080000b140020012000280200200028" - "020410af808080000b14002001280214200128021820001091808080000b220020" - "01280214418883c08000410e200128021828020c11808080800080808080000b60" - "01017f23808080800041306b22002480808080002000410136020c200041a883c0" - "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" - "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" - "057f017e23808080800041c0006b220524808080800041012106024020002d0004" - "0d0020002d0005210702402000280200220828021c22094104710d004101210620" - "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" - "28021828020c11808080800080808080000d012008280214200120022008280218" - "28020c11808080800080808080000d01200828021441ef97c08000410220082802" - "1828020c11808080800080808080000d0120032008200411818080800080808080" - "0021060c010b41012106024020074101710d00200828021441e984c08000410320" - "0828021828020c11808080800080808080000d01200828021c21090b4101210620" - "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" - "6a360214200520082902083702242008290200210a200520093602382005200828" - "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" - "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" - "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" - "84c080004102200528023428020c118080808000808080800021060b200041013a" - "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" - "6a2103200028020421042000280200210520002802082106410021074100210841" - "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" - "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" - "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" - "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" - "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" - "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" - "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" - "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" - "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" - "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" - "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" - "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" - "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" - "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" - "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" - "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" - "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" - "21070b20070b6001027f2000280204210220002802002103024020002802082200" - "2d0000450d00200341e084c080004104200228020c118080808000808080800045" - "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" - "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" - "41306b22032480808080002003200136020c200320003602082003410136021420" - "0341d490c080003602102003420137021c2003418280808000ad42208620034108" - "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" - "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" - "808080000b830201087f2380808080004180016b22022480808080002001280204" - "21032001280200210420002802002100200128021c220521060240200541047145" - "0d002005410872210620040d0020014281808080a0013702000b20012006410472" - "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" - "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" - "09450d000b02402007418101490d002007418001418885c08000108b8080800000" - "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" - "01200536021c200120033602042001200436020020024180016a24808080800020" - "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" - "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" - "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" - "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" - "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" - "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" - "006b22012480808080002001410636020c2001419498c08000360208024041002d" - "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" - "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" - "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" - "2003450d02200320032802002204417f6a3602002003290308210220044101470d" - "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" - "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" - "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" - "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" - "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" - "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" - "021041042103200141043a00182001200141106a360220200141186a41c08dc080" - "002000109180808000210020012d001821040240024020000d0042002102411720" - "0441ff0171764101710d01200128021c220328020021000240200341046a280200" - "22042802002205450d002000200511828080800080808080000b02402004280204" - "2204450d00200020041087808080000b2003410c108780808000410421030c010b" - "200441ff01714104460d032001290318220642807e8321022006a721030b200128" - "021022002000280208417f6a2204360208024020040d00200041003a000c200042" - "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" - "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" - "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" - "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" - "97c08000360228200142023702342001418c80808000ad422086200141106aad84" - "3703202001418280808000ad422086200141086aad843703182001200141186a36" - "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" - "6b22022480808080002002200036020c20024102360214200241a88bc080003602" - "102002420137021c2002418b8080800036022c2002200241286a36021820022002" - "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" - "808080000b200241306a2480808080000b4701017f23808080800041206b220024" - "8080808000200041003602182000410136020c200041bc90c08000360208200042" - "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" - "808080800041206b220024808080800041002d00b89ec080001a02400240024041" - "20109b808080002201450d00200141023602102001428180808010370300410029" - "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" - "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" - "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" - "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" - "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" - "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" - "41003a000020002802182202450d00200120021087808080000b02402000417f46" - "0d00200020002802042201417f6a36020420014101470d00200041201087808080" - "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" - "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" - "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" - "c08000410410af808080000be50301017f23808080800041c0006b220224808080" - "800002400240024002400240024020002d00000e0400010203000b200220002802" - "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" - "002800809bc08000360000200041086a41002900f89ac080003700002000410029" - "00f09ac08000370000200241143602102002200036020c20024114360208200241" - "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" - "86200241046aad843703202002418e80808000ad422086200241086aad84370318" - "2002200241186a36023020012802142001280218200241286a1091808080002100" - "20022802082201450d03200228020c20011087808080000c030b20002d00012100" - "2002410136022c200241d490c08000360228200242013702342002418280808000" - "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" - "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" - "02142001280218200241286a10918080800021000c020b20012000280204220028" - "0200200028020410af8080800021000c010b200028020422002802002001200028" - "0204280210118180808000808080800021000b200241c0006a2480808080002000" - "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" - "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" - "000240200141046a28020022022802002203450d00200020031182808080008080" - "8080000b024020022802042202450d00200020021087808080000b2001410c1087" - "808080000b0bf10101027f23808080800041206b22002480808080000240024002" - "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" - "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" - "410020013602d89ec08000410042808080808080013703d09ec080004100420037" - "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" - "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" - "200041003602182000410136020c200041bc9bc080003602082000420437021020" - "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" - "042480808080000240024002400240024020012802100d002001417f3602102003" - "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" - "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" - "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" - "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" - "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" - "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" - "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" - "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" - "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" - "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" - "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" - "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" - "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" - "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" - "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" - "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" - "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" - "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" - "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" - "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" - "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" - "2004410136020c2004418c91c0800036020820044204370210200441086a419491" - "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" - "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" - "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" - "80808000024020042d00084104460d00200020042903083702000c030b2001411c" - "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" - "066a210502402001280214200320066b22064b0d002000200141146a2005200610" - "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" - "002001411c6a20063602000b2001200128021041016a360210200441206a248080" - "8080000b7101027f20012802002104024020012802082205450d00200420056b20" - "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" - "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" - "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" - "0041106b2203248080808000200341086a20002802082802002001200210c98080" - "8000024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" - "046a28020022062802002207450d002001200711828080800080808080000b0240" - "20062802042206450d00200120061087808080000b2004410c1087808080000b20" - "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" - "23808080800041106b220224808080800020024100360204024002400240024020" - "01418001490d002001418010490d012001418080044f0d0220022001413f714180" - "01723a000620022001410c7641e001723a000420022001410676413f7141800172" - "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" - "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" - "418001723a00072002200141127641f001723a000420022001410676413f714180" - "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" - "00280208280200200241046a200110c980808000024020022d000822014104460d" - "0020002802042103200229030821040240024020002d0000220541044b0d002005" - "4103470d010b200328020021050240200341046a28020022062802002207450d00" - "2005200711828080800080808080000b024020062802042206450d002005200610" - "87808080000b2003410c1087808080000b200020043702000b200241106a248080" - "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" - "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" - "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" - "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" - "012002742204710d0020032000360200200020033602182000200036020c200020" - "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" - "200328020022042802044178712001470d00200421020c010b2001410041192002" - "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" - "002202450d02200341017421032002210420022802044178712001470d000b0b20" - "022802082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20002000" - "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" - "8080808000200028020c2102024002400240024020002802040e020001020b2002" - "0d0141012102410021030c020b20020d0020002802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c2001418f8080800020" - "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" - "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" - "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" - "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" - "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" - "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" - "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" - "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" - "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" - "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" - "0c010b2000410020006b41037122046a210502402004450d002000210320012106" - "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" - "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" - "0020084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a28020021060340200520062002762001280200220620" - "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" - "480d0020092101034020052001280200360200200141046a2101200541046a2205" - "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" - "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" - "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" - "067e22072003422088220820067e22062005200142208822097e7c22054220867c" - "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" - "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" - "00000c000000040000001200000013000000140000000000000000000000010000" - "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" - "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" - "2f6332663734633366393238616562353033663135623465396566353737386537" - "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" - "2e727300005f0010004b000000060a00000e000000000000000100000001000000" - "16000000170000001400000004000000180000004572726f72557466384572726f" - "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" - "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" - "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" - "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" - "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" - "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" - "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" - "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" - "000000da0110000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000b301100010000000fc011000100000000c02100009000000da0110" - "00090000000100000000000000ef0b100002000000000000000c00000004000000" - "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" - "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" - "000030783030303130323033303430353036303730383039313031313132313331" - "343135313631373138313932303231323232333234323532363237323832393330" - "333133323333333433353336333733383339343034313432343334343435343634" - "373438343935303531353235333534353535363537353835393630363136323633" - "363436353636363736383639373037313732373337343735373637373738373938" - "303831383238333834383538363837383838393930393139323933393439353936" - "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" - "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" - "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" - "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" - "031000220000000101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000020202020202020202020202020202020202020202020202020202020202" - "030303030303030303030303030303030404040404000000000000000000000000" - "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" - "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" - "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" - "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" - "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" - "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" - "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" - "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" - "000000690000001600000042616c616e636500b8051000360000007e0000001600" - "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" - "633266373463336639323861656235303366313562346539656635373738653737" - "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" - "652e72730000004c0610004d000000230100004200000000000000000000000400" - "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" - "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" - "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" - "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" - "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" - "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" - "206973206e6f7420706f737369626c652061667465722074686520746872656164" - "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" - "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" - "130000006661696c656420746f2067656e657261746520756e6971756520746872" - "6561642049443a2062697473706163652065786861757374656400040810003700" - "0000de07100015000000c40400000d00000001000000000000007374642f737263" - "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e000081081000090000005c081000250000000f0100002900000065" - "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" - "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" - "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" - "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" - "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" - "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" - "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" - "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" - "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" - "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" - "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" - "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" - "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" - "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" - "7267657265736f75726365206275737965786563757461626c652066696c652062" - "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" - "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" - "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" - "20696e746572727570746564756e737570706f72746564756e6578706563746564" - "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" - "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" - "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" - "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" - "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" - "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" - "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" - "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" - "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" - "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" - "65637572736976656c792061637175697265206d757465789c0c10002000000073" - "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" - "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" - "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" - "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" - "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" - "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" - "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" - "726d6564207265637572736976656c79840d100038000000100000001100000012" - "000000100000001000000013000000120000000d0000000e000000150000000c00" - "00000b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a000000100000001700000019000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600000015" - "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" - "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" - "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" - "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" - "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" - "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" - "000b000000040000004305100048051000540510005f0510006a05100000c62e04" - "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" - "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" - "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" - "6c6962313067657454784669656c64313768623836623962643665383439353163" - "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" - "43757272656e744c6564676572456e7472794669656c6431376861346138303037" - "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" - "6c696231396765744c6564676572456e7472794669656c64313768633661326634" - "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" - "5f6c69623139676574506172656e744c656467657254696d653137683731643366" - "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" - "696e745f6e756d626572313768343432633966366462343461613636374506305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" - "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" - "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" - "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" - "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" - "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376833326438343961303132376564636461450b445f" - "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" - "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" - "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" - "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" - "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683562646335303561663532336432393945" - "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" - "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" - "7a652447542433666d7431376836336361623039386234313233343130450f465f" - "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" - "63745f6669656c64325f66696e6973683137683135666166363733326663303964" - "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" - "313768396461663134643536353865323530364511265f5a4e34636f726533666d" - "743577726974653137683933353534653462653731663263376145124c5f5a4e34" - "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67244754243137683230373631353664386431" - "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" - "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" - "7224475424313768323066303937633266353863396661374514525f5a4e35335f" - "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" - "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" - "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" - "577269746524475424313077726974655f63686172313768323134333931636238" - "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" - "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" - "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" - "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" - "6573657276655f616e645f68616e646c6531376862356335336362636666396436" - "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" - "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "4754243977726974655f7374723137683539396439653537383934366464393845" - "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" - "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" - "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" - "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" - "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" - "6563313268616e646c655f6572726f723137683937623764626430663732646437" - "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" - "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683132313861313631643933363438653945" - "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" - "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768613636623539636339336533383537344520615f" - "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" - "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768633837363633386165616230633031664521475f" - "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376839393432316563653462383633" - "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" - "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" - "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" - "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" - "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" - "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" - "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" - "653970616e69636b696e673570616e696331376830346565623931376464393363" - "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" - "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" - "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" - "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" - "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" - "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" - "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" - "6b696e673970616e69635f666d7431376836353430636362326435666463336162" - "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" - "753230247533322447542433666d74313768626633653032323834383365333735" - "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" - "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" - "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" - "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" - "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" - "4e34636f726533666d7439466f726d617474657233706164313768343736396165" - "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" - "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" - "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" - "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" - "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" - "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" - "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" - "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" - "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" - "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" - "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" - "72656164795f626f72726f77656431376833313462353261316263343662666534" - "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" - "72756374356669656c64313768333531353864666637643465616633354537675f" - "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" - "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" - "7465244754243977726974655f7374723137683831386234396537653639613236" - "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" - "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" - "742e2e577269746524475424313077726974655f63686172313768393437396266" - "363162306130356661314539305f5a4e34636f726533666d743557726974653977" - "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" - "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" - "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" - "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" - "706c61792475323024666f7224753230246933322447542433666d743137686365" - "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" - "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376834366435353230663839333131346633453d0861" - "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" - "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" - "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" - "73746564313768333336626637613134383830343463384541425f5a4e34636f72" - "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" - "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" - "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" - "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" - "653970616e69636b696e6731336173736572745f6661696c656431376832333236" - "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768653138373433383865303762666532354545595f5a4e36305f244c542473" - "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" - "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" - "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" - "2e2e446973706c61792447542433666d7431376863653432323661613166373236" - "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" - "242447542424475424313768313636646336316162303333346331654548495f5a" - "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" - "2454244754243130696e697469616c697a65313768376635633530386461396531" - "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" - "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" - "697465244754243977726974655f616c6c31376832346238323631303436316432" - "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" - "65723138427566577269746572244c54245724475424313477726974655f616c6c" - "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c54245424475424247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376837666163663562" - "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" - "726974655f6368617231376866306233626531656331396465356537454d305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376866383830" - "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" - "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" - "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" - "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" - "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" - "645f73686f72745f6261636b747261636531376834646333646534376432323032" - "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" - "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" - "37642424753764243137686531376133393737663839633131373845533b5f5a4e" - "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" - "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" - "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" - "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" - "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" - "735f737472313768656233663732326432323465343266384555066d656d636d70" - "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" - "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d627901057275737463" - "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" - "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" - "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" - "797065732b087369676e2d657874"; + auto wasmHex = allHostFunctionsHex; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); @@ -1301,7 +198,7 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { @@ -1319,7 +216,7 @@ struct Wasm_test : public beast::unit_test::suite { // fail because current time < escrow_finish_after time TestHostFunctions nfs(&env); nfs.clock_drift = -1; - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { @@ -1344,7 +241,7 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); BEAST_EXPECT(re.error()); std::cout << "bad case (access nonexistent field) result " @@ -1364,7 +261,7 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(!re)) std::cout << "bad case (more than MAX_PAGES) result " @@ -1372,725 +269,7 @@ struct Wasm_test : public beast::unit_test::suite } { // fail because recursion too deep - auto wasmHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; + auto wasmHex = deepRecursionHex; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h new file mode 100644 index 00000000000..1d377676c6b --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -0,0 +1,1569 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +static auto const ledgerSqnHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" + "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" + "010700100041044a0b004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d31" + "2e38352e31202834656231363132353020323032352d30332d3135290049" + "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" + "732b0a6d756c746976616c7565"; + +static auto const allHostFunctionsHex = + "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" + "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" + "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" + "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" + "686f73745f6c69621a67657443757272656e744c6564676572456e747279" + "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" + "794669656c64000408686f73745f6c696213676574506172656e744c6564" + "67657254696d65000503363501010101090a000302010101010506020207" + "020201040001010100010400010101020701080101030800010103020202" + "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" + "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" + "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" + "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" + "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" + "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" + "0000450440200128021c41d480c0004104200128022028020c1100002100" + "0c010b41012100200128021c220341d880c0004104200128022022062802" + "0c22051100000d00200441016a2104024020012d00144104714504402003" + "418d83c000410120051100000d022004200110050d02200128021c210320" + "0128022028020c21050c010b2003418e83c000410220051100000d012002" + "41013a0017200241206a200141086a290200370300200241286a20014110" + "6a290200370300200241306a200141186a2802003602002002200636020c" + "20022003360208200241e482c00036023820022001290200370318200220" + "0241176a3602102002200241086a3602342004200241186a10050d012002" + "280234418883c0004102200228023828020c1100000d010b2003419891c0" + "004101200511000021000b200241406b240020000bff0201037f23004180" + "016b22032400027f0240200128021422024110714504402002412071450d" + "0120002d0000210241810121000340200020036a41026b2002410f712204" + "413072200441376a2004410a491b3a000020022204410476210220004101" + "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" + "41810120006b10090c020b20002d0000210241810121000340200020036a" + "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" + "22044104762102200041016b21002004410f4b0d000b20014101419183c0" + "004102200020036a41016b41810120006b10090c010b0240024002402000" + "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" + "0171410174419383c0006a2f00003b0001410021000c010b410221002002" + "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" + "410174419383c0006a2f00003b00010b2001410141014100200020036a20" + "0041037310090b20034180016a24000b4701017f230041106b2202240020" + "022000280200220041046a36020c200141a080c000410941a980c000410b" + "2000410141b480c00041092002410c6a41021008200241106a24000bff01" + "01037f23004180016b22042400027f024020012802142202411071450440" + "20024120710d01200028020041012001100a0c020b200028020021004181" + "0121020340200220046a41026b2000410f712203413072200341d7006a20" + "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" + "20014101419183c0004102200220046a41016b41810120026b10090c010b" + "2000280200210041810121020340200220046a41026b2000410f71220341" + "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" + "41047621000d000b20014101419183c0004102200220046a41016b418101" + "20026b10090b20044180016a24000bc50101017f230041106b220b240020" + "0028021c20012002200028022028020c1100002101200b41003a000d200b" + "20013a000c200b2000360208200b41086a20032004200520061020200720" + "082009200a10202101200b2d000d2202200b2d000c220372210002402003" + "4101712002410147720d00200128020022002d0014410471450440200028" + "021c418b83c0004102200028022028020c11000021000c010b200028021c" + "418a83c0004101200028022028020c11000021000b200b41106a24002000" + "4101710bef0401077f027f200145044020002802142106412d2109200541" + "016a0c010b412b418080c4002000280214220641017122011b2109200120" + "056a0b210702402006410471450440410021020c010b024020034504400c" + "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" + "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" + "280200450440200028021c22012000280220220020092002200310190440" + "41010f0b200120042005200028020c1100000f0b02400240024020072000" + "28020422084f0440200028021c2201200028022022002009200220031019" + "450d0141010f0b2006410871450d012000280210210b2000413036021020" + "002d0018210c41012101200041013a0018200028021c2206200028022022" + "0a20092002200310190d02200820076b41016a210102400340200141016b" + "2201450d0120064130200a280210110100450d000b41010f0b2006200420" + "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" + "000f0b200120042005200028020c11000021010c010b200820076b210602" + "4002400240410120002d0018220120014103461b220141016b0e02000102" + "0b20062101410021060c010b20064101762101200641016a41017621060b" + "200141016a21012000280210210820002802202107200028021c21000240" + "0340200141016b2201450d01200020082007280210110100450d000b4101" + "0f0b410121012000200720092002200310190d0020002004200520072802" + "0c1100000d004100210103402001200646044041000f0b200141016a2101" + "200020082007280210110100450d000b200141016b2006490f0b20010bbd" + "0201067f230041106b22042400410a2103024020004190ce004904402000" + "21050c010b0340200441066a20036a220641046b20004190ce006e220541" + "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" + "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" + "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" + "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" + "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" + "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" + "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" + "2203200441066a6a20004130723a00000b2002200141014100200441066a" + "20036a410a20036b1009200441106a24000b1701017f2000280200220104" + "4020002802042001100c0b0bce0601047f0240200041046b280200220422" + "02417871220341044108200241037122021b20016a4f0440200241002003" + "200141276a4b1b0d01200041086b22012004220341787122006a21020240" + "024020034101710d002003410271450d012001280200220320006a210020" + "0120036b22014190a0c00028020046044020022802044103714103470d01" + "4188a0c000200036020020022002280204417e7136020420012000410172" + "360204200220003602000c020b2001200310330b02400240024002400240" + "2002280204220341027145044020024194a0c000280200460d0220024190" + "a0c000280200460d0320022003417871220210332001200020026a220041" + "0172360204200020016a200036020020014190a0c000280200470d014188" + "a0c00020003602000c060b20022003417e71360204200120004101723602" + "04200020016a20003602000b2000418002490d0220012000103241002101" + "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" + "280200220004400340200141016a2101200028020822000d000b0b41a8a0" + "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" + "418ca0c000418ca0c00028020020006a2200360200200120004101723602" + "044190a0c00028020020014604404188a0c00041003602004190a0c00041" + "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" + "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" + "402002200128020022054f04402002200520012802046a490d040b200128" + "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" + "020020006a220036020020012000410172360204200020016a2000360200" + "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" + "012000410376742200714504404180a0c000200020037236020020020c01" + "0b20022802080b2100200220013602082000200136020c2001200236020c" + "200120003602080c010b41f09dc000280200220104400340200041016a21" + "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" + "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" + "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" + "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" + "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" + "087f230041406a2202240020002802082105200028020421034101210620" + "0128021c41cc81c0004101200128022028020c1100002100200504400340" + "20072108410121072000410171210441012100024020040d00024020012d" + "00144104714504402008410171450d01200128021c418383c00041022001" + "28022028020c110000450d010c020b20012802202104200128021c210920" + "08410171450440200941d59ac0004101200428020c1100000d020b200241" + "013a0017200241206a200141086a290200370300200241286a200141106a" + "290200370300200241306a200141186a2802003602002002200436020c20" + "022009360208200241e482c0003602382002200129020037031820022002" + "41176a3602102002200241086a3602342003200241186a10054504402002" + "280234418883c0004102200228023828020c11000021000c020b0c010b20" + "032001100521000b200341016a2103200541016b22050d000b0b20004504" + "40200128021c419083c0004101200128022028020c11000021060b200241" + "406b240020060bdb0101047f230041106b220224002002200036020c2300" + "41106b22002400200128021c41f899c000410d200128022028020c110000" + "2103200041003a000d200020033a000c20002001360208200041086a4185" + "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" + "722101024020054101712004410147720d00200328020022012d00144104" + "71450440200128021c418b83c0004102200128022028020c11000021010c" + "010b200128021c418a83c0004101200128022028020c11000021010b2000" + "41106a24002001410171200241106a24000b3300200128021c2000280200" + "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" + "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" + "c0002d00001a024002400240024002404107101222000440200041036a41" + "879bc000280000360000200041849bc000280000360000200341286a2000" + "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" + "200041036a41879bc000280000360000200041849bc00028000036000020" + "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" + "122200450d05200041076a41929bc0002800003600002000418b9bc00029" + "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" + "00001a200328024821012003280244210b410710122204450d0541002100" + "200441036a41b79bc000280000360000200441b49bc00028000036000020" + "0341d8006a41e100200b20012004410710021013200328025c2105024002" + "400240200328026022020e020700010b41012100200522012d0000412b6b" + "0e03060106010b20052d0000412b460440200241016b2100200541016a21" + "0120024112490d010c030b200521012002220041114f0d020b034020012d" + "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" + "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" + "186a2010103820012d000041306b220941094b0d02410221002003290320" + "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" + "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" + "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" + "8b06360000200341cc006a200041041001101320004104100c027f024020" + "03280254220541004e047f2003280250210c20054504404101210141000c" + "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" + "1014000b20050b21092001200c2005103721002005450d01200541076b22" + "014100200120054d1b2106200041036a417c7120006b2108410021010340" + "024002400240200020016a2d00002202c0220741004e0440200820016b41" + "03710d01200120064f0d020340200020016a220228020420022802007241" + "8081828478710d03200141086a22012006490d000b0c020b428080808080" + "20210e428080808010210f024002400240027e0240024002400240024002" + "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" + "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" + "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" + "220420054f0d06200020046a2c0000210402400240200241e00147044020" + "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" + "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" + "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" + "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" + "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" + "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" + "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" + "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" + "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" + "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" + "00210f0b2001ad200e200f8484210e200941808080807846044020002109" + "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" + "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" + "010b200120054f0d000340200020016a2c00004100480d01200520014101" + "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" + "0021050b410021000240024002400240024002400240200ea722020e0206" + "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" + "2b460440200241016b2100200541016a210120024112490d010c020b2005" + "21012002220041114f0d010b4200210e034020012d000041306b22024109" + "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" + "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" + "2d000041306b220441094b0d024102210020032903104200520d03200141" + "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" + "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" + "024002400240410b101222080440200841076a419d9bc000280000360000" + "200841969bc000290000370000200341d8006a2008410b10011013200328" + "025c2104024002400240200328026022020e020a00010b4101210720042d" + "00002201412b6b0e03090109010b20042d000021010b0240024002400240" + "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" + "20024109490d02200121020c080b200241016b2106200441016a21002002" + "4109490d044100210103402006450d0b20002d000041306b220241094b0d" + "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" + "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" + "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" + "0c0b4100210141012107034020002d000041306b220641094b0d06200041" + "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" + "010b410021010c040b4100210141012107034020002d000041306b220241" + "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" + "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" + "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" + "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" + "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" + "c0001015000b20032802582200044020042000100c0b2008410b100c4100" + "210020032802302202200328023c460440200328022c2104200328023821" + "0741002106024020022200450d00034020042d0000220220072d00002208" + "460440200441016a2104200741016a2107200041016b22000d010c020b0b" + "200220086b21060b20064521000b2009044020052009100c0b200328024c" + "22020440200c2002100c0b200328024022020440200b2002100c0b200328" + "02342202044020032802382002100c0b200328022822020440200328022c" + "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" + "0121000b200320003a0058200341d8006a419080c00041f880c000101500" + "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" + "15000b410141e899c0001014000bee2202087f017e024002400240024002" + "40024002400240200041f4014d04404180a0c00028020022024110200041" + "0b6a41f803712000410b491b220541037622007622014103710d01200541" + "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" + "00410b6a220141787121054184a0c0002802002208450d06411f21074100" + "20056b2103200041f4ffff074d04402005410620014108766722006b7641" + "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" + "45044041002100410021010c040b410021002005411920074101766b4100" + "2007411f471b742104410021010340024020022802044178712206200549" + "0d00200620056b220620034f0d0020022101200622030d00410021032001" + "21000c060b200228021422062000200620022004411d764104716a41106a" + "2802002202471b200020061b21002004410174210420020d000b0c030b02" + "402001417f7341017120006a2206410374220041f89dc0006a2203200041" + "809ec0006a280200220128020822044704402004200336020c2003200436" + "02080c010b4180a0c0002002417e200677713602000b2001200041037236" + "0204200020016a220020002802044101723602040c060b02404102200074" + "2203410020036b72200120007471682206410374220041f89dc0006a2203" + "200041809ec0006a280200220128020822044704402004200336020c2003" + "20043602080c010b4180a0c0002002417e200677713602000b2001200541" + "0372360204200120056a2206200020056b2204410172360204200020016a" + "20043602004188a0c00028020022020440200241787141f89dc0006a2100" + "4190a0c0002802002103027f4180a0c00028020022054101200241037674" + "2202714504404180a0c000200220057236020020000c010b20002802080b" + "2102200020033602082002200336020c2003200036020c20032002360208" + "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" + "41e89cc0006a280200220128020441787120056b21032001210202400340" + "02400240200128021022000d00200128021422000d002002280218210702" + "4002402002200228020c2200460440200241144110200228021422001b6a" + "28020022010d01410021000c020b20022802082201200036020c20002001" + "3602080c010b200241146a200241106a20001b2104034020042106200122" + "0041146a200041106a200028021422011b210420004114411020011b6a28" + "020022010d000b200641003602000b2007450d032002200228021c410274" + "41e89cc0006a220128020047044020074110411420072802102002461b6a" + "20003602002000450d040c020b2001200036020020000d014184a0c00041" + "84a0c000280200417e200228021c77713602000c030b2000280204417871" + "20056b22012003200120034922011b21032000200220011b210220002101" + "0c010b0b2000200736021820022802102201044020002001360210200120" + "003602180b20022802142201450d0020002001360214200120003602180b" + "02400240200341104f044020022005410372360204200220056a22062003" + "410172360204200320066a20033602004188a0c0002802002204450d0120" + "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" + "0200220541012004410376742204714504404180a0c00020042005723602" + "0020000c010b20002802080b2104200020013602082004200136020c2001" + "200036020c200120043602080c010b2002200320056a2200410372360204" + "200020026a220020002802044101723602040c010b4190a0c00020063602" + "004188a0c00020033602000b200241086a0f0b2000200172450440410021" + "0141022007742200410020006b722008712200450d0320006841027441e8" + "9cc0006a28020021000b2000450d010b0340200020012000280204417871" + "220420056b220620034922071b2108200028021022024504402000280214" + "21020b20012008200420054922001b210120032006200320071b20001b21" + "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" + "0020056b4f710d0020012802182107024002402001200128020c22004604" + "40200141144110200128021422001b6a28020022020d01410021000c020b" + "20012802082202200036020c200020023602080c010b200141146a200141" + "106a20001b21040340200421062002220041146a200041106a2000280214" + "22021b210420004114411020021b6a28020022020d000b20064100360200" + "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" + "0047044020074110411420072802102001461b6a20003602002000450d02" + "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" + "0128021c77713602000c010b200020073602182001280210220204402000" + "2002360210200220003602180b20012802142202450d0020002002360214" + "200220003602180b0240200341104f044020012005410372360204200120" + "056a22022003410172360204200220036a200336020020034180024f0440" + "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" + "280200220441012003410376742203714504404180a0c000200320047236" + "020020000c010b20002802080b2103200020023602082003200236020c20" + "02200036020c200220033602080c010b2001200320056a22004103723602" + "04200020016a220020002802044101723602040b0c010b02400240024002" + "400240024020054188a0c00028020022014b04402005418ca0c000280200" + "22004f044041002100200541af80046a220141107640002202417f462203" + "0d0720024110742202450d074198a0c000410020014180807c7120031b22" + "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" + "200020002001491b360200024002404194a0c0002802002203044041e89d" + "c0002100034020002802002201200028020422066a2002460d0220002802" + "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" + "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" + "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" + "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" + "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" + "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" + "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" + "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" + "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" + "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" + "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" + "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" + "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" + "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" + "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" + "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" + "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" + "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" + "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" + "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" + "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" + "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" + "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" + "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" + "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" + "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" + "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" + "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" + "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" + "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" + "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" + "0441286b220036020020022000410172360204200020026a412836020441" + "a0a0c00041808080013602000c080b200220034d200120034b720d002000" + "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" + "360200200220046a210141e89dc000210002400240034020012000280200" + "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" + "c0002100034002402003200028020022014f04402003200120002802046a" + "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" + "c000200441286b220036020020022000410172360204200020026a412836" + "020441a0a0c00041808080013602002003200641206b41787141086b2200" + "2000200341106a491b2201411b36020441e89dc000290200210920014110" + "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" + "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" + "02002001411c6a2100034020004107360200200041046a22002006490d00" + "0b20012003460d0720012001280204417e713602042003200120036b2200" + "4101723602042001200036020020004180024f04402003200010320c080b" + "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" + "410376742200714504404180a0c000200020027236020020010c010b2001" + "2802080b2100200120033602082000200336020c2003200136020c200320" + "003602080c070b200020023602002000200028020420046a360204200220" + "054103723602042006410f6a41787141086b2201200220056a22046b2103" + "20014194a0c000280200460d0320014190a0c000280200460d0420012802" + "04220541037141014604402001200541787122001033200020016a220128" + "02042105200020036a21030b20012005417e713602042004200341017236" + "0204200320046a200336020020034180024f04402004200310320c060b20" + "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" + "0376742203714504404180a0c000200120037236020020000c010b200028" + "02080b2103200020043602082003200436020c2004200036020c20042003" + "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" + "00280200220020056a220236020020022001410172360204200020054103" + "72360204200041086a21000c060b4190a0c0002802002100024020012005" + "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" + "2001410372360204200020016a220120012802044101723602040c010b41" + "88a0c00020023602004190a0c000200020056a2203360200200320024101" + "72360204200020016a2002360200200020054103723602040b200041086a" + "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" + "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" + "03200020016b6a41086a220136020020022001410172360204200020036a" + "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" + "00418ca0c000418ca0c00028020020036a22003602002004200041017236" + "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" + "6a220036020020042000410172360204200020046a20003602000b200241" + "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" + "20056b22013602004194a0c0004194a0c000280200220020056a22023602" + "002002200141017236020420002005410372360204200041086a0f0b2000" + "0f0b200141086a0b2701017f200020012800042202360208200020012800" + "003602042000200236020020014108100c0b3b002000450440230041206b" + "22002400200041003602182000410136020c2000419c81c0003602082000" + "4204370210200041086a20011017000b000b7e01017f230041406a220324" + "002003412b36020c200341d098c000360208200320013602142003200036" + "02102003410236021c200341d482c0003602182003420237022420032003" + "41106aad4280808080e000843703382003200341086aad4280808080f000" + "843703302003200341306a360220200341186a20021017000b4101017f23" + "0041206b2202240020024100360210200241013602042002420437020820" + "02412e36021c200220003602182002200241186a36020020022001101700" + "0bf40102027f017e230041106b22022400200241013b010c200220013602" + "0820022000360204230041106b22012400200241046a2200290200210420" + "01200036020c20012004370204230041106b22002400200141046a220128" + "0200220228020c2103024002400240024020022802040e020001020b2003" + "0d0141012102410021030c020b20030d0020022802002202280204210320" + "0228020021020c010b20004180808080783602002000200136020c200128" + "020822012d0008210220012d00091a2000410e20021026000b2000200336" + "020420002002360200200128020822012d0008210220012d00091a200041" + "0f20021026000b0d00200028020041012001100a0b380002402002418080" + "c400460d00200020022001280210110100450d0041010f0b200345044041" + "000f0b200020032004200128020c1100000b900a010a7f02400240024020" + "0028020022052000280208220372044002402003410171450d0020012002" + "6a21060240200028020c2209450440200121040c010b2001210403402004" + "22032006460d02027f200341016a20032c0000220441004e0d001a200341" + "026a20044160490d001a200341036a20044170490d001a200341046a0b22" + "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" + "20042c00001a20072002027f02402007450d00200220074d044020022007" + "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" + "031b21022003200120031b21010b2005450d032000280204210b20024110" + "4f044020022001200141036a417c7122076b22086a220a41037121094100" + "210541002103200120074704402008417c4d044041002106034020032001" + "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" + "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" + "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" + "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" + "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" + "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" + "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" + "09410371210a2009410274210741002104200641044f04402008200741f0" + "07716a210c200821030340200420032802002204417f7341077620044106" + "76724181828408716a20032802042204417f734107762004410676724181" + "828408716a20032802082204417f73410776200441067672418182840871" + "6a200328020c2204417f734107762004410676724181828408716a210420" + "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" + "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" + "200a450d000b2008200941fc01714102746a22042802002203417f734107" + "762003410676724181828408712103200a4101460d022003200428020422" + "03417f734107762003410676724181828408716a2103200a4102460d0220" + "0320042802082203417f734107762003410676724181828408716a21030c" + "020b2002450440410021050c030b20024103712104024020024104490440" + "41002105410021080c010b41002105200121032002410c71220821070340" + "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" + "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" + "200741046b22070d000b0b2004450d02200120086a21030340200520032c" + "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" + "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" + "056a21050b02402005200b490440200b20056b210602400240024020002d" + "00182203410020034103471b220341016b0e020001020b20062103410021" + "060c010b20064101762103200641016a41017621060b200341016a210320" + "00280210210820002802202104200028021c21000340200341016b220345" + "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" + "02200428020c110000044041010f0b410021030340200320064604404100" + "0f0b200341016a2103200020082004280210110100450d000b200341016b" + "2006490f0b200028021c20012002200028022028020c1100000b14002000" + "2802002001200028020428020c1101000b10002001200028020020002802" + "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" + "6b220324002003200136022c20032000360228200341033a002420034220" + "37021c200341003602142003410036020c027f0240024002402002280210" + "220a450440200228020c2200450d012002280208220120004103746a2104" + "200041016b41ffffffff017141016a210720022802002100034020004104" + "6a28020022050440200328022820002802002005200328022c28020c1100" + "000d040b20012802002003410c6a200141046a2802001101000d03200041" + "086a2100200141086a22012004470d000b0c010b20022802142200450d00" + "2000410574210b200041016b41ffffff3f7141016a210720022802082105" + "200228020021000340200041046a28020022010440200328022820002802" + "002001200328022c28020c1100000d030b20032008200a6a220141106a28" + "020036021c20032001411c6a2d00003a00242003200141186a2802003602" + "202001410c6a28020021044100210941002106024002400240200141086a" + "28020041016b0e020002010b200441037420056a220c2802000d01200c28" + "020421040b410121060b200320043602102003200636020c200141046a28" + "02002104024002400240200128020041016b0e020002010b200441037420" + "056a22062802000d01200628020421040b410121090b2003200436021820" + "0320093602142005200141146a2802004103746a22012802002003410c6a" + "200141046a2802001101000d02200041086a2100200b200841206a220847" + "0d000b0b200720022802044f0d012003280228200228020020074103746a" + "22002802002000280204200328022c28020c110000450d010b41010c010b" + "41000b200341306a24000b1900200128021c41a481c000410e2001280220" + "28020c1100000b820302047f017e230041406a2206240041012107024020" + "002d00040d0020002d00052108200028020022052d001441047145044020" + "0528021c418383c000418083c000200841017122081b4102410320081b20" + "0528022028020c1100000d01200528021c20012002200528022028020c11" + "00000d01200528021c41f391c0004102200528022028020c1100000d0120" + "032005200411010021070c010b2008410171450440200528021c418583c0" + "004103200528022028020c1100000d010b200641013a0017200641206a20" + "0541086a290200370300200641286a200541106a29020037030020064130" + "6a200541186a2802003602002006200529021c3702082005290200210920" + "0641e482c000360238200620093703182006200641176a36021020062006" + "41086a220536023420052001200210210d00200541f391c000410210210d" + "002003200641186a20041101000d002006280234418883c0004102200628" + "023828020c11000021070b200041013a0005200020073a0004200641406b" + "240020000bab04010c7f200141016b210e2000280204210a200028020021" + "0b2000280208210c0240034020050d01027f024020022003490d00034020" + "0120036a2105024002400240200220036b220741074d044020022003470d" + "01200221030c050b0240200541036a417c71220620056b22040440410021" + "000340200020056a2d0000410a460d052004200041016a2200470d000b20" + "04200741086b22004d0d010c030b200741086b21000b0340418082840820" + "062802002209418a94a8d000736b2009724180828408200641046a280200" + "2209418a94a8d000736b2009727141808182847871418081828478470d02" + "200641086a2106200441086a220420004d0d000b0c010b41002100034020" + "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" + "030b20042007460440200221030c030b200420056a2106200220046b2003" + "6b21074100210002400340200020066a2d0000410a460d01200720004101" + "6a2200470d000b200221030c030b200020046a21000b200020036a220441" + "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" + "200322040c030b200220034f0d000b0b20022008460d0241012105200821" + "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" + "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" + "200020086b2100200120086a2107200c20063a000020042108200b200720" + "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" + "042102200028020021030240200028020822002d0000450d00200341fc82" + "c0004104200228020c110000450d0041010f0b20002001410a463a000020" + "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" + "200028020022002000411f7522027320026b2000417f73411f762001100a" + "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" + "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" + "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" + "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" + "0041003a00002002450d00000b000b250020002802002d00004504402001" + "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" + "02082204452001280200220520046b20034f724504402001410036020820" + "0141003a000c410021040b20032005490440200128020420046a20022003" + "10371a200041043a00002001200320046a3602080f0b2000420437020020" + "0141003a000c0bac0301017f230041406a22022400024002400240024002" + "40024020002d000041016b0e03010203000b2002200028020436020441b1" + "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" + "0000200041086a41a495c0002900003700002000419c95c0002900003700" + "00200241143602102002200036020c200241143602082002410336022c20" + "02419c91c000360228200242023702342002200241046aad4280808080b0" + "01843703202002200241086aad4280808080c00184370318200220024118" + "6a360230200128021c2001280220200241286a101e210020022802082201" + "450d03200228020c2001100c0c030b20002d000121002002410136022c20" + "0241c88ac000360228200242013702342002200241186aad4280808080f0" + "008437030820022000410274220041f095c0006a28020036021c20022000" + "419897c0006a2802003602182002200241086a360230200128021c200128" + "0220200241286a101e21000c020b20012000280204220028020020002802" + "04101a21000c010b20002802042200280200200120002802042802101101" + "0021000b200241406b240020000f0b000b10002001200028020420002802" + "08101a0b5501037f2000280204210120002d0000220041044d2000410347" + "7145044020012802002100200141046a2802002202280200220304402000" + "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" + "c709010a7f230041206b2208240002400240024002402001280210450440" + "2001417f36021020032003200241036a417c7120026b220a6b4107714100" + "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" + "016b200220036a220541016b22062d0000410a460d001a2006200220096a" + "2207460d01200441026b200541026b22062d0000410a460d001a20062007" + "460d01200441036b200541036b22062d0000410a460d001a20062007460d" + "01200441046b200541046b22062d0000410a460d001a20062007460d0120" + "0441056b200541056b22062d0000410a460d001a20062007460d01200441" + "066b200541066b22062d0000410a460d001a20062007460d01200441076b" + "200541076b22052d0000410a460d001a20052007460d0120044178720b20" + "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" + "0241046b210d2004417f7320026a21060340024020062105200a21042009" + "2207200c4d0d00200441086b210a200541086b2106418082840820022007" + "41086b22096a280200220b418a94a8d000736b200b724180828408200720" + "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" + "8478460d010b0b20032007490d0202400340200320046a450d0120044101" + "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" + "016a21040c040b02402001411c6a2802002204450440410021040c010b20" + "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" + "00202001411c6a41003602000b2003200128021420046b4f044020002001" + "41146a2002200310280c050b200128021820046a2002200310371a200041" + "043a00002001411c6a200320046a3602000c040b230041306b2200240020" + "00410136020c200041c481c0003602082000420137021420002000412f6a" + "ad4280808080a001843703202000200041206a360210200041086a41d091" + "c0001017000b230041306b22002400200020033602042000200936020020" + "00410236020c200041d887c000360208200042023702142000200041046a" + "ad428080808080018437032820002000ad42808080808001843703202000" + "200041206a360210200041086a418485c0001017000b230041306b220024" + "0020002003360204200020073602002000410236020c200041f887c00036" + "0208200042023702142000200041046aad42808080808001843703282000" + "2000ad42808080808001843703202000200041206a360210200041086a41" + "9485c0001017000b20032004490440200841003602182008410136020c20" + "0841888bc00036020820084204370210200841086a41908bc0001017000b" + "02402001411c6a2802002205450d0002400240200128021420056b20044d" + "0440200841086a200141146a20022004102820082d00084104470d012001" + "411c6a28020021050c020b200141186a28020020056a2002200410371a20" + "01411c6a200420056a22053602000c010b200020082903083702000c020b" + "2005450d00200141003a00202001411c6a41003602000b200220046a2105" + "200320046b220220012802144f04402000200141146a2005200210280c01" + "0b200141186a2802002005200210371a200041043a00002001411c6a2002" + "3602000b2001200128021041016a360210200841206a24000b9a0102047f" + "017e230041106b22032400200341086a200028020828020020012002102c" + "20032d000822054104470440200028020421012003290308210720002d00" + "00220241044d20024103477145044020012802002102200141046a280200" + "220428020022060440200220061103000b20042802042204044020022004" + "100c0b2001410c100c0b200020073702000b200341106a24002005410447" + "0be10202057f017e230041106b2202240020024100360204027f20014180" + "014f044020014180104f04402001418080044f044020022001413f714180" + "01723a00072002200141127641f001723a000420022001410676413f7141" + "8001723a000620022001410c76413f71418001723a000541040c030b2002" + "2001413f71418001723a000620022001410c7641e001723a000420022001" + "410676413f71418001723a000541030c020b20022001413f71418001723a" + "00052002200141067641c001723a000441020c010b200220013a00044101" + "0b2101200241086a2000280208280200200241046a2001102c20022d0008" + "22054104470440200028020421012002290308210720002d000022034104" + "4d20034103477145044020012802002103200141046a2802002204280200" + "22060440200320061103000b20042802042204044020032004100c0b2001" + "410c100c0b200020073702000b200241106a240020054104470b0d002000" + "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" + "36020c2001419892c00036020841c89cc0002d0000410347044002402300" + "41206b22022400024002400240024041c89cc0002d000041026b0e020301" + "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" + "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" + "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" + "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" + "41206a24000c020b000b200241003602182002410136020c200241e895c0" + "0036020820024204370210200241086a41b094c0001017000b0b02400240" + "024041d89cc000290300220650044041e09cc00029030021050340200542" + "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" + "5122021b370300200721052002450d000b41d89cc00020063703000b0240" + "024041a09cc000290300200652044041ac9cc0002d000021034101210241" + "ac9cc00041013a0000200120033a00182003450d01200142003702342001" + "4281808080c00037022c200141c893c000360228230041106b2202240020" + "02418888c00036020c2002200141186a360208230041f0006b2200240020" + "00418c88c00036020c2000200241086a3602082000418c88c00036021420" + "002002410c6a3602102000410236021c200041cd81c00036021802402001" + "41286a22012802004504402000410336025c2000418082c0003602582000" + "42033702642000200041106aad4280808080e00084370348200020004108" + "6aad4280808080e000843703400c010b200041306a200141106a29020037" + "0300200041286a200141086a290200370300200020012902003703202000" + "410436025c200041b482c000360258200042043702642000200041106aad" + "4280808080e000843703502000200041086aad4280808080e00084370348" + "2000200041206aad42808080809001843703400b2000200041186aad4280" + "808080f000843703382000200041386a360260200041d8006a41fc93c000" + "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" + "0041306b220024002000412636020c200041c094c0003602082000410136" + "0214200041c88ac0003602102000420137021c2000200041086aad428080" + "8080f000843703282000200041286a360218200041106a418c95c0001017" + "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" + "36021041042102200141043a00182001200141106a360220200141186a41" + "9c88c0002000101e210320012d0018210002402003450440420021054117" + "2000764101710d01200128021c22002802002102200041046a2802002203" + "28020022040440200220041103000b20032802042203044020022003100c" + "0b2000410c100c410421020c010b20004104460d02200129031822074280" + "7e8321052007a721020b20012802102200200028020841016b2203360208" + "2003450440200041003a000c200042003703000b200241ff01714104470d" + "02200141406b24000f0b230041206b220024002000410036021820004101" + "36020c200041b08ac00036020820004204370210200041086a41b88ac000" + "1017000b200141003602382001410136022c2001419093c0003602282001" + "4204370230200141286a419893c0001017000b200120052002ad42ff0183" + "843703102001410236022c200141f891c000360228200142023702342001" + "200141106aad4280808080d001843703202001200141086aad4280808080" + "f000843703182001200141186a360230200141286a418892c0001017000b" + "0c00200020012902003703000bba0201047f411f21022000420037021020" + "0141ffffff074d04402001410620014108766722036b7641017120034101" + "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" + "20027422034184a0c0002802007145044020042000360200200020043602" + "182000200036020c200020003602084184a0c0004184a0c0002802002003" + "723602000f0b024002402001200428020022032802044178714604402003" + "21020c010b2001411920024101766b41002002411f471b74210503402003" + "2005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c" + "20022000360208200041003602182000200236020c200020013602080f0b" + "20042000360200200020033602182000200036020c200020003602080bf1" + "0201047f200028020c21020240024020014180024f044020002802182103" + "0240024020002002460440200041144110200028021422021b6a28020022" + "010d01410021020c020b20002802082201200236020c200220013602080c" + "010b200041146a200041106a20021b21040340200421052001220241146a" + "200241106a200228021422011b210420024114411020011b6a2802002201" + "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" + "006a220128020047044020034110411420032802102000461b6a20023602" + "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" + "280200417e200028021c77713602000c020b200028020822002002470440" + "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" + "7e200141037677713602000f0b2002200336021820002802102201044020" + "022001360210200120023602180b20002802142200450d00200220003602" + "14200020023602180b0b8f0101027f230041306b22012400024020004100" + "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" + "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" + "14200141d89ac0003602102001420137021c2001411036022c2001200141" + "286a36021820012001410c6a360228200141106a1030200128020c200141" + "306a24000bcf0101067f23004180016b2204240020012802042107200128" + "020021062000280200210020012802142205210202402005410471450d00" + "2005410872210220060d0020014281808080a0013702000b200120024104" + "7236021441810121020340200220046a41026b2000410f71220341307220" + "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" + "762100450d000b20014101419183c0004102200220046a41016b41810120" + "026b10092001200536021420012007360204200120063602002004418001" + "6a24000b6301017f230041306b220224002002200036020c200241023602" + "14200241f49ac0003602102002420137021c2002411036022c2002200241" + "286a36021820022002410c6a360228200241106a10302001044020022802" + "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" + "21030c010b02402000410020006b41037122066a220520004d0d00200021" + "032001210420060440200621070340200320042d00003a0000200441016a" + "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" + "0340200320042d00003a0000200341016a200441016a2d00003a00002003" + "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" + "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" + "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" + "003a0000200441086a2104200341086a22032005470d000b0b2005200220" + "066b2207417c7122086a21030240200120066a2204410371450440200320" + "054d0d0120042101034020052001280200360200200141046a2101200541" + "046a22052003490d000b0c010b200320054d0d0020044103742202411871" + "21062004417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220067620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20074103712102200420086a21010b" + "02402003200220036a22064f0d002002410771220404400340200320012d" + "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" + "200241016b4107490d000340200320012d00003a0000200341016a200141" + "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" + "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" + "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" + "41076a200141076a2d00003a0000200141086a2101200341086a22032006" + "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" + "420022022001422088420a7e7c22014220867c2204370300200020032004" + "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" + "c0000ba40611000000140000000400000012000000000000000100000001" + "00000013000000557466384572726f7276616c69645f75705f746f657272" + "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" + "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" + "003d0000005c0010000a0000001600000037000000636170616369747920" + "6f766572666c6f770000008800100011000000426f72726f774d75744572" + "726f72616c726561647920626f72726f7765643a20b2001000120000005b" + "3d3d617373657274696f6e20606c6566742020726967687460206661696c" + "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" + "00100017000000f60010000900000020726967687460206661696c65643a" + "200a20206c6566743a20000000cf00100010000000180110001000000028" + "01100009000000f6001000090000000100000000000000f3081000020000" + "00000000000c000000040000001400000015000000160000002020202020" + "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230" + "323132323233323432353236323732383239333033313332333333343335" + "333633373338333934303431343234333434343534363437343834393530" + "353135323533353435353536353735383539363036313632363336343635" + "363636373638363937303731373237333734373537363737373837393830" + "383138323833383438353836383738383839393039313932393339343935" + "393639373938393966616c7365747275656c6962726172792f636f72652f" + "7372632f736c6963652f6d656d6368722e72736402100020000000850000" + "001e0000006402100020000000a100000009000000010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010100" + "41e686c0000b330202020202020202020202020202020202020202020202" + "020202020202020303030303030303030303030303030304040404040041" + "a487c0000b6172616e676520737461727420696e64657820206f7574206f" + "662072616e676520666f7220736c696365206f66206c656e67746820a403" + "100012000000b60310002200000072616e676520656e6420696e64657820" + "e803100010000000b60310002200419088c0000b8f140400000004000000" + "17000000180000000c00000004000000190000001a0000001b0000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" + "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" + "61746520756e69717565207468726561642049443a206269747370616365" + "20657868617573746564f904100037000000dc0410001d000000ae040000" + "0d00000001000000000000006c6962726172792f7374642f7372632f696f" + "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e00007d05100009000000500510002d000000160100002900" + "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" + "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" + "696f6e207265736574686f737420756e726561636861626c656e6574776f" + "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" + "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" + "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c7265616479206578" + "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" + "206469726563746f727969732061206469726563746f7279646972656374" + "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c657379737465" + "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" + "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" + "2066696c652068616e646c65696e76616c696420696e7075742070617261" + "6d65746572696e76616c6964206461746174696d6564206f757477726974" + "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" + "756e7365656b61626c652066696c6571756f746120657863656564656466" + "696c6520746f6f206c617267657265736f75726365206275737965786563" + "757461626c652066696c652062757379646561646c6f636b63726f73732d" + "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" + "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" + "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" + "70746564756e737570706f72746564756e657870656374656420656e6420" + "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" + "736f74686572206572726f72756e63617465676f72697a6564206572726f" + "7220286f73206572726f72202900000001000000000000008d0810000b00" + "000098081000010000006c6962726172792f7374642f7372632f696f2f73" + "7464696f2e727300b40810001b00000032030000140000006661696c6564" + "207072696e74696e6720746f203a20000000e008100013000000f3081000" + "02000000b40810001b00000063040000090000007374646f75746c696272" + "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" + "696e6720747261697420696d706c656d656e746174696f6e207265747572" + "6e656420616e206572726f72207768656e2074686520756e6465726c7969" + "6e672073747265616d20646964206e6f7400000037091000560000001e09" + "100019000000680700001500000063616e6e6f7420726563757273697665" + "6c792061637175697265206d75746578a8091000200000006c6962726172" + "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" + "72656164732e7273d00910002c00000013000000090000006c6962726172" + "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" + "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" + "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" + "7273660a100026000000220100002d0000006f7065726174696f6e207375" + "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" + "6e206d6179206e6f7420626520706572666f726d65642072656375727369" + "76656c79b00a100038000000100000001100000012000000100000001000" + "000013000000120000000d0000000e000000150000000c0000000b000000" + "15000000150000000f0000000e0000001300000026000000380000001900" + "0000170000000c000000090000000a00000010000000170000000e000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600" + "0000150000000b000000160000000d0000000b0000000b00000013000000" + "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" + "1000250610003306100048061000540610005f0610007406100089061000" + "98061000a6061000b9061000df0610001707100030071000470710005307" + "10005c07100066071000760710008d0710009b071000a9071000b6071000" + "ca071000d2071000ed071000fb0710000b08100021081000360810004108" + "100057081000640810006f0810007a081000000000000100000001000000" + "1300000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" + "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" + "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" + "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" + "6963652e72737b0c10006d000000a1000000190000005061727365496e74" + "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" + "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" + "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" + "100009000000550d1000010000006465616c6c6f636174652000680d1000" + "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" + "46696e6973684166746572000000090d1000320000008000000016000000" + "42616c616e636500090d1000320000009b00000016000000456d70747949" + "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" + "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" + "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" + "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; + +static auto const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 46267d55b57..a61b4f73cb2 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2020 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index e6ef682e490..fd90b48d701 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -615,7 +615,7 @@ EscrowFinish::doApply() // WASM execution auto const wasmStr = slep->getFieldVL(sfFinishFunction); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("ready"); + std::string funcName("finish"); WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); From aef32ead2c0cd4027d882b4238634535a7756b6c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 May 2025 10:31:02 -0400 Subject: [PATCH 14/73] better WASM logging to match rippled (#5395) * basic logging * pass in Journal * log level based on journal level * clean up * attempt at adding WAMR logging properly * improve logline * maybe_unused * fix * fix * fix segfault * add test --- external/wamr/conanfile.py | 43 +++++------ src/test/app/Wasm_test.cpp | 103 +++++++++++++++++-------- src/xrpld/app/misc/WamrVM.cpp | 105 +++++++++++++++++++++++--- src/xrpld/app/misc/WamrVM.h | 6 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 7 ++ src/xrpld/app/misc/WasmVM.cpp | 7 +- src/xrpld/app/misc/WasmVM.h | 9 ++- 7 files changed, 212 insertions(+), 68 deletions(-) diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index d54bb6f98fb..ae83e8c13c1 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -1,11 +1,16 @@ from conans import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, copy -import os -import json +from conan.tools.files import ( + apply_conandata_patches, + export_conandata_patches, + # get, +) + +# import os required_conan_version = ">=1.55.0" + class WamrConan(ConanFile): name = "wamr" version = "2.2.0" @@ -17,31 +22,30 @@ class WamrConan(ConanFile): options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} generators = "CMakeToolchain", "CMakeDeps" - #requires = [("llvm/20.1.1@")] + # requires = [("llvm/20.1.1@")] def export_sources(self): export_conandata_patches(self) pass - - #def build_requirements(self): + # def build_requirements(self): # self.tool_requires("llvm/20.1.1") - def config_options(self): if self.settings.os == "Windows": del self.options.fPIC - def layout(self): cmake_layout(self, src_folder="src") - def source(self): git = tools.Git() - git.clone("https://github.com/bytecodealliance/wasm-micro-runtime.git", "c883fafead005e87ad3122b05409886f507c1cb0",shallow=True) - #get(self, **self.conan_data["sources"][self.version], strip_root=True) - + git.clone( + "https://github.com/bytecodealliance/wasm-micro-runtime.git", + "c883fafead005e87ad3122b05409886f507c1cb0", + shallow=True, + ) + # get(self, **self.conan_data["sources"][self.version], strip_root=True) def generate(self): tc = CMakeToolchain(self) @@ -54,37 +58,34 @@ def generate(self): tc.variables["WAMR_BUILD_FAST_JIT"] = 0 tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 - #tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 - #ll_dep = self.dependencies["llvm"] - #self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") - #tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" + # tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 + # ll_dep = self.dependencies["llvm"] + # self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") + # tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") tc.generate() # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder deps = CMakeDeps(self) deps.generate() - def build(self): apply_conandata_patches(self) cmake = CMake(self) cmake.verbose = True cmake.configure() cmake.build() - #self.run(f'echo {self.source_folder}') + # self.run(f'echo {self.source_folder}') # Explicit way: # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) # self.run("cmake --build . %s" % cmake.build_config) - def package(self): cmake = CMake(self) cmake.verbose = True cmake.install() - def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" - diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 5c9c0afc9c2..7f54a636ccb 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -127,41 +127,58 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; struct TestHostFunctions : public HostFunctions { - Env* env; - Bytes accountID; - Bytes data; - int clock_drift = 0; + Env* env_; + Bytes accountID_; + Bytes data_; + int clock_drift_ = 0; + test::StreamSink sink_; + beast::Journal jlog_; public: explicit TestHostFunctions(Env* env, int cd = 0) - : env(env), clock_drift(cd) + : env_(env) + , clock_drift_(cd) + , sink_(beast::severities::kTrace) + , jlog_(sink_) { std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID = Bytes{s.begin(), s.end()}; + accountID_ = Bytes{s.begin(), s.end()}; std::string t = "10000"; - data = Bytes{t.begin(), t.end()}; + data_ = Bytes{t.begin(), t.end()}; + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; } int32_t getLedgerSqn() override { - return (int32_t)env->current()->seq(); + return (int32_t)env_->current()->seq(); } int32_t getParentLedgerTime() override { - return env->current() + return env_->current() ->parentCloseTime() .time_since_epoch() .count() + - clock_drift; + clock_drift_; } std::optional getTxField(std::string const& fname) override { - return accountID; + return accountID_; } std::optional @@ -170,19 +187,19 @@ struct Wasm_test : public beast::unit_test::suite Bytes const& kdata, std::string const& fname) override { - return data; + return data_; } std::optional getCurrentLedgerEntryField(std::string const& fname) override { if (fname == "Destination" || fname == "Account") - return accountID; + return accountID_; else if (fname == "Data") - return data; + return data_; else if (fname == "FinishAfter") { - auto t = env->current() + auto t = env_->current() ->parentCloseTime() .time_since_epoch() .count(); @@ -197,14 +214,14 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { - TestHostFunctions nfs(&env); + TestHostFunctions nfs(&env, 0); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re.value().result); - std::cout << "good case result " << re.value().result - << " cost: " << re.value().cost << std::endl; + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; } } @@ -214,17 +231,17 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(&env); - nfs.clock_drift = -1; + TestHostFunctions nfs(&env, -1); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(!re.value().result); - std::cout << "bad case (current time < escrow_finish_after " - "time) result " - << re.value().result << " cost: " << re.value().cost - << std::endl; + // std::cout << "bad case (current time < escrow_finish_after " + // "time) result " + // << re.value().result << " cost: " << + // re.value().cost + // << std::endl; } } @@ -244,8 +261,8 @@ struct Wasm_test : public beast::unit_test::suite std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); BEAST_EXPECT(re.error()); - std::cout << "bad case (access nonexistent field) result " - << re.error() << std::endl; + // std::cout << "bad case (access nonexistent field) result " + // << re.error() << std::endl; } { // fail because trying to allocate more than MAX_PAGES memory @@ -263,9 +280,9 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(&env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); - if (BEAST_EXPECT(!re)) - std::cout << "bad case (more than MAX_PAGES) result " - << re.error() << std::endl; + BEAST_EXPECT(!re); + // std::cout << "bad case (more than MAX_PAGES) result " + // << re.error() << std::endl; } { // fail because recursion too deep @@ -276,9 +293,31 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions nfs(&env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); - if (BEAST_EXPECT(re.error())) - std::cout << "bad case (deep recursion) result " << re.error() - << std::endl; + BEAST_EXPECT(re.error()); + // std::cout << "bad case (deep recursion) result " << re.error() + // << std::endl; + + auto const& sink = nfs.getSink(); + auto countSubstr = [](std::string const& str, + std::string const& substr) { + std::size_t pos = 0; + int occurrences = 0; + while ((pos = str.find(substr, pos)) != std::string::npos) + { + occurrences++; + pos += substr.length(); + } + return occurrences; + }; + + BEAST_EXPECT( + countSubstr( + sink.messages().str(), "WAMR error: failed to call func") == + 1); + BEAST_EXPECT( + countSubstr( + sink.messages().str(), + "WAMR trap: Exception: wasm operand stack overflow") == 1); } } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index a781aadea9c..4ed47a2ffbb 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -19,6 +19,8 @@ #include +#include + #include namespace ripple { @@ -27,10 +29,91 @@ namespace ripple { namespace { +static log_level_t +getLogLevel(beast::severities::Severity severity) +{ + using namespace beast::severities; + switch (severity) + { + case kTrace: + return WASM_LOG_LEVEL_VERBOSE; + case kDebug: + return WASM_LOG_LEVEL_DEBUG; + case kInfo: + case kWarning: + return WASM_LOG_LEVEL_WARNING; + case kError: + return WASM_LOG_LEVEL_ERROR; + default: + UNREACHABLE("invalid severity"); + [[fallthrough]]; + case kFatal: + case kNone: + break; + } + + return WASM_LOG_LEVEL_FATAL; +} + +static beast::severities::Severity +getLogLevel(uint32_t severity) +{ + using namespace beast::severities; + switch (severity) + { + case WASM_LOG_LEVEL_VERBOSE: + return kTrace; + case WASM_LOG_LEVEL_DEBUG: + return kDebug; + case WASM_LOG_LEVEL_WARNING: + return kWarning; + case WASM_LOG_LEVEL_ERROR: + return kError; + default: + UNREACHABLE("invalid severity"); + [[fallthrough]]; + case WASM_LOG_LEVEL_FATAL: + break; + } + + return kFatal; +} + +// This function is called from WAMR to log messages. +extern "C" void +wamr_log_to_rippled( + uint32_t logLevel, + const char* file, + int line, + const char* fmt, + ...) +{ + beast::Journal j = debugLog(); + + // Format the variadic args + const char* safeFile = file ? file : ""; + + std::ostringstream oss; + oss << "WAMR LOG (" << safeFile << ":" << line << "): "; + + va_list args; + va_start(args, fmt); + + char formatted[1024]; + vsnprintf(formatted, sizeof(formatted), fmt, args); + formatted[sizeof(formatted) - 1] = '\0'; + + va_end(args); + + oss << formatted; + + j.stream(getLogLevel(logLevel)) << oss.str(); +} + static void -print_wasm_error(const char* message, wasm_trap_t* trap) +print_wasm_error(const char* message, wasm_trap_t* trap, beast::Journal j) { - fprintf(stderr, "WAMR error: %s\n", message); + j.debug() << "WAMR error: " << message; if (trap) { @@ -38,11 +121,7 @@ print_wasm_error(const char* message, wasm_trap_t* trap) wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); - fprintf( - stderr, - "WAMR trap: %.*s\n", - (int)error_message.size, - error_message.data); + j.debug() << "WAMR trap: " << error_message.data; wasm_byte_vec_delete(&error_message); } } @@ -69,7 +148,10 @@ InstanceWrapper::init( if (!mi || trap) { - print_wasm_error("can't create instance", trap); + print_wasm_error( + "can't create instance", + trap, + beast::Journal(beast::Journal::getNullSink())); throw std::runtime_error("WAMR: can't create instance"); } wasm_instance_exports(mi.get(), expt); @@ -570,7 +652,7 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) nullptr}; trap = wasm_func_call(func, &inv, &ret.r); if (trap) - print_wasm_error("failed to call func", trap); + print_wasm_error("failed to call func", trap, j_); // assert(results[0].kind == WASM_I32); // if (NR) printf("Result P5: %d\n", ret[0].of.i32); @@ -645,10 +727,13 @@ WamrEngine::run( wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params) + std::vector const& params, + beast::Journal j) { try { + wasm_runtime_set_log_level(getLogLevel(j.sink().threshold())); + j_ = j; return runHlp(wasmCode, funcName, imports, params); } catch (std::exception const&) diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 113fcf88866..a5b8051cb10 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,6 +20,8 @@ #include +#include + #include #include @@ -146,6 +148,7 @@ class WamrEngine wasm_trap_t* trap = nullptr; std::int64_t defGas = -1; std::int32_t defMaxPages = -1; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); public: WamrEngine(); @@ -155,7 +158,8 @@ class WamrEngine run(wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params); + std::vector const& params, + beast::Journal j); std::int64_t initGas(std::int64_t def); diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index e1943244e70..f2f70ee558d 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -23,6 +23,7 @@ #include #include +#include #include namespace ripple { @@ -34,6 +35,12 @@ class WasmHostFunctionsImpl : public HostFunctions { } + beast::Journal + getJournal() override + { + return ctx.journal; + } + int32_t getLedgerSqn() override; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index a61b4f73cb2..8e77bc027b9 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -56,7 +56,7 @@ runEscrowWasm( WASM_IMPORT_FUNC(imports, print, hfs) std::int64_t const sgas = gasLimit; // vm.getGas(); - auto ret = vm.run(wasmCode, funcName, imports); + auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -92,9 +92,10 @@ WasmEngine::run( wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params) + std::vector const& params, + beast::Journal j) { - return impl->run(wasmCode, funcName, imports, params); + return impl->run(wasmCode, funcName, imports, params, j); } std::int64_t diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b383bba37d8..25079861b97 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -68,6 +68,12 @@ typedef WasmResult EscrowResult; struct HostFunctions { + virtual beast::Journal + getJournal() + { + return beast::Journal{beast::Journal::getNullSink()}; + } + virtual int32_t getLedgerSqn() { @@ -331,7 +337,8 @@ class WasmEngine run(wbytes const& wasmCode, std::string_view funcName = {}, std::vector const& imports = {}, - std::vector const& params = {}); + std::vector const& params = {}, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); std::int64_t initGas(std::int64_t def = 1'000'000'000'000LL); From 1ede0bdec443eecb0d1ee7cf429b08ca00b39299 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 May 2025 17:37:14 -0400 Subject: [PATCH 15/73] fix: fix fixtures (#5445) --- src/test/app/wasm_fixtures/fixtures.cpp | 1571 +++++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 1553 +--------------------- src/xrpld/app/misc/WasmHostFuncImpl.h | 5 +- 3 files changed, 1580 insertions(+), 1549 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixtures.cpp diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp new file mode 100644 index 00000000000..1ed246f2529 --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -0,0 +1,1571 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +std::string const ledgerSqnHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" + "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" + "010700100041044a0b004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d31" + "2e38352e31202834656231363132353020323032352d30332d3135290049" + "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" + "732b0a6d756c746976616c7565"; + +std::string const allHostFunctionsHex = + "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" + "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" + "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" + "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" + "686f73745f6c69621a67657443757272656e744c6564676572456e747279" + "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" + "794669656c64000408686f73745f6c696213676574506172656e744c6564" + "67657254696d65000503363501010101090a000302010101010506020207" + "020201040001010100010400010101020701080101030800010103020202" + "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" + "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" + "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" + "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" + "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" + "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" + "0000450440200128021c41d480c0004104200128022028020c1100002100" + "0c010b41012100200128021c220341d880c0004104200128022022062802" + "0c22051100000d00200441016a2104024020012d00144104714504402003" + "418d83c000410120051100000d022004200110050d02200128021c210320" + "0128022028020c21050c010b2003418e83c000410220051100000d012002" + "41013a0017200241206a200141086a290200370300200241286a20014110" + "6a290200370300200241306a200141186a2802003602002002200636020c" + "20022003360208200241e482c00036023820022001290200370318200220" + "0241176a3602102002200241086a3602342004200241186a10050d012002" + "280234418883c0004102200228023828020c1100000d010b2003419891c0" + "004101200511000021000b200241406b240020000bff0201037f23004180" + "016b22032400027f0240200128021422024110714504402002412071450d" + "0120002d0000210241810121000340200020036a41026b2002410f712204" + "413072200441376a2004410a491b3a000020022204410476210220004101" + "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" + "41810120006b10090c020b20002d0000210241810121000340200020036a" + "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" + "22044104762102200041016b21002004410f4b0d000b20014101419183c0" + "004102200020036a41016b41810120006b10090c010b0240024002402000" + "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" + "0171410174419383c0006a2f00003b0001410021000c010b410221002002" + "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" + "410174419383c0006a2f00003b00010b2001410141014100200020036a20" + "0041037310090b20034180016a24000b4701017f230041106b2202240020" + "022000280200220041046a36020c200141a080c000410941a980c000410b" + "2000410141b480c00041092002410c6a41021008200241106a24000bff01" + "01037f23004180016b22042400027f024020012802142202411071450440" + "20024120710d01200028020041012001100a0c020b200028020021004181" + "0121020340200220046a41026b2000410f712203413072200341d7006a20" + "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" + "20014101419183c0004102200220046a41016b41810120026b10090c010b" + "2000280200210041810121020340200220046a41026b2000410f71220341" + "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" + "41047621000d000b20014101419183c0004102200220046a41016b418101" + "20026b10090b20044180016a24000bc50101017f230041106b220b240020" + "0028021c20012002200028022028020c1100002101200b41003a000d200b" + "20013a000c200b2000360208200b41086a20032004200520061020200720" + "082009200a10202101200b2d000d2202200b2d000c220372210002402003" + "4101712002410147720d00200128020022002d0014410471450440200028" + "021c418b83c0004102200028022028020c11000021000c010b200028021c" + "418a83c0004101200028022028020c11000021000b200b41106a24002000" + "4101710bef0401077f027f200145044020002802142106412d2109200541" + "016a0c010b412b418080c4002000280214220641017122011b2109200120" + "056a0b210702402006410471450440410021020c010b024020034504400c" + "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" + "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" + "280200450440200028021c22012000280220220020092002200310190440" + "41010f0b200120042005200028020c1100000f0b02400240024020072000" + "28020422084f0440200028021c2201200028022022002009200220031019" + "450d0141010f0b2006410871450d012000280210210b2000413036021020" + "002d0018210c41012101200041013a0018200028021c2206200028022022" + "0a20092002200310190d02200820076b41016a210102400340200141016b" + "2201450d0120064130200a280210110100450d000b41010f0b2006200420" + "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" + "000f0b200120042005200028020c11000021010c010b200820076b210602" + "4002400240410120002d0018220120014103461b220141016b0e02000102" + "0b20062101410021060c010b20064101762101200641016a41017621060b" + "200141016a21012000280210210820002802202107200028021c21000240" + "0340200141016b2201450d01200020082007280210110100450d000b4101" + "0f0b410121012000200720092002200310190d0020002004200520072802" + "0c1100000d004100210103402001200646044041000f0b200141016a2101" + "200020082007280210110100450d000b200141016b2006490f0b20010bbd" + "0201067f230041106b22042400410a2103024020004190ce004904402000" + "21050c010b0340200441066a20036a220641046b20004190ce006e220541" + "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" + "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" + "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" + "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" + "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" + "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" + "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" + "2203200441066a6a20004130723a00000b2002200141014100200441066a" + "20036a410a20036b1009200441106a24000b1701017f2000280200220104" + "4020002802042001100c0b0bce0601047f0240200041046b280200220422" + "02417871220341044108200241037122021b20016a4f0440200241002003" + "200141276a4b1b0d01200041086b22012004220341787122006a21020240" + "024020034101710d002003410271450d012001280200220320006a210020" + "0120036b22014190a0c00028020046044020022802044103714103470d01" + "4188a0c000200036020020022002280204417e7136020420012000410172" + "360204200220003602000c020b2001200310330b02400240024002400240" + "2002280204220341027145044020024194a0c000280200460d0220024190" + "a0c000280200460d0320022003417871220210332001200020026a220041" + "0172360204200020016a200036020020014190a0c000280200470d014188" + "a0c00020003602000c060b20022003417e71360204200120004101723602" + "04200020016a20003602000b2000418002490d0220012000103241002101" + "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" + "280200220004400340200141016a2101200028020822000d000b0b41a8a0" + "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" + "418ca0c000418ca0c00028020020006a2200360200200120004101723602" + "044190a0c00028020020014604404188a0c00041003602004190a0c00041" + "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" + "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" + "402002200128020022054f04402002200520012802046a490d040b200128" + "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" + "020020006a220036020020012000410172360204200020016a2000360200" + "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" + "012000410376742200714504404180a0c000200020037236020020020c01" + "0b20022802080b2100200220013602082000200136020c2001200236020c" + "200120003602080c010b41f09dc000280200220104400340200041016a21" + "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" + "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" + "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" + "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" + "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" + "087f230041406a2202240020002802082105200028020421034101210620" + "0128021c41cc81c0004101200128022028020c1100002100200504400340" + "20072108410121072000410171210441012100024020040d00024020012d" + "00144104714504402008410171450d01200128021c418383c00041022001" + "28022028020c110000450d010c020b20012802202104200128021c210920" + "08410171450440200941d59ac0004101200428020c1100000d020b200241" + "013a0017200241206a200141086a290200370300200241286a200141106a" + "290200370300200241306a200141186a2802003602002002200436020c20" + "022009360208200241e482c0003602382002200129020037031820022002" + "41176a3602102002200241086a3602342003200241186a10054504402002" + "280234418883c0004102200228023828020c11000021000c020b0c010b20" + "032001100521000b200341016a2103200541016b22050d000b0b20004504" + "40200128021c419083c0004101200128022028020c11000021060b200241" + "406b240020060bdb0101047f230041106b220224002002200036020c2300" + "41106b22002400200128021c41f899c000410d200128022028020c110000" + "2103200041003a000d200020033a000c20002001360208200041086a4185" + "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" + "722101024020054101712004410147720d00200328020022012d00144104" + "71450440200128021c418b83c0004102200128022028020c11000021010c" + "010b200128021c418a83c0004101200128022028020c11000021010b2000" + "41106a24002001410171200241106a24000b3300200128021c2000280200" + "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" + "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" + "c0002d00001a024002400240024002404107101222000440200041036a41" + "879bc000280000360000200041849bc000280000360000200341286a2000" + "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" + "200041036a41879bc000280000360000200041849bc00028000036000020" + "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" + "122200450d05200041076a41929bc0002800003600002000418b9bc00029" + "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" + "00001a200328024821012003280244210b410710122204450d0541002100" + "200441036a41b79bc000280000360000200441b49bc00028000036000020" + "0341d8006a41e100200b20012004410710021013200328025c2105024002" + "400240200328026022020e020700010b41012100200522012d0000412b6b" + "0e03060106010b20052d0000412b460440200241016b2100200541016a21" + "0120024112490d010c030b200521012002220041114f0d020b034020012d" + "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" + "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" + "186a2010103820012d000041306b220941094b0d02410221002003290320" + "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" + "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" + "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" + "8b06360000200341cc006a200041041001101320004104100c027f024020" + "03280254220541004e047f2003280250210c20054504404101210141000c" + "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" + "1014000b20050b21092001200c2005103721002005450d01200541076b22" + "014100200120054d1b2106200041036a417c7120006b2108410021010340" + "024002400240200020016a2d00002202c0220741004e0440200820016b41" + "03710d01200120064f0d020340200020016a220228020420022802007241" + "8081828478710d03200141086a22012006490d000b0c020b428080808080" + "20210e428080808010210f024002400240027e0240024002400240024002" + "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" + "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" + "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" + "220420054f0d06200020046a2c0000210402400240200241e00147044020" + "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" + "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" + "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" + "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" + "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" + "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" + "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" + "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" + "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" + "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" + "00210f0b2001ad200e200f8484210e200941808080807846044020002109" + "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" + "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" + "010b200120054f0d000340200020016a2c00004100480d01200520014101" + "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" + "0021050b410021000240024002400240024002400240200ea722020e0206" + "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" + "2b460440200241016b2100200541016a210120024112490d010c020b2005" + "21012002220041114f0d010b4200210e034020012d000041306b22024109" + "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" + "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" + "2d000041306b220441094b0d024102210020032903104200520d03200141" + "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" + "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" + "024002400240410b101222080440200841076a419d9bc000280000360000" + "200841969bc000290000370000200341d8006a2008410b10011013200328" + "025c2104024002400240200328026022020e020a00010b4101210720042d" + "00002201412b6b0e03090109010b20042d000021010b0240024002400240" + "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" + "20024109490d02200121020c080b200241016b2106200441016a21002002" + "4109490d044100210103402006450d0b20002d000041306b220241094b0d" + "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" + "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" + "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" + "0c0b4100210141012107034020002d000041306b220641094b0d06200041" + "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" + "010b410021010c040b4100210141012107034020002d000041306b220241" + "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" + "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" + "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" + "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" + "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" + "c0001015000b20032802582200044020042000100c0b2008410b100c4100" + "210020032802302202200328023c460440200328022c2104200328023821" + "0741002106024020022200450d00034020042d0000220220072d00002208" + "460440200441016a2104200741016a2107200041016b22000d010c020b0b" + "200220086b21060b20064521000b2009044020052009100c0b200328024c" + "22020440200c2002100c0b200328024022020440200b2002100c0b200328" + "02342202044020032802382002100c0b200328022822020440200328022c" + "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" + "0121000b200320003a0058200341d8006a419080c00041f880c000101500" + "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" + "15000b410141e899c0001014000bee2202087f017e024002400240024002" + "40024002400240200041f4014d04404180a0c00028020022024110200041" + "0b6a41f803712000410b491b220541037622007622014103710d01200541" + "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" + "00410b6a220141787121054184a0c0002802002208450d06411f21074100" + "20056b2103200041f4ffff074d04402005410620014108766722006b7641" + "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" + "45044041002100410021010c040b410021002005411920074101766b4100" + "2007411f471b742104410021010340024020022802044178712206200549" + "0d00200620056b220620034f0d0020022101200622030d00410021032001" + "21000c060b200228021422062000200620022004411d764104716a41106a" + "2802002202471b200020061b21002004410174210420020d000b0c030b02" + "402001417f7341017120006a2206410374220041f89dc0006a2203200041" + "809ec0006a280200220128020822044704402004200336020c2003200436" + "02080c010b4180a0c0002002417e200677713602000b2001200041037236" + "0204200020016a220020002802044101723602040c060b02404102200074" + "2203410020036b72200120007471682206410374220041f89dc0006a2203" + "200041809ec0006a280200220128020822044704402004200336020c2003" + "20043602080c010b4180a0c0002002417e200677713602000b2001200541" + "0372360204200120056a2206200020056b2204410172360204200020016a" + "20043602004188a0c00028020022020440200241787141f89dc0006a2100" + "4190a0c0002802002103027f4180a0c00028020022054101200241037674" + "2202714504404180a0c000200220057236020020000c010b20002802080b" + "2102200020033602082002200336020c2003200036020c20032002360208" + "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" + "41e89cc0006a280200220128020441787120056b21032001210202400340" + "02400240200128021022000d00200128021422000d002002280218210702" + "4002402002200228020c2200460440200241144110200228021422001b6a" + "28020022010d01410021000c020b20022802082201200036020c20002001" + "3602080c010b200241146a200241106a20001b2104034020042106200122" + "0041146a200041106a200028021422011b210420004114411020011b6a28" + "020022010d000b200641003602000b2007450d032002200228021c410274" + "41e89cc0006a220128020047044020074110411420072802102002461b6a" + "20003602002000450d040c020b2001200036020020000d014184a0c00041" + "84a0c000280200417e200228021c77713602000c030b2000280204417871" + "20056b22012003200120034922011b21032000200220011b210220002101" + "0c010b0b2000200736021820022802102201044020002001360210200120" + "003602180b20022802142201450d0020002001360214200120003602180b" + "02400240200341104f044020022005410372360204200220056a22062003" + "410172360204200320066a20033602004188a0c0002802002204450d0120" + "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" + "0200220541012004410376742204714504404180a0c00020042005723602" + "0020000c010b20002802080b2104200020013602082004200136020c2001" + "200036020c200120043602080c010b2002200320056a2200410372360204" + "200020026a220020002802044101723602040c010b4190a0c00020063602" + "004188a0c00020033602000b200241086a0f0b2000200172450440410021" + "0141022007742200410020006b722008712200450d0320006841027441e8" + "9cc0006a28020021000b2000450d010b0340200020012000280204417871" + "220420056b220620034922071b2108200028021022024504402000280214" + "21020b20012008200420054922001b210120032006200320071b20001b21" + "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" + "0020056b4f710d0020012802182107024002402001200128020c22004604" + "40200141144110200128021422001b6a28020022020d01410021000c020b" + "20012802082202200036020c200020023602080c010b200141146a200141" + "106a20001b21040340200421062002220041146a200041106a2000280214" + "22021b210420004114411020021b6a28020022020d000b20064100360200" + "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" + "0047044020074110411420072802102001461b6a20003602002000450d02" + "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" + "0128021c77713602000c010b200020073602182001280210220204402000" + "2002360210200220003602180b20012802142202450d0020002002360214" + "200220003602180b0240200341104f044020012005410372360204200120" + "056a22022003410172360204200220036a200336020020034180024f0440" + "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" + "280200220441012003410376742203714504404180a0c000200320047236" + "020020000c010b20002802080b2103200020023602082003200236020c20" + "02200036020c200220033602080c010b2001200320056a22004103723602" + "04200020016a220020002802044101723602040b0c010b02400240024002" + "400240024020054188a0c00028020022014b04402005418ca0c000280200" + "22004f044041002100200541af80046a220141107640002202417f462203" + "0d0720024110742202450d074198a0c000410020014180807c7120031b22" + "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" + "200020002001491b360200024002404194a0c0002802002203044041e89d" + "c0002100034020002802002201200028020422066a2002460d0220002802" + "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" + "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" + "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" + "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" + "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" + "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" + "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" + "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" + "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" + "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" + "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" + "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" + "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" + "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" + "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" + "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" + "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" + "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" + "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" + "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" + "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" + "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" + "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" + "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" + "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" + "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" + "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" + "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" + "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" + "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" + "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" + "0441286b220036020020022000410172360204200020026a412836020441" + "a0a0c00041808080013602000c080b200220034d200120034b720d002000" + "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" + "360200200220046a210141e89dc000210002400240034020012000280200" + "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" + "c0002100034002402003200028020022014f04402003200120002802046a" + "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" + "c000200441286b220036020020022000410172360204200020026a412836" + "020441a0a0c00041808080013602002003200641206b41787141086b2200" + "2000200341106a491b2201411b36020441e89dc000290200210920014110" + "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" + "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" + "02002001411c6a2100034020004107360200200041046a22002006490d00" + "0b20012003460d0720012001280204417e713602042003200120036b2200" + "4101723602042001200036020020004180024f04402003200010320c080b" + "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" + "410376742200714504404180a0c000200020027236020020010c010b2001" + "2802080b2100200120033602082000200336020c2003200136020c200320" + "003602080c070b200020023602002000200028020420046a360204200220" + "054103723602042006410f6a41787141086b2201200220056a22046b2103" + "20014194a0c000280200460d0320014190a0c000280200460d0420012802" + "04220541037141014604402001200541787122001033200020016a220128" + "02042105200020036a21030b20012005417e713602042004200341017236" + "0204200320046a200336020020034180024f04402004200310320c060b20" + "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" + "0376742203714504404180a0c000200120037236020020000c010b200028" + "02080b2103200020043602082003200436020c2004200036020c20042003" + "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" + "00280200220020056a220236020020022001410172360204200020054103" + "72360204200041086a21000c060b4190a0c0002802002100024020012005" + "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" + "2001410372360204200020016a220120012802044101723602040c010b41" + "88a0c00020023602004190a0c000200020056a2203360200200320024101" + "72360204200020016a2002360200200020054103723602040b200041086a" + "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" + "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" + "03200020016b6a41086a220136020020022001410172360204200020036a" + "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" + "00418ca0c000418ca0c00028020020036a22003602002004200041017236" + "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" + "6a220036020020042000410172360204200020046a20003602000b200241" + "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" + "20056b22013602004194a0c0004194a0c000280200220020056a22023602" + "002002200141017236020420002005410372360204200041086a0f0b2000" + "0f0b200141086a0b2701017f200020012800042202360208200020012800" + "003602042000200236020020014108100c0b3b002000450440230041206b" + "22002400200041003602182000410136020c2000419c81c0003602082000" + "4204370210200041086a20011017000b000b7e01017f230041406a220324" + "002003412b36020c200341d098c000360208200320013602142003200036" + "02102003410236021c200341d482c0003602182003420237022420032003" + "41106aad4280808080e000843703382003200341086aad4280808080f000" + "843703302003200341306a360220200341186a20021017000b4101017f23" + "0041206b2202240020024100360210200241013602042002420437020820" + "02412e36021c200220003602182002200241186a36020020022001101700" + "0bf40102027f017e230041106b22022400200241013b010c200220013602" + "0820022000360204230041106b22012400200241046a2200290200210420" + "01200036020c20012004370204230041106b22002400200141046a220128" + "0200220228020c2103024002400240024020022802040e020001020b2003" + "0d0141012102410021030c020b20030d0020022802002202280204210320" + "0228020021020c010b20004180808080783602002000200136020c200128" + "020822012d0008210220012d00091a2000410e20021026000b2000200336" + "020420002002360200200128020822012d0008210220012d00091a200041" + "0f20021026000b0d00200028020041012001100a0b380002402002418080" + "c400460d00200020022001280210110100450d0041010f0b200345044041" + "000f0b200020032004200128020c1100000b900a010a7f02400240024020" + "0028020022052000280208220372044002402003410171450d0020012002" + "6a21060240200028020c2209450440200121040c010b2001210403402004" + "22032006460d02027f200341016a20032c0000220441004e0d001a200341" + "026a20044160490d001a200341036a20044170490d001a200341046a0b22" + "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" + "20042c00001a20072002027f02402007450d00200220074d044020022007" + "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" + "031b21022003200120031b21010b2005450d032000280204210b20024110" + "4f044020022001200141036a417c7122076b22086a220a41037121094100" + "210541002103200120074704402008417c4d044041002106034020032001" + "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" + "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" + "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" + "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" + "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" + "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" + "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" + "09410371210a2009410274210741002104200641044f04402008200741f0" + "07716a210c200821030340200420032802002204417f7341077620044106" + "76724181828408716a20032802042204417f734107762004410676724181" + "828408716a20032802082204417f73410776200441067672418182840871" + "6a200328020c2204417f734107762004410676724181828408716a210420" + "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" + "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" + "200a450d000b2008200941fc01714102746a22042802002203417f734107" + "762003410676724181828408712103200a4101460d022003200428020422" + "03417f734107762003410676724181828408716a2103200a4102460d0220" + "0320042802082203417f734107762003410676724181828408716a21030c" + "020b2002450440410021050c030b20024103712104024020024104490440" + "41002105410021080c010b41002105200121032002410c71220821070340" + "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" + "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" + "200741046b22070d000b0b2004450d02200120086a21030340200520032c" + "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" + "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" + "056a21050b02402005200b490440200b20056b210602400240024020002d" + "00182203410020034103471b220341016b0e020001020b20062103410021" + "060c010b20064101762103200641016a41017621060b200341016a210320" + "00280210210820002802202104200028021c21000340200341016b220345" + "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" + "02200428020c110000044041010f0b410021030340200320064604404100" + "0f0b200341016a2103200020082004280210110100450d000b200341016b" + "2006490f0b200028021c20012002200028022028020c1100000b14002000" + "2802002001200028020428020c1101000b10002001200028020020002802" + "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" + "6b220324002003200136022c20032000360228200341033a002420034220" + "37021c200341003602142003410036020c027f0240024002402002280210" + "220a450440200228020c2200450d012002280208220120004103746a2104" + "200041016b41ffffffff017141016a210720022802002100034020004104" + "6a28020022050440200328022820002802002005200328022c28020c1100" + "000d040b20012802002003410c6a200141046a2802001101000d03200041" + "086a2100200141086a22012004470d000b0c010b20022802142200450d00" + "2000410574210b200041016b41ffffff3f7141016a210720022802082105" + "200228020021000340200041046a28020022010440200328022820002802" + "002001200328022c28020c1100000d030b20032008200a6a220141106a28" + "020036021c20032001411c6a2d00003a00242003200141186a2802003602" + "202001410c6a28020021044100210941002106024002400240200141086a" + "28020041016b0e020002010b200441037420056a220c2802000d01200c28" + "020421040b410121060b200320043602102003200636020c200141046a28" + "02002104024002400240200128020041016b0e020002010b200441037420" + "056a22062802000d01200628020421040b410121090b2003200436021820" + "0320093602142005200141146a2802004103746a22012802002003410c6a" + "200141046a2802001101000d02200041086a2100200b200841206a220847" + "0d000b0b200720022802044f0d012003280228200228020020074103746a" + "22002802002000280204200328022c28020c110000450d010b41010c010b" + "41000b200341306a24000b1900200128021c41a481c000410e2001280220" + "28020c1100000b820302047f017e230041406a2206240041012107024020" + "002d00040d0020002d00052108200028020022052d001441047145044020" + "0528021c418383c000418083c000200841017122081b4102410320081b20" + "0528022028020c1100000d01200528021c20012002200528022028020c11" + "00000d01200528021c41f391c0004102200528022028020c1100000d0120" + "032005200411010021070c010b2008410171450440200528021c418583c0" + "004103200528022028020c1100000d010b200641013a0017200641206a20" + "0541086a290200370300200641286a200541106a29020037030020064130" + "6a200541186a2802003602002006200529021c3702082005290200210920" + "0641e482c000360238200620093703182006200641176a36021020062006" + "41086a220536023420052001200210210d00200541f391c000410210210d" + "002003200641186a20041101000d002006280234418883c0004102200628" + "023828020c11000021070b200041013a0005200020073a0004200641406b" + "240020000bab04010c7f200141016b210e2000280204210a200028020021" + "0b2000280208210c0240034020050d01027f024020022003490d00034020" + "0120036a2105024002400240200220036b220741074d044020022003470d" + "01200221030c050b0240200541036a417c71220620056b22040440410021" + "000340200020056a2d0000410a460d052004200041016a2200470d000b20" + "04200741086b22004d0d010c030b200741086b21000b0340418082840820" + "062802002209418a94a8d000736b2009724180828408200641046a280200" + "2209418a94a8d000736b2009727141808182847871418081828478470d02" + "200641086a2106200441086a220420004d0d000b0c010b41002100034020" + "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" + "030b20042007460440200221030c030b200420056a2106200220046b2003" + "6b21074100210002400340200020066a2d0000410a460d01200720004101" + "6a2200470d000b200221030c030b200020046a21000b200020036a220441" + "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" + "200322040c030b200220034f0d000b0b20022008460d0241012105200821" + "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" + "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" + "200020086b2100200120086a2107200c20063a000020042108200b200720" + "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" + "042102200028020021030240200028020822002d0000450d00200341fc82" + "c0004104200228020c110000450d0041010f0b20002001410a463a000020" + "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" + "200028020022002000411f7522027320026b2000417f73411f762001100a" + "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" + "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" + "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" + "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" + "0041003a00002002450d00000b000b250020002802002d00004504402001" + "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" + "02082204452001280200220520046b20034f724504402001410036020820" + "0141003a000c410021040b20032005490440200128020420046a20022003" + "10371a200041043a00002001200320046a3602080f0b2000420437020020" + "0141003a000c0bac0301017f230041406a22022400024002400240024002" + "40024020002d000041016b0e03010203000b2002200028020436020441b1" + "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" + "0000200041086a41a495c0002900003700002000419c95c0002900003700" + "00200241143602102002200036020c200241143602082002410336022c20" + "02419c91c000360228200242023702342002200241046aad4280808080b0" + "01843703202002200241086aad4280808080c00184370318200220024118" + "6a360230200128021c2001280220200241286a101e210020022802082201" + "450d03200228020c2001100c0c030b20002d000121002002410136022c20" + "0241c88ac000360228200242013702342002200241186aad4280808080f0" + "008437030820022000410274220041f095c0006a28020036021c20022000" + "419897c0006a2802003602182002200241086a360230200128021c200128" + "0220200241286a101e21000c020b20012000280204220028020020002802" + "04101a21000c010b20002802042200280200200120002802042802101101" + "0021000b200241406b240020000f0b000b10002001200028020420002802" + "08101a0b5501037f2000280204210120002d0000220041044d2000410347" + "7145044020012802002100200141046a2802002202280200220304402000" + "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" + "c709010a7f230041206b2208240002400240024002402001280210450440" + "2001417f36021020032003200241036a417c7120026b220a6b4107714100" + "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" + "016b200220036a220541016b22062d0000410a460d001a2006200220096a" + "2207460d01200441026b200541026b22062d0000410a460d001a20062007" + "460d01200441036b200541036b22062d0000410a460d001a20062007460d" + "01200441046b200541046b22062d0000410a460d001a20062007460d0120" + "0441056b200541056b22062d0000410a460d001a20062007460d01200441" + "066b200541066b22062d0000410a460d001a20062007460d01200441076b" + "200541076b22052d0000410a460d001a20052007460d0120044178720b20" + "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" + "0241046b210d2004417f7320026a21060340024020062105200a21042009" + "2207200c4d0d00200441086b210a200541086b2106418082840820022007" + "41086b22096a280200220b418a94a8d000736b200b724180828408200720" + "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" + "8478460d010b0b20032007490d0202400340200320046a450d0120044101" + "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" + "016a21040c040b02402001411c6a2802002204450440410021040c010b20" + "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" + "00202001411c6a41003602000b2003200128021420046b4f044020002001" + "41146a2002200310280c050b200128021820046a2002200310371a200041" + "043a00002001411c6a200320046a3602000c040b230041306b2200240020" + "00410136020c200041c481c0003602082000420137021420002000412f6a" + "ad4280808080a001843703202000200041206a360210200041086a41d091" + "c0001017000b230041306b22002400200020033602042000200936020020" + "00410236020c200041d887c000360208200042023702142000200041046a" + "ad428080808080018437032820002000ad42808080808001843703202000" + "200041206a360210200041086a418485c0001017000b230041306b220024" + "0020002003360204200020073602002000410236020c200041f887c00036" + "0208200042023702142000200041046aad42808080808001843703282000" + "2000ad42808080808001843703202000200041206a360210200041086a41" + "9485c0001017000b20032004490440200841003602182008410136020c20" + "0841888bc00036020820084204370210200841086a41908bc0001017000b" + "02402001411c6a2802002205450d0002400240200128021420056b20044d" + "0440200841086a200141146a20022004102820082d00084104470d012001" + "411c6a28020021050c020b200141186a28020020056a2002200410371a20" + "01411c6a200420056a22053602000c010b200020082903083702000c020b" + "2005450d00200141003a00202001411c6a41003602000b200220046a2105" + "200320046b220220012802144f04402000200141146a2005200210280c01" + "0b200141186a2802002005200210371a200041043a00002001411c6a2002" + "3602000b2001200128021041016a360210200841206a24000b9a0102047f" + "017e230041106b22032400200341086a200028020828020020012002102c" + "20032d000822054104470440200028020421012003290308210720002d00" + "00220241044d20024103477145044020012802002102200141046a280200" + "220428020022060440200220061103000b20042802042204044020022004" + "100c0b2001410c100c0b200020073702000b200341106a24002005410447" + "0be10202057f017e230041106b2202240020024100360204027f20014180" + "014f044020014180104f04402001418080044f044020022001413f714180" + "01723a00072002200141127641f001723a000420022001410676413f7141" + "8001723a000620022001410c76413f71418001723a000541040c030b2002" + "2001413f71418001723a000620022001410c7641e001723a000420022001" + "410676413f71418001723a000541030c020b20022001413f71418001723a" + "00052002200141067641c001723a000441020c010b200220013a00044101" + "0b2101200241086a2000280208280200200241046a2001102c20022d0008" + "22054104470440200028020421012002290308210720002d000022034104" + "4d20034103477145044020012802002103200141046a2802002204280200" + "22060440200320061103000b20042802042204044020032004100c0b2001" + "410c100c0b200020073702000b200241106a240020054104470b0d002000" + "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" + "36020c2001419892c00036020841c89cc0002d0000410347044002402300" + "41206b22022400024002400240024041c89cc0002d000041026b0e020301" + "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" + "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" + "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" + "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" + "41206a24000c020b000b200241003602182002410136020c200241e895c0" + "0036020820024204370210200241086a41b094c0001017000b0b02400240" + "024041d89cc000290300220650044041e09cc00029030021050340200542" + "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" + "5122021b370300200721052002450d000b41d89cc00020063703000b0240" + "024041a09cc000290300200652044041ac9cc0002d000021034101210241" + "ac9cc00041013a0000200120033a00182003450d01200142003702342001" + "4281808080c00037022c200141c893c000360228230041106b2202240020" + "02418888c00036020c2002200141186a360208230041f0006b2200240020" + "00418c88c00036020c2000200241086a3602082000418c88c00036021420" + "002002410c6a3602102000410236021c200041cd81c00036021802402001" + "41286a22012802004504402000410336025c2000418082c0003602582000" + "42033702642000200041106aad4280808080e00084370348200020004108" + "6aad4280808080e000843703400c010b200041306a200141106a29020037" + "0300200041286a200141086a290200370300200020012902003703202000" + "410436025c200041b482c000360258200042043702642000200041106aad" + "4280808080e000843703502000200041086aad4280808080e00084370348" + "2000200041206aad42808080809001843703400b2000200041186aad4280" + "808080f000843703382000200041386a360260200041d8006a41fc93c000" + "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" + "0041306b220024002000412636020c200041c094c0003602082000410136" + "0214200041c88ac0003602102000420137021c2000200041086aad428080" + "8080f000843703282000200041286a360218200041106a418c95c0001017" + "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" + "36021041042102200141043a00182001200141106a360220200141186a41" + "9c88c0002000101e210320012d0018210002402003450440420021054117" + "2000764101710d01200128021c22002802002102200041046a2802002203" + "28020022040440200220041103000b20032802042203044020022003100c" + "0b2000410c100c410421020c010b20004104460d02200129031822074280" + "7e8321052007a721020b20012802102200200028020841016b2203360208" + "2003450440200041003a000c200042003703000b200241ff01714104470d" + "02200141406b24000f0b230041206b220024002000410036021820004101" + "36020c200041b08ac00036020820004204370210200041086a41b88ac000" + "1017000b200141003602382001410136022c2001419093c0003602282001" + "4204370230200141286a419893c0001017000b200120052002ad42ff0183" + "843703102001410236022c200141f891c000360228200142023702342001" + "200141106aad4280808080d001843703202001200141086aad4280808080" + "f000843703182001200141186a360230200141286a418892c0001017000b" + "0c00200020012902003703000bba0201047f411f21022000420037021020" + "0141ffffff074d04402001410620014108766722036b7641017120034101" + "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" + "20027422034184a0c0002802007145044020042000360200200020043602" + "182000200036020c200020003602084184a0c0004184a0c0002802002003" + "723602000f0b024002402001200428020022032802044178714604402003" + "21020c010b2001411920024101766b41002002411f471b74210503402003" + "2005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c" + "20022000360208200041003602182000200236020c200020013602080f0b" + "20042000360200200020033602182000200036020c200020003602080bf1" + "0201047f200028020c21020240024020014180024f044020002802182103" + "0240024020002002460440200041144110200028021422021b6a28020022" + "010d01410021020c020b20002802082201200236020c200220013602080c" + "010b200041146a200041106a20021b21040340200421052001220241146a" + "200241106a200228021422011b210420024114411020011b6a2802002201" + "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" + "006a220128020047044020034110411420032802102000461b6a20023602" + "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" + "280200417e200028021c77713602000c020b200028020822002002470440" + "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" + "7e200141037677713602000f0b2002200336021820002802102201044020" + "022001360210200120023602180b20002802142200450d00200220003602" + "14200020023602180b0b8f0101027f230041306b22012400024020004100" + "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" + "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" + "14200141d89ac0003602102001420137021c2001411036022c2001200141" + "286a36021820012001410c6a360228200141106a1030200128020c200141" + "306a24000bcf0101067f23004180016b2204240020012802042107200128" + "020021062000280200210020012802142205210202402005410471450d00" + "2005410872210220060d0020014281808080a0013702000b200120024104" + "7236021441810121020340200220046a41026b2000410f71220341307220" + "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" + "762100450d000b20014101419183c0004102200220046a41016b41810120" + "026b10092001200536021420012007360204200120063602002004418001" + "6a24000b6301017f230041306b220224002002200036020c200241023602" + "14200241f49ac0003602102002420137021c2002411036022c2002200241" + "286a36021820022002410c6a360228200241106a10302001044020022802" + "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" + "21030c010b02402000410020006b41037122066a220520004d0d00200021" + "032001210420060440200621070340200320042d00003a0000200441016a" + "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" + "0340200320042d00003a0000200341016a200441016a2d00003a00002003" + "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" + "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" + "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" + "003a0000200441086a2104200341086a22032005470d000b0b2005200220" + "066b2207417c7122086a21030240200120066a2204410371450440200320" + "054d0d0120042101034020052001280200360200200141046a2101200541" + "046a22052003490d000b0c010b200320054d0d0020044103742202411871" + "21062004417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220067620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20074103712102200420086a21010b" + "02402003200220036a22064f0d002002410771220404400340200320012d" + "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" + "200241016b4107490d000340200320012d00003a0000200341016a200141" + "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" + "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" + "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" + "41076a200141076a2d00003a0000200141086a2101200341086a22032006" + "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" + "420022022001422088420a7e7c22014220867c2204370300200020032004" + "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" + "c0000ba40611000000140000000400000012000000000000000100000001" + "00000013000000557466384572726f7276616c69645f75705f746f657272" + "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" + "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" + "003d0000005c0010000a0000001600000037000000636170616369747920" + "6f766572666c6f770000008800100011000000426f72726f774d75744572" + "726f72616c726561647920626f72726f7765643a20b2001000120000005b" + "3d3d617373657274696f6e20606c6566742020726967687460206661696c" + "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" + "00100017000000f60010000900000020726967687460206661696c65643a" + "200a20206c6566743a20000000cf00100010000000180110001000000028" + "01100009000000f6001000090000000100000000000000f3081000020000" + "00000000000c000000040000001400000015000000160000002020202020" + "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230" + "323132323233323432353236323732383239333033313332333333343335" + "333633373338333934303431343234333434343534363437343834393530" + "353135323533353435353536353735383539363036313632363336343635" + "363636373638363937303731373237333734373537363737373837393830" + "383138323833383438353836383738383839393039313932393339343935" + "393639373938393966616c7365747275656c6962726172792f636f72652f" + "7372632f736c6963652f6d656d6368722e72736402100020000000850000" + "001e0000006402100020000000a100000009000000010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010100" + "41e686c0000b330202020202020202020202020202020202020202020202" + "020202020202020303030303030303030303030303030304040404040041" + "a487c0000b6172616e676520737461727420696e64657820206f7574206f" + "662072616e676520666f7220736c696365206f66206c656e67746820a403" + "100012000000b60310002200000072616e676520656e6420696e64657820" + "e803100010000000b60310002200419088c0000b8f140400000004000000" + "17000000180000000c00000004000000190000001a0000001b0000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" + "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" + "61746520756e69717565207468726561642049443a206269747370616365" + "20657868617573746564f904100037000000dc0410001d000000ae040000" + "0d00000001000000000000006c6962726172792f7374642f7372632f696f" + "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e00007d05100009000000500510002d000000160100002900" + "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" + "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" + "696f6e207265736574686f737420756e726561636861626c656e6574776f" + "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" + "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" + "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c7265616479206578" + "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" + "206469726563746f727969732061206469726563746f7279646972656374" + "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c657379737465" + "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" + "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" + "2066696c652068616e646c65696e76616c696420696e7075742070617261" + "6d65746572696e76616c6964206461746174696d6564206f757477726974" + "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" + "756e7365656b61626c652066696c6571756f746120657863656564656466" + "696c6520746f6f206c617267657265736f75726365206275737965786563" + "757461626c652066696c652062757379646561646c6f636b63726f73732d" + "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" + "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" + "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" + "70746564756e737570706f72746564756e657870656374656420656e6420" + "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" + "736f74686572206572726f72756e63617465676f72697a6564206572726f" + "7220286f73206572726f72202900000001000000000000008d0810000b00" + "000098081000010000006c6962726172792f7374642f7372632f696f2f73" + "7464696f2e727300b40810001b00000032030000140000006661696c6564" + "207072696e74696e6720746f203a20000000e008100013000000f3081000" + "02000000b40810001b00000063040000090000007374646f75746c696272" + "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" + "696e6720747261697420696d706c656d656e746174696f6e207265747572" + "6e656420616e206572726f72207768656e2074686520756e6465726c7969" + "6e672073747265616d20646964206e6f7400000037091000560000001e09" + "100019000000680700001500000063616e6e6f7420726563757273697665" + "6c792061637175697265206d75746578a8091000200000006c6962726172" + "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" + "72656164732e7273d00910002c00000013000000090000006c6962726172" + "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" + "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" + "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" + "7273660a100026000000220100002d0000006f7065726174696f6e207375" + "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" + "6e206d6179206e6f7420626520706572666f726d65642072656375727369" + "76656c79b00a100038000000100000001100000012000000100000001000" + "000013000000120000000d0000000e000000150000000c0000000b000000" + "15000000150000000f0000000e0000001300000026000000380000001900" + "0000170000000c000000090000000a00000010000000170000000e000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600" + "0000150000000b000000160000000d0000000b0000000b00000013000000" + "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" + "1000250610003306100048061000540610005f0610007406100089061000" + "98061000a6061000b9061000df0610001707100030071000470710005307" + "10005c07100066071000760710008d0710009b071000a9071000b6071000" + "ca071000d2071000ed071000fb0710000b08100021081000360810004108" + "100057081000640810006f0810007a081000000000000100000001000000" + "1300000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" + "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" + "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" + "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" + "6963652e72737b0c10006d000000a1000000190000005061727365496e74" + "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" + "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" + "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" + "100009000000550d1000010000006465616c6c6f636174652000680d1000" + "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" + "46696e6973684166746572000000090d1000320000008000000016000000" + "42616c616e636500090d1000320000009b00000016000000456d70747949" + "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" + "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" + "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" + "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; + +std::string const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 1d377676c6b..e7bada74a5f 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -17,1553 +17,14 @@ */ //============================================================================== +#pragma once + // TODO: consider moving these to separate files (and figure out the build) -static auto const ledgerSqnHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" - "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" - "010700100041044a0b004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d31" - "2e38352e31202834656231363132353020323032352d30332d3135290049" - "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" - "732b0a6d756c746976616c7565"; +#include + +extern std::string const ledgerSqnHex; -static auto const allHostFunctionsHex = - "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" - "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" - "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" - "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" - "686f73745f6c69621a67657443757272656e744c6564676572456e747279" - "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" - "794669656c64000408686f73745f6c696213676574506172656e744c6564" - "67657254696d65000503363501010101090a000302010101010506020207" - "020201040001010100010400010101020701080101030800010103020202" - "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" - "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" - "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" - "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" - "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" - "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" - "0000450440200128021c41d480c0004104200128022028020c1100002100" - "0c010b41012100200128021c220341d880c0004104200128022022062802" - "0c22051100000d00200441016a2104024020012d00144104714504402003" - "418d83c000410120051100000d022004200110050d02200128021c210320" - "0128022028020c21050c010b2003418e83c000410220051100000d012002" - "41013a0017200241206a200141086a290200370300200241286a20014110" - "6a290200370300200241306a200141186a2802003602002002200636020c" - "20022003360208200241e482c00036023820022001290200370318200220" - "0241176a3602102002200241086a3602342004200241186a10050d012002" - "280234418883c0004102200228023828020c1100000d010b2003419891c0" - "004101200511000021000b200241406b240020000bff0201037f23004180" - "016b22032400027f0240200128021422024110714504402002412071450d" - "0120002d0000210241810121000340200020036a41026b2002410f712204" - "413072200441376a2004410a491b3a000020022204410476210220004101" - "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" - "41810120006b10090c020b20002d0000210241810121000340200020036a" - "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" - "22044104762102200041016b21002004410f4b0d000b20014101419183c0" - "004102200020036a41016b41810120006b10090c010b0240024002402000" - "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" - "0171410174419383c0006a2f00003b0001410021000c010b410221002002" - "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" - "410174419383c0006a2f00003b00010b2001410141014100200020036a20" - "0041037310090b20034180016a24000b4701017f230041106b2202240020" - "022000280200220041046a36020c200141a080c000410941a980c000410b" - "2000410141b480c00041092002410c6a41021008200241106a24000bff01" - "01037f23004180016b22042400027f024020012802142202411071450440" - "20024120710d01200028020041012001100a0c020b200028020021004181" - "0121020340200220046a41026b2000410f712203413072200341d7006a20" - "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" - "20014101419183c0004102200220046a41016b41810120026b10090c010b" - "2000280200210041810121020340200220046a41026b2000410f71220341" - "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" - "41047621000d000b20014101419183c0004102200220046a41016b418101" - "20026b10090b20044180016a24000bc50101017f230041106b220b240020" - "0028021c20012002200028022028020c1100002101200b41003a000d200b" - "20013a000c200b2000360208200b41086a20032004200520061020200720" - "082009200a10202101200b2d000d2202200b2d000c220372210002402003" - "4101712002410147720d00200128020022002d0014410471450440200028" - "021c418b83c0004102200028022028020c11000021000c010b200028021c" - "418a83c0004101200028022028020c11000021000b200b41106a24002000" - "4101710bef0401077f027f200145044020002802142106412d2109200541" - "016a0c010b412b418080c4002000280214220641017122011b2109200120" - "056a0b210702402006410471450440410021020c010b024020034504400c" - "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" - "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" - "280200450440200028021c22012000280220220020092002200310190440" - "41010f0b200120042005200028020c1100000f0b02400240024020072000" - "28020422084f0440200028021c2201200028022022002009200220031019" - "450d0141010f0b2006410871450d012000280210210b2000413036021020" - "002d0018210c41012101200041013a0018200028021c2206200028022022" - "0a20092002200310190d02200820076b41016a210102400340200141016b" - "2201450d0120064130200a280210110100450d000b41010f0b2006200420" - "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" - "000f0b200120042005200028020c11000021010c010b200820076b210602" - "4002400240410120002d0018220120014103461b220141016b0e02000102" - "0b20062101410021060c010b20064101762101200641016a41017621060b" - "200141016a21012000280210210820002802202107200028021c21000240" - "0340200141016b2201450d01200020082007280210110100450d000b4101" - "0f0b410121012000200720092002200310190d0020002004200520072802" - "0c1100000d004100210103402001200646044041000f0b200141016a2101" - "200020082007280210110100450d000b200141016b2006490f0b20010bbd" - "0201067f230041106b22042400410a2103024020004190ce004904402000" - "21050c010b0340200441066a20036a220641046b20004190ce006e220541" - "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" - "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" - "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" - "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" - "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" - "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" - "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" - "2203200441066a6a20004130723a00000b2002200141014100200441066a" - "20036a410a20036b1009200441106a24000b1701017f2000280200220104" - "4020002802042001100c0b0bce0601047f0240200041046b280200220422" - "02417871220341044108200241037122021b20016a4f0440200241002003" - "200141276a4b1b0d01200041086b22012004220341787122006a21020240" - "024020034101710d002003410271450d012001280200220320006a210020" - "0120036b22014190a0c00028020046044020022802044103714103470d01" - "4188a0c000200036020020022002280204417e7136020420012000410172" - "360204200220003602000c020b2001200310330b02400240024002400240" - "2002280204220341027145044020024194a0c000280200460d0220024190" - "a0c000280200460d0320022003417871220210332001200020026a220041" - "0172360204200020016a200036020020014190a0c000280200470d014188" - "a0c00020003602000c060b20022003417e71360204200120004101723602" - "04200020016a20003602000b2000418002490d0220012000103241002101" - "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" - "280200220004400340200141016a2101200028020822000d000b0b41a8a0" - "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" - "418ca0c000418ca0c00028020020006a2200360200200120004101723602" - "044190a0c00028020020014604404188a0c00041003602004190a0c00041" - "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" - "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" - "402002200128020022054f04402002200520012802046a490d040b200128" - "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" - "020020006a220036020020012000410172360204200020016a2000360200" - "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" - "012000410376742200714504404180a0c000200020037236020020020c01" - "0b20022802080b2100200220013602082000200136020c2001200236020c" - "200120003602080c010b41f09dc000280200220104400340200041016a21" - "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" - "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" - "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" - "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" - "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" - "087f230041406a2202240020002802082105200028020421034101210620" - "0128021c41cc81c0004101200128022028020c1100002100200504400340" - "20072108410121072000410171210441012100024020040d00024020012d" - "00144104714504402008410171450d01200128021c418383c00041022001" - "28022028020c110000450d010c020b20012802202104200128021c210920" - "08410171450440200941d59ac0004101200428020c1100000d020b200241" - "013a0017200241206a200141086a290200370300200241286a200141106a" - "290200370300200241306a200141186a2802003602002002200436020c20" - "022009360208200241e482c0003602382002200129020037031820022002" - "41176a3602102002200241086a3602342003200241186a10054504402002" - "280234418883c0004102200228023828020c11000021000c020b0c010b20" - "032001100521000b200341016a2103200541016b22050d000b0b20004504" - "40200128021c419083c0004101200128022028020c11000021060b200241" - "406b240020060bdb0101047f230041106b220224002002200036020c2300" - "41106b22002400200128021c41f899c000410d200128022028020c110000" - "2103200041003a000d200020033a000c20002001360208200041086a4185" - "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" - "722101024020054101712004410147720d00200328020022012d00144104" - "71450440200128021c418b83c0004102200128022028020c11000021010c" - "010b200128021c418a83c0004101200128022028020c11000021010b2000" - "41106a24002001410171200241106a24000b3300200128021c2000280200" - "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" - "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" - "c0002d00001a024002400240024002404107101222000440200041036a41" - "879bc000280000360000200041849bc000280000360000200341286a2000" - "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" - "200041036a41879bc000280000360000200041849bc00028000036000020" - "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" - "122200450d05200041076a41929bc0002800003600002000418b9bc00029" - "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" - "00001a200328024821012003280244210b410710122204450d0541002100" - "200441036a41b79bc000280000360000200441b49bc00028000036000020" - "0341d8006a41e100200b20012004410710021013200328025c2105024002" - "400240200328026022020e020700010b41012100200522012d0000412b6b" - "0e03060106010b20052d0000412b460440200241016b2100200541016a21" - "0120024112490d010c030b200521012002220041114f0d020b034020012d" - "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" - "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" - "186a2010103820012d000041306b220941094b0d02410221002003290320" - "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" - "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" - "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" - "8b06360000200341cc006a200041041001101320004104100c027f024020" - "03280254220541004e047f2003280250210c20054504404101210141000c" - "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" - "1014000b20050b21092001200c2005103721002005450d01200541076b22" - "014100200120054d1b2106200041036a417c7120006b2108410021010340" - "024002400240200020016a2d00002202c0220741004e0440200820016b41" - "03710d01200120064f0d020340200020016a220228020420022802007241" - "8081828478710d03200141086a22012006490d000b0c020b428080808080" - "20210e428080808010210f024002400240027e0240024002400240024002" - "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" - "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" - "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" - "220420054f0d06200020046a2c0000210402400240200241e00147044020" - "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" - "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" - "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" - "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" - "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" - "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" - "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" - "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" - "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" - "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" - "00210f0b2001ad200e200f8484210e200941808080807846044020002109" - "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" - "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" - "010b200120054f0d000340200020016a2c00004100480d01200520014101" - "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" - "0021050b410021000240024002400240024002400240200ea722020e0206" - "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" - "2b460440200241016b2100200541016a210120024112490d010c020b2005" - "21012002220041114f0d010b4200210e034020012d000041306b22024109" - "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" - "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" - "2d000041306b220441094b0d024102210020032903104200520d03200141" - "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" - "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" - "024002400240410b101222080440200841076a419d9bc000280000360000" - "200841969bc000290000370000200341d8006a2008410b10011013200328" - "025c2104024002400240200328026022020e020a00010b4101210720042d" - "00002201412b6b0e03090109010b20042d000021010b0240024002400240" - "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" - "20024109490d02200121020c080b200241016b2106200441016a21002002" - "4109490d044100210103402006450d0b20002d000041306b220241094b0d" - "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" - "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" - "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" - "0c0b4100210141012107034020002d000041306b220641094b0d06200041" - "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" - "010b410021010c040b4100210141012107034020002d000041306b220241" - "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" - "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" - "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" - "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" - "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" - "c0001015000b20032802582200044020042000100c0b2008410b100c4100" - "210020032802302202200328023c460440200328022c2104200328023821" - "0741002106024020022200450d00034020042d0000220220072d00002208" - "460440200441016a2104200741016a2107200041016b22000d010c020b0b" - "200220086b21060b20064521000b2009044020052009100c0b200328024c" - "22020440200c2002100c0b200328024022020440200b2002100c0b200328" - "02342202044020032802382002100c0b200328022822020440200328022c" - "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" - "0121000b200320003a0058200341d8006a419080c00041f880c000101500" - "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" - "15000b410141e899c0001014000bee2202087f017e024002400240024002" - "40024002400240200041f4014d04404180a0c00028020022024110200041" - "0b6a41f803712000410b491b220541037622007622014103710d01200541" - "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" - "00410b6a220141787121054184a0c0002802002208450d06411f21074100" - "20056b2103200041f4ffff074d04402005410620014108766722006b7641" - "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" - "45044041002100410021010c040b410021002005411920074101766b4100" - "2007411f471b742104410021010340024020022802044178712206200549" - "0d00200620056b220620034f0d0020022101200622030d00410021032001" - "21000c060b200228021422062000200620022004411d764104716a41106a" - "2802002202471b200020061b21002004410174210420020d000b0c030b02" - "402001417f7341017120006a2206410374220041f89dc0006a2203200041" - "809ec0006a280200220128020822044704402004200336020c2003200436" - "02080c010b4180a0c0002002417e200677713602000b2001200041037236" - "0204200020016a220020002802044101723602040c060b02404102200074" - "2203410020036b72200120007471682206410374220041f89dc0006a2203" - "200041809ec0006a280200220128020822044704402004200336020c2003" - "20043602080c010b4180a0c0002002417e200677713602000b2001200541" - "0372360204200120056a2206200020056b2204410172360204200020016a" - "20043602004188a0c00028020022020440200241787141f89dc0006a2100" - "4190a0c0002802002103027f4180a0c00028020022054101200241037674" - "2202714504404180a0c000200220057236020020000c010b20002802080b" - "2102200020033602082002200336020c2003200036020c20032002360208" - "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" - "41e89cc0006a280200220128020441787120056b21032001210202400340" - "02400240200128021022000d00200128021422000d002002280218210702" - "4002402002200228020c2200460440200241144110200228021422001b6a" - "28020022010d01410021000c020b20022802082201200036020c20002001" - "3602080c010b200241146a200241106a20001b2104034020042106200122" - "0041146a200041106a200028021422011b210420004114411020011b6a28" - "020022010d000b200641003602000b2007450d032002200228021c410274" - "41e89cc0006a220128020047044020074110411420072802102002461b6a" - "20003602002000450d040c020b2001200036020020000d014184a0c00041" - "84a0c000280200417e200228021c77713602000c030b2000280204417871" - "20056b22012003200120034922011b21032000200220011b210220002101" - "0c010b0b2000200736021820022802102201044020002001360210200120" - "003602180b20022802142201450d0020002001360214200120003602180b" - "02400240200341104f044020022005410372360204200220056a22062003" - "410172360204200320066a20033602004188a0c0002802002204450d0120" - "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" - "0200220541012004410376742204714504404180a0c00020042005723602" - "0020000c010b20002802080b2104200020013602082004200136020c2001" - "200036020c200120043602080c010b2002200320056a2200410372360204" - "200020026a220020002802044101723602040c010b4190a0c00020063602" - "004188a0c00020033602000b200241086a0f0b2000200172450440410021" - "0141022007742200410020006b722008712200450d0320006841027441e8" - "9cc0006a28020021000b2000450d010b0340200020012000280204417871" - "220420056b220620034922071b2108200028021022024504402000280214" - "21020b20012008200420054922001b210120032006200320071b20001b21" - "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" - "0020056b4f710d0020012802182107024002402001200128020c22004604" - "40200141144110200128021422001b6a28020022020d01410021000c020b" - "20012802082202200036020c200020023602080c010b200141146a200141" - "106a20001b21040340200421062002220041146a200041106a2000280214" - "22021b210420004114411020021b6a28020022020d000b20064100360200" - "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" - "0047044020074110411420072802102001461b6a20003602002000450d02" - "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" - "0128021c77713602000c010b200020073602182001280210220204402000" - "2002360210200220003602180b20012802142202450d0020002002360214" - "200220003602180b0240200341104f044020012005410372360204200120" - "056a22022003410172360204200220036a200336020020034180024f0440" - "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" - "280200220441012003410376742203714504404180a0c000200320047236" - "020020000c010b20002802080b2103200020023602082003200236020c20" - "02200036020c200220033602080c010b2001200320056a22004103723602" - "04200020016a220020002802044101723602040b0c010b02400240024002" - "400240024020054188a0c00028020022014b04402005418ca0c000280200" - "22004f044041002100200541af80046a220141107640002202417f462203" - "0d0720024110742202450d074198a0c000410020014180807c7120031b22" - "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" - "200020002001491b360200024002404194a0c0002802002203044041e89d" - "c0002100034020002802002201200028020422066a2002460d0220002802" - "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" - "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" - "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" - "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" - "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" - "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" - "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" - "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" - "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" - "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" - "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" - "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" - "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" - "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" - "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" - "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" - "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" - "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" - "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" - "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" - "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" - "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" - "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" - "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" - "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" - "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" - "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" - "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" - "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" - "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" - "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" - "0441286b220036020020022000410172360204200020026a412836020441" - "a0a0c00041808080013602000c080b200220034d200120034b720d002000" - "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" - "360200200220046a210141e89dc000210002400240034020012000280200" - "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" - "c0002100034002402003200028020022014f04402003200120002802046a" - "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" - "c000200441286b220036020020022000410172360204200020026a412836" - "020441a0a0c00041808080013602002003200641206b41787141086b2200" - "2000200341106a491b2201411b36020441e89dc000290200210920014110" - "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" - "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" - "02002001411c6a2100034020004107360200200041046a22002006490d00" - "0b20012003460d0720012001280204417e713602042003200120036b2200" - "4101723602042001200036020020004180024f04402003200010320c080b" - "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" - "410376742200714504404180a0c000200020027236020020010c010b2001" - "2802080b2100200120033602082000200336020c2003200136020c200320" - "003602080c070b200020023602002000200028020420046a360204200220" - "054103723602042006410f6a41787141086b2201200220056a22046b2103" - "20014194a0c000280200460d0320014190a0c000280200460d0420012802" - "04220541037141014604402001200541787122001033200020016a220128" - "02042105200020036a21030b20012005417e713602042004200341017236" - "0204200320046a200336020020034180024f04402004200310320c060b20" - "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" - "0376742203714504404180a0c000200120037236020020000c010b200028" - "02080b2103200020043602082003200436020c2004200036020c20042003" - "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" - "00280200220020056a220236020020022001410172360204200020054103" - "72360204200041086a21000c060b4190a0c0002802002100024020012005" - "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" - "2001410372360204200020016a220120012802044101723602040c010b41" - "88a0c00020023602004190a0c000200020056a2203360200200320024101" - "72360204200020016a2002360200200020054103723602040b200041086a" - "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" - "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" - "03200020016b6a41086a220136020020022001410172360204200020036a" - "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" - "00418ca0c000418ca0c00028020020036a22003602002004200041017236" - "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" - "6a220036020020042000410172360204200020046a20003602000b200241" - "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" - "20056b22013602004194a0c0004194a0c000280200220020056a22023602" - "002002200141017236020420002005410372360204200041086a0f0b2000" - "0f0b200141086a0b2701017f200020012800042202360208200020012800" - "003602042000200236020020014108100c0b3b002000450440230041206b" - "22002400200041003602182000410136020c2000419c81c0003602082000" - "4204370210200041086a20011017000b000b7e01017f230041406a220324" - "002003412b36020c200341d098c000360208200320013602142003200036" - "02102003410236021c200341d482c0003602182003420237022420032003" - "41106aad4280808080e000843703382003200341086aad4280808080f000" - "843703302003200341306a360220200341186a20021017000b4101017f23" - "0041206b2202240020024100360210200241013602042002420437020820" - "02412e36021c200220003602182002200241186a36020020022001101700" - "0bf40102027f017e230041106b22022400200241013b010c200220013602" - "0820022000360204230041106b22012400200241046a2200290200210420" - "01200036020c20012004370204230041106b22002400200141046a220128" - "0200220228020c2103024002400240024020022802040e020001020b2003" - "0d0141012102410021030c020b20030d0020022802002202280204210320" - "0228020021020c010b20004180808080783602002000200136020c200128" - "020822012d0008210220012d00091a2000410e20021026000b2000200336" - "020420002002360200200128020822012d0008210220012d00091a200041" - "0f20021026000b0d00200028020041012001100a0b380002402002418080" - "c400460d00200020022001280210110100450d0041010f0b200345044041" - "000f0b200020032004200128020c1100000b900a010a7f02400240024020" - "0028020022052000280208220372044002402003410171450d0020012002" - "6a21060240200028020c2209450440200121040c010b2001210403402004" - "22032006460d02027f200341016a20032c0000220441004e0d001a200341" - "026a20044160490d001a200341036a20044170490d001a200341046a0b22" - "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" - "20042c00001a20072002027f02402007450d00200220074d044020022007" - "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" - "031b21022003200120031b21010b2005450d032000280204210b20024110" - "4f044020022001200141036a417c7122076b22086a220a41037121094100" - "210541002103200120074704402008417c4d044041002106034020032001" - "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" - "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" - "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" - "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" - "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" - "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" - "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" - "09410371210a2009410274210741002104200641044f04402008200741f0" - "07716a210c200821030340200420032802002204417f7341077620044106" - "76724181828408716a20032802042204417f734107762004410676724181" - "828408716a20032802082204417f73410776200441067672418182840871" - "6a200328020c2204417f734107762004410676724181828408716a210420" - "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" - "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" - "200a450d000b2008200941fc01714102746a22042802002203417f734107" - "762003410676724181828408712103200a4101460d022003200428020422" - "03417f734107762003410676724181828408716a2103200a4102460d0220" - "0320042802082203417f734107762003410676724181828408716a21030c" - "020b2002450440410021050c030b20024103712104024020024104490440" - "41002105410021080c010b41002105200121032002410c71220821070340" - "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" - "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" - "200741046b22070d000b0b2004450d02200120086a21030340200520032c" - "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" - "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" - "056a21050b02402005200b490440200b20056b210602400240024020002d" - "00182203410020034103471b220341016b0e020001020b20062103410021" - "060c010b20064101762103200641016a41017621060b200341016a210320" - "00280210210820002802202104200028021c21000340200341016b220345" - "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" - "02200428020c110000044041010f0b410021030340200320064604404100" - "0f0b200341016a2103200020082004280210110100450d000b200341016b" - "2006490f0b200028021c20012002200028022028020c1100000b14002000" - "2802002001200028020428020c1101000b10002001200028020020002802" - "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" - "6b220324002003200136022c20032000360228200341033a002420034220" - "37021c200341003602142003410036020c027f0240024002402002280210" - "220a450440200228020c2200450d012002280208220120004103746a2104" - "200041016b41ffffffff017141016a210720022802002100034020004104" - "6a28020022050440200328022820002802002005200328022c28020c1100" - "000d040b20012802002003410c6a200141046a2802001101000d03200041" - "086a2100200141086a22012004470d000b0c010b20022802142200450d00" - "2000410574210b200041016b41ffffff3f7141016a210720022802082105" - "200228020021000340200041046a28020022010440200328022820002802" - "002001200328022c28020c1100000d030b20032008200a6a220141106a28" - "020036021c20032001411c6a2d00003a00242003200141186a2802003602" - "202001410c6a28020021044100210941002106024002400240200141086a" - "28020041016b0e020002010b200441037420056a220c2802000d01200c28" - "020421040b410121060b200320043602102003200636020c200141046a28" - "02002104024002400240200128020041016b0e020002010b200441037420" - "056a22062802000d01200628020421040b410121090b2003200436021820" - "0320093602142005200141146a2802004103746a22012802002003410c6a" - "200141046a2802001101000d02200041086a2100200b200841206a220847" - "0d000b0b200720022802044f0d012003280228200228020020074103746a" - "22002802002000280204200328022c28020c110000450d010b41010c010b" - "41000b200341306a24000b1900200128021c41a481c000410e2001280220" - "28020c1100000b820302047f017e230041406a2206240041012107024020" - "002d00040d0020002d00052108200028020022052d001441047145044020" - "0528021c418383c000418083c000200841017122081b4102410320081b20" - "0528022028020c1100000d01200528021c20012002200528022028020c11" - "00000d01200528021c41f391c0004102200528022028020c1100000d0120" - "032005200411010021070c010b2008410171450440200528021c418583c0" - "004103200528022028020c1100000d010b200641013a0017200641206a20" - "0541086a290200370300200641286a200541106a29020037030020064130" - "6a200541186a2802003602002006200529021c3702082005290200210920" - "0641e482c000360238200620093703182006200641176a36021020062006" - "41086a220536023420052001200210210d00200541f391c000410210210d" - "002003200641186a20041101000d002006280234418883c0004102200628" - "023828020c11000021070b200041013a0005200020073a0004200641406b" - "240020000bab04010c7f200141016b210e2000280204210a200028020021" - "0b2000280208210c0240034020050d01027f024020022003490d00034020" - "0120036a2105024002400240200220036b220741074d044020022003470d" - "01200221030c050b0240200541036a417c71220620056b22040440410021" - "000340200020056a2d0000410a460d052004200041016a2200470d000b20" - "04200741086b22004d0d010c030b200741086b21000b0340418082840820" - "062802002209418a94a8d000736b2009724180828408200641046a280200" - "2209418a94a8d000736b2009727141808182847871418081828478470d02" - "200641086a2106200441086a220420004d0d000b0c010b41002100034020" - "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" - "030b20042007460440200221030c030b200420056a2106200220046b2003" - "6b21074100210002400340200020066a2d0000410a460d01200720004101" - "6a2200470d000b200221030c030b200020046a21000b200020036a220441" - "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" - "200322040c030b200220034f0d000b0b20022008460d0241012105200821" - "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" - "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" - "200020086b2100200120086a2107200c20063a000020042108200b200720" - "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" - "042102200028020021030240200028020822002d0000450d00200341fc82" - "c0004104200228020c110000450d0041010f0b20002001410a463a000020" - "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" - "200028020022002000411f7522027320026b2000417f73411f762001100a" - "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" - "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" - "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" - "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" - "0041003a00002002450d00000b000b250020002802002d00004504402001" - "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" - "02082204452001280200220520046b20034f724504402001410036020820" - "0141003a000c410021040b20032005490440200128020420046a20022003" - "10371a200041043a00002001200320046a3602080f0b2000420437020020" - "0141003a000c0bac0301017f230041406a22022400024002400240024002" - "40024020002d000041016b0e03010203000b2002200028020436020441b1" - "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" - "0000200041086a41a495c0002900003700002000419c95c0002900003700" - "00200241143602102002200036020c200241143602082002410336022c20" - "02419c91c000360228200242023702342002200241046aad4280808080b0" - "01843703202002200241086aad4280808080c00184370318200220024118" - "6a360230200128021c2001280220200241286a101e210020022802082201" - "450d03200228020c2001100c0c030b20002d000121002002410136022c20" - "0241c88ac000360228200242013702342002200241186aad4280808080f0" - "008437030820022000410274220041f095c0006a28020036021c20022000" - "419897c0006a2802003602182002200241086a360230200128021c200128" - "0220200241286a101e21000c020b20012000280204220028020020002802" - "04101a21000c010b20002802042200280200200120002802042802101101" - "0021000b200241406b240020000f0b000b10002001200028020420002802" - "08101a0b5501037f2000280204210120002d0000220041044d2000410347" - "7145044020012802002100200141046a2802002202280200220304402000" - "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" - "c709010a7f230041206b2208240002400240024002402001280210450440" - "2001417f36021020032003200241036a417c7120026b220a6b4107714100" - "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" - "016b200220036a220541016b22062d0000410a460d001a2006200220096a" - "2207460d01200441026b200541026b22062d0000410a460d001a20062007" - "460d01200441036b200541036b22062d0000410a460d001a20062007460d" - "01200441046b200541046b22062d0000410a460d001a20062007460d0120" - "0441056b200541056b22062d0000410a460d001a20062007460d01200441" - "066b200541066b22062d0000410a460d001a20062007460d01200441076b" - "200541076b22052d0000410a460d001a20052007460d0120044178720b20" - "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" - "0241046b210d2004417f7320026a21060340024020062105200a21042009" - "2207200c4d0d00200441086b210a200541086b2106418082840820022007" - "41086b22096a280200220b418a94a8d000736b200b724180828408200720" - "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" - "8478460d010b0b20032007490d0202400340200320046a450d0120044101" - "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" - "016a21040c040b02402001411c6a2802002204450440410021040c010b20" - "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" - "00202001411c6a41003602000b2003200128021420046b4f044020002001" - "41146a2002200310280c050b200128021820046a2002200310371a200041" - "043a00002001411c6a200320046a3602000c040b230041306b2200240020" - "00410136020c200041c481c0003602082000420137021420002000412f6a" - "ad4280808080a001843703202000200041206a360210200041086a41d091" - "c0001017000b230041306b22002400200020033602042000200936020020" - "00410236020c200041d887c000360208200042023702142000200041046a" - "ad428080808080018437032820002000ad42808080808001843703202000" - "200041206a360210200041086a418485c0001017000b230041306b220024" - "0020002003360204200020073602002000410236020c200041f887c00036" - "0208200042023702142000200041046aad42808080808001843703282000" - "2000ad42808080808001843703202000200041206a360210200041086a41" - "9485c0001017000b20032004490440200841003602182008410136020c20" - "0841888bc00036020820084204370210200841086a41908bc0001017000b" - "02402001411c6a2802002205450d0002400240200128021420056b20044d" - "0440200841086a200141146a20022004102820082d00084104470d012001" - "411c6a28020021050c020b200141186a28020020056a2002200410371a20" - "01411c6a200420056a22053602000c010b200020082903083702000c020b" - "2005450d00200141003a00202001411c6a41003602000b200220046a2105" - "200320046b220220012802144f04402000200141146a2005200210280c01" - "0b200141186a2802002005200210371a200041043a00002001411c6a2002" - "3602000b2001200128021041016a360210200841206a24000b9a0102047f" - "017e230041106b22032400200341086a200028020828020020012002102c" - "20032d000822054104470440200028020421012003290308210720002d00" - "00220241044d20024103477145044020012802002102200141046a280200" - "220428020022060440200220061103000b20042802042204044020022004" - "100c0b2001410c100c0b200020073702000b200341106a24002005410447" - "0be10202057f017e230041106b2202240020024100360204027f20014180" - "014f044020014180104f04402001418080044f044020022001413f714180" - "01723a00072002200141127641f001723a000420022001410676413f7141" - "8001723a000620022001410c76413f71418001723a000541040c030b2002" - "2001413f71418001723a000620022001410c7641e001723a000420022001" - "410676413f71418001723a000541030c020b20022001413f71418001723a" - "00052002200141067641c001723a000441020c010b200220013a00044101" - "0b2101200241086a2000280208280200200241046a2001102c20022d0008" - "22054104470440200028020421012002290308210720002d000022034104" - "4d20034103477145044020012802002103200141046a2802002204280200" - "22060440200320061103000b20042802042204044020032004100c0b2001" - "410c100c0b200020073702000b200241106a240020054104470b0d002000" - "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" - "36020c2001419892c00036020841c89cc0002d0000410347044002402300" - "41206b22022400024002400240024041c89cc0002d000041026b0e020301" - "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" - "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" - "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" - "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" - "41206a24000c020b000b200241003602182002410136020c200241e895c0" - "0036020820024204370210200241086a41b094c0001017000b0b02400240" - "024041d89cc000290300220650044041e09cc00029030021050340200542" - "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" - "5122021b370300200721052002450d000b41d89cc00020063703000b0240" - "024041a09cc000290300200652044041ac9cc0002d000021034101210241" - "ac9cc00041013a0000200120033a00182003450d01200142003702342001" - "4281808080c00037022c200141c893c000360228230041106b2202240020" - "02418888c00036020c2002200141186a360208230041f0006b2200240020" - "00418c88c00036020c2000200241086a3602082000418c88c00036021420" - "002002410c6a3602102000410236021c200041cd81c00036021802402001" - "41286a22012802004504402000410336025c2000418082c0003602582000" - "42033702642000200041106aad4280808080e00084370348200020004108" - "6aad4280808080e000843703400c010b200041306a200141106a29020037" - "0300200041286a200141086a290200370300200020012902003703202000" - "410436025c200041b482c000360258200042043702642000200041106aad" - "4280808080e000843703502000200041086aad4280808080e00084370348" - "2000200041206aad42808080809001843703400b2000200041186aad4280" - "808080f000843703382000200041386a360260200041d8006a41fc93c000" - "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" - "0041306b220024002000412636020c200041c094c0003602082000410136" - "0214200041c88ac0003602102000420137021c2000200041086aad428080" - "8080f000843703282000200041286a360218200041106a418c95c0001017" - "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" - "36021041042102200141043a00182001200141106a360220200141186a41" - "9c88c0002000101e210320012d0018210002402003450440420021054117" - "2000764101710d01200128021c22002802002102200041046a2802002203" - "28020022040440200220041103000b20032802042203044020022003100c" - "0b2000410c100c410421020c010b20004104460d02200129031822074280" - "7e8321052007a721020b20012802102200200028020841016b2203360208" - "2003450440200041003a000c200042003703000b200241ff01714104470d" - "02200141406b24000f0b230041206b220024002000410036021820004101" - "36020c200041b08ac00036020820004204370210200041086a41b88ac000" - "1017000b200141003602382001410136022c2001419093c0003602282001" - "4204370230200141286a419893c0001017000b200120052002ad42ff0183" - "843703102001410236022c200141f891c000360228200142023702342001" - "200141106aad4280808080d001843703202001200141086aad4280808080" - "f000843703182001200141186a360230200141286a418892c0001017000b" - "0c00200020012902003703000bba0201047f411f21022000420037021020" - "0141ffffff074d04402001410620014108766722036b7641017120034101" - "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" - "20027422034184a0c0002802007145044020042000360200200020043602" - "182000200036020c200020003602084184a0c0004184a0c0002802002003" - "723602000f0b024002402001200428020022032802044178714604402003" - "21020c010b2001411920024101766b41002002411f471b74210503402003" - "2005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c" - "20022000360208200041003602182000200236020c200020013602080f0b" - "20042000360200200020033602182000200036020c200020003602080bf1" - "0201047f200028020c21020240024020014180024f044020002802182103" - "0240024020002002460440200041144110200028021422021b6a28020022" - "010d01410021020c020b20002802082201200236020c200220013602080c" - "010b200041146a200041106a20021b21040340200421052001220241146a" - "200241106a200228021422011b210420024114411020011b6a2802002201" - "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" - "006a220128020047044020034110411420032802102000461b6a20023602" - "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" - "280200417e200028021c77713602000c020b200028020822002002470440" - "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" - "7e200141037677713602000f0b2002200336021820002802102201044020" - "022001360210200120023602180b20002802142200450d00200220003602" - "14200020023602180b0b8f0101027f230041306b22012400024020004100" - "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" - "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" - "14200141d89ac0003602102001420137021c2001411036022c2001200141" - "286a36021820012001410c6a360228200141106a1030200128020c200141" - "306a24000bcf0101067f23004180016b2204240020012802042107200128" - "020021062000280200210020012802142205210202402005410471450d00" - "2005410872210220060d0020014281808080a0013702000b200120024104" - "7236021441810121020340200220046a41026b2000410f71220341307220" - "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" - "762100450d000b20014101419183c0004102200220046a41016b41810120" - "026b10092001200536021420012007360204200120063602002004418001" - "6a24000b6301017f230041306b220224002002200036020c200241023602" - "14200241f49ac0003602102002420137021c2002411036022c2002200241" - "286a36021820022002410c6a360228200241106a10302001044020022802" - "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" - "21030c010b02402000410020006b41037122066a220520004d0d00200021" - "032001210420060440200621070340200320042d00003a0000200441016a" - "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" - "0340200320042d00003a0000200341016a200441016a2d00003a00002003" - "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" - "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" - "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" - "003a0000200441086a2104200341086a22032005470d000b0b2005200220" - "066b2207417c7122086a21030240200120066a2204410371450440200320" - "054d0d0120042101034020052001280200360200200141046a2101200541" - "046a22052003490d000b0c010b200320054d0d0020044103742202411871" - "21062004417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220067620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20074103712102200420086a21010b" - "02402003200220036a22064f0d002002410771220404400340200320012d" - "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" - "200241016b4107490d000340200320012d00003a0000200341016a200141" - "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" - "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" - "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" - "41076a200141076a2d00003a0000200141086a2101200341086a22032006" - "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" - "420022022001422088420a7e7c22014220867c2204370300200020032004" - "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" - "c0000ba40611000000140000000400000012000000000000000100000001" - "00000013000000557466384572726f7276616c69645f75705f746f657272" - "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" - "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" - "003d0000005c0010000a0000001600000037000000636170616369747920" - "6f766572666c6f770000008800100011000000426f72726f774d75744572" - "726f72616c726561647920626f72726f7765643a20b2001000120000005b" - "3d3d617373657274696f6e20606c6566742020726967687460206661696c" - "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" - "00100017000000f60010000900000020726967687460206661696c65643a" - "200a20206c6566743a20000000cf00100010000000180110001000000028" - "01100009000000f6001000090000000100000000000000f3081000020000" - "00000000000c000000040000001400000015000000160000002020202020" - "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230" - "323132323233323432353236323732383239333033313332333333343335" - "333633373338333934303431343234333434343534363437343834393530" - "353135323533353435353536353735383539363036313632363336343635" - "363636373638363937303731373237333734373537363737373837393830" - "383138323833383438353836383738383839393039313932393339343935" - "393639373938393966616c7365747275656c6962726172792f636f72652f" - "7372632f736c6963652f6d656d6368722e72736402100020000000850000" - "001e0000006402100020000000a100000009000000010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010100" - "41e686c0000b330202020202020202020202020202020202020202020202" - "020202020202020303030303030303030303030303030304040404040041" - "a487c0000b6172616e676520737461727420696e64657820206f7574206f" - "662072616e676520666f7220736c696365206f66206c656e67746820a403" - "100012000000b60310002200000072616e676520656e6420696e64657820" - "e803100010000000b60310002200419088c0000b8f140400000004000000" - "17000000180000000c00000004000000190000001a0000001b0000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" - "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" - "61746520756e69717565207468726561642049443a206269747370616365" - "20657868617573746564f904100037000000dc0410001d000000ae040000" - "0d00000001000000000000006c6962726172792f7374642f7372632f696f" - "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e00007d05100009000000500510002d000000160100002900" - "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" - "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" - "696f6e207265736574686f737420756e726561636861626c656e6574776f" - "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" - "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" - "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c7265616479206578" - "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" - "206469726563746f727969732061206469726563746f7279646972656374" - "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c657379737465" - "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" - "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" - "2066696c652068616e646c65696e76616c696420696e7075742070617261" - "6d65746572696e76616c6964206461746174696d6564206f757477726974" - "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" - "756e7365656b61626c652066696c6571756f746120657863656564656466" - "696c6520746f6f206c617267657265736f75726365206275737965786563" - "757461626c652066696c652062757379646561646c6f636b63726f73732d" - "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" - "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" - "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" - "70746564756e737570706f72746564756e657870656374656420656e6420" - "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" - "736f74686572206572726f72756e63617465676f72697a6564206572726f" - "7220286f73206572726f72202900000001000000000000008d0810000b00" - "000098081000010000006c6962726172792f7374642f7372632f696f2f73" - "7464696f2e727300b40810001b00000032030000140000006661696c6564" - "207072696e74696e6720746f203a20000000e008100013000000f3081000" - "02000000b40810001b00000063040000090000007374646f75746c696272" - "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" - "696e6720747261697420696d706c656d656e746174696f6e207265747572" - "6e656420616e206572726f72207768656e2074686520756e6465726c7969" - "6e672073747265616d20646964206e6f7400000037091000560000001e09" - "100019000000680700001500000063616e6e6f7420726563757273697665" - "6c792061637175697265206d75746578a8091000200000006c6962726172" - "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" - "72656164732e7273d00910002c00000013000000090000006c6962726172" - "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" - "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" - "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" - "7273660a100026000000220100002d0000006f7065726174696f6e207375" - "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" - "6e206d6179206e6f7420626520706572666f726d65642072656375727369" - "76656c79b00a100038000000100000001100000012000000100000001000" - "000013000000120000000d0000000e000000150000000c0000000b000000" - "15000000150000000f0000000e0000001300000026000000380000001900" - "0000170000000c000000090000000a00000010000000170000000e000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600" - "0000150000000b000000160000000d0000000b0000000b00000013000000" - "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" - "1000250610003306100048061000540610005f0610007406100089061000" - "98061000a6061000b9061000df0610001707100030071000470710005307" - "10005c07100066071000760710008d0710009b071000a9071000b6071000" - "ca071000d2071000ed071000fb0710000b08100021081000360810004108" - "100057081000640810006f0810007a081000000000000100000001000000" - "1300000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" - "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" - "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" - "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" - "6963652e72737b0c10006d000000a1000000190000005061727365496e74" - "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" - "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" - "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" - "100009000000550d1000010000006465616c6c6f636174652000680d1000" - "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" - "46696e6973684166746572000000090d1000320000008000000016000000" - "42616c616e636500090d1000320000009b00000016000000456d70747949" - "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" - "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" - "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" - "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" - "6e63652d74797065732b0a6d756c746976616c7565"; +extern std::string const allHostFunctionsHex; -static auto const deepRecursionHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; +extern std::string const deepRecursionHex; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index f2f70ee558d..b87c23a4a85 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED -#define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED + +#pragma once #include #include @@ -90,4 +90,3 @@ class WasmHostFunctionsImpl : public HostFunctions }; } // namespace ripple -#endif // RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED From ce31acf0306444d8a1842200be2f47415928db90 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 28 May 2025 13:48:38 -0400 Subject: [PATCH 16/73] debug comments --- src/xrpld/app/misc/WasmVM.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 8e77bc027b9..6185826826d 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -58,19 +58,19 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); - // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() - // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + << ", gasLimit: " << gasLimit << ", funcName: " << funcName; if (!ret.has_value()) { - // std::cout << ", error: " << ret.error() << std::endl; + std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); - // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent - // << std::endl; + std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From fb1311e013a049fa22d538a74201a99f683de49c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 28 May 2025 14:00:50 -0400 Subject: [PATCH 17/73] uncomment???? --- src/xrpld/app/misc/WasmVM.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 6185826826d..8e77bc027b9 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -58,19 +58,19 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); - std::cout << "runEscrowWasm, mod size: " << wasmCode.size() - << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; if (!ret.has_value()) { - std::cout << ", error: " << ret.error() << std::endl; + // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); - std::cout << ", ret: " << ret.value() << ", gas spent: " << spent - << std::endl; + // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From 1f8aece8cd19b3fb271a5534f1db0fd71c1e31fd Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 29 May 2025 16:36:55 -0400 Subject: [PATCH 18/73] feat: add a `GasUsed` parameter to the metadata (#5456) --- include/xrpl/protocol/TxMeta.h | 34 ++++++--- include/xrpl/protocol/detail/sfields.macro | 1 + src/libxrpl/protocol/TxMeta.cpp | 15 ++-- src/test/app/Escrow_test.cpp | 76 +++++++++++++-------- src/xrpld/app/tx/detail/ApplyContext.h | 7 ++ src/xrpld/app/tx/detail/Escrow.cpp | 2 + src/xrpld/ledger/ApplyViewImpl.h | 7 ++ src/xrpld/ledger/detail/ApplyStateTable.cpp | 8 ++- src/xrpld/ledger/detail/ApplyStateTable.h | 1 + src/xrpld/ledger/detail/ApplyViewImpl.cpp | 3 +- 10 files changed, 109 insertions(+), 45 deletions(-) diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 02fde2ffe53..eb594fcc57f 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -46,10 +46,7 @@ class TxMeta CtorHelper); public: - TxMeta( - uint256 const& transactionID, - std::uint32_t ledger, - std::optional parentBatchId = std::nullopt); + TxMeta(uint256 const& transactionID, std::uint32_t ledger); TxMeta(uint256 const& txID, std::uint32_t ledger, Blob const&); TxMeta(uint256 const& txID, std::uint32_t ledger, std::string const&); TxMeta(uint256 const& txID, std::uint32_t ledger, STObject const&); @@ -136,7 +133,7 @@ class TxMeta void setParentBatchId(uint256 const& parentBatchId) { - mParentBatchId = parentBatchId; + parentBatchId_ = parentBatchId; } uint256 @@ -145,13 +142,33 @@ class TxMeta XRPL_ASSERT( hasParentBatchId(), "ripple::TxMeta::getParentBatchId : non-null batch id"); - return *mParentBatchId; + return *parentBatchId_; } bool hasParentBatchId() const { - return static_cast(mParentBatchId); + return static_cast(parentBatchId_); + } + + void + setGasUsed(std::uint32_t const& gasUsed) + { + gasUsed_ = gasUsed; + } + + std::uint32_t + getGasUsed() const + { + XRPL_ASSERT( + hasGasUsed(), "ripple::TxMeta::getGasUsed : non-null batch id"); + return *gasUsed_; + } + + bool + hasGasUsed() const + { + return static_cast(gasUsed_); } private: @@ -161,7 +178,8 @@ class TxMeta int mResult; std::optional mDelivered; - std::optional mParentBatchId; + std::optional gasUsed_; + std::optional parentBatchId_; STArray mNodes; }; diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index faeff4ebb22..155d0e8663d 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -118,6 +118,7 @@ TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 53) TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 54) TYPED_SFIELD(sfGasPrice, UINT32, 55) TYPED_SFIELD(sfComputationAllowance, UINT32, 56) +TYPED_SFIELD(sfGasUsed, UINT32, 57) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index 2083fc8eaf3..fb703d9435e 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -56,9 +56,10 @@ TxMeta::TxMeta( if (obj.isFieldPresent(sfDeliveredAmount)) setDeliveredAmount(obj.getFieldAmount(sfDeliveredAmount)); - if (obj.isFieldPresent(sfParentBatchID)) setParentBatchId(obj.getFieldH256(sfParentBatchID)); + if (obj.isFieldPresent(sfGasUsed)) + setGasUsed(obj.getFieldU32(sfGasUsed)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) @@ -82,6 +83,9 @@ TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) if (obj.isFieldPresent(sfParentBatchID)) setParentBatchId(obj.getFieldH256(sfParentBatchID)); + + if (obj.isFieldPresent(sfGasUsed)) + setGasUsed(obj.getFieldU32(sfGasUsed)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, Blob const& vec) @@ -97,15 +101,11 @@ TxMeta::TxMeta( { } -TxMeta::TxMeta( - uint256 const& transactionID, - std::uint32_t ledger, - std::optional parentBatchId) +TxMeta::TxMeta(uint256 const& transactionID, std::uint32_t ledger) : mTransactionID(transactionID) , mLedger(ledger) , mIndex(static_cast(-1)) , mResult(255) - , mParentBatchId(parentBatchId) , mNodes(sfAffectedNodes) { mNodes.reserve(32); @@ -241,9 +241,10 @@ TxMeta::getAsObject() const metaData.emplace_back(mNodes); if (hasDeliveredAmount()) metaData.setFieldAmount(sfDeliveredAmount, getDeliveredAmount()); - if (hasParentBatchId()) metaData.setFieldH256(sfParentBatchID, getParentBatchId()); + if (hasGasUsed()) + metaData.setFieldU32(sfGasUsed, getGasUsed()); return metaData; } diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index c326f8c996e..df505b317b1 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1863,7 +1863,7 @@ struct Escrow_test : public beast::unit_test::suite XRPAmount const txnFees = env.current()->fees().base + 1000; env(finish(carol, alice, 1), fee(txnFees), - comp_allowance(110), + comp_allowance(4), ter(temDISABLED)); env.close(); } @@ -1914,12 +1914,12 @@ struct Escrow_test : public beast::unit_test::suite { // not enough fees - // This function takes 110 gas + // This function takes 4 gas // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 109; + auto const finishFee = env.current()->fees().base + 3; env(finish(carol, alice, seq), fee(finishFee), - comp_allowance(110), + comp_allowance(4), ter(telINSUF_FEE_P)); } @@ -1968,6 +1968,7 @@ struct Escrow_test : public beast::unit_test::suite // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = ledgerSqnHex; + std::uint32_t constexpr allowance = 4; { // basic FinishFunction situation @@ -1990,31 +1991,34 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(carol, XRP(5000))); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); env(finish(alice, alice, seq), fee(txnFees), - comp_allowance(110), + comp_allowance(allowance), ter(tesSUCCESS)); - env.close(); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2046,38 +2050,42 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(finish(carol, alice, seq), condition(cb1), fulfillment(fb1), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // no fulfillment provided, function succeeds env(finish(alice, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb2), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb1), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tesSUCCESS)); - env.close(); + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + + env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } @@ -2106,21 +2114,26 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(4), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(4), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(4), fee(txnFees + 1), ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } @@ -2148,24 +2161,28 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // finish time has passed, function succeeds, tx succeeds env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tesSUCCESS)); - env.close(); + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + + env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } @@ -2179,7 +2196,6 @@ struct Escrow_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; - // TODO: figure out how to make this a fixture in a separate file static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); @@ -2218,7 +2234,8 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); - auto const allowance = 40'000; + // TODO: figure out why this can't be 2412 + auto const allowance = 3'600; // FinishAfter time hasn't passed env(finish(carol, alice, seq), @@ -2232,6 +2249,7 @@ struct Escrow_test : public beast::unit_test::suite comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + env.close(); // destination balance is too high env(finish(carol, alice, seq), @@ -2256,8 +2274,12 @@ struct Escrow_test : public beast::unit_test::suite comp_allowance(allowance), fee(txnFees), ter(tesSUCCESS)); - env.close(); + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 2412); + + env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 720d0aeea3c..a3bdf9a85a7 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -106,6 +106,13 @@ class ApplyContext view_->deliver(amount); } + /** Sets the gas used in the metadata */ + void + setGasUsed(std::uint32_t const& gasUsed) + { + view_->setGasUsed(gasUsed); + } + /** Discard changes and start fresh. */ void discard(); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 375a77022cf..42e67621e77 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -634,6 +634,8 @@ EscrowFinish::doApply() if (re.has_value()) { auto reValue = re.value().result; + // TODO: better error handling for this conversion + ctx_.setGasUsed(static_cast(re.value().cost)); JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << re.value().cost; if (!reValue) diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index d170cf71ffd..f7e90b9d54c 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -75,6 +75,12 @@ class ApplyViewImpl final : public detail::ApplyViewBase deliver_ = amount; } + void + setGasUsed(std::uint32_t const& gasUsed) + { + gasUsed_ = gasUsed; + } + /** Get the number of modified entries */ std::size_t @@ -93,6 +99,7 @@ class ApplyViewImpl final : public detail::ApplyViewBase private: std::optional deliver_; + std::optional gasUsed_; }; } // namespace ripple diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 2a740093d9e..039088205bd 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -117,6 +117,7 @@ ApplyStateTable::apply( TER ter, std::optional const& deliver, std::optional const& parentBatchId, + std::optional const& gasUsed, bool isDryRun, beast::Journal j) { @@ -127,11 +128,14 @@ ApplyStateTable::apply( std::optional metadata; if (!to.open() || isDryRun) { - TxMeta meta(tx.getTransactionID(), to.seq(), parentBatchId); + TxMeta meta(tx.getTransactionID(), to.seq()); if (deliver) meta.setDeliveredAmount(*deliver); - + if (parentBatchId) + meta.setParentBatchId(*parentBatchId); + if (gasUsed) + meta.setGasUsed(*gasUsed); Mods newMod; for (auto& item : items_) { diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index 5a2e0bcf545..896705042fd 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -73,6 +73,7 @@ class ApplyStateTable TER ter, std::optional const& deliver, std::optional const& parentBatchId, + std::optional const& gasUsed, bool isDryRun, beast::Journal j); diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index 3fd9478b542..a90fc3fcbbc 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -35,7 +35,8 @@ ApplyViewImpl::apply( bool isDryRun, beast::Journal j) { - return items_.apply(to, tx, ter, deliver_, parentBatchId, isDryRun, j); + return items_.apply( + to, tx, ter, deliver_, parentBatchId, gasUsed_, isDryRun, j); } std::size_t From 6a6fed5dcef436a05a2d5998e371328bff45fde2 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 30 May 2025 19:01:27 -0400 Subject: [PATCH 19/73] More hostfunctions (#5451) * Bug fixes: - Fix bugs found during schedule table tests - Add more tests - Add parameters passing for runEscrowWasm function * Add new host-functions fix wamr logging add runtime passing through HF fix runEscrowWasm interface * Improve logs * Fix logging bug * Set 4k limit for update_data HF * allHF wasm module fixes --- include/xrpl/protocol/Protocol.h | 4 + src/test/app/Escrow_test.cpp | 5 +- src/test/app/Wasm_test.cpp | 698 +- src/test/app/wasm_fixtures/fixtures.cpp | 11744 +++++++++++++++++-- src/test/app/wasm_fixtures/fixtures.h | 26 + src/xrpld/app/misc/WamrVM.cpp | 452 +- src/xrpld/app/misc/WamrVM.h | 153 +- src/xrpld/app/misc/WasmHostFunc.h | 224 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 533 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 111 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 767 +- src/xrpld/app/misc/WasmHostFuncWrapper.h | 155 +- src/xrpld/app/misc/WasmParamsHelper.h | 269 + src/xrpld/app/misc/WasmVM.cpp | 147 +- src/xrpld/app/misc/WasmVM.h | 313 +- src/xrpld/app/tx/detail/Escrow.cpp | 3 +- 16 files changed, 13691 insertions(+), 1913 deletions(-) create mode 100644 src/xrpld/app/misc/WasmHostFunc.h create mode 100644 src/xrpld/app/misc/WasmParamsHelper.h diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 898fd06fbd2..ab95017db12 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -126,6 +126,10 @@ std::uint8_t constexpr vaultStrategyFirstComeFirstServe = 1; * another vault; counted from 0 */ std::uint8_t constexpr maxAssetCheckDepth = 5; +/** The maximum length of a Data field in Escrow object that can be updated by + * Wasm code */ +std::size_t constexpr maxWasmDataLength = 4 * 1024; + /** A ledger index. */ using LedgerIndex = std::uint32_t; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index df505b317b1..52abf61fc6c 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2196,6 +2196,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; + // TODO: create wasm module for all host functions static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); @@ -2277,7 +2278,7 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 2412); + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 487); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2303,6 +2304,8 @@ struct Escrow_test : public beast::unit_test::suite testCreateFinishFunctionPreflight(); testFinishWasmFailures(); testFinishFunction(); + + // TODO: Update module with new host functions testAllHostFunctions(); } }; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 16e7f67d991..3156a98a864 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -20,18 +20,20 @@ #include #include +#include #include #include -#include +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif namespace ripple { namespace test { -/* Host function body definition. */ using Add_proto = int32_t(int32_t, int32_t); -wasm_trap_t* +static wasm_trap_t* Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { int32_t Val1 = params->data[0].of.i32; @@ -41,15 +43,497 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } +struct TestLedgerDataProvider +{ + jtx::Env* env; + +public: + TestLedgerDataProvider(jtx::Env* env_) : env(env_) + { + } + + int32_t + get_ledger_sqn() + { + return (int32_t)env->current()->seq(); + } +}; + +using getLedgerSqn_proto = std::int32_t(); +static wasm_trap_t* +getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) +{ + auto sqn = reinterpret_cast(env)->get_ledger_sqn(); + + results->data[0] = WASM_I32_VAL(sqn); + results->num_elems = 1; + + return nullptr; +} + +struct TestHostFunctionsOld : public HostFunctions +{ + test::jtx::Env* env_; + Bytes accountID_; + Bytes data_; + int clock_drift_ = 0; + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsOld(test::jtx::Env* env, int cd = 0) + : env_(env) + , clock_drift_(cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + accountID_ = Bytes{s.begin(), s.end()}; + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } + + int32_t + getLedgerSqn() override + { + return (int32_t)env_->current()->seq(); + } + + int32_t + getParentLedgerTime() override + { + return env_->current()->parentCloseTime().time_since_epoch().count() + + clock_drift_; + } + + Expected + getTxField(SField const& fname) override + { + return accountID_; + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + return data_; + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + if (fname.getName() == "Destination" || fname.getName() == "Account") + return accountID_; + else if (fname.getName() == "Data") + return data_; + else if (fname.getName() == "FinishAfter") + { + auto t = + env_->current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(-1); + } +}; + +struct TestHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + AccountID accountID_; + Bytes data_; + int clock_drift_ = 0; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctions(test::jtx::Env& env, int cd = 0) + : env_(env), clock_drift_(cd) + { + auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); + if (opt) + accountID_ = *opt; + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + int32_t + getLedgerSqn() override + { + return static_cast(env_.current()->seq()); + } + + int32_t + getParentLedgerTime() override + { + return env_.current()->parentCloseTime().time_since_epoch().count() + + clock_drift_; + } + + virtual int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override + { + return 1; + } + + Expected + getTxField(SField const& fname) override + { + if (fname == sfAccount) + return Bytes(accountID_.begin(), accountID_.end()); + else if (fname == sfFee) + { + int64_t x = 235; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + else if (fname == sfSequence) + { + int32_t x = getLedgerSqn(); + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + return Bytes(); + } + + Expected + getTxNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + // auto const& sn = fname.getName(); + if (fname == sfBalance) + { + int64_t x = 10'000; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + return data_; + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(-1); + } + + int32_t + getTxArrayLen(SField const& fname) override + { + return 32; + } + + int32_t + getTxNestedArrayLen(Slice const& locator) override + { + return 32; + } + + int32_t + updateData(Bytes const& data) override + { + return 0; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << msg; + if (!asHex) + j << std::string_view( + reinterpret_cast(data.data()), data.size()); + else + { + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + int32_t + traceNum(std::string const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << msg << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } +}; + struct Wasm_test : public beast::unit_test::suite { void - testWasmtimeLib() + testWasmFib() + { + testcase("Wasm fibo"); + + auto const ws = boost::algorithm::unhex(fib32Hex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = engine.run(wasm, "fib", wasmParams(10)); + + BEAST_EXPECT(r.has_value() && (r->result == 55)); + } + + void + testWasmSha() + { + testcase("Wasm sha"); + + auto const ws = boost::algorithm::unhex(sha512PureHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = + engine.run(wasm, "sha512_process", wasmParams(sha512PureHex)); + + BEAST_EXPECT(r.has_value() && (r->result == 34432)); + } + + void + testWasmB58() + { + testcase("Wasm base58"); + auto const ws = boost::algorithm::unhex(b58Hex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + Bytes outb; + outb.resize(1024); + + auto const minsz = std::min( + static_cast(512), + static_cast(b58Hex.size())); + auto const s = std::string_view(b58Hex.c_str(), minsz); + auto const r = engine.run(wasm, "b58enco", wasmParams(outb, s)); + + BEAST_EXPECT(r.has_value() && r->result); + } + + void + testWasmSP1Verifier() + { + testcase("Wasm sp1 zkproof verifier"); + auto const ws = boost::algorithm::unhex(sp1_wasm); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = engine.run(wasm, "sp1_groth16_verifier"); + + BEAST_EXPECT(r.has_value() && r->result); + } + + void + testWasmBG16Verifier() + { + testcase("Wasm BG16 zkproof verifier"); + auto const ws = boost::algorithm::unhex(zkProofHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = engine.run(wasm, "bellman_groth16_test"); + + BEAST_EXPECT(r.has_value() && r->result); + } + + void + testWasmLedgerSqn() + { + testcase("Wasm get ledger sequence"); + + auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider ledgerDataProvider(&env); + std::string const funcName("finish"); + + std::vector imports; + WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider); + + auto& engine = WasmEngine::instance(); + + auto r = engine.run( + wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + if (BEAST_EXPECT(r.has_value())) + BEAST_EXPECT(!r->result); + env.close(); + env.close(); + env.close(); + env.close(); + + // empty module - run the same module + r = engine.run( + {}, funcName, {}, imports, nullptr, 1'000'000, env.journal); + if (BEAST_EXPECT(r.has_value())) + BEAST_EXPECT(r->result); + } + + void + testWasmCheckJson() + { + testcase("Wasm check json"); + + using namespace test::jtx; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(checkJsonHex); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("check_accountID"); + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + Bytes data(str.begin(), str.end()); + auto re = runEscrowWasm( + wasm, funcName, wasmParams(data), nullptr, -1, env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value().result); + } + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; + Bytes data(str.begin(), str.end()); + auto re = runEscrowWasm( + wasm, funcName, wasmParams(data), nullptr, -1, env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value().result); + } + } + + void + testWasmCompareJson() + { + testcase("Wasm compare json"); + + using namespace test::jtx; + Env env{*this}; + + auto wasmStr = boost::algorithm::unhex(compareJsonHex); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::vector const tx_data(tx_js.begin(), tx_js.end()); + std::vector const lo_data(lo_js.begin(), lo_js.end()); + auto re = runEscrowWasm( + wasm, + funcName, + wasmParams(tx_data, lo_data), + nullptr, + -1, + env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value().result); + + std::vector const lo_data2(lo_js2.begin(), lo_js2.end()); + re = runEscrowWasm( + wasm, + funcName, + wasmParams(tx_data, lo_data2), + nullptr, + -1, + env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value().result); + } + + void + testWasmLib() { testcase("wasmtime lib test"); // clang-format off /* The WASM module buffer. */ - wbytes const wasm = {/* WASM header */ + Bytes const wasm = {/* WASM header */ 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, /* Type section */ 0x01, 0x07, 0x01, @@ -82,11 +566,11 @@ struct Wasm_test : public beast::unit_test::suite WasmImpFunc( imports, "func-add", reinterpret_cast(&Add)); - auto res = vm.run(wasm, "addTwo", imports, wasmParams(1234, 5678)); + auto res = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); // if (res) printf("invokeAdd get the result: %d\n", res.value()); - BEAST_EXPECT(res.has_value() && res.value() == 6912); + BEAST_EXPECT(res.has_value() && res->result == 6912); } void @@ -94,12 +578,15 @@ struct Wasm_test : public beast::unit_test::suite { testcase("bad wasm test"); + using namespace test::jtx; + Env env{*this}; + HostFunctions hfs; auto wasmHex = "00000000"; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, &hfs, 15); + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); BEAST_EXPECT(re.error()); } @@ -107,9 +594,9 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN1() { testcase("escrow wasm devnet 1 test"); - auto wasmHex = allHostFunctionsHex; + std::string const wasmHex = allHostFunctionsHex; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); // let sender = get_tx_account_id(); @@ -125,98 +612,11 @@ struct Wasm_test : public beast::unit_test::suite // pl_time >= e_time using namespace test::jtx; - struct TestHostFunctions : public HostFunctions - { - Env* env_; - Bytes accountID_; - Bytes data_; - int clock_drift_ = 0; - test::StreamSink sink_; - beast::Journal jlog_; - - public: - explicit TestHostFunctions(Env* env, int cd = 0) - : env_(env) - , clock_drift_(cd) - , sink_(beast::severities::kTrace) - , jlog_(sink_) - { - std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID_ = Bytes{s.begin(), s.end()}; - std::string t = "10000"; - data_ = Bytes{t.begin(), t.end()}; - } - - test::StreamSink& - getSink() - { - return sink_; - } - - beast::Journal - getJournal() override - { - return jlog_; - } - - int32_t - getLedgerSqn() override - { - return (int32_t)env_->current()->seq(); - } - - int32_t - getParentLedgerTime() override - { - return env_->current() - ->parentCloseTime() - .time_since_epoch() - .count() + - clock_drift_; - } - - std::optional - getTxField(std::string const& fname) override - { - return accountID_; - } - - std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) override - { - return data_; - } - - std::optional - getCurrentLedgerEntryField(std::string const& fname) override - { - if (fname == "Destination" || fname == "Account") - return accountID_; - else if (fname == "Data") - return data_; - else if (fname == "FinishAfter") - { - auto t = env_->current() - ->parentCloseTime() - .time_since_epoch() - .count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } - - return std::nullopt; - } - }; - Env env{*this}; - { - TestHostFunctions nfs(&env, 0); + TestHostFunctions nfs(env, 0); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re.value().result); @@ -231,9 +631,9 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(&env, -1); + TestHostFunctions nfs(env, -1); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(!re.value().result); @@ -248,18 +648,18 @@ struct Wasm_test : public beast::unit_test::suite { // fail because trying to access nonexistent field struct BadTestHostFunctions : public TestHostFunctions { - explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - std::optional - getTxField(std::string const& fname) override + Expected + getTxField(SField const& fname) override { - return std::nullopt; + return Unexpected(-1); } }; - BadTestHostFunctions nfs(&env); + BadTestHostFunctions nfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); BEAST_EXPECT(re.error()); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; @@ -268,18 +668,18 @@ struct Wasm_test : public beast::unit_test::suite { // fail because trying to allocate more than MAX_PAGES memory struct BadTestHostFunctions : public TestHostFunctions { - explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - std::optional - getTxField(std::string const& fname) override + Expected + getTxField(SField const& fname) override { return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); } }; - BadTestHostFunctions nfs(&env); + BadTestHostFunctions nfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); BEAST_EXPECT(!re); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; @@ -290,9 +690,9 @@ struct Wasm_test : public beast::unit_test::suite auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctions nfs(&env); + TestHostFunctionsOld nfs(&env); std::string funcName("recursive"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1000'000'000); BEAST_EXPECT(re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -317,7 +717,56 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT( countSubstr( sink.messages().str(), - "WAMR trap: Exception: wasm operand stack overflow") == 1); + "WAMR Exception: wasm operand stack overflow") == 1); + } + } + + void + testEscrowWasmDN2() + { + testcase("wasm devnet 3 test"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = xrplStdExampleHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(env, 0); + + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; + } + } + + env.close(); + env.close(); + env.close(); + env.close(); + env.close(); + + { + std::string const wasmHex = hostFunctions2Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(env, 0); + + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; + } } } @@ -325,9 +774,24 @@ struct Wasm_test : public beast::unit_test::suite run() override { using namespace test::jtx; - testWasmtimeLib(); + + testWasmLib(); testBadWasm(); - testEscrowWasmDN1(); + testWasmCheckJson(); + testWasmCompareJson(); + testWasmLedgerSqn(); + + testWasmFib(); + testWasmSha(); + testWasmB58(); + + // runing too long + // testWasmSP1Verifier(); + // testWasmBG16Verifier(); + + // TODO: needs fix for new host functions interface + // testEscrowWasmDN1(); + testEscrowWasmDN2(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 1ed246f2529..7dbc4fdc2ff 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -21,6 +21,10781 @@ #include +extern std::string const tx_js = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; +extern std::string const lo_js = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + +extern std::string const lo_js2 = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode": "0", + "PreviousTxnID": "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + +extern std::string const fib32Hex = + "0061736d0100000001090260000060017f017f0303020001071b02115f5f" + "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" + "01017f200045044041000f0b2000410348044041010f0b200041026a2100" + "0340200041036b100120016a2101200041026b220041044a0d000b200141" + "016a0b"; + +extern std::string const fib64Hex = + "0061736d0100000001090260000060017e017e0303020001071b02115f5f" + "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" + "01017e200050044042000f0b2000420353044042010f0b200042027c2100" + "0340200042037d100120017c2101200042027d22004204550d000b200142" + "017c0b00490f7461726765745f6665617475726573042b0f6d757461626c" + "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e6365" + "2d74797065732b0a6d756c746976616c7565"; + +extern std::string const b58Hex = + "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" + "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" + "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" + "617465000106655f6461746103000a6465616c6c6f636174650002076235" + "38656e636f00030ae8050402000b3401017f024020004180084a0d0041c0" + "082802002200411f4a0d0041c008200041016a3602002000410a7441d008" + "6a21010b20010b02000baa0501097f41d088060240200341004c0d000340" + "200220066a2d00000d012003200641016a2206470d000b200321060b2003" + "20066b220c418a016c41e4006d220741106a4170716b21090240200c4100" + "480d00200741016a220a410771210541002104200741074f0440200a41f8" + "ffff1f71210a0340200420096a4200370300200a200441086a2204470d00" + "0b0b2005450d00200420096a21040340200441003a0000200441016a2104" + "200541016b22050d000b0b200320064a0440200621052007210403402002" + "20056a2d0000210802402004220a20074e0440200721042008450d010b20" + "0721040340200420096a220b200b2d000041087420086a220b200b413a6d" + "2208413a6c6b3a00002004450440410021040c020b200441016b2204200a" + "4a0d00200b413a6b418d7f490d000b0b200541016a22052003470d000b0b" + "200741016a22022103410021040240200c4100480d000340200420096a2d" + "00000d012002200441016a2204470d000b200221040b2001200320066a20" + "046b4a047f02402006450d002006410771210841002105200641084f0440" + "200641787121010340200020056a42b1e2c48993a6cc9831370000200120" + "0541086a2205470d000b0b2008450d00200020056a21050340200541313a" + "0000200541016a2105200841016b22080d000b0b0240200420074a0d0020" + "0420076a410171047f200405200020066a200420096a2d00004180086a2d" + "00003a0000200641016a2106200441016a0b210520042007460d00200520" + "096a2101200720056b2102200020066a2103417f21040340200320046a22" + "0741016a200120046a220541016a2d00004180086a2d00003a0000200741" + "026a200541026a2d00004180086a2d00003a00002002200441026a220447" + "0d000b200420066a41016a21060b200020066a41003a0000200641016a05" + "41000b0b0b4101004180080b3a3132333435363738394142434445464748" + "4a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f" + "707172737475767778797a00490f7461726765745f666561747572657304" + "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const sha512PureHex = + "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" + "05040001020305030100020607017f0041800d0b075006066d656d6f7279" + "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" + "65000106655f6461746103000a6465616c6c6f6361746500020e73686135" + "31325f70726f6365737300030aa4060402000b0f0041800d410020004180" + "80024d1b0b02000b8b0602147e037f200141ff006a41ff014f044041c08c" + "06211620014180016d41016bac210b41808d02290300210c41888d022903" + "00210d41908d02290300210e41988d02290300210f41a08d022903002110" + "41a88d02290300211141b08d02290300211241b88d022903002113034041" + "002101200c21092013210a201221082011210520102103200f2115200e21" + "06200d2102034020022107200120166a200020016a290000220242388620" + "024280fe0383422886842002428080fc0783421886200242808080f80f83" + "4208868484200242088842808080f80f832002421888428080fc07838420" + "024228884280fe03832002423888848484220237030020014180086a2903" + "00200a200322044232892004422e89852004421789857c2008220a200442" + "7f858320052208200483847c7c20027c2203200922024224892002421e89" + "85200242198985200220072006221485832006200783857c7c2109200320" + "157c2103200421052006211520072106200141086a2201418001470d000b" + "200020016a21004180092117411e210103402002210620162001410e6b41" + "0f714103746a221820182903002016200141056b410f714103746a290300" + "20162001410d6b410f714103746a2903002202423f892002423889852002" + "420788857c7c20162001410f714103746a2903002202422d892002420389" + "852002420688857c22023703002017290300200a20032205423289200542" + "2e89852005421789857c2005427f852008832004200583847c7c20027c22" + "03200922024224892002421e898520024219898520022006200785832006" + "200783857c7c2109200320147c2103201741086a21172008210a20042108" + "200521042007211420062107200141016a220141de00470d000b41b88d02" + "200a20137c221337030041b08d02200820127c221237030041a88d022004" + "20117c221137030041a08d02200320107c221037030041988d02200f2014" + "7c220f37030041908d022007200e7c220e37030041888d022002200d7c22" + "0d37030041808d022009200c7c220c370300200b420052200b42017d210b" + "0d000b0b41808d020b0b880501004180080b800522ae28d7982f8a42cd65" + "ef23914437712f3b4deccffbc0b5bcdb8981a5dbb5e938b548f35bc25639" + "19d005b6f111f1599b4f19afa4823f9218816ddad55e1cab420203a398aa" + "07d8be6f7045015b83128cb2e44ebe853124e2b4ffd5c37d0c556f897bf2" + "745dbe72b196163bfeb1de803512c725a706dc9b942669cf74f19bc1d24a" + "f19ec1699be4e3254f388647beefb5d58c8bc69dc10f659cac77cca10c24" + "75022b596f2ce92d83e4a66eaa84744ad4fb41bddca9b05cb5531183da88" + "f976abdf66ee52513e981032b42d6dc631a83f21fb98c82703b0e40eefbe" + "c77f59bfc28fa83df30be0c625a70a934791a7d56f8203e05163ca06706e" + "0e0a67292914fc2fd246850ab72726c9265c38211b2eed2ac45afc6d2c4d" + "dfb3959d130d3853de63af8b54730a65a8b2773cbb0a6a76e6aeed472ec9" + "c2813b358214852c72926403f14ca1e8bfa2013042bc4b661aa89197f8d0" + "708b4bc230be5406a3516cc71852efd619e892d110a96555240699d62a20" + "715785350ef4b8d1bb3270a06a10c8d0d2b816c1a41953ab4151086c371e" + "99eb8edf4c774827a8489be1b5bcb034635ac9c5b30c1c39cb8a41e34aaa" + "d84e73e363774fca9c5ba3b8b2d6f36f2e68fcb2ef5dee828f74602f1743" + "6f63a57872abf0a11478c884ec39641a0802c78c281e6323faffbe90e9bd" + "82deeb6c50a41579c6b2f7a3f9be2b5372e3f27871c69c6126eace3e27ca" + "07c2c021c7b886d11eebe0cdd67ddaea78d16eee7f4f7df5ba6f1772aa67" + "f006a698c8a2c57d630aae0df9be04983f111b471c13350b711b847d0423" + "f577db289324c7407babca32bcbec9150abe9e3c4c0d109cc4671d43b642" + "3ecbbed4c54c2a7e65fc9c297f59ecfad63aab6fcb5f1758474a8c19446c" + "00490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" + "7065732b0a6d756c746976616c7565"; + +extern std::string const checkJsonHex = + "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" + "00030c0b01010200000000000003000405017001030305030100110619037f0141" + "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" + "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" + "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" + "200010012200450d0120000f0b230041206b220024002000410036021820004101" + "36020c200041b480c00036020820004204370210200041086a41d080c000100500" + "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" + "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" + "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" + "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" + "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" + "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" + "0245044041002100410021010c040b4100210020054100411920074101766b2007" + "411f461b7421044100210103400240200228020441787122062005490d00200620" + "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" + "021422062000200620022004411d764104716a41106a2802002202471b20002006" + "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" + "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" + "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" + "000b20012000410372360204200020016a220020002802044101723602040c060b" + "024041022000742203410020036b72200120007471682206410374220041a483c0" + "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" + "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" + "360204200120056a2206200020056b2204410172360204200020016a2004360200" + "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" + "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" + "200220057236020020000c010b20002802080b2102200020033602082002200336" + "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" + "043602000c050b200068410274419482c0006a280200220128020441787120056b" + "2103200121020240034002400240200128021022000d00200128021422000d0020" + "022802182107024002402002200228020c22004604402002411441102002280214" + "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" + "013602080c010b200241146a200241106a20001b21040340200421062001220041" + "146a200041106a200028021422011b210420004114411020011b6a28020022010d" + "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" + "28020047044020074110411420072802102002461b6a20003602002000450d040c" + "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" + "77713602000c030b200028020441787120056b22012003200120034922011b2103" + "2000200220011b2102200021010c010b0b20002007360218200228021022010440" + "20002001360210200120003602180b20022802142201450d002000200136021420" + "0120003602180b02400240200341104f044020022005410372360204200220056a" + "22062003410172360204200320066a200336020041b485c0002802002204450d01" + "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" + "2205410120044103767422047145044041ac85c000200420057236020020000c01" + "0b20002802080b2104200020013602082004200136020c2001200036020c200120" + "043602080c010b2002200320056a2200410372360204200020026a220020002802" + "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" + "41086a0f0b20002001724504404100210141022007742200410020006b72200871" + "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" + "20012000280204417871220420056b220620034922071b21082000280210220245" + "0440200028021421020b20012008200420054922001b210120032006200320071b" + "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" + "200020056b4f710d0020012802182107024002402001200128020c220046044020" + "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" + "2202200036020c200020023602080c010b200141146a200141106a20001b210403" + "40200421062002220041146a200041106a200028021422021b2104200041144110" + "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" + "28021c410274419482c0006a220228020047044020074110411420072802102001" + "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" + "b085c000280200417e200128021c77713602000c010b2000200736021820012802" + "102202044020002002360210200220003602180b20012802142202450d00200020" + "02360214200220003602180b0240200341104f0440200120054103723602042001" + "20056a22022003410172360204200220036a200336020020034180024f04402002" + "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" + "410120034103767422037145044041ac85c000200320047236020020000c010b20" + "002802080b2103200020023602082003200236020c2002200036020c2002200336" + "02080c010b2001200320056a2200410372360204200020016a2200200028020441" + "01723602040b0c010b024002400240024002400240200541b485c0002802002201" + "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" + "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" + "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" + "02002201200020002001491b3602000240024041c085c000280200220304404194" + "83c0002100034020002802002201200028020422066a2002460d02200028020822" + "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" + "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" + "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" + "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" + "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" + "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" + "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" + "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" + "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" + "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" + "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" + "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" + "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" + "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" + "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" + "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" + "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" + "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" + "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" + "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" + "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" + "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" + "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" + "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" + "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" + "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" + "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" + "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" + "85c000200441286b220036020020022000410172360204200020026a4128360204" + "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" + "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" + "20046a2101419483c0002100024002400340200120002802002206470440200028" + "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" + "0028020022014f04402003200120002802046a2206490d010b200028020821000c" + "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" + "0172360204200020026a412836020441cc85c00041808080013602002003200641" + "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" + "002109200141106a419c83c00029020037020020012009370208419883c0002004" + "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" + "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" + "012003460d0720012001280204417e713602042003200120036b22004101723602" + "042001200036020020004180024f04402003200010070c080b200041f8017141a4" + "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" + "ac85c000200020027236020020010c010b20012802080b21002001200336020820" + "00200336020c2003200136020c200320003602080c070b20002002360200200020" + "0028020420046a360204200220054103723602042006410f6a41787141086b2201" + "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" + "460d04200128020422054103714101460440200120054178712200100820002001" + "6a22012802042105200020036a21030b20012005417e7136020420042003410172" + "360204200320046a200336020020034180024f04402004200310070c060b200341" + "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" + "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" + "043602082003200436020c2004200036020c200420033602080c050b41b885c000" + "200020056b220136020041c085c00041c085c000280200220020056a2202360200" + "2002200141017236020420002005410372360204200041086a21000c060b41bc85" + "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" + "85c000410036020020002001410372360204200020016a22012001280204410172" + "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" + "2002410172360204200020016a2002360200200020054103723602040b20004108" + "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" + "71220141086b220236020041b885c00041b885c00028020020046a220320002001" + "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" + "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" + "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" + "0041b485c00041b485c00028020020036a22003602002004200041017236020420" + "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" + "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" + "20056a22023602002002200141017236020420002005410372360204200041086a" + "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" + "402007410020076b41037122026a21062002044020072103418080c00021050340" + "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" + "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" + "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" + "6b411871210820052802002105034020062005200c762004280200220520087472" + "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" + "20022104034020062004280200360200200441046a2104200641046a2206200349" + "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" + "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" + "4122460440200021032007210241002105412221080240034020032d0000220920" + "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" + "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" + "0b000bd20601047f0240200041046b280200220241787122034104410820024103" + "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" + "0041046b280200220341787122006a21020240024020034101710d002003410271" + "450d012001280200220320006a2100200120036b220141bc85c000280200460440" + "20022802044103714103470d0141b485c000200036020020022002280204417e71" + "36020420012000410172360204200220003602000c020b2001200310080b024002" + "4002400240024020022802042203410271450440200241c085c000280200460d02" + "200241bc85c000280200460d0320022003417871220210082001200020026a2200" + "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" + "0020003602000c060b20022003417e713602042001200041017236020420002001" + "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" + "c00028020041016b220036020020000d04419c83c0002802002200044003402001" + "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" + "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" + "003602002001200041017236020441bc85c000280200200146044041b485c00041" + "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" + "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" + "00210103402002200128020022054f04402002200520012802046a490d040b2001" + "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" + "20006a220036020020012000410172360204200020016a20003602000c020b2000" + "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" + "007145044041ac85c000200020037236020020020c010b20022802080b21002002" + "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" + "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" + "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" + "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" + "7f230041206b220224002002410036021020024101360204200242043702082002" + "412e36021c200220003602182002200241186a360200200220011005000ba40201" + "037f230041206b22022400200241106a2203200041106a29020037030020024108" + "6a2204200041086a290200370300200241013b011c200220013602182002200029" + "0200370300230041206b2200240020022802182101200041106a20032902003703" + "00200041086a20042902003703002000200236021c200020013602182000200229" + "020037030041002102230041106b22012400200028020c21030240024002400240" + "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" + "2802042102200328020021030c010b20014180808080783602002001200036020c" + "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" + "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" + "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" + "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" + "2002410274419482c0006a21044101200274220341b085c0002802007145044020" + "042000360200200020043602182000200036020c2000200036020841b085c00041" + "b085c0002802002003723602000f0b024002402001200428020022032802044178" + "71460440200321020c010b20014100411920024101766b2002411f461b74210503" + "4020032005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c200220" + "00360208200041003602182000200236020c200020013602080f0b200420003602" + "00200020033602182000200036020c200020003602080bf10201047f200028020c" + "21020240024020014180024f044020002802182103024002402000200246044020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" + "2201200236020c200220013602080c010b200041146a200041106a20021b210403" + "40200421052001220241146a200241106a200228021422011b2104200241144110" + "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" + "0274419482c0006a220128020047044020034110411420032802102000461b6a20" + "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" + "280200417e200028021c77713602000c020b200028020822002002470440200020" + "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" + "77713602000f0b2002200336021820002802102201044020022001360210200120" + "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" + "017f230041106b22032400419082c000419082c000280200220441016a36020002" + "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" + "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" + "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" + "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" + "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" + "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" + "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" + "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" + "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" + "64006000100029000000a804000009000000617373657274696f6e206661696c65" + "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" + "6765010452757374000c70726f6365737365642d62790105727573746325312e38" + "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" + "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + +extern std::string const compareJsonHex = + "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" + "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" + "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" + "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" + "616004030305060001070808080809040702000000040403030304030500020306" + "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" + "0903020201020200000405000203030402020205100b0303000005030101010104" + "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" + "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" + "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" + "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" + "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" + "360228200320023602242003200136022020034180013a002c2003410036021c20" + "03428080808010370214200341c8006a200341146a108180808000024002400240" + "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" + "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" + "2903483703300240024020032802282202200328022422064f0d00200328022021" + "070340200720026a2d000041776a220141174b0d02410120017441938080047145" + "0d022006200241016a2202470d000b200320063602280b20002003290330370300" + "200041106a2004290300370300200041086a200529030037030020032802142202" + "450d04200328021820021082808080000c040b20032002360228200341086a2007" + "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" + "200328020c21012003280208210641141084808080002202450d01200220063602" + "0c2002411636020020002002360204200041063a00002002200136021020034130" + "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" + "032802142202450d00200328021820021082808080000b200341e0006a24808080" + "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" + "210302400240024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f0006a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" + "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" + "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241386a200320052005200441016a220420052004491b" + "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" + "84808080002207450d1f2007200836020c20074105360200200720043602100c08" + "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" + "c080001a200228024c21042002280248210841141084808080002207450d1e2007" + "200836020c20074107360200200720043602100c070b20022902dc02210e200228" + "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228024421042002280240210841141084808080002207450d1c2007200836020c" + "20074115360200200720043602100c050b200241b0016a20011081808080000240" + "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" + "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" + "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" + "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" + "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" + "000120042007360204200441106a2003290300370300200441036a20052d00003a" + "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" + "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" + "0000200420083602100c180b200628020021030b200241306a2003200520052004" + "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" + "042002280230210841141084808080002207450d172007200836020c2007410236" + "0200200720043602100b200241d8026a109180808000024020022802d802220445" + "0d002009200441186c1082808080000b200128020c210320012802142104200128" + "0210210541062106410121090b200120012d001841016a3a001802400240200420" + "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" + "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" + "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28021421082002280210210541141084808080002204450d1d200441163602000c" + "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" + "41776a220841174b0d024101200874419380800471450d022001200441016a2204" + "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" + "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" + "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" + "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" + "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" + "210541141084808080002204450d1a200441153602000c040b200241206a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228022421082002280220210541141084808080002204450d1920044116360200" + "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" + "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" + "001a200228021c21082002280218210541141084808080002204450d1620044102" + "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" + "01200220073602b401200220063a00b001024020090d00200241063a0078200220" + "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" + "200241c8016a1092808080000c110b200241086a20032005200520042005200449" + "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" + "1084808080002204450d142004200136020c200441183602002000200436020420" + "0041063a0000200420083602100c130b200141003602082001200441016a360214" + "200241b0016a2006200110938080800020022802b40121080240024020022802b0" + "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" + "948080800020022d00784106460d1320002002290378370300200041106a200241" + "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" + "150b41002101024020044100480d00024020040d0041012101410021050c030b41" + "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" + "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" + "086a220320012008200410df808080003602002002200536027c200241033a0078" + "2002200436028401200041106a200241f8006a41106a290300370300200041086a" + "2003290300370300200020022903783703000c120b2001200441016a3602142002" + "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" + "20024190016a109680808000024020022d00784106460d00200020022903783703" + "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" + "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" + "200020043602040c120b2000200228029801360204200041063a00000c110b0240" + "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" + "14200141bb80c0800041031086808080002204450d02200041063a000020002004" + "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" + "0a490d042002200320052005200441016a220420052004491b1083808080004100" + "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" + "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" + "200241003a007820002002290378370300200041086a200241f8006a41086a2903" + "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" + "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" + "00200020043602040c0e0b20024181023b01782000200229037837030020004108" + "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" + "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" + "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" + "02290378370300200041086a200241f8006a41086a290300370300200041106a20" + "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" + "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" + "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" + "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" + "21070c070b20022802d401220441003602082004200428021441016a3602142002" + "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" + "460d06200241d8026a200720022802b801109880808000024020022802d8022204" + "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" + "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" + "41003602dc01200220053602e002200220083602dc02200220043602d802200241" + "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" + "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" + "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" + "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" + "024020022d00b101450d0020022802d40122044100360208200420042802144101" + "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" + "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" + "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" + "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" + "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" + "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" + "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" + "290300220f370300200220022903b00122103703d802200541106a200e37020020" + "0541086a200f3702002005201037020020024180026a41086a200c290200370300" + "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" + "186a280200360200200220022902b00137038002200220033602a4022002200736" + "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" + "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" + "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" + "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" + "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" + "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" + "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" + "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" + "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" + "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" + "200820041082808080000b200241dc016a109b808080000b41062106410121090b" + "200120012d001841016a3a0018200128020c210302400240024020012802142204" + "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" + "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" + "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" + "21040c050b200241e8006a200320052005200441016a220420052004491b108380" + "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" + "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" + "200441016a220436021420052004470d000b200521040b200241e0006a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28026421082002280260210541141084808080002204450d072004200536020c20" + "044103360200200420083602100c010b200241d8006a200320052005200441016a" + "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" + "280258210541141084808080002204450d062004200536020c2004411636020020" + "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" + "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" + "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" + "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" + "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" + "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" + "80000c010b200241d0006a200320052005200420052004491b1083808080004100" + "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" + "0d042004200136020c2004411836020020002004360204200041063a0000200420" + "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" + "200041063a0000200020043602040c010b20002002290378370300200041106a20" + "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" + "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" + "002202417871220341044108200241037122021b20016a490d0002402002450d00" + "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" + "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" + "0301057f02400240024002400240024020022003490d0041012104410021052003" + "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" + "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" + "418a94a8d000736b20077241808182847871418081828478460d00034020062001" + "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" + "034109490d0103400240024020074108480d004180828408200120076a22064178" + "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" + "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" + "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" + "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" + "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" + "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" + "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" + "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" + "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" + "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" + "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" + "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" + "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" + "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" + "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" + "0041002100410021060c040b4100210020024100411920054101766b2005411f46" + "1b74210741002106034002402001220128020441787122082002490d0020082002" + "6b220820034f0d00200821032001210620080d004100210320012106200121000c" + "060b200128021422082000200820012007411d764104716a41106a280200220147" + "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" + "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" + "0022032802082206460d002006200236020c200220063602080c010b4100200141" + "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" + "0204410172360204200341086a0f0b024002402000200374410220037422004100" + "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" + "0022002802082207460d002007200636020c200620073602080c010b4100200141" + "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" + "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" + "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" + "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" + "d2c08000200621010c010b200628020821010b200620033602082001200336020c" + "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" + "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" + "787120026b2103200621010240024003400240200628021022000d002006280214" + "22000d0020012802182105024002400240200128020c22002001470d0020014114" + "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" + "0036020c200020063602080c010b200141146a200141106a20001b210703402007" + "21082006220041146a200041106a200028021422061b210720004114411020061b" + "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" + "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" + "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" + "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" + "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" + "360218024020012802102206450d0020002006360210200620003602180b200128" + "02142206450d0020002006360214200620003602180b0240024002402003411049" + "0d0020012002410372360204200120026a22022003410172360204200220036a20" + "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" + "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" + "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" + "0b200620003602082007200036020c2000200636020c200020073602080c010b20" + "01200320026a2200410372360204200120006a220020002802044101723602040c" + "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" + "4020002006720d004100210641022005742200410020006b722004712200450d03" + "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" + "280204417871220120026b220820034922051b2104200120024921072008200320" + "051b21080240200028021022010d00200028021421010b2006200420071b210620" + "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" + "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" + "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" + "410021000c020b20062802082201200036020c200020013602080c010b20064114" + "6a200641106a20001b21070340200721082001220041146a200041106a20002802" + "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" + "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" + "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" + "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" + "c080000c010b20002005360218024020062802102201450d002000200136021020" + "0120003602180b20062802142201450d0020002001360214200120003602180b02" + "40024020034110490d0020062002410372360204200620026a2200200341017236" + "0204200020036a200336020002402003418002490d002000200310d7808080000c" + "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" + "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" + "200228020821030b200220003602082003200036020c2000200236020c20002003" + "3602080c010b2006200320026a2200410372360204200620006a22002000280204" + "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" + "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" + "200241af80046a220641107640002203417f4622070d0720034110742201450d07" + "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" + "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" + "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" + "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" + "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" + "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" + "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" + "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" + "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" + "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" + "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" + "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" + "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" + "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" + "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" + "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" + "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" + "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" + "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" + "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" + "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" + "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" + "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" + "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" + "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" + "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" + "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" + "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" + "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" + "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" + "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" + "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" + "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" + "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" + "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" + "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" + "003602f0d2c0800020012000410172360204200120006a41283602044100418080" + "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" + "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" + "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" + "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" + "02402000280200220620034b0d002003200620002802046a2206490d020b200028" + "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" + "800020012000410172360204200120006a412836020441004180808001360284d3" + "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" + "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" + "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" + "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" + "200041046a22002006490d000b20072003460d0720072007280204417e71360204" + "2003200720036b22004101723602042007200036020002402000418002490d0020" + "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" + "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" + "c08000200621000c010b200628020821000b200620033602082000200336020c20" + "03200636020c200320003602080c070b200020013602002000200028020420086a" + "360204200120024103723602042007410f6a41787141786a2206200120026a2200" + "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" + "200628020422024103714101470d0020062002417871220210a880808000200220" + "036a2103200620026a220628020421020b20062002417e71360204200020034101" + "72360204200020036a200336020002402003418002490d002000200310d7808080" + "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" + "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" + "010b200228020821030b200220003602082003200036020c2000200236020c2000" + "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" + "8000220020026a22063602f8d2c080002006200341017236020420002002410372" + "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" + "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" + "410372360204200320006a220020002802044101723602040c010b410020063602" + "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" + "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" + "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" + "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" + "d2c0800020062001410172360204200020036a4128360204410041808080013602" + "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" + "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" + "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" + "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" + "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" + "0020026a22063602f8d2c080002006200341017236020420002002410372360204" + "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" + "02000b200041046a109b808080000c020b20002802042201450d01200028020820" + "011082808080000f0b200041046a10918080800020002802042201450d00200028" + "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" + "80808080002000280214220420002802102205200420054b1b2106200028020c21" + "0702400240024002400340024020020d00410021040c050b20062004460d012000" + "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" + "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" + "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" + "8080002204450d01200441093602000c020b200320072005200610838080800041" + "002d00c0cfc080001a200328020421012003280200210241141084808080002204" + "450d00200441053602000c010b000b2004200236020c200420013602100b200341" + "106a24808080800020040b970202027f027e23808080800041106b220424808080" + "8000024002400240024002400240024002402001280214220520012802104f0d00" + "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" + "020b2002450d02420121060c050b20042001200220034100108880808000200428" + "02000d020c030b200420012002200341001089808080002004280200450d022000" + "2004280204360208200042033703000c040b420021060240420020037d22074200" + "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" + "020b20002004280204360208200042033703000c020b2004290308210342002106" + "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" + "23808080800041106b220524808080800020012001280214220641016a22073602" + "140240024002402007200128021022084f0d00200720086b2109200128020c210a" + "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" + "410a490d00024020060d002005200a20082008200741016a220720082007491b10" + "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" + "808080002207450d072007200c36020c2007410d36020020002007360204200041" + "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" + "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" + "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" + "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" + "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" + "20002001200220032007108b808080000c010b200541086a200128020c20082008" + "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" + "0c21062005280208210c41141084808080002207450d012007200c36020c200741" + "053602002000200736020420004101360200200720063602100b200541106a2480" + "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" + "0620012001280214220741016a220836021402402008200128021022094f0d0041" + "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" + "2001200741026a22083602140b200128020c210a02400240024002400240024002" + "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" + "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" + "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" + "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" + "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" + "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" + "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" + "042007200836020c20074105360200200020073602042000410136020020072001" + "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" + "020421012005280200210841141084808080002207450d032007200836020c2007" + "410d3602002000200736020420004101360200200720013602100c040b20042008" + "6a2207411f7541808080807873200720084100482007200448731b21070b200020" + "01200220032007108b808080000c020b2000200120022003502006108c80808000" + "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" + "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" + "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" + "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" + "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" + "22052480808080002003ba2106024002400240024002400240024020042004411f" + "7522077320076b220741b502490d0003402006440000000000000000610d062004" + "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" + "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" + "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" + "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" + "84808080002204450d022004200136020c2004410e360200200020043602042004" + "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" + "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" + "28020c21072005280208210141141084808080002204450d012004200136020c20" + "04410e36020020002004360204200420073602100b410121040c020b000b200020" + "0620069a20021b390308410021040b20002004360200200541106a248080808000" + "0b840201027f23808080800041106b220524808080800002400240024002402004" + "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" + "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" + "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" + "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" + "1084808080002204450d002004200336020c2004410e3602002000200436020420" + "042001360210410121040c020b000b200044000000000000000044000000000000" + "008020021b390308410021040b20002004360200200541106a2480808080000b95" + "0502067f017e23808080800041306b2203248080808000200128020c2104024002" + "40024002400240024020012802142205200128021022064f0d002001200541016a" + "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" + "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" + "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" + "21072003280218210441141084808080002201450d022001200436020c20014105" + "3602002000200136020820004203370300200120073602100c040b200341086a20" + "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" + "1a200328020c21072003280208210441141084808080002201450d012001200436" + "020c2001410d3602002000200136020820004203370300200120073602100c030b" + "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" + "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" + "01450d012001200436020c2001410d360200200020013602082000420337030020" + "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" + "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" + "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" + "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" + "0b0b200341206a200120022009108e808080000240024020032802200d00200020" + "032b0328390308420021090c010b20002003280224360208420321090b20002009" + "3703000c020b000b20002001200220091087808080000b200341306a2480808080" + "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" + "0641016a2107200520066b2108200128020c20066a210541002104034002402005" + "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" + "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" + "200720046a3602142008200441016a2204470d000b200821040b20002001200220" + "032004108b808080000f0b200020012002200320041088808080000bc80101047f" + "23808080800041206b2202248080808000024002400240200028020c450d002000" + "21010c010b200241106a41086a2203200041086a28020036020020022000290200" + "370310200241086a200128020c2001280210200128021410838080800041002d00" + "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" + "200120022903103702002001200536020c20012004360210200141086a20032802" + "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "014108411810d480808000024020012802082200418180808078460d0020002001" + "28020c109580808000000b200141106a2480808080000b950101027f0240200028" + "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" + "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" + "0041046a28020020021082808080000c010b200010918080800020002802002202" + "450d00200041046a280200200241186c1082808080000b200041186a2100200141" + "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" + "01020b20002802082201450d01200028020420011082808080000c010b20002d00" + "044103470d00200028020822012802002102024020012802042203280200220445" + "0d002002200411808080800080808080000b024020032802042203450d00200220" + "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" + "097f017e23808080800041306b2203248080808000024002400240024002400240" + "0240024002400340024002402001280208220420012802042205460d0002400240" + "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" + "00460d0120074120490d012006200441016a22086a21094100200520086b417871" + "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" + "800020012802042105200128020821070c040b200741086a2107200b41086a2109" + "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" + "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" + "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" + "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" + "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" + "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" + "1084808080002207450d052007200936020c200741043602002000200736020420" + "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" + "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" + "024020094122470d002002280208450d0520072004490d072002200b20046a2007" + "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" + "0204200228020810ca8080800020032802282207450d032000200328022c360208" + "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" + "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" + "450d052007200936020c2007411036020020002007360204200041023602002007" + "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" + "80002001200741016a2209360208024020092005490d00200341206a200b200520" + "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" + "1084808080002207450d06200741043602000c090b2001200741026a2204360208" + "02400240024002400240024002400240024002400240200b20096a2d0000220741" + "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" + "00470d020240200228020822072002280200470d00200210cb808080000b200220" + "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" + "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" + "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" + "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" + "22072002280200470d00200210cb808080000b2002200741016a36020820022802" + "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" + "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" + "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" + "02200741016a360208200228020420076a41083a0000410021070c050b02402002" + "28020822072002280200470d00200210cb808080000b2002200741016a36020820" + "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" + "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" + "0000410021070c030b0240200228020822072002280200470d00200210cb808080" + "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" + "40200228020822072002280200470d00200210cb808080000b2002200741016a36" + "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" + "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" + "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" + "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" + "40024020032802282207450d002000200328022c3602084100210b0c010b410221" + "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" + "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" + "200936020c2007200b3602100b20004102360200200020073602040b200341306a" + "2480808080000b7901027f410021030240024020024100480d00024020020d0041" + "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" + "040d01410121030b20032002109580808000000b20042001200210df8080800021" + "012000200236020c2000200136020820002003360204200041033a00000b100002" + "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" + "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" + "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" + "370308200041023a0000200020012903083703100f0b200041023a000020002001" + "290308220337031020002003423f883703080bb40701077f23808080800041306b" + "22022480808080002001280200220328020c210402400240024002402003280214" + "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" + "174b0d024101200874419380800471450d022003200541016a2205360214200620" + "05470d000b200621050b41012108200241286a200420062006200541016a220520" + "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" + "210341141084808080002205450d022005200336020c2005410336020020002005" + "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" + "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" + "20053602140240200520064f0d00034002400240024002400240200420056a2d00" + "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" + "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" + "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" + "0c21062002280208210341141084808080002205450d092005200336020c200541" + "1136020020002005360204200520063602100c080b200041013a0001410021080c" + "070b41012108200241186a200420062006200541016a220520062005491b108380" + "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" + "80002205450d072005200336020c20054115360200200020053602042005200636" + "02100c060b2003200541016a220536021420062005470d000b200621050b410121" + "08200241106a200420062006200541016a220520062005491b1083808080004100" + "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" + "0d042005200336020c2005410536020020002005360204200520063602100c030b" + "41002108200141003a0004024020074122460d002002200420062006200541016a" + "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" + "280200210641141084808080002205450d042005200636020c2005411136020020" + "002005360204200520083602100c020b200041013a00010c020b200241206a2004" + "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" + "21082002280220210641141084808080002205450d022005200636020c20054108" + "36020020002005360204200520083602100b410121080b200020083a0000200241" + "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" + "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" + "8080800022040d01410121030b20032002109580808000000b20042001200210df" + "8080800021012000200236020820002001360204200020033602000bdc0201067f" + "23808080800041106b22022480808080002001280200220328020c210402400240" + "02400240024020032802142201200341106a28020022054f0d000340200420016a" + "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" + "41016a220136021420052001470d000b200521010b200241086a20042005200520" + "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" + "21072002280208210541141084808080002201450d03200141033602000c010b02" + "402006413a470d002003200141016a360214200020031081808080000c020b2002" + "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" + "001a200228020421072002280200210541141084808080002201450d0220014106" + "3602000b2001200536020c20002001360204200041063a0000200120073602100b" + "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" + "042480808080000240024002400240024002400240024002400240024002400240" + "20012802002205450d002002280208210620022802042107200128020421080240" + "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" + "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" + "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" + "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" + "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" + "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" + "2002290204220fa721092002280200220b418080808078470d03200921050c010b" + "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" + "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" + "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" + "028c02200142808080801037020420012009360200200920032903003703002009" + "41086a200341086a290300370300200941106a200341106a2903003703000c010b" + "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" + "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" + "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" + "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" + "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" + "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" + "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" + "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" + "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" + "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" + "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" + "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" + "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" + "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" + "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" + "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" + "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" + "200420042903880137026020042005360208200420063602782008280200220d41" + "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" + "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" + "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" + "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" + "370300200b2003290300370300200b41086a200341086a290300370300200d200e" + "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" + "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" + "246a200441dc006a41186a28020036020020042010370234200420073602302004" + "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" + "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" + "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" + "210d200b2f019203410b490d02200641016a210602400240024002400240024002" + "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" + "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" + "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" + "36027820044188016a200441f8006a10c18080800020042802b001410520044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" + "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" + "2105200d418080808078460d032004200d3602302008200441086a412410df8080" + "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" + "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" + "41003b019203200d410036028802200b41003b019003200b200d36028802200120" + "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" + "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" + "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" + "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" + "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" + "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" + "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" + "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" + "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" + "6a200941106a220d290300370300200041086a200941086a220b29030037030020" + "092003290300370300200b200341086a290300370300200d200341106a29030037" + "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" + "80808080004100210241002103024020002802002204450d002001200436021820" + "014100360214200120043602082001410036020420012000280204220336021c20" + "01200336020c20002802082103410121020b200120033602202001200236021020" + "01200236020002400240024003400240024002400240024020030d002001280200" + "450d0820012802082104200128020422030d0141002100200128020c2203450d06" + "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" + "024020024101712203450d0020012802040d0020012802082103200128020c2200" + "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" + "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" + "3702082001200336020441012102200141013602000b2001280208210002402001" + "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" + "20012802242203450d0120012802282100200128022c220520032f019203490d02" + "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" + "2001200436020c20014100360208200120033602040c010b200320044102746a41" + "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" + "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" + "2802002204450d00200028020420041082808080000b0240024002400240200320" + "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" + "20032802042200450d01200328020820001082808080000c010b200341046a1091" + "8080800020032802042200450d002003280208200041186c1082808080000b2001" + "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" + "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" + "03037f017e037f23808080800041f0006b22022480808080004100210302402000" + "2d0000220420012d0000470d00410121030240024002400240024020040e060500" + "01020304050b20002d000120012d00014621030c040b4100210320002903082205" + "2001290308520d030240024002402005a70e03000102000b200029031020012903" + "105121030c050b200029031020012903105121030c040b20002b031020012b0310" + "6121030c030b41002103200028020c2204200128020c470d022000280208200128" + "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" + "0d012001280208210420002802082100200641016a210103402001417f6a220145" + "21032001450d0220002004109c808080002106200441186a2104200041186a2100" + "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" + "6c2002420037026420024100360254200241003602442002410036023020024100" + "36022020022001280208220636025c200220012802042203360258200220063602" + "4c2002200336024820022000280208220636023820022000280204220136023420" + "0220063602282002200136022420022004410020031b3602602002200341004722" + "033602502002200336024020022004410020011b36023c20022001410047220336" + "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" + "80004101210320022802102201450d0120022802142104200241086a2007109d80" + "80800020022802082200450d0141002103200128020822062000280208470d0120" + "0228020c210820012802042000280204200610dc808080000d0120042008109c80" + "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" + "200128022022020d00410021020c010b20012002417f6a36022002400240024020" + "012802004101470d0020012802040d01200128020821030240200128020c220245" + "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" + "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" + "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" + "050c010b03402003280288022205450d03200241016a210220032f019003210420" + "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" + "21060c010b200520034102746a4198036a21030340200328020022064198036a21" + "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" + "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" + "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" + "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" + "001a200010848080800022010d01410121010b20012000109580808000000b2001" + "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" + "108080808000024002400240024020042d00384106460d00200441086a41106a20" + "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" + "29030037030020042004290338370308200441386a200220031080808080002004" + "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" + "0629030037030020042004290338370320200441086a10a0808080002205450d02" + "200441206a10a0808080002206450d0320052006109c808080002105200441206a" + "108580808000200441086a10858080800002402003450d00200220031082808080" + "000b02402001450d00200020011082808080000b200441d0006a24808080800020" + "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" + "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" + "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" + "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" + "004105470d0020002802042202450d002000280208210303402002418c026a2100" + "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" + "0c020b2000280208210120002802042107200641016a2106200541746a21052000" + "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" + "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" + "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" + "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" + "0041c0006b22052480808080002005200136020c20052000360208200520033602" + "14200520023602102005410236021c200541dc82c0800036021820054202370224" + "2005418180808000ad422086200541106aad843703382005418280808000ad4220" + "86200541086aad843703302005200541306a360220200541186a200410a4808080" + "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" + "41206b2200248080808000200041003602182000410136020c200041ac81c08000" + "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" + "23808080800041206b2202248080808000200241106a200041106a290200370300" + "200241086a200041086a290200370300200241013b011c20022001360218200220" + "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" + "6a280200220241787122006a21030240024020024101710d002002410271450d01" + "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" + "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" + "7136020420012000410172360204200320003602000f0b2001200210a880808000" + "0b024002400240024002400240200328020422024102710d00200341002802f8d2" + "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" + "80002001200220006a2200410172360204200120006a2000360200200141002802" + "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" + "2000410172360204200120006a20003602000b2000418002490d022001200010d7" + "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" + "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" + "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" + "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" + "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" + "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" + "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" + "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" + "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" + "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" + "00220241012000410376742200710d00410020022000723602e4d2c08000200321" + "000c010b200328020821000b200320013602082000200136020c2001200336020c" + "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" + "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" + "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" + "0041206b2203248080808000200341003602102003410136020420034204370208" + "2003200136021c200320003602182003200341186a3602002003200210a4808080" + "00000b840601057f0240024002402000417c6a2203280200220441787122054104" + "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" + "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" + "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" + "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" + "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" + "7871220420056a22052001490d042006200410a880808000200520016b22024110" + "490d0120032001200328020041017172410272360200200720016a220120024103" + "72360204200720056a220520052802044101723602042001200210a98080800020" + "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" + "20016a22052002410372360204200620062802044101723602042005200210a980" + "80800020000f0b20032005200328020041017172410272360200200720056a2202" + "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" + "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" + "200720056a2202200228020441017236020441002102410021010c010b20032001" + "200441017172410272360200200720016a22012002410172360204200720056a22" + "05200236020020052005280204417e713602040b410020013602f4d2c080004100" + "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" + "0240200210848080800022050d0041000f0b20052000417c417820032802002201" + "4103711b20014178716a2201200220012002491b10df808080002102200010a580" + "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" + "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" + "410272360200200720016a2202200520016b2205410172360204410020053602f0" + "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" + "4002402001418002490d002000280218210302400240024020022000470d002000" + "41144110200028021422021b6a28020022010d01410021020c020b200028020822" + "01200236020c200220013602080c010b200041146a200041106a20021b21040340" + "200421052001220241146a200241106a200228021422011b210420024114411020" + "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" + "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" + "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" + "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" + "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" + "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d0020022001360214" + "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" + "4101710d002003410271450d012000280200220320016a21010240200020036b22" + "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" + "d2c0800020022002280204417e7136020420002001410172360204200220013602" + "000c020b2000200310a8808080000b024002400240024020022802042203410271" + "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" + "03417871220310a8808080002000200320016a2201410172360204200020016a20" + "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" + "2003417e7136020420002001410172360204200020016a20013602000b02402001" + "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" + "0240024041002802e4d2c08000220341012001410376742201710d004100200320" + "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" + "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" + "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" + "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" + "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" + "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" + "7e23808080800041306b2203248080808000200320003602002003200136020420" + "03410236020c200341c485c08000360208200342023702142003418380808000ad" + "4220862204200341046aad84370328200320042003ad843703202003200341206a" + "360210200341086a200210a480808000000b110020003502004101200110ad8080" + "80000b7902017f017e23808080800041306b220324808080800020032001360204" + "200320003602002003410236020c200341c882c080003602082003420237021420" + "03418380808000ad42208622042003ad8437032820032004200341046aad843703" + "202003200341206a360210200341086a200210a480808000000bec0203027f017e" + "037f23808080800041306b2203248080808000412721040240024020004290ce00" + "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" + "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" + "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" + "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" + "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" + "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" + "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" + "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" + "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" + "23808080800041206b220124808080800020002802182102200141106a20004110" + "6a290200370300200141086a200041086a2902003703002001200036021c200120" + "0236021820012000290200370300200110d880808000000bcb0501077f02400240" + "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" + "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" + "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" + "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" + "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" + "28021422012000280218220920082002200310b080808000450d0041010f0b2001" + "20042005200928020c11818080800080808080000f0b0240024002400240200028" + "0204220120064b0d00200028021422012000280218220920082002200310b08080" + "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" + "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" + "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" + "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" + "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" + "00202000200736021041000f0b200120042005200928020c118180808000808080" + "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" + "020b20072101410021070c010b20074101762101200741016a41017621070b2001" + "41016a210120002802102106200028021821092000280214210a02400340200141" + "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" + "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" + "020c11818080800080808080000d00410021010340024020072001470d00200720" + "07490f0b200141016a2101200a200620092802101182808080008080808000450d" + "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" + "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" + "200020032004200128020c11818080800080808080000b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c200341e485c08000360208200342023702142003418380808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" + "200028020022040d002003410171450d010b02402003410171450d00200120026a" + "210502400240200028020c22060d0041002107200121080c010b41002107410021" + "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" + "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" + "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" + "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" + "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" + "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" + "2007200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a02402002" + "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" + "0641002103024020012007460d004100210302402009417c4b0d00410021034100" + "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" + "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" + "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" + "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" + "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" + "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" + "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" + "41002108024020054104490d002004200d41f007716a2109410021082004210303" + "40200328020c2207417f7341077620074106767241818284087120032802082207" + "417f7341077620074106767241818284087120032802042207417f734107762007" + "4106767241818284087120032802002207417f7341077620074106767241818284" + "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" + "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" + "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" + "4107762003410676724181828408712103200c4101460d0220082802042207417f" + "7341077620074106767241818284087120036a2103200c4102460d022008280208" + "2208417f7341077620084106767241818284087120036a21030c020b024020020d" + "00410021060c030b2002410371210802400240200241044f0d0041002106410021" + "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" + "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" + "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" + "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" + "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" + "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" + "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" + "024020002d00200e0402000102020b20052103410021050c010b20054101762103" + "200541016a41017621050b200341016a2103200028021021092000280218210820" + "00280214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c118180" + "80800080808080000f0b0240200720012002200828020c11818080800080808080" + "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" + "016a21032007200920082802101182808080008080808000450d000b2003417f6a" + "2005490b140020012000280200200028020410b2808080000b1c00200028020020" + "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" + "306b2203248080808000200341033a002c2003412036021c410021042003410036" + "02282003200136022420032000360220200341003602142003410036020c024002" + "40024002400240200228021022050d00200228020c2200450d0120022802082101" + "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" + "0240200041046a2802002207450d00200328022020002802002007200328022428" + "020c11818080800080808080000d040b20012802002003410c6a20012802041182" + "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" + "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" + "41016a210420022802082109200228020021004100210603400240200041046a28" + "02002201450d00200328022020002802002001200328022428020c118180808000" + "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" + "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" + "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" + "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" + "02102003200b36020c200141046a280200210702400240024020012802000e0301" + "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" + "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" + "2802002003410c6a200128020411828080800080808080000d02200041086a2100" + "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" + "0020044103746a22012802002001280204200328022428020c1181808080008080" + "808000450d010b410121010c010b410021010b200341306a24808080800020010b" + "d70201057f2380808080004180016b220224808080800002400240024002402001" + "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" + "030b41ff00210303402002200322046a22052000410f712203413072200341d700" + "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" + "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" + "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" + "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" + "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" + "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" + "20024180016a24808080800020000b7902017f017e23808080800041306b220324" + "808080800020032000360200200320013602042003410236020c2003419886c080" + "00360208200342023702142003418380808000ad4220862204200341046aad8437" + "0328200320042003ad843703202003200341206a360210200341086a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" + "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" + "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" + "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" + "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" + "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" + "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" + "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" + "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" + "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" + "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" + "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" + "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" + "0010a280808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641a888c0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541b089c080003602302005420537023c20054182" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418480808000ad422086200541286aad843703582005418580808000ad42" + "2086200541246aad843703502005418380808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541f089c080003602302005420337023c2005" + "418280808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418380808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541d088c080003602302005420437023c2005418280" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" + "000d00200128021441d881c080004102200128021828020c118180808000808080" + "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111828080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111828080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11818080800080808080000d010b2004412720011182808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410de808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" + "400240024041c8031084808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" + "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "df80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" + "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" + "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" + "00200028020021002002410036022c2002428080808010370224200241033a0050" + "200241203602402002410036024c200241c0a0c080003602482002410036023820" + "0241003602302002200241246a3602440240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002400240" + "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" + "1314151617180b024002400240024020002d00040e0400010203000b2002200028" + "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" + "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" + "2900e4ccc08000370000200241143602602002200336025c200241143602582002" + "410336026c200241ccccc08000360268200242023702742002418680808000ad42" + "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" + "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" + "8080002103024020022802582204450d00200228025c20041082808080000b2003" + "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" + "013702742002418280808000ad422086200241086aad8437035820022003410274" + "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" + "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" + "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" + "0c190b20002802082203280200200241306a200328020428021011828080800080" + "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" + "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" + "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" + "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" + "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" + "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" + "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" + "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" + "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" + "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" + "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" + "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" + "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" + "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" + "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" + "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" + "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" + "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" + "6a200241246a41086a280200360200200220022902243703582002418380808000" + "36027c2002418380808000360274200241888080800036026c2002410436020c20" + "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" + "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" + "280218200241086a10b5808080002100024020022802582201450d00200228025c" + "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" + "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" + "00280204200028020810b2808080000b4b01017f02402000280200200028020822" + "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" + "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" + "8080800041106b2202248080808000200028020821032000280204210441012105" + "024020012802142206412220012802182207280210220811828080800080808080" + "000d000240024020030d0041002103410021000c010b410021094100210a200421" + "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" + "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" + "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" + "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" + "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" + "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" + "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" + "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" + "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" + "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" + "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" + "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" + "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" + "0d010240024020022d0004418001470d0020062002280208200811828080800080" + "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" + "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" + "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" + "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" + "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" + "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" + "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" + "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" + "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" + "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" + "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" + "200728020c11818080800080808080000d00200641222008118280808000808080" + "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" + "05200128021828020c11818080800080808080000b1e01017f0240200028020022" + "01450d00200028020420011082808080000b0b5301047f02402000280208220120" + "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" + "200441dc00460d0120044120490d012000200141016a220136020820022001470d" + "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" + "0210cf80808000200028020821030b200028020420036a2001200210df80808000" + "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" + "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" + "20026b21074100210503400240024002400240200220056a2d00002208c0220941" + "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" + "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" + "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" + "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" + "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" + "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" + "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" + "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" + "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" + "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" + "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" + "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" + "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" + "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" + "0520042802082108024041141084808080002203450d002003200836020c200341" + "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" + "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" + "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" + "41106a2480808080000b5901017f23808080800041106b22012480808080002001" + "41086a2000200028020041014101410110d4808080000240200128020822004181" + "80808078460d002000200128020c109580808000000b200141106a248080808000" + "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" + "8080000240024020022f01140d0002400240024002400240024020022f01162203" + "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" + "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" + "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" + "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" + "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" + "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" + "2205418080046a210302402001280200200128020822006b41034b0d0020012000" + "410410cf80808000200128020821000b2001200041046a36020820012802042000" + "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" + "002005410676413f71418001723a000220002003410c76413f71418001723a0001" + "410021000c070b200220002802002000280204200028020810838080800041002d" + "00c0cfc080001a200228020421012002280200210341141084808080002200450d" + "042000200336020c20004114360200200020013602100c060b200241086a200028" + "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" + "21012002280208210341141084808080002200450d032000200336020c20004114" + "360200200020013602100c050b200241173602142000200241146a10d080808000" + "21000c040b200241173602142000200241146a10d08080800021000c030b024002" + "4002402003418001490d0002402001280200200128020822046b41034b0d002001" + "2004410410cf80808000200128020821040b200128020420046a21002003418010" + "4f0d0120034106764140722106410221050c020b02402001280208220020012802" + "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" + "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" + "60722106410321050b200020063a00002001200420056a360208200020056a417f" + "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" + "206a24808080800020000b910301057f23808080800041106b2202248080808000" + "02400240024002402001280204220320012802082204490d000240200320046b41" + "034b0d0020012003360208200241086a2001280200200320031083808080004100" + "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" + "0d022001200436020c2001410436020020002001360204200120033602100c030b" + "2001200441046a220536020802402001280200220620046a22012d000141017441" + "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" + "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" + "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" + "001a200228020421032002280200210441141084808080002201450d0220012004" + "36020c2001410c36020020002001360204200120033602100c030b200020013b01" + "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" + "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" + "022480808080000240024002402001280208220320012802042204490d00200241" + "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" + "032002280208210441141084808080002201450d022001200436020c2001410436" + "02002000200136020420012003360210410121010c010b2000200128020020036a" + "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" + "5601017f23808080800041106b2203248080808000200341086a20002001200241" + "01410110d480808000024020032802082202418180808078460d00200220032802" + "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" + "106b2202248080808000200241086a200028020020002802042000280208108380" + "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" + "8080800022000d00000b2000200436020c20002001290200370200200020033602" + "10200041086a200141086a280200360200200241106a24808080800020000b1f00" + "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" + "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" + "00200320016a3602080b200241106a24808080800041000b820101017f02400240" + "024002402003280204450d000240200328020822040d002002450d0341002d00c0" + "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" + "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" + "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" + "8080800041206b2206248080808000024002400240200220036a220320024f0d00" + "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" + "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" + "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" + "20080d00410021020c010b2006200820056c36021c200620012802043602142004" + "21020b20062002360218200641086a20042009200641146a10d380808000024020" + "062802080d00200628020c21022001200736020020012002360204418180808078" + "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" + "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" + "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" + "017120024101746b413e6a21020b200042003702102000200236021c2002410274" + "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" + "00360200200020033602182000200036020c20002000360208410041002802e8d2" + "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" + "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" + "03034020042003411d764104716a41106a22052802002202450d02200341017421" + "032002210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b20052000" + "360200200020043602182000200036020c200020003602080b0b00200010d98080" + "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" + "024002400240024020002802040e020001020b20020d0141012102410021030c02" + "0b20020d00200028020022022802042103200228020021020c010b200141808080" + "80783602002001200036020c2001418980808000200028021c22002d001c20002d" + "001d10da80808000000b20012003360204200120023602002001418a8080800020" + "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" + "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" + "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" + "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" + "086a200020011183808080008080808000000b410041003a0094d3c08000200245" + "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" + "02402002450d000240034020002d0000220420012d00002205470d01200041016a" + "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" + "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" + "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" + "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" + "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" + "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" + "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" + "280200210803402005417c6a220520082003742001280200220820027672360200" + "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" + "210103402005417c6a220520012802003602002001417c6a210120042005490d00" + "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" + "036a210502402003450d0020002104200121080340200420082d00003a00002008" + "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" + "6a210402400240200120036a2206410371450d0020074101480d01200641037422" + "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" + "21080340200520082002762001280200220820037472360200200141046a210120" + "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" + "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" + "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" + "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" + "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" + "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" + "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" + "00410020006b41037122046a210502402004450d00200021032001210603402003" + "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" + "01480d012009410374220641187121022009417c71220a41046a2101410020066b" + "4118712104200a2802002106034020052006200276200128020022062004747236" + "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" + "092101034020052001280200360200200141046a2101200541046a22052003490d" + "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" + "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" + "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" + "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" + "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" + "0a000000150000004b000000450010000a000000160000004b0000004163636f75" + "6e7400450010000a0000001700000033000000450010000a000000180000003300" + "00006361706163697479206f766572666c6f770000009800100011000000616c6c" + "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" + "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" + "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" + "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" + "686520696e6465782069732000150110002000000035011000120000003a200000" + "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" + "7273006c0110001300000066000000170000003078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230323132" + "323233323432353236323732383239333033313332333333343335333633373338" + "333934303431343234333434343534363437343834393530353135323533353435" + "353536353735383539363036313632363336343635363636373638363937303731" + "373237333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939636f72652f7372632f66" + "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" + "000000a40900001a00000072616e676520737461727420696e64657820206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" + "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" + "10000000a202100022000000736c69636520696e64657820737461727473206174" + "202062757420656e64732061742000f4021000160000000a0310000d0000000101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000020202020202" + "020202020202020202020202020202020202020202020202030303030303030303" + "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" + "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" + "000e0000003b041000040000003f041000100000004f0410000100000062797465" + "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" + "7420697320696e7369646520202862797465732029206f66206000700410000b00" + "00007b04100026000000a104100008000000a9041000060000004f041000010000" + "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" + "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" + "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" + "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" + "002c0510001d0000000a0000002b00000000060101030104020507070208080902" + "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" + "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" + "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" + "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" + "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" + "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" + "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" + "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" + "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" + "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" + "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" + "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" + "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" + "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" + "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" + "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" + "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" + "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" + "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" + "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" + "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" + "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" + "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" + "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" + "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" + "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" + "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" + "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" + "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" + "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" + "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" + "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" + "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" + "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" + "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" + "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" + "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" + "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" + "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" + "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" + "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" + "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" + "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" + "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" + "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" + "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" + "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" + "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" + "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" + "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" + "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" + "0239010405010204011402160601013a0101020104080107030a021e013b010101" + "0c01090128010301370101030503010407020b021d013a01020102010301050207" + "020b021c02390201010204080109010a021d014801040102030101080151010207" + "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" + "0202021902040310040d01020206010f01000300031d021e021e02400201070801" + "020b09012d030101750222017603040209010603db0202013a0101070101010102" + "08060a0201301f310430070101050128090c022004020201033801010203010103" + "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" + "04010a200250020001030104011902050197021a120d012608190b2e0330010204" + "020227014306020202020c0108012f01330101030202050201012a020801ee0102" + "01040100010010101000020001e201950500030102050428030401a50200040002" + "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" + "090a0402015f0302010102060102019d010308150239020101010116010e070305" + "c308020301011701510102060101020101020102eb010204060201021b02550802" + "0101026a0101010206010165030204010500090102f5010a020101040190040202" + "0401200a280602040801090602032e0d010200070106010152160207010201027a" + "06030101020107010148020301010100020b023405050101010001060f00053b07" + "00013f0451010002002e0217000101030405080802071e0494030037043208010e" + "011605010f000701110207010201056401a00700013d04000400076d07006080f0" + "002f72757374632f63326637346333663932386165623530336631356234653965" + "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" + "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" + "0e10006000000071010000360000002f72757374632f6332663734633366393238" + "61656235303366313562346539656635373738653737663330353862382f6c6962" + "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" + "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" + "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" + "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" + "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" + "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" + "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" + "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" + "00181d10005f00000058020000300000000d0000000c000000040000000e000000" + "0f00000010000000000000000000000001000000110000006120446973706c6179" + "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" + "20756e65787065637465646c792f72757374632f63326637346333663932386165" + "6235303366313562346539656635373738653737663330353862382f6c69627261" + "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" + "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" + "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" + "207768696c652070617273696e67206120737472696e67454f46207768696c6520" + "70617273696e6720612076616c7565657870656374656420603a60657870656374" + "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" + "78706563746564206964656e7465787065637465642076616c7565657870656374" + "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" + "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" + "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" + "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" + "206120737472696e676b6579206d757374206265206120737472696e67696e7661" + "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" + "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" + "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" + "6164696e6720737572726f6761746520696e206865782065736361706574726169" + "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" + "70656374656420656e64206f662068657820657363617065726563757273696f6e" + "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" + "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" + "4826100001000000000000000000f03f0000000000002440000000000000594000" + "00000000408f40000000000088c34000000000006af8400000000080842e410000" + "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" + "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" + "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" + "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" + "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" + "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" + "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" + "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" + "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" + "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" + "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" + "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" + "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" + "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" + "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" + "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" + "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" + "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" + "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" + "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" + "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" + "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" + "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" + "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" + "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" + "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" + "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" + "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" + "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" + "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" + "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" + "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" + "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" + "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" + "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" + "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" + "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" + "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" + "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" + "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" + "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" + "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" + "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" + "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" + "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" + "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" + "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" + "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" + "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" + "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" + "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" + "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" + "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" + "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" + "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" + "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" + "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" + "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" + "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" + "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" + "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" + "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" + "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" + "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" + "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" + "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" + "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" + "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" + "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" + "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" + "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" + "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" + "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" + "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" + "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" + "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" + "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" + "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" + "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" + "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" + "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" + "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" + "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" + "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" + "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" + "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" + "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" + "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" + "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" + "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" + "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" + "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" + "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" + "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" + "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" + "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" + "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" + "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" + "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" + "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" + "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" + "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" + "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" + "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" + "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" + "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" + "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" + "64656466696c6520746f6f206c617267657265736f757263652062757379657865" + "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" + "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" + "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" + "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" + "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" + "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" + "0048261000010000006f7065726174696f6e207375636365737366756c10000000" + "1100000012000000100000001000000013000000120000000d0000000e00000015" + "0000000c0000000b00000015000000150000000f0000000e000000130000002600" + "00003800000019000000170000000c000000090000000a00000010000000170000" + "00190000000e0000000d00000014000000080000001b0000000e00000010000000" + "16000000150000000b000000160000000d0000000b000000130000005023100060" + "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" + "1000f8231000042410000f24100024241000392410004824100056241000692410" + "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" + "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" + "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" + "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" + "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" + "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" + "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" + "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" + "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" + "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" + "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" + "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" + "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" + "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" + "243137683533326265333033376461316237656445064a5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" + "70617273655f6964656e743137683663353964643731393635353139313045074b" + "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" + "4c54245224475424313270617273655f6e756d6265723137683738336134316134" + "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" + "73657269616c697a6572244c54245224475424313370617273655f646563696d61" + "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" + "70617273655f6578706f6e656e7431376833366464376462643233653461346562" + "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" + "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" + "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" + "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" + "346636345f66726f6d5f7061727473313768633863316239626161613836666637" + "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" + "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" + "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" + "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" + "24313670617273655f616e795f6e756d6265723137683931643533303465356139" + "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" + "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" + "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" + "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" + "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" + "61775f7665633139526177566563244c54245424432441244754243867726f775f" + "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" + "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" + "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" + "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" + "62653863353535633862636433353545143c5f5a4e357365726465326465375669" + "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" + "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" + "68616e646c655f6572726f72313768393762376462643066373264643738384516" + "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" + "35766973697431376838366238393638313662613130613765451781015f5a4e37" + "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" + "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" + "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" + "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" + "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" + "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" + "244754243976697369745f73747231376835356436653830653061376366383938" + "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" + "6363657373244c5424522447542424753230246173247532302473657264652e2e" + "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" + "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" + "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" + "4c54244b24432456244324412447542436696e7365727431376834643164623464" + "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" + "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" + "244b244324562443244124475424247532302461732475323024636f72652e2e6f" + "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" + "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" + "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" + "702e2e5061727469616c4571244754243265713137683162323138393234373831" + "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" + "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" + "475424247532302461732475323024636f72652e2e697465722e2e747261697473" + "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" + "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" + "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" + "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" + "6e646578244754243130696e6465785f696e746f31376864333238633634636161" + "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" + "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" + "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" + "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" + "63617061636974795f6f766572666c6f7731376834393964343832613965643537" + "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" + "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" + "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" + "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" + "70616e69636b696e673570616e6963313768303465656239313764643933633232" + "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" + "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" + "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" + "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "244754243133646973706f73655f6368756e6b3137683665306363636434353836" + "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" + "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" + "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" + "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" + "2475323024666f7224753230247533322447542433666d74313768626633653032" + "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" + "70616e69635f626f756e64735f636865636b313768336436623861613463383034" + "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" + "363431376864353231666136656636613036373261452e11727573745f62656769" + "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" + "327061645f696e74656772616c3137686334656130376130626331333536633445" + "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" + "656772616c313277726974655f7072656669783137686139613433323830623630" + "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" + "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" + "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" + "706164313768343736396165333839333734636335314533495f5a4e34345f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" + "706c61792447542433666d74313768376666346430623836303963323437324534" + "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" + "2e666d742e2e44656275672447542433666d743137683361366261613162623437" + "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" + "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" + "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" + "3024666f7224753230247533322447542433666d74313768353533393862313635" + "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" + "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" + "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" + "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" + "6275675f657874313768656366613566303431373437393039384539345f5a4e34" + "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" + "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" + "6963655f6572726f725f6661696c31376862303364323439386438646362363433" + "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" + "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" + "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" + "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" + "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" + "656275672447542433666d7431376865613566643964626339343936626665453e" + "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" + "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" + "30246933322447542433666d743137686365643930633761363339633031646445" + "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" + "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" + "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" + "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" + "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" + "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" + "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" + "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" + "3130696e736572745f666974313768633861306366353339656666303131314541" + "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" + "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" + "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" + "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" + "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" + "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" + "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768343032353764366634326532" + "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" + "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" + "61792447542433666d74313768636534323236616131663732366331634544615f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" + "74655f73747231376835393964396535373839343664643938452e31393245575f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768623637326562313939633335643138364546555f5a4e35335f244c542463" + "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768663761653238353562323439" + "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" + "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" + "313768376236353738393966393837353963624548475f5a4e313073657264655f" + "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" + "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" + "616c6c6f63337665633136566563244c5424542443244124475424313765787465" + "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" + "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" + "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" + "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" + "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" + "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" + "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" + "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" + "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" + "6f64655f6865785f65736361706531376834376265353936383535663830346461" + "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" + "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" + "63377261775f7665633230526177566563496e6e6572244c542441244754243772" + "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" + "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" + "3472656164356572726f7231376865663535323764333333633963323666455130" + "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" + "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" + "666d742e2e577269746524475424313077726974655f6368617231376832313433" + "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" + "766563313166696e6973685f67726f773137683533383539626133383962373164" + "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" + "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" + "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" + "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" + "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" + "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" + "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" + "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" + "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" + "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" + "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" + "75376424247537642431376865313761333937376638396331313738455a3b5f5a" + "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" + "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" + "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" + "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" + "61735f73747231376865623366373232643232346534326638455c066d656d636d" + "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" + "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" + "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" + "2e726f6461746100550970726f64756365727302086c616e677561676501045275" + "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" + "6768746c79202863326637346333663920323032342d30392d30392900490f7461" + "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const zkProofHex = + "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" + "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" + "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" + "057f7f7f7f7f017f60057f7e7e7e7e00038c018a01030402030202020302" + "030505030206020601000006010606070303080202020302090208020202" + "030a0806020a030b06060202030302020303030203030203020202010302" + "030203060a02000202080a020c0807010d02030206060102020803080302" + "030202020a02060303020a03020301010a0d030101010001010301020604" + "0a0a020200000e000004050170010e0e05030100110619037f01418080c0" + "000b7f0041bd97c0000b7f0041c097c0000b075d06066d656d6f72790200" + "08616c6c6f63617465001b13646573657269616c697a655f67315f776173" + "6d001c1462656c6c6d616e5f67726f746831365f7465737400210a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020914010041010b" + "0d15767778717e830111547d137a7b0ad6f3048a014b01017f0240024002" + "4020010d00410021010c010b2002450d01200120026e2203200320026c20" + "01476a21010b2000200136020820004101360204200020013602000f0b10" + "8180808000000b4701017f23808080800041206b22002480808080002000" + "41003602182000410136020c200041e090c0800036020820004204370210" + "200041086a41fc82c0800010a480808000000b0f002000200141e8001083" + "808080000b170002402000450d002001200020026c108d808080000b0b0e" + "002000200141011083808080000b0f002000200141a0021083808080000b" + "0e002000200141201083808080000b4201017f0240200028020822032000" + "280200470d00200020021088808080000b2000280204200341e8006c6a20" + "0141e8001086818080001a2000200341016a3602080b5a01017f23808080" + "800041106b2202248080808000200241086a20002000280200410141e800" + "108b80808000024020022802082200418180808078460d00200020022802" + "0c2001108c80808000000b200241106a2480808080000b6401027f238080" + "80800041106b2203248080808000200341086a20024101410141f081c080" + "00108a8080800020032802082104200328020c2001200210868180800021" + "01200020023602082000200136020420002004360200200341106a248080" + "8080000b6401017f23808080800041106b2205248080808000200541046a" + "200120022003108e8080800020052802082103024020052802040d002000" + "200528020c36020420002003360200200541106a2480808080000f0b2003" + "200528020c2004108c80808000000bfd0102037f017e2380808080004110" + "6b22052480808080004100210602400240200220036a22032002490d0020" + "0441076a417871ad2001280200220741017422022003200220034b1b2202" + "4104200241044b1b2203ad7e2208422088a70d002008a7220241f8ffffff" + "074b0d01024002402007450d00024020040d00200541086a4108200210d7" + "80808000200528020821040c020b2001280204200720046c200210cb8080" + "800021040c010b20054108200210d780808000200528020021040b024020" + "040d00410821060c020b2001200336020020012004360204418180808078" + "21060b0b2000200236020420002006360200200541106a2480808080000b" + "1200024020000d00200210cf808080000b000b6c01027f02400240200041" + "7c6a2802002202417871220341044108200241037122021b20016a490d00" + "02402002450d002003200141276a4b0d020b200010c9808080000f0b41e9" + "92c08000419893c0800010ca80808000000b41a893c0800041d893c08000" + "10ca80808000000bc70103017f017e017f23808080800041106b22042480" + "8080800002400240200220036a417f6a410020026b71ad2001ad7e220542" + "2088a70d002005a7220341808080807820026b4b0d00024020030d002000" + "200236020841002102200041003602040c020b200441086a2002200310d7" + "80808000024020042802082206450d002000200636020820002001360204" + "410021020c020b2000200336020820002002360204410121020c010b2000" + "4100360204410121020b20002002360200200441106a2480808080000b88" + "0303017f097e017f23808080800041306b22022480808080002002420042" + "002001290330220342abd5feffffffbfffb97f56ad7d2204200129033822" + "057d220642ffffcf8aebffffd51e7c220720052003842001290340220884" + "20012903482209842001290350220a842001290358220b8450220c1b3703" + "082002420042abd5feffffffbfffb97f20037d200c1b3703002002420020" + "042004200554ad7d2007200654ad7c423f87220320087d220442a4ecc3b5" + "8fd4b498e7007c2205200c1b3703102002420020032003200854ad7d2005" + "200454ad7c423f87220320097d220442bfa5949ccff0d2bbe4007c220520" + "0c1b3703182002420020032003200954ad7d2005200454ad7c423f872203" + "200a7d220442d7d9ae9ae4f6e98dcb007c2205200c1b3703202002420020" + "032003200a54ad7d2005200454ad7c423f87200b7d429acdffcba3bdc480" + "1a7c200c1b370328200041306a200241e086c0800020012d0060220c1090" + "80808000200020014130108681808000200c3a0060200241306a24808080" + "80000b9e0101027e20002002290328200129032822048542002003ad42ff" + "01837d220583200485370328200020022903202001290320220485200583" + "200485370320200020022903182001290318220485200583200485370318" + "200020022903102001290310220485200583200485370310200020022903" + "082001290308220485200583200485370308200020022903002001290300" + "2204852005832004853703000bec0201057f23808080800041c0006b2202" + "248080808000410121030240200128021c2204418082c080004111200128" + "0220220528020c220611808080800080808080000d000240024020012d00" + "144104710d0041012103200441fa8ec08000410120061180808080008080" + "8080000d02200141e091c080004102109280808000450d010c020b200441" + "fb8ec080004102200611808080800080808080000d014101210320024101" + "3a0017200241186a41086a200141086a290200370300200241186a41106a" + "200141106a290200370300200241186a41186a200141186a280200360200" + "2002200536020c20022004360208200241dc8ec080003602382002200129" + "02003703182002200241176a3602102002200241086a360234200241186a" + "41e091c0800041021092808080000d01200241086a41f88ec08000410210" + "93808080000d010b200441ec8cc080004101200611808080800080808080" + "0021030b200241c0006a24808080800020030bbf0b010b7f024002400240" + "200028020022032000280208220472450d0002402004410171450d002001" + "20026a210502400240200028020c22060d0041002107200121080c010b41" + "00210741002109200121080340200822042005460d020240024020042c00" + "002208417f4c0d00200441016a21080c010b0240200841604f0d00200441" + "026a21080c010b0240200841704f0d00200441036a21080c010b20044104" + "6a21080b200820046b20076a21072006200941016a2209470d000b0b2008" + "2005460d00024020082c00002204417f4a0d0020044160491a0b02400240" + "2007450d00024020072002490d0020072002460d01410021040c020b2001" + "20076a2c000041404e0d00410021040c010b200121040b2007200220041b" + "21022004200120041b21010b024020030d00200028021c20012002200028" + "022028020c11808080800080808080000f0b2000280204210a0240200241" + "10490d0020022001200141036a417c7122076b22096a220b410371210341" + "00210641002104024020012007460d004100210402402009417c4b0d0041" + "0021044100210503402004200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c0000" + "41bf7f4a6a2104200541046a22050d000b0b200121080340200420082c00" + "0041bf7f4a6a2104200841016a2108200941016a22090d000b0b02402003" + "450d002007200b417c716a22082c000041bf7f4a210620034101460d0020" + "0620082c000141bf7f4a6a210620034102460d00200620082c000241bf7f" + "4a6a21060b200b4102762105200620046a21060340200721032005450d04" + "200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002003200d41f007716a210941002108200321040340" + "200428020c2207417f734107762007410676724181828408712004280208" + "2207417f7341077620074106767241818284087120042802042207417f73" + "41077620074106767241818284087120042802002207417f734107762007" + "4106767241818284087120086a6a6a6a2108200441106a22042009470d00" + "0b0b2005200b6b21052003200d6a2107200841087641ff81fc0771200841" + "ff81fc07716a418180046c41107620066a2106200c450d000b2003200b41" + "fc01714102746a22082802002204417f7341077620044106767241818284" + "08712104200c4101460d0220082802042207417f73410776200741067672" + "41818284087120046a2104200c4102460d0220082802082208417f734107" + "7620084106767241818284087120046a21040c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d004100210641002109" + "0c010b41002106200121042002410c71220921070340200620042c000041" + "bf7f4a6a200441016a2c000041bf7f4a6a200441026a2c000041bf7f4a6a" + "200441036a2c000041bf7f4a6a2106200441046a21042007417c6a22070d" + "000b0b2008450d02200120096a21040340200620042c000041bf7f4a6a21" + "06200441016a21042008417f6a22080d000c030b0b200028021c20012002" + "200028022028020c11808080800080808080000f0b200441087641ff811c" + "71200441ff81fc07716a418180046c41107620066a21060b02400240200a" + "20064d0d00200a20066b2105024002400240410020002d00182204200441" + "03461b22040e03020001020b20052104410021050c010b20054101762104" + "200541016a41017621050b200441016a2104200028021021092000280220" + "2108200028021c210703402004417f6a2204450d02200720092008280210" + "1181808080008080808000450d000b41010f0b200028021c200120022000" + "28022028020c11808080800080808080000f0b0240200720012002200828" + "020c1180808080008080808000450d0041010f0b41002104034002402005" + "2004470d0020052005490f0b200441016a21042007200920082802101181" + "808080008080808000450d000b2004417f6a2005490bdf04010c7f200141" + "7f6a21032000280204210420002802002105200028020821064100210741" + "002108410021094100210a02400340200a4101710d010240024020092002" + "4b0d000340200120096a210a0240024002400240200220096b220b41074b" + "0d0020022009470d01200221090c050b02400240200a41036a417c71220c" + "200a6b220d450d00410021000340200a20006a2d0000410a460d05200d20" + "0041016a2200470d000b200d200b41786a220e4d0d010c030b200b41786a" + "210e0b03404180828408200c2802002200418a94a8d000736b2000724180" + "828408200c41046a2802002200418a94a8d000736b200072714180818284" + "7871418081828478470d02200c41086a210c200d41086a220d200e4d0d00" + "0c020b0b410021000340200a20006a2d0000410a460d02200b200041016a" + "2200470d000b200221090c030b0240200d200b470d00200221090c030b20" + "0a200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d" + "0000410a460d01200b200041016a2200470d000b200221090c030b200020" + "0d6a21000b200020096a220c41016a21090240200c20024f0d00200a2000" + "6a2d0000410a470d004100210a2009210d200921000c030b200920024d0d" + "000b0b20082002460d024101210a2008210d200221000b0240024020062d" + "0000450d00200541f48ec080004104200428020c11808080800080808080" + "000d010b200020086b210b4100210c024020002008460d00200320006a2d" + "0000410a46210c0b200120086a21002006200c3a0000200d210820052000" + "200b200428020c1180808080008080808000450d010b0b410121070b2007" + "0ba80101017f23808080800041306b220424808080800020042003360208" + "20042002360204200420012d00c80122033a000f024020034101460d0020" + "04420137021c200441013602142004419482c08000360210200441818080" + "800036022c2004200441286a3602182004200441046a3602282004410f6a" + "41c886c08000200441106a419c82c08000109680808000000b2000200141" + "c8011086818080001a200441306a2480808080000b140020012000280200" + "20002802041092808080000b4401017f23808080800041106b2204248080" + "8080002004200136020c20042000360208200441086a41b886c080002004" + "410c6a41b886c080002002200310d380808000000ba70101017f23808080" + "800041306b22042480808080002004200336020820042002360204200420" + "012d006822033a000f024020034101460d002004420137021c2004410136" + "02142004419482c08000360210200441818080800036022c200420044128" + "6a3602182004200441046a3602282004410f6a41c886c08000200441106a" + "419c82c08000109680808000000b2000200141e8001086818080001a2004" + "41306a2480808080000b45000240024020042003490d0020022004490d01" + "2000200420036b3602042000200120036a3602000f0b2003200420051099" + "80808000000b200420022005109a80808000000b0f0020002001200210fc" + "80808000000b0f0020002001200210f580808000000b4001017f23808080" + "800041106b2201248080808000200141086a200041014101419883c08000" + "108a80808000200128020c2100200141106a24808080800020000b9a0101" + "017f23808080800041b0016b2202248080808000200241086a2001280204" + "20012802084100413041a883c080001098808080000240200228020c4130" + "460d00200241106a41b883c08000109d80808000000b20024180016a2002" + "28020841301089818080001a200241106a20024180016a109e8080800020" + "00200241106a41c883c080004118109780808000200241b0016a24808080" + "80000b970101017f23808080800041c0006b22022480808080002002412b" + "36020c200241f880c08000360208200241e880c080003602142002200036" + "02102002410236021c200241cc8ec0800036021820024202370224200241" + "8280808000ad422086200241106aad843703382002418380808000ad4220" + "86200241086aad843703302002200241306a360220200241186a200110a4" + "80808000000ba50801077f23808080800041c0086b220224808080800020" + "012d0000220341077610a3808080002104200341067641017110a3808080" + "002105200341057641017110a3808080002106200241a0066a2001413010" + "86818080001a200220022d00a006411f713a00a006200241e8006a200241" + "a0066a10dc80808000200241b0076a410041301085818080001a200241c0" + "026a200241b0076a200241e8006a20022d00980122071090808080002002" + "4190056a10a8808080002002200520047110a380808000200610d2808080" + "007110a380808000200241c0026a10a9808080007110a38080800022013a" + "00f805200110d2808080002108200241a0066a200241c0026a10bd808080" + "0020024180046a200241a0066a200241c0026a10a780808000200241e007" + "6a20024180046a418089c0800010b98080800020024180046a200241e007" + "6a41c087c0800010df80808000200241a0066a20024180046a10bd808080" + "00200241a0066a200241e0076a10db808080002103200241f0026a200241" + "80046a41301086818080001a200220033a00a00320024100413010858180" + "800022024190086a2002200241f0026a2003109080808000200241a0066a" + "20024190086a10b28080800020024180046a41306a20024190086a200241" + "a0066a200620024190086a10de808080007310a380808000109080808000" + "20024180046a200241c0026a41301086818080001a20032004200510d280" + "8080007110a3808080007110a3808080002103200241a0066a2002418004" + "6a41e0001086818080001a200220033a008807200220053a008007200241" + "d0016a20024190056a200241a0066a200810aa8080800020022007200120" + "03200173410020086b71737110a3808080003a00b802200241e8006a10a8" + "808080002002200241e8006a200241d0016a20022d00b802220310aa8080" + "8000200241a0066a200210a58080800020024190056a200241a0066a10e4" + "8080800020024180046a20024190056a10e480808000200241f0026a2002" + "4180046a10e58080800020024190056a200241e8001086818080001a2002" + "4190056a41b089c0800010dd80808000200241a0066a20024190056a10a5" + "80808000200241b0076a200241f0026a200241a0066a41e0006a220510a7" + "80808000200241e0076a200241a0066a200241f0026a41e0006a220110a7" + "8080800020024190086a200241f0026a41306a200510a780808000200241" + "80046a200241a0066a41306a200110a7808080002003200110a980808000" + "2201200510a98080800022057110a380808000200110d280808000200510" + "d2808080007110a380808000200241b0076a200241e0076a10db80808000" + "7110a38080800020024190086a20024180046a10db808080007110a38080" + "80007210a3808080007110a38080800021052000200241e8001086818080" + "0020053a0068200241c0086a2480808080000b970101017f238080808000" + "41c0026b2203248080808000200341086a20012002410041e00041e083c0" + "80001098808080000240200328020c41e000460d00200341106a41f083c0" + "8000109d80808000000b200341e0016a200328020841e000108981808000" + "1a200341106a200341e0016a10a0808080002000200341106a41c883c080" + "004118109480808000200341c0026a2480808080000bff1d02137f017e23" + "808080800041a0276b220224808080800020012d0000220341077610a380" + "8080002104200341067641017110a3808080002105200341057641017110" + "a380808000210620024180106a200141301086818080001a200220022d00" + "8010411f713a008010200241a0216a20024180106a10dc80808000200241" + "80226a200141306a10dc80808000200241e01f6a41004130108581808000" + "1a200241801f6a200241e01f6a200241a0216a20022d00d0212207109080" + "80800020022d00b0222101200241c0206a410041301085818080001a2002" + "41e0226a200241c0206a20024180226a2001109080808000200241e0226a" + "41306a200241801f6a41301086818080001a200241e00d6a10e780808000" + "2002200520047110a380808000200610d2808080007110a3808080002002" + "41e0226a10e0808080007110a38080800022033a00a80f200310d2808080" + "00210820024180106a200241e0226a10ba80808000200241c00b6a200241" + "80106a200241e0226a10b380808000200241c0236a200241c00b6a41e089" + "c0800010bc80808000200241c0236a10e08080800021032002410041e000" + "108581808000220220033a0060200310d2808080002109200241a0246a20" + "0241c0236a41a088c0800010e38080800020024180106a200241a0246a10" + "ba8080800020024180256a20024180106a200241c0236a10b38080800020" + "0241e0256a200241a0246a200241c0236a10b38080800020024180106a20" + "0241e0256a41306a10b28080800020024180106a41306a200241e0256a41" + "30108681808000210a200241d0016a41306a410041301085818080001a20" + "0241d0016a41e086c0800041301086818080001a200241c0266a200241d0" + "016a10e28080800020024180256a200241c0266a10c28080800021032002" + "41c00b6a20024180106a41e0001086818080001a200220033a00a00c2003" + "10d280808000210b200a41004130108581808000210320024180106a41e0" + "86c0800041301086818080001a20024180076a20024180256a2002418010" + "6a10bc8080800020024198036a20024180076a41d088c0800010e3808080" + "0020024180106a20024198036a200241e0256a10b3808080002002410110" + "a3808080003a00e01020024180076a200241c00b6a20024180106a200b10" + "da80808000200241c00b6a410041e0001085818080001a20024198036a20" + "0241c00b6a20024180076a20022d00e007220a10b0808080002002418010" + "6a20024198036a10ba80808000200a20024180106a200241c0236a10c280" + "8080007110a380808000210a20024180106a20024198036a41e000108681" + "8080001a2002200a3a00e01020024180076a200220024180106a200910da" + "808080002002410041e00010858180800022024198036a20022002418007" + "6a20022d00e007220910b08080800020024180106a20024198036a10e280" + "808000200241c00b6a41e0006a220b20024198036a20024180106a200620" + "024198036a41306a220a10de80808000200a10a98080800020024198036a" + "10de808080007110a3808080007210a3808080007310a38080800010b080" + "808000200241c00b6a200241e0226a41e0001086818080001a2009200420" + "0510d2808080007110a3808080007110a380808000210420024180106a20" + "0241c00b6a41c0011086818080001a200220043a00c811200220053a00c0" + "11200241c00b6a200241e00d6a20024180106a200810d980808000200120" + "0420022d00a80f220573410020086b712005737110a38080800021012002" + "200241c00b6a41c801108681808000220241cc016a200241c00b6a41cc01" + "6a280000360000200220022800890d3600c9012002200120077110a38080" + "8000220c3a00c80120024198036a10e780808000200241d0016a20024198" + "036a2002200c10d980808000200241e0046a200241d0016a10e880808000" + "200241c00b6a410041301085818080001a200242ba8a92abf1a7dbf21437" + "03980c200242e8a0ee96fe89bcf2143703900c200242a4a0a0f4c7f1c686" + "a27f3703880c200242acfced84e38c82c4d0003703800c200242d5cb9694" + "b3cac8f92a3703f80b200242c38bd5b3c8bcf286897f3703f00b200242d2" + "8ff6dfdbdddf950e3703b80e2002429df8bab6e9ac96d12d3703b00e2002" + "42a7a9d3d3fd9088e5513703a80e200242f1fdbada86bba3842f3703a00e" + "200242fcfcc9d492d8f78b5c3703980e200242da9f8cd5a5f4e9e7fb0037" + "03900e200242c8bd89ecc7dfe4ea0b3703880e200242b9e1f3e3fac9d3bc" + "1d3703800e20024298fcc0c8d1dfcad6927f3703f80d200242b2ee88db88" + "999194383703f00d200242838386b6d8a788cac2003703e80d200242d1b5" + "f2aada8bd6973e3703e00d2003200241e0046a41306a10b2808080002002" + "4180106a200241e0046a41301086818080001a20024180076a2002418010" + "6a200241c00b6a10b3808080002003200241f0056a10b280808000200241" + "80106a200241e0046a41e0006a220141301086818080001a20024180076a" + "41e0006a220d20024180106a200241e00d6a10b3808080002003200241d0" + "066a10b28080800020024180106a200241e0046a41c0016a220541301086" + "818080001a20024180076a41c0016a20024180106a41e000108681808000" + "210e2003410041301085818080001a20024180106a41e086c08000413010" + "86818080001a200241a0096a410041e0001085818080001a200241a0096a" + "41e0006a20024180106a41e0001086818080002109200241a0096a41c001" + "6a410041e000108581808000210a200241c0266a41306a210f2002418010" + "6a41e0006a2110200241e00d6a41e0006a211120024180106a41c0016a21" + "12200241c00b6a41c0016a2113200241e00d6a41c0016a21144280808280" + "8080a080e9002115024003402015500d01200241e0196a200110ba808080" + "00200241c01a6a200241e0196a200241e0196a10bc80808000200241a01b" + "6a200241c01a6a200241c01a6a10bc80808000200241801c6a200241a01b" + "6a200241a01b6a10bc80808000200241e01c6a2001200510b38080800020" + "0241c01d6a200510ba80808000200241a01e6a200241c01d6a41c08ac080" + "0010b380808000200241801f6a200241a01e6a200241801c6a10b3808080" + "00200241e01f6a200241e0196a200241a01e6a10bc80808000200241c020" + "6a200241e01c6a200241801c6a10b380808000200241a0216a200241a01e" + "6a200241a01e6a10bc8080800020024180226a200241a0216a200241a01e" + "6a10bc80808000200241e0226a200241e0196a20024180226a10bb808080" + "00200241c0236a200241e0226a200241e01f6a10b380808000200241a024" + "6a200241801f6a200241c0236a10bc8080800020024180256a200241e004" + "6a200110b380808000200241e0256a200241e0226a20024180256a10b380" + "808000200241e00d6a200241e0256a200241e0256a10bc80808000201120" + "0241a0246a41e00010868180800021082014200241c0206a41e000108681" + "8080002107200f410041301085818080001a200241c0266a41e086c08000" + "41301086818080001a20024180106a410041e0001085818080001a201020" + "0241c0266a41e00010868180800021042012410041e00010858180800021" + "06200241c00b6a200241e00d6a20024180106a200510e080808000220310" + "b080808000200b20082004200310b080808000201320072006200310b080" + "808000200241e0046a200241c00b6a41a0021086818080001a0240201542" + "0183500d00200241a0126a200241a0096a200241e0046a10b38080800020" + "024180136a2009200110b380808000200241e0136a200a200510b3808080" + "00200241c0146a200241a0096a200910bc80808000200241a0156a200241" + "e0046a200110bc8080800020024180166a200241c0146a200241a0156a10" + "b380808000200241e0166a200241a0126a20024180136a10bc8080800020" + "0241c0176a20024180166a200241e0166a10bb80808000200241a0186a20" + "09200a10bc8080800020024180196a2001200510bc80808000200241e019" + "6a200241a0186a20024180196a10b380808000200241c01a6a2002418013" + "6a200241e0136a10bc80808000200241a01b6a200241e0196a200241c01a" + "6a10bb80808000200241801c6a200241a0096a200a10bc80808000200241" + "e01c6a200241e0046a200510bc80808000200241c01d6a200241801c6a20" + "0241e01c6a10b380808000200241a01e6a200241a0126a200241e0136a10" + "bc80808000200241801f6a200241c01d6a200241a01e6a10bb8080800020" + "0241e01f6a200241a0126a200241a0126a10bc80808000200241c0206a20" + "0241e01f6a200241a0126a10bc80808000200241a0216a200241e0136a41" + "c08ac0800010b38080800020024180226a20024180136a200241a0216a10" + "bc80808000200241e0226a20024180136a200241a0216a10bb8080800020" + "0241c0236a200241801f6a41c08ac0800010b380808000200241a0246a20" + "0241a01b6a200241c0236a10b38080800020024180256a200241c0176a20" + "0241e0226a10b38080800020024180106a20024180256a200241a0246a10" + "bb80808000200241e0256a200241c0236a200241c0206a10b38080800020" + "0241c0266a200241e0226a20024180226a10b3808080002004200241c026" + "6a200241e0256a10bc80808000200241c00b6a200241c0206a200241c017" + "6a10b380808000200241e00d6a20024180226a200241a01b6a10b3808080" + "002006200241e00d6a200241c00b6a10bc80808000200241a0096a200241" + "80106a41a0021086818080001a0b201542018821150c000b0b2002418010" + "6a41e0006a200910e28080800020024180106a41c0016a200a41e0001086" + "818080001a20024180106a200241a0096a41e0001086818080001a200241" + "a0096a20024180106a41a0021086818080001a200241c0266a2002418007" + "6a200241a0096a41c0016a220110b380808000200241c00b6a200241a009" + "6a200e10b380808000200241e00d6a200d200110b3808080002002418010" + "6a200241a0096a41e0006a200e10b380808000200e10e080808000220520" + "0110e08080800022017110a380808000200510d280808000200110d28080" + "80007110a380808000200241c0266a200241c00b6a10c2808080007110a3" + "80808000200241e00d6a20024180106a10c2808080007110a38080800072" + "10a380808000200c7110a38080800021012000200241d0016a41c8011086" + "8180800020013a00c801200241a0276a2480808080000ba0d50103097f25" + "7e347f23808080800041e0ec006b2200248080808000200042d2b4bbf88c" + "a0d28d053700f40c2000428dcfdee5fd81c2bb0c3700ec0c200042afbed3" + "efd9fc81acea003700e40c20004283c4c699c3e0e5bf313700dc0c200042" + "869e99a9baa4ebe5e5003700d40c2000428dbfe3e0ae86d0a7b27f3700cc" + "0c200042908484d9e8fa99f80e3700c40c2000428bdfe7adc3a8cae04f37" + "00bc0c200042d687f295e888f880cd003700b40c20004281ddcf86b5f2d0" + "cf633700ac0c200042aef2a7aaae91d5accb003700a40c200042eb8fbebf" + "aee5caf4967f37009c0c200042b9b3d69fbf86ace8bb7f3700940c200042" + "d4fa86d5a0e3d296a87f37008c0c200042c5eddc9291a0c9e3a27f370084" + "0c2000428594fecef0de91d0643700fc0b20004289ae81b0d7a1feb5d300" + "3700f40b200042d4f18391eaffb8ed2e3700ec0b2000428cc8d9c6afddd3" + "d2ca003700e40b200042bca4908cdbc4caa54e3700dc0b200042b9cfe7bf" + "d99fbcbd563700d40b200042a4f788c3999fcac2c6003700cc0b200042b7" + "93c2cbbcbec3ee8e7f3700c40b200042a188aeeaaf8e90ba9b7f3700bc0b" + "200042c1fb969fd3cb97a0f5003700b40b200042ff9ce790fc9fe0fa6837" + "00ac0b200042b2dcb096dfcda7b9293700a40b200042a9e3f3c0c2c5cf85" + "2a37009c0b200042ad95c395bdd085ec393700940b200042c1f0c9e1f6d5" + "88e04537008c0b200042cfe1a7fed79ab1b2da003700840b200042d38490" + "85a5b6dff17d3700fc0a200042daf4a7a781f39dc7f8003700f40a200042" + "b88d9b949dd3aa86713700ec0a20004286b08ace96d5b8e0493700e40a20" + "0042e291f4f2d7e689e0443700dc0a200042c188fdead38de5d7f1003700" + "d40a200042fec2c2f2fb858b84283700cc0a200042fe8ebfddfaafafefec" + "003700c40a20004291f5b996b996cbc8bf7f3700bc0a200042b497cfc0d9" + "e3f284043700b40a2000428c9691f2e7bca4ec2d3700ac0a20004287e0c3" + "c29eccb3d21c3700a40a200042c8bbf68fceb0ad9eda0037009c0a200042" + "85c5e3e89284a997fd003700940a20004297bd8ec1effea3935437008c0a" + "200042eea8f8adc2cdbed9bb7f3700840a200042f5a3a4828bfd9ac1ac7f" + "3700fc09200042a087bbac98e0e282827f3700f4092000429a8683e6d8cc" + "ddd7113700ec09200042f0e1a982ee8890e33b3700e40920004286f6f2ba" + "80bf8bc3d5003700dc0920004297cfaad29bac9ec8243700d409200042c9" + "d3b292ffc082e01e3700cc09200042a9a3ffacc691beef6a3700c4092000" + "42a2d1f7c2ff94dce2543700bc09200042c78cfef2b8eabef8713700b409" + "20004286edaddda1fbf6baa37f3700ac09200042fdddbb9dedd1e9ef3337" + "00a409200042c6b2d8f2a9dae59d9f7f37009c09200042b59fb2d0b3e4cf" + "e32337009409200042c5c8c2fe9f869487c00037008c09200042ee91eb8f" + "c9a9c69cd1003700840920004283afa5ac9ded86b7253700fc08200042be" + "b9e4bccb88c99f3c3700f408200042c4d7d7c08b8db9e7f5003700ec0820" + "0042bf948bc7d7b1b0fcc1003700e4082000429a9ed5eea2d281c0e70037" + "00dc08200042acf185b19c87b3c3dd003700d40820004294bcf3c5dec192" + "ebb67f3700cc082000429db89ddb8fc9add13b3700c408200042e99baac8" + "a8faa582817f3700bc08200042daccdaad88c1f9b35b3700b408200042b5" + "d48be3dada8f8b223700ac08200042bdfdafd8a0e7aee4d8003700a40820" + "0042b9a7fddeeba08a8a3e37009c08200042e893cdd1ffdb94af08370094" + "08200042b58bef84d587bf842937008c08200042f4d8c597c3f6bd9f5a37" + "008408200042b3ccedc1b3d5cb987f3700fc07200042e0a38ecbbad9b6b8" + "b97f3700f407200042918cc8bfb089f7ab2f3700ec07200042dca8f8e4f3" + "82aee38f7f3700e407200042a3bfc29bc5d8edebca003700dc072000428e" + "81e4d981f589f1283700d40720004296f48083b9fcdab5b67f3700cc0720" + "0042cf938386a9d3d78a023700c4072000429687f1eff8ebacafef003700" + "bc072000429ef0afffc392fc88163700b407200042dbcda6cadfc8f38797" + "7f3700ac07200042cec2c1f9b5a7ec8e773700a407200042a5c192ecc6ad" + "99ef8f7f37009c07200042fd908df7cd8eeaab1837009407200042b18585" + "d2b981fac47637008c072000428af4e7cfa4fac8c4d70037008407200042" + "d6e7eeadc1c4f395a07f3700fc06200042a394d5b790978ebcec003700f4" + "0620004284f5dcaa92b5c09f663700ec06200042dcbedda48ae58eebe000" + "3700e406200042ac8bc7ea9baff0cf1b3700dc06200041940d6a42003700" + "002000418c0d6a4200370000200041840d6a4200370000200042003700fc" + "0c2000419c0d6a200041dc066a4130108980808000200041a80d6a200041" + "9c0d6a109c80808000200041940e6a200041dc066a41306a413010898080" + "8000200041a00e6a200041940e6a109c808080002000418c0f6a200041dc" + "066a41e0006a41e000108980808000200041980f6a20002802900f200028" + "02940f109f80808000200041e4106a2000419c086a41e000108980808000" + "200041f0106a20002802e81020002802ec10109f80808000200041bc126a" + "200041fc086a4130108980808000200041c8126a200041bc126a109c8080" + "8000200041b4136a200041ac096a41e000108980808000200041c0136a20" + "002802b81320002802bc13109f8080800020004188156a2000418c0a6a41" + "900110898080800020004194156a41086a22014100360200200042808080" + "80800137029415200041d0066a200028028c152202200028029015220341" + "004130418084c08000109880808000200041a0156a20002802d006200028" + "02d406108980808000200041b0156a200041a0156a109c80808000200041" + "94156a200041b0156a419084c08000108780808000200041c8066a200220" + "03413041e00041a084c08000109880808000200041b0156a20002802c806" + "20002802cc0610898080800020002802a01520002802a415108480808000" + "200041a0156a41086a2204200041b0156a41086a22052802003602002000" + "20002902b0153703a015200041b0156a200041a0156a109c808080002000" + "4194156a200041b0156a41b084c08000108780808000200041c0066a2002" + "200341e00041900141c084c08000109880808000200041b0156a20002802" + "c00620002802c40610898080800020002802a01520002802a41510848080" + "800020042005280200360200200020002902b0153703a015200041b0156a" + "200041a0156a109c8080800020004194156a200041b0156a41d084c08000" + "108780808000200041c81c6a200128020036020020002000290294153703" + "c01c200041b0156a200041a80d6a41e8001086818080001a200041b0156a" + "41e8006a200041a00e6a41e8001086818080001a20004180176a20004198" + "0f6a41c8011086818080002106200041c8186a200041f0106a41c8011086" + "818080002107200041901a6a200041c8126a41e8001086818080001a2000" + "41f81a6a200041c0136a41c8011086818080002108200041f8326a200041" + "9c0b6a109e80808000200041d01c6a200041f8326a41e084c08000411710" + "9780808000200041f8326a200041cc0b6a10a080808000200041b81d6a20" + "0041f8326a41f784c080004117109480808000200041f8326a200041ac0c" + "6a109e80808000200041801f6a200041f8326a418e85c080004117109780" + "808000200041e81f6a200041d01c6a41e8001086818080001a200041e81f" + "6a41e8006a200041b81d6a41c8011086818080001a20004198226a200041" + "801f6a41e8001086818080001a200041a0e8006a41c00041201080808080" + "0002400240024002400240024020002802a4684101470d00200041b8066a" + "20002802a8684108412041d880c08000108a80808000200041003602c85b" + "200020002802bc0622033602c45b200020002802b80622023602c05b2000" + "41f8326a41c0004120108080808000024020002802fc324101470d004100" + "21050240200220002802803322014f0d00200041b0066a200041c0db006a" + "410020014120108b8080800020002802b0062202418180808078470d0520" + "002802c45b210320002802c85b21050b200041dc0c6a2102200320054105" + "746a210341c000210103402001450d03200041b0046a2002290000220942" + "0042edb8ca9f8fb2facc494200108781808000200041c0046a2009420042" + "a3b8c9bcb8b9bbb62b4200108781808000200041d0046a20094200428ff3" + "d092e792c5e9054200108781808000200041e0046a200942004291fee7fa" + "99bbb6a4074200108781808000200041f0056a2002290008220a420042ed" + "b8ca9f8fb2facc49420010878180800020004180066a200a420042a3b8c9" + "bcb8b9bbb62b420010878180800020004190066a200a4200428ff3d092e7" + "92c5e9054200108781808000200041a0066a200a42004291fee7fa99bbb6" + "a4074200108781808000200041b0056a2002290010220b420042edb8ca9f" + "8fb2facc494200108781808000200041c0056a200b420042a3b8c9bcb8b9" + "bbb62b4200108781808000200041d0056a200b4200428ff3d092e792c5e9" + "054200108781808000200041e0056a200b42004291fee7fa99bbb6a40742" + "00108781808000200041f0046a2002290018220c420042edb8ca9f8fb2fa" + "cc49420010878180800020004180056a200c420042a3b8c9bcb8b9bbb62b" + "420010878180800020004190056a200c4200428ff3d092e792c5e9054200" + "108781808000200041a0056a200c42004291fee7fa99bbb6a40742001087" + "81808000200041a0046a20002903b004220d42ffffffff6f7e220e420042" + "8180808070420010878180800020004190046a200e420042feb7f9ffaf80" + "e9ded3004200108781808000200041c0036a200e42004285b087cd8081f6" + "9c334200108781808000200041f0026a200e420042c8faf5ccb2eae9f6f3" + "00420010878180800020004180046a20002903f005220f20002903c00422" + "10200041b0046a41086a2903007c22117c22122000290390047c22132000" + "41a0046a41086a290300200d20002903a004220e7c200e54ad7c7c220d42" + "ffffffff6f7e220e42004281808080704200108781808000200041f0036a" + "200e420042feb7f9ffaf80e9ded3004200108781808000200041e0036a20" + "0e42004285b087cd8081f69c334200108781808000200041d0036a200e42" + "0042c8faf5ccb2eae9f6f3004200108781808000200041b0036a20004190" + "046a41086a2903002013201254ad7c200d201354ad7c221420002903c003" + "7c2213200041c0046a41086a2903002011201054ad7c221520002903d004" + "7c22102000290380067c2211200041f0056a41086a2903002012200f54ad" + "7c7c221220002903b0057c22167c220f20002903f0037c22172000418004" + "6a41086a290300200029038004220e200d7c200e54ad7c7c220d42ffffff" + "ff6f7e220e42004281808080704200108781808000200041a0036a200e42" + "0042feb7f9ffaf80e9ded300420010878180800020004190036a200e4200" + "4285b087cd8081f69c33420010878180800020004180036a200e420042c8" + "faf5ccb2eae9f6f3004200108781808000200041e0026a200041f0036a41" + "086a2903002017200f54ad7c200d201754ad7c221820002903e0037c2217" + "200041c0036a41086a2903002013201454ad7c200f201354ad7c22192000" + "2903f0027c2213200041d0046a41086a2903002010201554ad7c221a2000" + "2903e0047c220f2000290390067c221420004180066a41086a2903002011" + "201054ad7c2012201154ad7c7c221020002903c0057c2211200041b0056a" + "41086a2903002016201254ad7c7c221220002903f0047c221b7c221c7c22" + "1520002903a0037c2216200041b0036a41086a29030020002903b003220e" + "200d7c200e54ad7c7c220d42ffffffff6f7e220e42004281808080704200" + "108781808000200041d0026a200e420042feb7f9ffaf80e9ded300420010" + "8781808000200041c0026a200e42004285b087cd8081f69c334200108781" + "808000200041b0026a200e420042c8faf5ccb2eae9f6f300420010878180" + "8000200041d0036a41086a290300211d20004180056a41086a290300211e" + "200041d0056a41086a290300211f200041a0066a41086a29030021202000" + "2903e00521212000290390052122200029038003212320004180036a4108" + "6a290300212420004190036a41086a290300212520004190056a41086a29" + "03002126200041e0056a41086a290300212720002903a005212820002903" + "b0022129200041b0026a41086a290300212a20002903c002212b200041c0" + "026a41086a290300212c200020002903d002222d200041e0046a41086a29" + "0300200f201a54ad7c221a20002903a0067c220e20004190066a41086a29" + "03002014200f54ad7c2010201454ad7c7c220f20002903d0057c22142000" + "41c0056a41086a2903002011201054ad7c2012201154ad7c7c2210200029" + "0380057c2211200041f0046a41086a290300201b201254ad7c7c22122000" + "41f0026a41086a2903002013201954ad7c201c201354ad7c7c2213200029" + "03d0037c2219200041e0036a41086a2903002017201854ad7c2015201754" + "ad7c7c22172000290390037c2218200041a0036a41086a29030020162015" + "54ad7c200d201654ad7c7c22167c2215200041e0026a41086a2903002000" + "2903e002221b200d7c201b54ad7c7c221b3703f8322000202b2023202220" + "212020200e201a54ad7c200f200e54ad7c221a7c220e201f2014200f54ad" + "7c2010201454ad7c7c220d7c220f201e2011201054ad7c2012201154ad7c" + "7c22102013201254ad7c2212201d2019201354ad7c2017201954ad7c7c22" + "137c221120252018201754ad7c2016201854ad7c7c22177c2214200041d0" + "026a41086a2903002015202d54ad7c201b201554ad7c7c22153703803320" + "0020292012201054ad2013201254ad7c221620282027200e201a54ad7c20" + "0d200e54ad7c22197c220e2026200f200d54ad7c2010200f54ad7c7c2210" + "7c221220242011201354ad7c2017201154ad7c7c22137c220d202c201420" + "1754ad7c2015201454ad7c7c22113703883320002012201654ad20132012" + "54ad7c200041a0056a41086a290300200e201954ad7c2010200e54ad7c7c" + "202a200d201354ad7c2011200d54ad7c7c37039033200041a0e8006a2000" + "41f8326a10a28080800020002903a068210e20002903a868211220002903" + "b068211320002903b868210d200942ffffffff0f7c200954ad427f7c2209" + "2009200a7c220a200954ad7c200a4282c88680d0ff96a1ac7f7c200a54ad" + "7c427f7c423f872209200b20097c2209200b54ad7c200942fbcff8b2fffe" + "89e34c7c200954ad7c427f7c423f872209200c20097c2209200c54ad7c20" + "0942b8858ab3cd9596898c7f7c200954ad7ca741016a41017110a3808080" + "0021042000411836028457200041a585c0800036028057200020043a00c0" + "52200441ff01714101470d04200341186a200d370300200341106a201337" + "0300200341086a20123703002003200e370300200341206a210320054101" + "6a210520022001412020014120491b22046a2102200120046b21010c000b" + "0b2000410036028833200041013602fc32200041d085c080003602f83220" + "00420437028033200041f8326a41d880c0800010a480808000000b200041" + "0036028833200041013602fc32200041d085c080003602f8322000420437" + "028033200041f8326a41d880c0800010a480808000000b20002802c45b21" + "2e20002802c05b212f200541016a20002802c81c470d0220004180236a20" + "002802c41c220210a580808000200241e8006a2130200041d4d2006a2131" + "200041c0d2006a41086a2132200041a0ce006a2133200041c0db006a4130" + "6a2134200041a0dc006a2135410021040340024020042005470d00200041" + "f8326a20004180236a41e0006a10a68080800041002102200041a0e8006a" + "410041301085818080001a200041c0db006a200041a0e8006a200041f832" + "6a20002d00a833109080808000200041a0e8006a20004180236a200041c0" + "db006a10a780808000200041a0e8006a41306a20004180236a41306a2000" + "41c0db006a10a7808080002000410010a3808080003a008069200041f832" + "6a10a88080800020004190246a200041a0e8006a200041f8326a200041c0" + "db006a10a98080800010aa80808000200041f8246a200041b81d6a10ab80" + "80800020004188256a200710ab8080800020004198256a200810ab808080" + "00200041a8256a200610ab80808000200041b82e6a20004190246a108f80" + "808000200041c0376a200041801f6a108f80808000200041803c6a200041" + "b0156a108f808080002000200041a8256a3602942a2000200041803c6a36" + "02902a200020004198256a36028c2a2000200041c0376a3602882a200020" + "004188256a3602842a2000200041b82e6a3602802a2000200041f8246a36" + "02fc292000200041e81f6a3602f829200042043702c4642000200041f829" + "6a3602c064200041b8256a10ac80808000200041f8326a41a0026a210520" + "0041b8256a41a0026a213620004180d7006a41c0016a213320004180d700" + "6a41e0006a2134200041c0db006a41e0036a2135200041a0e8006a41e003" + "6a2132200041c0db006a4180036a2106200041a0e8006a4180036a210720" + "0041c0db006a41a0026a2108200041a0e8006a41a0026a2131200041c0d2" + "006a41c0016a2137200041c0d2006a41e0006a2138200041c0db006a41c0" + "016a2139200041a0e8006a41c0016a213a200041c0db006a41e0006a213b" + "200041a0e8006a41e0006a213c41c000213d034002400240203d450d0020" + "02410171210342808082808080a080e900203d417f6a223d413f71ad88a7" + "21022003450d02200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200241017145" + "0d01200041c0db006a200041b8256a41c0041086818080001a20002802c4" + "64410374210120002802c064210320002802c8642130024003402001450d" + "01200328020422042d000c20032802002d00607210a38080800021022000" + "41a0e8006a200041c0db006a200441046a280200200441086a2802002030" + "41dc8cc0800010ae80808000200328020010af80808000200041c0d2006a" + "200041a0e8006a200041c0db006a200210b0808080002038203c203b2002" + "10b0808080002037203a2039200210b08080800020004180d7006a203120" + "08200210b080808000203420072006200210b08080800020332032203520" + "0210b080808000200041f8326a200041c0d2006a41a0021086818080001a" + "200520004180d7006a41a0021086818080001a200041c0db006a200041f8" + "326a41c0041086818080001a200141786a2101200341086a21030c000b0b" + "2000203041016a3602c864200041b8256a200041c0db006a41c004108681" + "8080001a0c010b200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200041f8326a" + "41a0026a223e203610b180808000200041f8326a200041b8256a41a00210" + "86818080001a200041b8256a200041f8326a41c0041086818080001a2000" + "41f8296a200041b8256a41c0041086818080001a200041c0d2006a41306a" + "2230200041b8256a41306a10b280808000200041c0d2006a200041b8256a" + "41301086818080001a200041c0db006a41306a2201200041b8256a419001" + "6a10b280808000200041c0db006a200041b8256a41e0006a413010868180" + "80001a200041a0e8006a41306a2203200041b8256a41f0016a10b2808080" + "00200041a0e8006a200041b8256a41c0016a41301086818080001a200041" + "f8326a410041301085818080001a200042c18e8ea3d58c88f8183703d033" + "200042d2a1c19ee8addffc033703c8332000429e97eb8de0d783db8e7f37" + "03c03320004295b7949cfdd590b8d8003703b833200042d2cbb6fee1c8c8" + "d5dd003703b033200042f1e0c7b3c8bcf2814d3703a83320004180d7006a" + "41e0006a2232200041c0db006a200041f8326a10b380808000200041f832" + "6a41306a410041301085818080002105200042ba8a92abf1a7dbf2143703" + "a033200042e8a0ee96fe89bcf21437039833200042a4a0a0f4c7f1c686a2" + "7f37039033200042acfced84e38c82c4d00037038833200042d5cb9694b3" + "cac8f92a37038033200042c38bd5b3c8bcf286897f3703f83220004180d7" + "006a41c0016a2204200041a0e8006a200041f8326a10b380808000200041" + "80d7006a200041c0d2006a41e0001086818080001a20004180ce006a4130" + "6a2202200041b8256a41d0026a10b28080800020004180ce006a200041b8" + "256a41a0026a41301086818080001a2030200041b8256a41b0036a10b280" + "808000200041c0d2006a200041b8256a4180036a41301086818080001a20" + "03200041b8256a4190046a10b280808000200041a0e8006a200041b8256a" + "41e0036a41301086818080001a200041f8326a410041301085818080001a" + "200042c18e8ea3d58c88f8183703d033200042d2a1c19ee8addffc033703" + "c8332000429e97eb8de0d783db8e7f3703c03320004295b7949cfdd590b8" + "d8003703b833200042d2cbb6fee1c8c8d5dd003703b033200042f1e0c7b3" + "c8bcf2814d3703a833200041c0db006a41e0006a2235200041c0d2006a20" + "0041f8326a10b3808080002005410041301085818080002133200042ba8a" + "92abf1a7dbf2143703a033200042e8a0ee96fe89bcf21437039833200042" + "a4a0a0f4c7f1c686a27f37039033200042acfced84e38c82c4d000370388" + "33200042d5cb9694b3cac8f92a37038033200042c38bd5b3c8bcf286897f" + "3703f832200041c0db006a41c0016a223b200041a0e8006a200041f8326a" + "10b380808000200041c0db006a20004180ce006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703f86820004289bd83adbef9849c2e3703" + "f068200042d0d1a385a497e78d413703e86820004294a7e7acc2baa5a44f" + "3703e068200042ecf9a5e2bf8da8a1d8003703d868200042c6ac97e7d4d5" + "9afbb27f3703d068200042ebcded87fbc188f9083703c868200042cd9cab" + "eda5fde4f11c3703c068200042eed3f096abd9ebada37f3703b868200042" + "8fc5dc88cd998ff4977f3703b0682000429386aaa8abf2d7b4463703a868" + "200042e5a8e798abaaa584073703a068200041a0e8006a41e0006a410041" + "c0011085818080002108203e200041c0db006a200041a0e8006a10b48080" + "8000200041f8326a20004180d7006a41a0021086818080001a2002203310" + "b28080800020004180ce006a200041f8326a41301086818080001a200041" + "80d7006a41306a2207200041f8326a4190016a10b28080800020004180d7" + "006a200041f8326a41e0006a223f41301086818080001a2001200041f832" + "6a41f0016a10b280808000200041c0db006a200041f8326a41c0016a2240" + "41301086818080001a200041a0e8006a410041301085818080001a200042" + "c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f06820" + "00429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d80037" + "03e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf2" + "814d3703d068200041c0d2006a41e0006a223820004180d7006a200041a0" + "e8006a10b3808080002003410041301085818080002103200042ba8a92ab" + "f1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0" + "a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b06820" + "0042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703" + "a068200041c0d2006a41c0016a2234200041c0db006a200041a0e8006a10" + "b380808000200041c0d2006a20004180ce006a41e0001086818080001a20" + "0041c0c9006a41306a2205200041f8326a41d0026a10b280808000200041" + "c0c9006a203e41301086818080001a2002200041f8326a41b0036a10b280" + "80800020004180ce006a200041f8326a4180036a22414130108681808000" + "1a2001200041f8326a4190046a10b280808000200041c0db006a200041f8" + "326a41e0036a224241301086818080001a200041a0e8006a410041301085" + "818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8ad" + "dffc033703f0682000429e97eb8de0d783db8e7f3703e86820004295b794" + "9cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8682000" + "42f1e0c7b3c8bcf2814d3703d068203220004180ce006a200041a0e8006a" + "10b3808080002003410041301085818080002143200042ba8a92abf1a7db" + "f2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7" + "f1c686a27f3703b868200042acfced84e38c82c4d0003703b068200042d5" + "cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820" + "04200041c0db006a200041a0e8006a10b38080800020004180d7006a2000" + "41c0c9006a41e0001086818080001a200042afff91c4a8fbbb8711370398" + "5c20004289bd83adbef9849c2e3703905c200042d0d1a385a497e78d4137" + "03885c20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1" + "d8003703f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87" + "fbc188f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3" + "f096abd9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20" + "00429386aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c0" + "5b2035410041c001108581808000213c200041a0e8006a41a0026a220320" + "004180d7006a200041c0db006a10b480808000200041a0e8006a200041c0" + "d2006a41a0021086818080001a2005204310b280808000200041c0c9006a" + "200041a0e8006a41301086818080001a2030200041a0e8006a4190016a22" + "4410b280808000200041c0d2006a200841301086818080001a2007200041" + "a0e8006a41f0016a224510b28080800020004180d7006a200041a0e8006a" + "41c0016a223a41301086818080001a200041c0db006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc" + "033703905c2000429e97eb8de0d783db8e7f3703885c20004295b7949cfd" + "d590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1" + "e0c7b3c8bcf2814d3703f05b20004180ce006a41e0006a2236200041c0d2" + "006a200041c0db006a10b380808000200141004130108581808000210120" + "0042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e0" + "5b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0" + "003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bc" + "f286897f3703c05b20004180ce006a41c0016a224620004180d7006a2000" + "41c0db006a10b38080800020004180ce006a200041c0c9006a41e0001086" + "818080001a20004180c5006a41306a2231200041a0e8006a41d0026a2247" + "10b28080800020004180c5006a200341301086818080001a2005200041a0" + "e8006a41b0036a224810b280808000200041c0c9006a200041a0e8006a41" + "80036a224941301086818080001a2007200041a0e8006a4190046a224a10" + "b28080800020004180d7006a200041a0e8006a41e0036a224b4130108681" + "8080001a200041c0db006a410041301085818080001a200042c18e8ea3d5" + "8c88f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb" + "8de0d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c2000" + "42d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f0" + "5b2038200041c0c9006a200041c0db006a10b38080800020014100413010" + "85818080002135200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96" + "fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042ac" + "fced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b20" + "0042c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db" + "006a10b380808000200041c0d2006a20004180c5006a41e0001086818080" + "001a200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e" + "3703d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5" + "a44f3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7" + "d4d59afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd" + "9cabeda5fde4f11c3703a057200042eed3f096abd9ebada37f3703985720" + "00428fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b4463703" + "8857200042e5a8e798abaaa58407370380572032410041c0011085818080" + "00213d200041c0db006a41a0026a2232200041c0d2006a20004180d7006a" + "10b480808000200041c0db006a20004180ce006a41a0021086818080001a" + "2031203510b28080800020004180c5006a200041c0db006a413010868180" + "80001a2002200041c0db006a4190016a224c10b28080800020004180ce00" + "6a203c41301086818080001a2030200041c0db006a41f0016a224d10b280" + "808000200041c0d2006a203b41301086818080001a20004180d7006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703d857200042d2a1" + "c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8572000" + "4295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd003703" + "b857200042f1e0c7b3c8bcf2814d3703b057200041c0c9006a41e0006a22" + "0620004180ce006a20004180d7006a10b380808000200741004130108581" + "8080002101200042ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89" + "bcf2143703a057200042a4a0a0f4c7f1c686a27f37039857200042acfced" + "84e38c82c4d00037039057200042d5cb9694b3cac8f92a37038857200042" + "c38bd5b3c8bcf286897f37038057200041c0c9006a41c0016a2207200041" + "c0d2006a20004180d7006a10b380808000200041c0c9006a20004180c500" + "6a41e0001086818080001a200041c0c0006a41306a2237200041c0db006a" + "41d0026a224e10b280808000200041c0c0006a203241301086818080001a" + "2031200041c0db006a41b0036a224f10b28080800020004180c5006a2000" + "41c0db006a4180036a225041301086818080001a2030200041c0db006a41" + "90046a225110b280808000200041c0d2006a200041c0db006a41e0036a22" + "5241301086818080001a20004180d7006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703d857200042d2a1c19ee8addffc033703d057" + "2000429e97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d800" + "3703c057200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bc" + "f2814d3703b057203620004180c5006a20004180d7006a10b38080800020" + "01410041301085818080002101200042ba8a92abf1a7dbf2143703a85720" + "0042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c686a27f3703" + "9857200042acfced84e38c82c4d00037039057200042d5cb9694b3cac8f9" + "2a37038857200042c38bd5b3c8bcf286897f370380572046200041c0d200" + "6a20004180d7006a10b38080800020004180ce006a200041c0c0006a41e0" + "001086818080001a200042afff91c4a8fbbb87113703985320004289bd83" + "adbef9849c2e37039053200042d0d1a385a497e78d413703885320004294" + "a7e7acc2baa5a44f37038053200042ecf9a5e2bf8da8a1d8003703f85220" + "0042c6ac97e7d4d59afbb27f3703f052200042ebcded87fbc188f9083703" + "e852200042cd9cabeda5fde4f11c3703e052200042eed3f096abd9ebada3" + "7f3703d8522000428fc5dc88cd998ff4977f3703d0522000429386aaa8ab" + "f2d7b4463703c852200042e5a8e798abaaa584073703c0522038410041c0" + "01108581808000213820004180d7006a41a0026a225320004180ce006a20" + "0041c0d2006a10b48080800020004180d7006a200041c0c9006a41a00210" + "86818080001a2037200110b280808000200041c0c0006a20004180d7006a" + "41301086818080001a200520004180d7006a4190016a10b2808080002000" + "41c0c9006a203d41301086818080001a200220004180d7006a41f0016a10" + "b28080800020004180ce006a200441301086818080001a200041c0d2006a" + "410041301085818080001a200042c18e8ea3d58c88f81837039853200042" + "d2a1c19ee8addffc03370390532000429e97eb8de0d783db8e7f37038853" + "20004295b7949cfdd590b8d80037038053200042d2cbb6fee1c8c8d5dd00" + "3703f852200042f1e0c7b3c8bcf2814d3703f05220004180c5006a41e000" + "6a2254200041c0c9006a200041c0d2006a10b38080800020304100413010" + "85818080002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96" + "fe89bcf2143703e052200042a4a0a0f4c7f1c686a27f3703d852200042ac" + "fced84e38c82c4d0003703d052200042d5cb9694b3cac8f92a3703c85220" + "0042c38bd5b3c8bcf286897f3703c05220004180c5006a41c0016a225520" + "004180ce006a200041c0d2006a10b38080800020004180c5006a200041c0" + "c0006a41e0001086818080001a200041803c6a41306a223020004180d700" + "6a41d0026a10b280808000200041803c6a205341301086818080001a2037" + "20004180d7006a41b0036a10b280808000200041c0c0006a20004180d700" + "6a4180036a41301086818080001a200220004180d7006a4190046a10b280" + "80800020004180ce006a20004180d7006a41e0036a41301086818080001a" + "200041c0d2006a410041301085818080001a200042c18e8ea3d58c88f818" + "37039853200042d2a1c19ee8addffc03370390532000429e97eb8de0d783" + "db8e7f3703885320004295b7949cfdd590b8d80037038053200042d2cbb6" + "fee1c8c8d5dd003703f852200042f1e0c7b3c8bcf2814d3703f052200620" + "0041c0c0006a200041c0d2006a10b3808080002039410041301085818080" + "002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96fe89bcf2" + "143703e052200042a4a0a0f4c7f1c686a27f3703d852200042acfced84e3" + "8c82c4d0003703d052200042d5cb9694b3cac8f92a3703c852200042c38b" + "d5b3c8bcf286897f3703c052200720004180ce006a200041c0d2006a10b3" + "80808000200041c0c9006a200041803c6a41e0001086818080001a200042" + "afff91c4a8fbbb87113703d84e20004289bd83adbef9849c2e3703d04e20" + "0042d0d1a385a497e78d413703c84e20004294a7e7acc2baa5a44f3703c0" + "4e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac97e7d4d59afbb2" + "7f3703b04e200042ebcded87fbc188f9083703a84e200042cd9cabeda5fd" + "e4f11c3703a04e200042eed3f096abd9ebada37f3703984e2000428fc5dc" + "88cd998ff4977f3703904e2000429386aaa8abf2d7b4463703884e200042" + "e5a8e798abaaa584073703804e2036410041c00110858180800021362000" + "41c0d2006a41a0026a2256200041c0c9006a20004180ce006a10b4808080" + "00200041c0d2006a20004180c5006a41a0021086818080001a2030203910" + "b280808000200041803c6a200041c0d2006a41301086818080001a203720" + "0041c0d2006a4190016a225710b280808000200041c0c0006a2038413010" + "86818080001a2005200041c0d2006a41f0016a225810b280808000200041" + "c0c9006a203441301086818080001a20004180ce006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc" + "033703d04e2000429e97eb8de0d783db8e7f3703c84e20004295b7949cfd" + "d590b8d8003703c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1" + "e0c7b3c8bcf2814d3703b04e2054200041c0c0006a20004180ce006a10b3" + "808080002002410041301085818080002102200042ba8a92abf1a7dbf214" + "3703a84e200042e8a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c6" + "86a27f3703984e200042acfced84e38c82c4d0003703904e200042d5cb96" + "94b3cac8f92a3703884e200042c38bd5b3c8bcf286897f3703804e205520" + "0041c0c9006a20004180ce006a10b38080800020004180c5006a20004180" + "3c6a41e0001086818080001a200041c0376a41306a2259200041c0d2006a" + "41d0026a225a10b280808000200041c0376a205641301086818080001a20" + "30200041c0d2006a41b0036a225b10b280808000200041803c6a200041c0" + "d2006a4180036a225c41301086818080001a2037200041c0d2006a419004" + "6a225d10b280808000200041c0c0006a200041c0d2006a41e0036a225e41" + "301086818080001a20004180ce006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc033703d04e2000" + "429e97eb8de0d783db8e7f3703c84e20004295b7949cfdd590b8d8003703" + "c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1e0c7b3c8bcf281" + "4d3703b04e2006200041803c6a20004180ce006a10b38080800020024100" + "4130108581808000215f200042ba8a92abf1a7dbf2143703a84e200042e8" + "a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c686a27f3703984e20" + "0042acfced84e38c82c4d0003703904e200042d5cb9694b3cac8f92a3703" + "884e200042c38bd5b3c8bcf286897f3703804e2007200041c0c0006a2000" + "4180ce006a10b380808000200041c0c9006a200041c0376a41e000108681" + "8080001a200042afff91c4a8fbbb87113703d84e20004289bd83adbef984" + "9c2e3703d04e200042d0d1a385a497e78d413703c84e20004294a7e7acc2" + "baa5a44f3703c04e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac" + "97e7d4d59afbb27f3703b04e200042ebcded87fbc188f9083703a84e2000" + "42cd9cabeda5fde4f11c3703a04e200042eed3f096abd9ebada37f370398" + "4e2000428fc5dc88cd998ff4977f3703904e2000429386aaa8abf2d7b446" + "3703884e200042e5a8e798abaaa584073703804e2036410041c001108581" + "8080002160200041b82e6a41a0026a200041c0c9006a20004180ce006a10" + "b480808000200041b82e6a20004180c5006a41a0021086818080001a2000" + "41a0e8006a200041f8296a10b58080800020004180ce006a200041f8296a" + "41a0026a226110b580808000200041f8326a20004180ce006a10b6808080" + "00200041c0c9006a200041a0e8006a200041f8326a10b780808000200041" + "f8326a2006200710b38080800020004180e0006a200041f8326a203310b8" + "8080800020004180e0006a41306a2230200041f8326a203310b980808000" + "200041f8326a200041c0c9006a10ba80808000200041a0e2006a200041f8" + "326a20004180e0006a10bb80808000200041f8326a200710ba8080800020" + "0041c0e4006a200041f8326a203310b880808000200041c0e4006a41306a" + "2236200041f8326a203310b980808000200041f8326a200041c0c9006a20" + "0610b380808000200041c0376a200041c0e4006a200041f8326a10bb8080" + "8000200041803c6a200610ba80808000200041f8326a200041c0c9006a20" + "0710b380808000200041c0c0006a200041803c6a200041f8326a10bb8080" + "8000200041a0e8006a2006200041c0c0006a10b380808000200041f8326a" + "2007200041c0376a10b380808000200041c0db006a200041a0e8006a2000" + "41f8326a10bc8080800020004180c5006a200041c0db006a203510b88080" + "80002031200041c0db006a203510b980808000200041f8326a200041c0c9" + "006a200041a0e2006a10b380808000200041c0d2006a20004180c5006a20" + "0041f8326a10bc80808000200041a0e8006a200041c0d2006a10bd808080" + "00200041f8326a203910bd80808000200041e0e6006a200041a0e8006a20" + "0041f8326a10b980808000200041c0db006a200041e0e6006a10a6808080" + "0020004180d7006a410041301085818080001a200041c0e7006a20004180" + "d7006a200041c0db006a20002d00f05b2202109080808000200041f8326a" + "200041c0d2006a200041c0e7006a10a780808000200041a0e8006a200041" + "c0e7006a10b28080800020332039200041a0e8006a10a780808000200041" + "a0e8006a200041f8326a41e0001086818080001a200020023a0080692000" + "4180d7006a410041e0001085818080001a200041c0db006a20004180d700" + "6a200041a0e8006a200210b080808000200041f8326a200041c0db006a20" + "0041a0e2006a10b380808000203f200041c0db006a200041c0376a10b380" + "8080002040200041c0db006a200041c0c0006a10b380808000200041c0db" + "006a200041f8326a41a0021086818080001a200020023a00e05d20004180" + "d7006a410041a0021085818080001a200041c0d2006a20004180d7006a20" + "0041c0db006a200210b0808080002038203d203c200210b0808080002034" + "2004203b200210b080808000200041a0e8006a200041f8296a200041c0d2" + "006a10b480808000200041f8326a200041c0d2006a10b180808000200320" + "61200041f8326a10b480808000200041f8326a200041a0e8006a41c00410" + "86818080001a200020023a00b837200041803c6a410041c0041085818080" + "001a200041c0db006a200041803c6a200041f8326a200210b08080800020" + "3c200041803c6a41e0006a203f200210b080808000203b200041803c6a41" + "c0016a2040200210b080808000200041a0e8006a200041803c6a41a0026a" + "203e200210b0808080002008200041803c6a4180036a2041200210b08080" + "8000203a200041803c6a41e0036a2042200210b080808000200041c0376a" + "200041c0db006a41a0021086818080001a200041c0376a41a0026a200041" + "a0e8006a41a0021086818080002161200041c0c0006a200041b82e6a2000" + "41c0376a10be80808000200041c0376a200041c0c0006a41c00410868180" + "80001a205f203710b28080800020004180ce006a200041c0c0006a413010" + "86818080001a2001200041c0c0006a4190016a10b28080800020004180d7" + "006a200041c0c0006a41e0006a41301086818080001a2035200041c0c000" + "6a41f0016a10b280808000200041c0db006a200041c0c0006a41c0016a41" + "301086818080001a200041a0e8006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f0682000" + "429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d8003703" + "e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf281" + "4d3703d068203820004180d7006a200041a0e8006a10b380808000204341" + "0041301085818080002133200042ba8a92abf1a7dbf2143703c868200042" + "e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a27f3703b868" + "200042acfced84e38c82c4d0003703b068200042d5cb9694b3cac8f92a37" + "03a868200042c38bd5b3c8bcf286897f3703a0682034200041c0db006a20" + "0041a0e8006a10b380808000200041c0d2006a20004180ce006a41e00010" + "86818080001a2005200041c0c0006a41d0026a10b280808000200041c0c9" + "006a200041c0c0006a41a0026a223741301086818080001a205f200041c0" + "c0006a41b0036a10b28080800020004180ce006a200041c0c0006a418003" + "6a41301086818080001a2035200041c0c0006a4190046a10b28080800020" + "0041c0db006a200041c0c0006a41e0036a41301086818080001a200041a0" + "e8006a410041301085818080001a200042c18e8ea3d58c88f8183703f868" + "200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e7f37" + "03e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8" + "d5dd003703d868200042f1e0c7b3c8bcf2814d3703d068203d20004180ce" + "006a200041a0e8006a10b380808000203341004130108581808000210620" + "0042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c0" + "68200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0" + "003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bc" + "f286897f3703a0682004200041c0db006a200041a0e8006a10b380808000" + "20004180d7006a200041c0c9006a41e0001086818080001a200042afff91" + "c4a8fbbb87113703985c20004289bd83adbef9849c2e3703905c200042d0" + "d1a385a497e78d413703885c20004294a7e7acc2baa5a44f3703805c2000" + "42ecf9a5e2bf8da8a1d8003703f85b200042c6ac97e7d4d59afbb27f3703" + "f05b200042ebcded87fbc188f9083703e85b200042cd9cabeda5fde4f11c" + "3703e05b200042eed3f096abd9ebada37f3703d85b2000428fc5dc88cd99" + "8ff4977f3703d05b2000429386aaa8abf2d7b4463703c85b200042e5a8e7" + "98abaaa584073703c05b203c410041c00110858180800021432003200041" + "80d7006a200041c0db006a10b480808000200041a0e8006a200041c0d200" + "6a41a0021086818080001a2005200610b280808000200041c0c9006a2000" + "41a0e8006a41301086818080001a2039204410b280808000200041c0d200" + "6a200841301086818080001a2001204510b28080800020004180d7006a20" + "3a41301086818080001a200041c0db006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc033703905c" + "2000429e97eb8de0d783db8e7f3703885c20004295b7949cfdd590b8d800" + "3703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bc" + "f2814d3703f05b2060200041c0d2006a200041c0db006a10b38080800020" + "35410041301085818080002133200042ba8a92abf1a7dbf2143703e85b20" + "0042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703" + "d85b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f9" + "2a3703c85b200042c38bd5b3c8bcf286897f3703c05b204620004180d700" + "6a200041c0db006a10b38080800020004180ce006a200041c0c9006a41e0" + "001086818080001a2031204710b28080800020004180c5006a2003413010" + "86818080001a2005204810b280808000200041c0c9006a20494130108681" + "8080001a2001204a10b28080800020004180d7006a204b41301086818080" + "001a200041c0db006a410041301085818080001a200042c18e8ea3d58c88" + "f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0" + "d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c200042d2" + "cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b20" + "38200041c0c9006a200041c0db006a10b380808000203341004130108581" + "8080002133200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89" + "bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced" + "84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042" + "c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db006a" + "10b380808000200041c0d2006a20004180c5006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e3703" + "d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5a44f" + "3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7d4d5" + "9afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd9cab" + "eda5fde4f11c3703a057200042eed3f096abd9ebada37f37039857200042" + "8fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b44637038857" + "200042e5a8e798abaaa5840737038057203d410041c00110858180800021" + "072032200041c0d2006a20004180d7006a10b480808000200041c0db006a" + "20004180ce006a41a0021086818080001a200041c0c0006a200041c0db00" + "6a41c0041086818080001a200041c0c0006a200041c0376a10bf80808000" + "200041a0e8006a200041c0c0006a10c0808080002032200310b180808000" + "200041c0db006a200041a0e8006a41a0021086818080001a200041c0376a" + "200041c0db006a41c0041086818080001a20004180c5006a200041c0c000" + "6a10c180808000200041c0c9006a20004180c5006a10c080808000200041" + "80ce006a200041c0376a20004180c5006a10be80808000200041c0376a20" + "004180ce006a10c180808000200041b82e6a200041c0376a10c180808000" + "200041c0d2006a200041b82e6a10c180808000200041c0d2006a200041c0" + "c9006a10bf80808000200041c0c9006a200041c0d2006a10c18080800020" + "0320004180ce006a41a0026a10b180808000200041a0e8006a20004180ce" + "006a41a0021086818080001a20004180ce006a200041a0e8006a41c00410" + "86818080001a200041a0e8006a20004180ce006a200041c0c0006a10be80" + "808000200041c0c9006a200041a0e8006a10bf808080002003203710b180" + "808000200041a0e8006a200041c0c0006a41a0021086818080001a200041" + "80ce006a200041a0e8006a41c0041086818080001a200041c0376a200041" + "c0c0006a10bf80808000200041a0e2006a41306a2205205910b280808000" + "200041a0e2006a200041c0376a41301086818080001a2001200041c0376a" + "4190016a10b28080800020004180d7006a200041c0376a41e0006a413010" + "86818080001a2033200041c0376a41f0016a10b280808000200041c0db00" + "6a200041c0376a41c0016a41301086818080001a200041a0e8006a410041" + "301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c1" + "9ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e868200042" + "95b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8" + "68200042f1e0c7b3c8bcf2814d3703d068200041c0e4006a41e0006a2237" + "20004180d7006a200041a0e8006a10b38080800020064100413010858180" + "80002106200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bc" + "f2143703c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84" + "e38c82c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c3" + "8bd5b3c8bcf286897f3703a068200041c0e4006a41c0016a2235200041c0" + "db006a200041a0e8006a10b380808000200041c0e4006a200041a0e2006a" + "41e0001086818080001a2030200041c0376a41d0026a10b2808080002000" + "4180e0006a206141301086818080001a2005200041c0376a41b0036a10b2" + "80808000200041a0e2006a200041c0376a4180036a41301086818080001a" + "2033200041c0376a4190046a10b280808000200041c0db006a200041c037" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "808000200641004130108581808000213c200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2043" + "410041c001108581808000213d200320004180d7006a200041c0db006a10" + "b480808000200041a0e8006a200041c0e4006a41a0021086818080001a20" + "30203c10b28080800020004180e0006a200041a0e8006a41301086818080" + "001a2036204410b280808000200041c0e4006a200841301086818080001a" + "2001204510b28080800020004180d7006a203a41301086818080001a2000" + "41c0db006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e" + "7f3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1" + "c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b200041a0e2" + "006a41e0006a2243200041c0e4006a200041c0db006a10b3808080002033" + "410041301085818080002133200042ba8a92abf1a7dbf2143703e85b2000" + "42e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d8" + "5b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a" + "3703c85b200042c38bd5b3c8bcf286897f3703c05b200041a0e2006a41c0" + "016a224620004180d7006a200041c0db006a10b380808000200041a0e200" + "6a20004180e0006a41e0001086818080001a200041c0e7006a41306a2206" + "204710b280808000200041c0e7006a200341301086818080001a20302048" + "10b28080800020004180e0006a204941301086818080001a2001204a10b2" + "8080800020004180d7006a204b41301086818080001a200041c0db006a41" + "0041301085818080001a200042c18e8ea3d58c88f8183703985c200042d2" + "a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20" + "004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd0037" + "03f85b200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a2000" + "41c0db006a10b3808080002033410041301085818080002133200042ba8a" + "92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042" + "a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d0" + "5b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f" + "3703c05b203520004180d7006a200041c0db006a10b380808000200041c0" + "e4006a200041c0e7006a41e0001086818080001a200042afff91c4a8fbbb" + "87113703d85720004289bd83adbef9849c2e3703d057200042d0d1a385a4" + "97e78d413703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5" + "e2bf8da8a1d8003703b857200042c6ac97e7d4d59afbb27f3703b0572000" + "42ebcded87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057" + "200042eed3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f" + "370390572000429386aaa8abf2d7b44637038857200042e5a8e798abaaa5" + "8407370380572007410041c00110858180800021072032200041c0e4006a" + "20004180d7006a10b480808000200041c0db006a200041a0e2006a41a002" + "1086818080001a2006203310b280808000200041c0e7006a200041c0db00" + "6a41301086818080001a2005204c10b280808000200041a0e2006a203d41" + "301086818080001a2036204d10b280808000200041c0e4006a203b413010" + "86818080001a20004180d7006a410041301085818080001a200042c18e8e" + "a3d58c88f8183703d857200042d2a1c19ee8addffc033703d0572000429e" + "97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d8003703c057" + "200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bcf2814d37" + "03b05720004180e0006a41e0006a200041a0e2006a20004180d7006a10b3" + "808080002001410041301085818080002101200042ba8a92abf1a7dbf214" + "3703a857200042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c6" + "86a27f37039857200042acfced84e38c82c4d00037039057200042d5cb96" + "94b3cac8f92a37038857200042c38bd5b3c8bcf286897f37038057200041" + "80e0006a41c0016a200041c0e4006a20004180d7006a10b3808080002000" + "4180e0006a200041c0e7006a41e0001086818080001a200041e0e6006a41" + "306a204e10b280808000200041e0e6006a203241301086818080001a2006" + "204f10b280808000200041c0e7006a205041301086818080001a20362051" + "10b280808000200041c0e4006a205241301086818080001a20004180d700" + "6a410041301085818080001a200042c18e8ea3d58c88f8183703d8572000" + "42d2a1c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8" + "5720004295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd" + "003703b857200042f1e0c7b3c8bcf2814d3703b0572043200041c0e7006a" + "20004180d7006a10b3808080002001410041301085818080002101200042" + "ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89bcf2143703a05720" + "0042a4a0a0f4c7f1c686a27f37039857200042acfced84e38c82c4d00037" + "039057200042d5cb9694b3cac8f92a37038857200042c38bd5b3c8bcf286" + "897f370380572046200041c0e4006a20004180d7006a10b3808080002000" + "41a0e2006a200041e0e6006a41e0001086818080001a200042afff91c4a8" + "fbbb87113703986520004289bd83adbef9849c2e37039065200042d0d1a3" + "85a497e78d413703886520004294a7e7acc2baa5a44f37038065200042ec" + "f9a5e2bf8da8a1d8003703f864200042c6ac97e7d4d59afbb27f3703f064" + "200042ebcded87fbc188f9083703e864200042cd9cabeda5fde4f11c3703" + "e064200042eed3f096abd9ebada37f3703d8642000428fc5dc88cd998ff4" + "977f3703d0642000429386aaa8abf2d7b4463703c864200042e5a8e798ab" + "aaa584073703c0642037410041c00110858180800021372053200041a0e2" + "006a200041c0e4006a10b48080800020004180d7006a20004180e0006a41" + "a0021086818080001a200041c0376a20004180d7006a41c0041086818080" + "001a200041c0d2006a20004180ce006a10bf808080002005203910b28080" + "8000200041a0e2006a200041c0d2006a41301086818080001a2001205710" + "b28080800020004180d7006a203841301086818080001a2033205810b280" + "808000200041c0db006a203441301086818080001a200041a0e8006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1" + "c19ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e8682000" + "4295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703" + "d868200042f1e0c7b3c8bcf2814d3703d068203720004180d7006a200041" + "a0e8006a10b380808000203c410041301085818080002134200042ba8a92" + "abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4" + "a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b068" + "200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f37" + "03a0682035200041c0db006a200041a0e8006a10b380808000200041c0e4" + "006a200041a0e2006a41e0001086818080001a2030205a10b28080800020" + "004180e0006a205641301086818080001a2005205b10b280808000200041" + "a0e2006a205c41301086818080001a2033205d10b280808000200041c0db" + "006a205e41301086818080001a200041a0e8006a41004130108581808000" + "1a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc0337" + "03f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590" + "b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7" + "b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b38080" + "80002034410041301085818080002134200042ba8a92abf1a7dbf2143703" + "c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a2" + "7f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694b3" + "cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a0682004200041" + "c0db006a200041a0e8006a10b38080800020004180d7006a20004180e000" + "6a41e0001086818080001a200042afff91c4a8fbbb87113703985c200042" + "89bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c20" + "004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d8003703" + "f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188f9" + "083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096abd9" + "ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b2000429386" + "aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b203d41" + "0041c0011085818080002138200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2000" + "41c0d2006a200041a0e8006a41c0041086818080001a20004180c5006a20" + "0041b82e6a10bf808080002005203110b280808000200041a0e2006a2000" + "4180c5006a41301086818080001a200120004180c5006a4190016a10b280" + "80800020004180d7006a205441301086818080001a203320004180c5006a" + "41f0016a10b280808000200041c0db006a205541301086818080001a2000" + "41a0e8006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "f868200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e" + "7f3703e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1" + "c8c8d5dd003703d868200042f1e0c7b3c8bcf2814d3703d0682037200041" + "80d7006a200041a0e8006a10b38080800020344100413010858180800021" + "34200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf21437" + "03c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82" + "c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3" + "c8bcf286897f3703a0682035200041c0db006a200041a0e8006a10b38080" + "8000200041c0e4006a200041a0e2006a41e0001086818080001a20302000" + "4180c5006a41d0026a10b28080800020004180e0006a20004180c5006a41" + "a0026a41301086818080001a200520004180c5006a41b0036a10b2808080" + "00200041a0e2006a20004180c5006a4180036a41301086818080001a2033" + "20004180c5006a4190046a10b280808000200041c0db006a20004180c500" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "8080002034410041301085818080002105200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2038" + "410041c0011085818080001a200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2030" + "200510b28080800020004180e0006a200041a0e8006a4130108681808000" + "1a2036204410b280808000200041c0e4006a200841301086818080001a20" + "01204510b28080800020004180d7006a203a41301086818080001a200041" + "c0db006a410041301085818080001a200042c18e8ea3d58c88f818370398" + "5c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f" + "3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8" + "c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b2043200041c0" + "e4006a200041c0db006a10b3808080002033410041301085818080002104" + "200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703" + "e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4" + "d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8" + "bcf286897f3703c05b204620004180d7006a200041c0db006a10b3808080" + "00200041a0e2006a20004180e0006a41e0001086818080001a2006204710" + "b280808000200041c0e7006a200341301086818080001a2030204810b280" + "80800020004180e0006a204941301086818080001a2001204a10b2808080" + "0020004180d7006a204b41301086818080001a200041c0db006a41004130" + "1085818080001a200042c18e8ea3d58c88f8183703985c200042d2a1c19e" + "e8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20004295" + "b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b" + "200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a200041c0db" + "006a10b3808080002004410041301085818080001a200042ba8a92abf1a7" + "dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4" + "c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d05b200042" + "d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f3703c05b" + "203520004180d7006a200041c0db006a10b380808000200041c0e4006a20" + "0041c0e7006a41e0001086818080001a200042afff91c4a8fbbb87113703" + "d85720004289bd83adbef9849c2e3703d057200042d0d1a385a497e78d41" + "3703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5e2bf8da8" + "a1d8003703b857200042c6ac97e7d4d59afbb27f3703b057200042ebcded" + "87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057200042ee" + "d3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f37039057" + "2000429386aaa8abf2d7b44637038857200042e5a8e798abaaa584073703" + "80572007410041c0011085818080001a2032200041c0e4006a20004180d7" + "006a10b480808000200041c0db006a200041a0e2006a41a0021086818080" + "001a20004180c5006a200041c0db006a41c0041086818080001a20004180" + "c5006a200041c0376a10bf8080800020004180c5006a200041c0d2006a10" + "bf80808000200041f8296a20004180c5006a200041c0c9006a10be808080" + "00200020023a00a068024020024101470d00200041a0e8006a200041f829" + "6a41c0041086818080001a200041f8326a10ac80808000200041a0e8006a" + "200041f8326a10c2808080002008203f10c2808080007110a38080800020" + "3a204010c2808080007110a3808080002003203e10c28080800020492041" + "10c2808080007110a380808000204b204210c2808080007110a380808000" + "7110a380808000210220002802a82520002802ac25108580808000200028" + "029825200028029c25108580808000200028028825200028028c25108580" + "80800020002802f82420002802fc24108580808000202f202e1086808080" + "0020002802c01c20002802c41c10828080800020002802a01520002802a4" + "15108480808000200028028815200028028c1510848080800020002802b4" + "1320002802b81310848080800020002802bc1220002802c0121084808080" + "0020002802e41020002802e810108480808000200028028c0f2000280290" + "0f10848080800020002802940e20002802980e108480808000200028029c" + "0d20002802a00d108480808000200241ff017141004721020c080b200041" + "003602f832200041a0e8006a41c886c08000200041f8326a41cc86c08000" + "109680808000000b200041c0c0006a200041b8256a203610b48080800020" + "004180c5006a200041b8256a203610c380808000200041c0c9006a203610" + "b68080800020004180ce006a200041c0c9006a200041b8256a10c3808080" + "00200041c0d2006a20004180ce006a20004180c5006a10b4808080002000" + "4180d7006a200041c0d2006a200041c0c0006a10b780808000200041c0db" + "006a200041c0c0006a200041c0c0006a10c380808000200041a0e8006a20" + "0041c0c0006a10b680808000200041f8326a20004180d7006a200041a0e8" + "006a10b7808080002005200041c0db006a41a0021086818080001a200041" + "b8256a200041f8326a41c0041086818080001a410121020c000b0b200041" + "80d7006a2030200441e8006c6a10a580808000200041a0026a202e200441" + "05746a2202290300220c42ffffffff6f7e22094200428180808070420010" + "878180800020004190026a2009420042feb7f9ffaf80e9ded30042001087" + "8180800020004180026a200942004285b087cd8081f69c33420010878180" + "8000200041f0016a2009420042c8faf5ccb2eae9f6f30042001087818080" + "00200041e0016a200029039002220e20022903087c220b200041a0026a41" + "086a290300200c20002903a00222097c200954ad7c7c220c42ffffffff6f" + "7e220942004281808080704200108781808000200041d0016a2009420042" + "feb7f9ffaf80e9ded300420010878180800020004180016a200942004285" + "b087cd8081f69c334200108781808000200041306a2009420042c8faf5cc" + "b2eae9f6f3004200108781808000200041c0016a20002903d00122132000" + "29038002221220022903107c220a20004190026a41086a290300200b200e" + "54ad7c200c200b54ad7c7c220d7c220b200041e0016a41086a2903002000" + "2903e0012209200c7c200954ad7c7c220c42ffffffff6f7e220942004281" + "808080704200108781808000200041b0016a2009420042feb7f9ffaf80e9" + "ded3004200108781808000200041a0016a200942004285b087cd8081f69c" + "33420010878180800020004190016a2009420042c8faf5ccb2eae9f6f300" + "4200108781808000200041f0006a20002903b001221020002903f0012211" + "20022903187c220e20004180026a41086a290300200a201254ad7c200d20" + "0a54ad7c7c220a2000290380017c2212200041d0016a41086a290300200b" + "201354ad7c200c200b54ad7c7c22137c220b200041c0016a41086a290300" + "20002903c0012209200c7c200954ad7c7c220c42ffffffff6f7e22094200" + "4281808080704200108781808000200041e0006a2009420042feb7f9ffaf" + "80e9ded3004200108781808000200041d0006a200942004285b087cd8081" + "f69c334200108781808000200041c0006a2009420042c8faf5ccb2eae9f6" + "f3004200108781808000200041a0016a41086a290300210d200041306a41" + "086a290300210f200029039001211720002903502114200041d0006a4108" + "6a2903002115200020002903602216200041f0016a41086a290300200e20" + "1154ad7c200a200e54ad7c221120002903307c220920004180016a41086a" + "2903002012200a54ad7c2013201254ad7c7c220a20002903a0017c220e20" + "0041b0016a41086a290300200b201054ad7c200c200b54ad7c7c22127c22" + "0b200041f0006a41086a29030020002903702213200c7c201354ad7c7c22" + "133703f832200020142017200f2009201154ad7c200a200954ad7c22107c" + "2209200d200e200a54ad7c2012200e54ad7c7c220c7c220a200041e0006a" + "41086a290300200b201654ad7c2013200b54ad7c7c220b37038033200020" + "004190016a41086a2903002009201054ad7c200c200954ad7c220e200029" + "03407c22092015200a200c54ad7c200b200a54ad7c7c220b370388332000" + "200041c0006a41086a2903002009200e54ad7c200b200954ad7c37039033" + "200041a0e8006a200041f8326a10a280808000200020002903b868370398" + "4e200020002903b0683703904e200020002903a8683703884e2000200029" + "03a0683703804e200041c0db006a410041301085818080001a2035410041" + "301085818080001a203441e086c0800041301086818080001a4101210220" + "0041013602e052200041003602d452200041003602c852200020333602c4" + "52200020004180ce006a3602c05203400240024020020d00200041086a20" + "0041c0d2006a10c48080800020002d0009210120002d000821030c010b20" + "0041003602e0520240024020002802c852450d00200041286a2002203210" + "c58080800020002802280d01200028022c21020b024020002802c0522201" + "450d0020002802c45221030340024020032001470d00200020033602c452" + "0c020b2000428080808080013702cc5220002003417f6a22033602c85220" + "0041206a2002203210c580808000024020002802200d0020002802242102" + "0c010b0b200020033602c4520c010b200041003602c852024020002802d4" + "52450d00200041186a2002203110c58080800020002802180d0120002802" + "1c21020b41002103200041003602d45220020d010b200041106a200041c0" + "d2006a10c48080800020002d0011210120002d001021030b024020034101" + "71450d00200041f8326a200041c0db006a10c680808000200041c0db006a" + "200041f8326a4190011086818080001a200041f8326a200041c0db006a20" + "004180d7006a10c780808000200041a0e8006a200041c0db006a200041f8" + "326a200110c880808000200041c0db006a200041a0e8006a419001108681" + "8080001a20002802e05221020c010b0b200041a0e8006a200041c0db006a" + "4190011086818080001a200041f8326a20004180236a200041a0e8006a10" + "c78080800020004180236a200041f8326a4190011086818080001a200441" + "016a21040c000b0b2000420137028433200041013602fc322000419482c0" + "80003602f83220004181808080003602a4682000200041a0e8006a360280" + "33200020004180d7006a3602a068200041c0d2006a41c886c08000200041" + "f8326a419c82c08000109680808000000b200220002802b40641b092c080" + "00108c80808000000b202f202e10868080800020002802c01c20002802c4" + "1c10828080800020002802a01520002802a4151084808080002000280288" + "15200028028c1510848080800020002802b41320002802b8131084808080" + "0020002802bc1220002802c01210848080800020002802e41020002802e8" + "10108480808000200028028c0f20002802900f1084808080002000280294" + "0e20002802980e108480808000200028029c0d20002802a00d1084808080" + "00410021020b200041e0ec006a24808080800020020ba60201087e200020" + "01290300220242ffffffff0f7c2203200254ad427f7c2202200220012903" + "0822047c2202200454ad7c20024282c88680d0ff96a1ac7f7c2204200254" + "ad7c427f7c423f8722022002200129031022057c2202200554ad7c200242" + "fbcff8b2fffe89e34c7c2205200254ad7c427f7c423f8722022002200129" + "031822067c2202200654ad7c200242b8858ab3cd9596898c7f7c22062002" + "54ad7c427f7c220242818080807083220720037c22083703002000200242" + "feb7f9ffaf80e9ded30083220920047c22032008200754ad7c2207370308" + "200020024285b087cd8081f69c3383220820057c22042003200954ad2007" + "200354ad7c7c22033703102000200242c8faf5ccb2eae9f6f3008320067c" + "2004200854ad2003200454ad7c7c3703180b1901017f2380808080004110" + "6b220120003a000f20012d000f0b3601017f23808080800041106b220224" + "8080808000200241013b010c200220013602082002200036020420024104" + "6a10f380808000000b6501017f23808080800041306b2202248080808000" + "200041306a200141306a41301086818080001a200041e0006a41e086c080" + "00200241004130108581808000220220012d006010908080800020002001" + "41301086818080001a200241306a2480808080000b25002000200141f087" + "c0800010df808080002000200110a98080800010d2808080003a00300be7" + "2502017f4c7e23808080800041b0096b2203248080808000200341c0046a" + "200229030022044200200129030022054200108781808000200341d0046a" + "20022903082206420020054200108781808000200341e0046a2002290310" + "2207420020054200108781808000200341f0046a20022903182208420020" + "05420010878180800020034180056a200229032022094200200542001087" + "8180800020034190056a2002290328220a42002005420010878180800020" + "0341a0056a20012903082205420020044200108781808000200341f0056a" + "2005420020064200108781808000200341c0066a20054200200742001087" + "8180800020034190076a2005420020084200108781808000200341e0076a" + "2005420020094200108781808000200341b0086a20054200200a42001087" + "81808000200341b0056a2001290310220542002004420010878180800020" + "034180066a2005420020064200108781808000200341d0066a2005420020" + "074200108781808000200341a0076a200542002008420010878180800020" + "0341f0076a2005420020094200108781808000200341c0086a2005420020" + "0a4200108781808000200341c0056a200129031822054200200442001087" + "8180800020034190066a2005420020064200108781808000200341e0066a" + "2005420020074200108781808000200341b0076a20054200200842001087" + "8180800020034180086a2005420020094200108781808000200341d0086a" + "20054200200a4200108781808000200341d0056a20012903202205420020" + "044200108781808000200341a0066a200542002006420010878180800020" + "0341f0066a2005420020074200108781808000200341c0076a2005420020" + "08420010878180800020034190086a200542002009420010878180800020" + "0341e0086a20054200200a4200108781808000200341e0056a2001290328" + "2205420020044200108781808000200341b0066a20054200200642001087" + "8180800020034180076a2005420020074200108781808000200341d0076a" + "2005420020084200108781808000200341a0086a20054200200942001087" + "81808000200341f0086a20054200200a4200108781808000200341b0046a" + "20032903c004220542fdfff3ffcffffff9897f7e2204420042abd5feffff" + "ffbfffb97f4200108781808000200341a0046a2004420042ffffcf8aebff" + "ffd51e4200108781808000200341b0036a2004420042a4ecc3b58fd4b498" + "e7004200108781808000200341c0026a2004420042bfa5949ccff0d2bbe4" + "004200108781808000200341d0016a2004420042d7d9ae9ae4f6e98dcb00" + "4200108781808000200341e0006a20044200429acdffcba3bdc4801a4200" + "10878180800020034190046a200341b0046a41086a290300200520032903" + "b00422047c200454ad7c220720032903a0047c220520032903a005220820" + "032903d0042209200341c0046a41086a2903007c220a7c220b7c220642fd" + "fff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f4200108781" + "80800020034180046a2004420042ffffcf8aebffffd51e42001087818080" + "00200341f0036a2004420042a4ecc3b58fd4b498e7004200108781808000" + "200341e0036a2004420042bfa5949ccff0d2bbe400420010878180800020" + "0341d0036a2004420042d7d9ae9ae4f6e98dcb0042001087818080002003" + "41c0036a20044200429acdffcba3bdc4801a4200108781808000200341a0" + "036a200341a0046a41086a2903002005200754ad7c2006200554ad7c220c" + "20032903b0037c220520032903f005220d200341d0046a41086a29030020" + "0a200954ad7c220e20032903e0047c220f7c2207200341a0056a41086a29" + "0300200b200854ad7c7c220820032903b0057c22107c2209200329038004" + "7c220a20034190046a41086a290300200329039004220420067c200454ad" + "7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb9" + "7f420010878180800020034190036a2004420042ffffcf8aebffffd51e42" + "0010878180800020034180036a2004420042a4ecc3b58fd4b498e7004200" + "108781808000200341f0026a2004420042bfa5949ccff0d2bbe400420010" + "8781808000200341e0026a2004420042d7d9ae9ae4f6e98dcb0042001087" + "81808000200341d0026a20044200429acdffcba3bdc4801a420010878180" + "8000200341b0026a20034180046a41086a290300200a200954ad7c200620" + "0a54ad7c221120032903f0037c220a200341b0036a41086a290300200520" + "0c54ad7c2009200554ad7c221220032903c0027c2205200341e0046a4108" + "6a290300200f200e54ad7c220f20032903f0047c220920032903c0067c22" + "0b200341f0056a41086a2903002007200d54ad7c2008200754ad7c7c2207" + "2003290380067c220c200341b0056a41086a2903002010200854ad7c7c22" + "0820032903c0057c22107c22137c220d2003290390037c220e200341a003" + "6a41086a29030020032903a003220420067c200454ad7c7c220642fdfff3" + "ffcffffff9897f7e2204420042abd5feffffffbfffb97f42001087818080" + "00200341a0026a2004420042ffffcf8aebffffd51e420010878180800020" + "034190026a2004420042a4ecc3b58fd4b498e70042001087818080002003" + "4180026a2004420042bfa5949ccff0d2bbe4004200108781808000200341" + "f0016a2004420042d7d9ae9ae4f6e98dcb004200108781808000200341e0" + "016a20044200429acdffcba3bdc4801a4200108781808000200341c0016a" + "20034190036a41086a290300200e200d54ad7c2006200e54ad7c22142003" + "290380037c220e200341f0036a41086a290300200a201154ad7c200d200a" + "54ad7c221520032903e0037c220a200341c0026a41086a29030020052012" + "54ad7c2013200554ad7c221220032903d0017c2205200341f0046a41086a" + "2903002009200f54ad7c22132003290380057c220d2003290390077c220f" + "200341c0066a41086a290300200b200954ad7c2007200b54ad7c7c220920" + "032903d0067c220b20034180066a41086a290300200c200754ad7c200820" + "0c54ad7c7c22072003290390067c220c200341c0056a41086a2903002010" + "200854ad7c7c220820032903d0057c22167c22177c22187c221020032903" + "a0027c2211200341b0026a41086a29030020032903b002220420067c2004" + "54ad7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbf" + "ffb97f4200108781808000200341b0016a2004420042ffffcf8aebffffd5" + "1e4200108781808000200341a0016a2004420042a4ecc3b58fd4b498e700" + "420010878180800020034190016a2004420042bfa5949ccff0d2bbe40042" + "0010878180800020034180016a2004420042d7d9ae9ae4f6e98dcb004200" + "108781808000200341f0006a20044200429acdffcba3bdc4801a42001087" + "81808000200341d0006a200341a0026a41086a2903002011201054ad7c20" + "06201154ad7c22192003290390027c221120034180036a41086a29030020" + "0e201454ad7c2010200e54ad7c221a20032903f0027c220e200341e0036a" + "41086a290300200a201554ad7c2018200a54ad7c221820032903d0037c22" + "0a200341d0016a41086a2903002005201254ad7c2017200554ad7c221520" + "032903607c220520034180056a41086a290300200d201354ad7c22172003" + "290390057c221020032903e0077c221220034190076a41086a290300200f" + "200d54ad7c2009200f54ad7c7c220d20032903a0077c220f200341d0066a" + "41086a290300200b200954ad7c2007200b54ad7c7c220920032903e0067c" + "220b20034190066a41086a290300200c200754ad7c2008200c54ad7c7c22" + "0720032903a0067c220c200341d0056a41086a2903002016200854ad7c7c" + "220820032903e0057c22167c221b7c221c7c221d7c221320032903b0017c" + "2214200341c0016a41086a29030020032903c001220420067c200454ad7c" + "7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f" + "4200108781808000200341c0006a2004420042ffffcf8aebffffd51e4200" + "108781808000200341306a2004420042a4ecc3b58fd4b498e70042001087" + "81808000200341206a2004420042bfa5949ccff0d2bbe400420010878180" + "8000200341106a2004420042d7d9ae9ae4f6e98dcb004200108781808000" + "200320044200429acdffcba3bdc4801a4200108781808000200341c0036a" + "41086a290300211e200341b0066a41086a290300211f200341f0066a4108" + "6a2903002120200341b0076a41086a2903002121200341f0076a41086a29" + "03002122200341b0086a41086a290300212320032903c008212420032903" + "8008212520032903c0072126200329038007212720032903d00221282003" + "41d0026a41086a2903002129200341e0026a41086a290300212a20034180" + "076a41086a290300212b200341c0076a41086a290300212c20034180086a" + "41086a290300212d200341c0086a41086a290300212e20032903d008212f" + "200329039008213020032903d007213120032903e0012132200341e0016a" + "41086a290300213320032903f0012134200341f0016a41086a2903002135" + "20034180026a41086a2903002136200341d0076a41086a29030021372003" + "4190086a41086a2903002138200341d0086a41086a290300213920032903" + "e008213a20032903a008213b2003290370213c200341f0006a41086a2903" + "00213d200329038001213e20034180016a41086a290300213f2003290390" + "01214020034190016a41086a2903002141200341a0016a41086a29030021" + "42200341a0086a41086a2903002143200341e0086a41086a290300214420" + "032903f008214520032903002146200341086a2903002147200329031021" + "48200341106a41086a29030021492003290320214a200341206a41086a29" + "0300214b2003290330214c200341306a41086a290300214d200320032903" + "40224e20034190056a41086a2903002010201754ad7c224f20032903b008" + "7c2204200341e0076a41086a2903002012201054ad7c200d201254ad7c7c" + "221020032903f0077c2212200341a0076a41086a290300200f200d54ad7c" + "2009200f54ad7c7c220d20032903b0077c220f200341e0066a41086a2903" + "00200b200954ad7c2007200b54ad7c7c220920032903f0067c220b200341" + "a0066a41086a290300200c200754ad7c2008200c54ad7c7c220720032903" + "b0067c220c200341e0056a41086a2903002016200854ad7c7c2208200341" + "e0006a41086a2903002005201554ad7c201b200554ad7c7c220520032903" + "c0037c2215200341d0036a41086a290300200a201854ad7c201c200a54ad" + "7c7c220a20032903e0027c2216200341f0026a41086a290300200e201a54" + "ad7c201d200e54ad7c7c220e2003290380027c221720034190026a41086a" + "2903002011201954ad7c2013201154ad7c7c221120032903a0017c221820" + "0341b0016a41086a2903002014201354ad7c2006201454ad7c7c22197c22" + "13200341d0006a41086a2903002003290350221420067c201454ad7c7c22" + "1a370380092003204c204020342028202720262025202420232004204f54" + "ad7c2010200454ad7c221b7c220420222012201054ad7c200d201254ad7c" + "7c22067c22102021200f200d54ad7c2009200f54ad7c7c220d7c220f2020" + "200b200954ad7c2007200b54ad7c7c22097c220b201f200c200754ad7c20" + "08200c54ad7c7c22072005200854ad7c2208201e2015200554ad7c200a20" + "1554ad7c7c22057c220c202a2016200a54ad7c200e201654ad7c7c220a7c" + "221220362017200e54ad7c2011201754ad7c7c220e7c2214204220182011" + "54ad7c2019201854ad7c7c22117c2215200341c0006a41086a2903002013" + "204e54ad7c201a201354ad7c7c2213370388092003204a203e2032200820" + "0754ad2005200854ad7c221620312030202f202e2004201b54ad7c200620" + "0454ad7c22177c2204202d2010200654ad7c200d201054ad7c7c22067c22" + "08202c200f200d54ad7c2009200f54ad7c7c220d7c220f202b200b200954" + "ad7c2007200b54ad7c7c22107c22072029200c200554ad7c200a200c54ad" + "7c7c22057c220920352012200a54ad7c200e201254ad7c7c220a7c220b20" + "412014200e54ad7c2011201454ad7c7c220c7c220e204d2015201154ad7c" + "2013201554ad7c7c22113703900920032048203c2007201654ad20052007" + "54ad7c2212203b203a20392004201754ad7c2006200454ad7c22137c2204" + "20382008200654ad7c200d200854ad7c7c22067c22072037200f200d54ad" + "7c2010200f54ad7c7c220d7c220820332009200554ad7c200a200954ad7c" + "7c22057c2209203f200b200a54ad7c200c200b54ad7c7c220a7c220b204b" + "200e200c54ad7c2011200e54ad7c7c220c37039809200320462008201254" + "ad2005200854ad7c2208204520442004201354ad7c2006200454ad7c220e" + "7c220420432007200654ad7c200d200754ad7c7c220d7c2206203d200920" + "0554ad7c200a200954ad7c7c22057c22072049200b200a54ad7c200c200b" + "54ad7c7c22093703a00920032006200854ad2005200654ad7c200341f008" + "6a41086a2903002004200e54ad7c200d200454ad7c7c20472007200554ad" + "7c2009200754ad7c7c3703a809200020034180096a10d680808000200341" + "b0096a2480808080000b3701017f20004100413010858180800021004101" + "10a3808080002101200041306a41e086c0800041301086818080001a2000" + "20013a00600b3a01017f23808080800041306b2201248080808000200020" + "0141004130108581808000220110db808080002100200141306a24808080" + "800020000b42002000200120022003109080808000200041306a20014130" + "6a200241306a2003109080808000200020022d006020012d006022027341" + "0020036b712002733a00600bd80d010b7f23808080800041c0176b220224" + "808080800020012d00c0012103410021042002410010a3808080003a0088" + "03200242f2b7f89e96d4f0950b37038003200242ed95f3a18a8ad68b6737" + "03f802200242bac6f6c9ec89d7a4f9003703f002200242a0d793dfa38deb" + "d6867f3703e802200242dcc3d1d8a2e189d5183703e002200242dde092fb" + "ad92bfe0ad7f3703d802200242e5b583f4e7b1ffc1003703d002200242a2" + "cbbc87dfaeeae9073703c802200242df92b5f096bdedf7bb7f3703c00220" + "0242dac6a9d0caada1f3673703b802200242dab8daf1f5c3bebed9003703" + "b002200242ca98a58286dfc2b9cc003703a802200242f3db839b97c18ac9" + "113703a002200242c78ad690efa1bbdb4237039802200242e7e686aac8d9" + "ad8d1b3703900220024286f099948ec3dfd83b37038802200242c3c1b5e6" + "dbb3b1d0aa7f3703800220024286ec8ff1d98ef0d4a57f3703f801200242" + "d7f9c29aa4b2e4c0053703f001200242ebec8cc3b1ecedb3ef003703e801" + "200242e9ddf2d1d1b3a6ca987f3703e00120024280cbabf1d3f6a4d4a17f" + "3703d8012002429aacd2bde8e4fefab37f3703d0012002429094d094a0f4" + "a3f9753703c80120022001200241c8016a200310d980808000200241c005" + "6a200210e880808000200241c8016a41c400410841a002108e8080800020" + "022802cc0121010240024020022802c8014101460d0020022802d0012105" + "200241c8016a200241c0056a41a0021086818080001a200241c8016a41a0" + "026a200241c8011086818080002106200241003602b805200220053602b4" + "05200220013602b005200241c0056a41c0016a2107200241c0056a41e000" + "6a2108200241c8016a41e0006a2109200241c8046a210a200241c8016a41" + "c0016a2105200241b0056a210b413f2101024003402001417f460d014280" + "8082808080a080e9002001413f71ad88a7210c0240024020044101710d00" + "200c21040c010b41012104200241c8016a10ed80808000200c410171450d" + "00200241e0076a200510ba80808000200241c0086a200a10ba8080800020" + "0241a0096a200241e0076a200610b380808000200241e0166a200a200510" + "bc8080800020024180166a200241e0166a10ba80808000200241a0156a20" + "024180166a200241c0086a10bb8080800020024180166a200241a0156a20" + "0241e0076a10bb80808000200241800a6a20024180166a200241e0076a10" + "b380808000200241e00a6a200241a0096a200241c8016a10bb8080800020" + "0241c00b6a200241e00a6a10ba80808000200241a00c6a200241c00b6a20" + "0241c00b6a10bc80808000200241800d6a200241a00c6a200241a00c6a10" + "bc80808000200241e00d6a200241800d6a200241e00a6a10b38080800020" + "0241e0166a200241800a6a200910bb80808000200241c00e6a200241e016" + "6a200910bb80808000200241a00f6a200241c00e6a200610b38080800020" + "024180106a200241800d6a200241c8016a10b380808000200241e0166a20" + "0241c00e6a10ba8080800020024180166a200241e0166a200241e00d6a10" + "bb80808000200241e0166a20024180166a20024180106a10bb8080800020" + "0241c8016a200241e0166a20024180106a10bb80808000200241e0166a20" + "05200241e00a6a10bc8080800020024180166a200241e0166a10ba808080" + "00200241a0156a20024180166a200241e0076a10bb808080002005200241" + "a0156a200241c00b6a10bb80808000200241e0106a200a200510bc808080" + "00200241e0166a20024180106a200241c8016a10bb80808000200241c011" + "6a200241e0166a200241c00e6a10b380808000200241a0126a2009200241" + "e00d6a10b38080800020024180136a200241a0126a200241a0126a10bc80" + "8080002009200241c0116a20024180136a10bb80808000200241e0166a20" + "0241e0106a10ba80808000200241e0136a200241e0166a200241c0086a10" + "bb80808000200241c0146a200510ba80808000200241a0156a200241e013" + "6a200241c0146a10bb80808000200241e0166a200241a00f6a200241a00f" + "6a10bc8080800020024180166a200241e0166a200241a0156a10bb808080" + "00200241c0056a2005200510bc80808000200241e0166a200241c00e6a10" + "e2808080002008200241e0166a200241e0166a10bc808080002007200241" + "80166a41e0001086818080001a200b200241c0056a41bc8cc0800010ee80" + "8080000b2001417f6a21010c000b0b200241c8016a10ed80808000200220" + "022802b80522013602e016200141c400470d01200020033a000c2000200b" + "290200370200200041086a200b41086a280200360200200241c0176a2480" + "808080000f0b200120022802d00141888cc08000108c80808000000b2002" + "41003602c005200241e0166a200241c0056a10ef80808000000b8e010101" + "7f2380808080004180036b2201248080808000200141a0026a41306a4100" + "41301085818080001a200141a0026a41e086c0800041301086818080001a" + "2001200141a0026a41e000108681808000220141e0006a410041c0011085" + "818080001a200041a0026a410041a0021085818080001a2000200141a002" + "1086818080001a20014180036a2480808080000bd70301157f2380808080" + "0041c00d6b2203248080808000200241e0036a210420024180036a210520" + "0241a0026a2106200241c0016a2107200241e0006a210820012802044103" + "742109200341c0046a41a0026a210a200341a00b6a41c0016a210b200341" + "a00b6a41e0006a210c200341e0036a210d20034180036a210e200341a002" + "6a210f20034180096a41c0016a211020034180096a41e0006a2111200341" + "c0016a2112200341e0006a21132001280200211420012802082115034002" + "4020090d002001201541016a3602082000200241c0041086818080001a20" + "0341c00d6a2480808080000f0b201428020422162d000c20142802002d00" + "607210a380808000211720032002201641046a280200201641086a280200" + "201541cc8cc0800010ae80808000201428020010af808080002003418009" + "6a20032002201710b080808000201120132008201710b080808000201020" + "122007201710b080808000200341a00b6a200f2006201710b08080800020" + "0c200e2005201710b080808000200b200d2004201710b080808000200341" + "c0046a20034180096a41a0021086818080001a200a200341a00b6a41a002" + "1086818080001a2002200341c0046a41c0041086818080001a200941786a" + "2109201441086a21140c000b0b22000240200120024b0d00200220012003" + "10f080808000000b2000200241a0026c6a0bd60301027f23808080800041" + "e00f6b22042480808080002004200241e000108681808000220441e0006a" + "200241e0006a41e0001086818080001a2004200341306a220510dd808080" + "00200441306a200510dd80808000200441e0006a200310dd808080002004" + "41e0006a41306a200310dd80808000200441c0016a2001200241c0016a22" + "02200441e0006a10e980808000200441c00d6a200141e0036a200410b380" + "808000200441a00b6a200441c00d6a200441c00d6a41306a220310b88080" + "8000200441a00b6a41306a200441c00d6a200310b980808000200441e003" + "6a41e0006a200141a0026a2203200410b380808000200441e0036a41c001" + "6a20014180036a200410b380808000200441e0036a200441a00b6a41e000" + "1086818080001a20044180066a200441e0006a200410bc80808000200441" + "e0066a2003200110c38080800020044180096a200441e0066a2002200441" + "80066a10e980808000200441c00d6a20044180096a200441c0016a10b780" + "808000200441a00b6a200441c00d6a200441e0036a10b780808000200441" + "c00d6a200441e0036a10b6808080002000200441c00d6a200441c0016a10" + "c380808000200041a0026a200441a00b6a41a0021086818080001a200441" + "e00f6a2480808080000b2700200020012002200310908080800020004130" + "6a200141306a200241306a20031090808080000b30002000200110e28080" + "8000200041e0006a200141e0006a10e280808000200041c0016a200141c0" + "016a10e2808080000bbd0201097e2000420042002001290300220242abd5" + "feffffffbfffb97f56ad7d2203200129030822047d220542ffffcf8aebff" + "ffd51e7c2206200420028420012903102207842001290318220884200129" + "03202209842001290328220a845022011b3703082000420042abd5feffff" + "ffbfffb97f20027d20011b3703002000420020032003200454ad7d200620" + "0554ad7c423f87220220077d220342a4ecc3b58fd4b498e7007c22042001" + "1b3703102000420020022002200754ad7d2004200354ad7c423f87220220" + "087d220342bfa5949ccff0d2bbe4007c220420011b370318200042002002" + "2002200854ad7d2004200354ad7c423f87220220097d220342d7d9ae9ae4" + "f6e98dcb007c220420011b3703202000420020022002200954ad7d200420" + "0354ad7c423f87200a7d429acdffcba3bdc4801a7c20011b3703280bc701" + "01057f23808080800041c0016b2203248080808000200341306a22042001" + "41306a220510b280808000200320014130108681808000220341e0006a41" + "306a200241306a220641301086818080002107200341e0006a2002413010" + "86818080001a20002003200341e0006a10e1808080002004200541301086" + "818080001a200320014130108681808000220341e0006a20064130108681" + "8080001a2007200241301086818080001a200041306a2003200341e0006a" + "10e180808000200341c0016a2480808080000bcd0b01167f238080808000" + "41a0086b22032480808080002003200241e0006a220420024190016a2205" + "10b980808000200341306a2004200510b880808000200341e0006a200241" + "c0016a2206200241f0016a220710b98080800020034190016a2006200710" + "b880808000200341e0036a41306a2208200141306a220910b28080800020" + "0341e0036a41e0006a200141e0006a220a4130108681808000210b200341" + "e0036a4190016a220c20014190016a220d10b280808000200341e0036a41" + "c0016a200141c0016a220e4130108681808000210f200341e0036a41f001" + "6a2210200141f0016a221110b280808000200341e0036a20014130108681" + "8080001a20034180066a41306a200241306a221241301086818080002113" + "20034180066a200241301086818080001a20034180066a41e0006a200341" + "90016a4130108681808000211420034180066a4190016a200341e0006a41" + "30108681808000211520034180066a41c0016a200341306a413010868180" + "8000211620034180066a41f0016a200341301086818080002117200341c0" + "016a200341e0036a20034180066a10ea8080800020082009413010868180" + "80002108200b200a41301086818080002118200c200d4130108681808000" + "210b200f200e4130108681808000210f201020114130108681808000210c" + "200341e0036a200141301086818080001a20034180066a20124130108681" + "8080001a20132002413010868180800021102014200341e0006a41301086" + "818080002113201520034190016a41301086818080002114201620034130" + "10868180800021152017200341306a41301086818080002116200341c001" + "6a41306a200341e0036a20034180066a10ea808080002008200910b28080" + "80002018200a41301086818080002117200b200d10b280808000200f200e" + "4130108681808000210f200c201110b280808000200341e0036a20014130" + "1086818080001a20034180066a200441301086818080001a201020054130" + "108681808000211020142012413010868180800021142013200241301086" + "818080002113201520034190016a413010868180800021152016200341e0" + "006a41301086818080002116200341a0026a200341e0036a20034180066a" + "10ea8080800020082009413010868180800021082017200a413010868180" + "80002117200b200d4130108681808000210b200f200e4130108681808000" + "210f200c20114130108681808000210c200341e0036a2001413010868180" + "80001a20034180066a200541301086818080001a20102004413010868180" + "800021102013201241301086818080002113201420024130108681808000" + "21142015200341e0006a41301086818080002115201620034190016a4130" + "1086818080002116200341a0026a41306a200341e0036a20034180066a10" + "ea808080002008200910b2808080002017200a4130108681808000211720" + "0b200d10b280808000200f200e4130108681808000210f200c201110b280" + "808000200341e0036a200141301086818080001a20034180066a20064130" + "1086818080001a2010200741301086818080002110201320044130108681" + "808000211320142005413010868180800021142016201241301086818080" + "002116201520024130108681808000211520034180036a200341e0036a20" + "034180066a10ea808080002008200941301086818080001a2017200a4130" + "1086818080001a200b200d41301086818080001a200f200e413010868180" + "80001a200c201141301086818080001a200341e0036a2001413010868180" + "80001a20034180066a200741301086818080001a20102006413010868180" + "80001a2013200541301086818080001a2014200441301086818080001a20" + "15201241301086818080001a2016200241301086818080001a2003418003" + "6a41306a200341e0036a20034180066a10ea808080002000200341c0016a" + "41e000108681808000220241e0006a200341a0026a41e000108681808000" + "1a200241c0016a20034180036a41e0001086818080001a200341a0086a24" + "80808080000bb30301027f23808080800041e0066b220224808080800020" + "02200110ba80808000200241e0006a2001200141e0006a220310b3808080" + "00200241c0016a200241e0006a200241e0006a10bc808080002002418006" + "6a2001200310bb80808000200241a0056a20024180066a200141c0016a22" + "0110bc80808000200241a0026a200241a0056a10ba808080002002418003" + "6a2003200110b380808000200241e0036a20024180036a20024180036a10" + "bc80808000200241c0046a200110ba8080800020024180066a200241e003" + "6a200241e0036a41306a220110b88080800020024180066a41306a220320" + "0241e0036a200110b980808000200020024180066a200210bc8080800020" + "024180066a200241c0046a200241c0046a41306a220110b8808080002003" + "200241c0046a200110b980808000200041e0006a20024180066a200241c0" + "016a10bc8080800020024180066a200241c0016a200241a0026a10bc8080" + "8000200241a0056a20024180066a200241e0036a10bc8080800020024180" + "066a200241a0056a200210bb80808000200041c0016a20024180066a2002" + "41c0046a10bb80808000200241e0066a2480808080000b7c01037f238080" + "80800041e0006b22022480808080002002200141c0016a2203200141f001" + "6a220410b880808000200241306a2003200410b980808000200041c0016a" + "200141e0006a41e0001086818080001a2000200241e00010868180800041" + "e0006a200141e0001086818080001a200241e0006a2480808080000b3e00" + "20002001200210bb80808000200041e0006a200141e0006a200241e0006a" + "10bb80808000200041c0016a200141c0016a200241c0016a10bb80808000" + "0b3601017f23808080800041306b22032480808080002003200210b28080" + "800020002003200110b980808000200341306a2480808080000b87020201" + "7f0c7e23808080800041306b220324808080800020012903082104200229" + "030821052002290328210620012903282107200229032021082001290320" + "21092002290318210a2001290318210b2002290310210c2001290310210d" + "20032002290300220e20012903007c220f3703002003200520047c220420" + "0f200e54ad7c220e3703082003200c200d7c220d2004200554ad200e2004" + "54ad7c7c22043703102003200a200b7c2205200d200c54ad2004200d54ad" + "7c7c22043703182003200820097c220c2005200a54ad2004200554ad7c7c" + "22053703202003200620077c200c200854ad2005200c54ad7c7c37032820" + "00200310d680808000200341306a2480808080000b7401027f2380808080" + "004190016b220224808080800020022001200141306a220310b980808000" + "200241306a2001200310b880808000200241e0006a2001200110b9808080" + "0020002002200241306a10a780808000200041306a200241e0006a200310" + "a78080800020024190016a2480808080000b230020002001200210b88080" + "8000200041306a200141306a200241306a10b8808080000b230020002001" + "200210b980808000200041306a200141306a200241306a10b9808080000b" + "c71f02017f3b7e23808080800041c0076b2202248080808000200241c004" + "6a200129030822034200200129030022044200108781808000200241d004" + "6a20012903102205420020044200108781808000200241e0046a20012903" + "182206420020044200108781808000200241f0046a200129032022074200" + "2004420010878180800020024180056a2001290328220842002004420010" + "8781808000200241a0056a2005420020034200108781808000200241b005" + "6a2006420020034200108781808000200241c0056a200742002003420010" + "8781808000200241d0056a2008420020034200108781808000200241f005" + "6a200642002005420010878180800020024180066a200742002005420010" + "878180800020024190066a2008420020054200108781808000200241b006" + "6a2007420020064200108781808000200241c0066a200842002006420010" + "8781808000200241e0066a20084200200742001087818080002002419005" + "6a2004420020044200108781808000200241e0056a200342002003420010" + "8781808000200241a0066a2005420020054200108781808000200241d006" + "6a2006420020064200108781808000200241f0066a200742002007420010" + "878180800020024180076a2008420020084200108781808000200241b004" + "6a200229039005220642fdfff3ffcffffff9897f7e2203420042abd5feff" + "ffffbfffb97f4200108781808000200241a0046a2003420042ffffcf8aeb" + "ffffd51e420010878180800020024190046a2003420042a4ecc3b58fd4b4" + "98e700420010878180800020024180046a2003420042bfa5949ccff0d2bb" + "e4004200108781808000200241f0036a2003420042d7d9ae9ae4f6e98dcb" + "004200108781808000200241e0036a20034200429acdffcba3bdc4801a42" + "00108781808000200241d0036a20024190056a41086a2903002209200229" + "03c00422084201867c220420022903a0047c2205200241b0046a41086a29" + "030020022903b00422032006427d837c200354ad7c7c220642fdfff3ffcf" + "fffff9897f7e2203420042abd5feffffffbfffb97f420010878180800020" + "0241c0036a2003420042ffffcf8aebffffd51e4200108781808000200241" + "d0026a2003420042a4ecc3b58fd4b498e7004200108781808000200241e0" + "016a2003420042bfa5949ccff0d2bbe4004200108781808000200241f000" + "6a2003420042d7d9ae9ae4f6e98dcb004200108781808000200220034200" + "429acdffcba3bdc4801a4200108781808000200241b0036a20022903c003" + "220a20022903e005220b20022903d004220c200241c0046a41086a290300" + "7c22074201862008423f88847c22082004200954ad7c2209200229039004" + "7c220d200241a0046a41086a2903002005200454ad7c2006200554ad7c7c" + "220e7c2204200241d0036a41086a29030020022903d003220320067c2003" + "54ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5feffffffbf" + "ffb97f4200108781808000200241a0036a2003420042ffffcf8aebffffd5" + "1e420010878180800020024190036a2003420042a4ecc3b58fd4b498e700" + "420010878180800020024180036a2003420042bfa5949ccff0d2bbe40042" + "00108781808000200241f0026a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200241e0026a20034200429acdffcba3bdc4801a42001087" + "81808000200241c0026a20022903a003220f200241e0056a41086a290300" + "2008200b54ad7c2009200854ad7c2210200241d0046a41086a2903002007" + "200c54ad7c220c20022903e0047c220620022903a0057c22084201862007" + "423f88847c22072002290380047c220b20024190046a41086a290300200d" + "200954ad7c200e200d54ad7c7c220920022903d0027c220d200241c0036a" + "41086a2903002004200a54ad7c2005200454ad7c7c220a7c2204200241b0" + "036a41086a29030020022903b003220320057c200354ad7c7c220542fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200241b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200241a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "024190026a2003420042bfa5949ccff0d2bbe40042001087818080002002" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200241" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200241d001" + "6a20022903b0022211200241d0026a41086a290300200d200954ad7c200a" + "200d54ad7c221220022903e0017c220d20024180046a41086a290300200b" + "200754ad7c2009200b54ad7c221320022903f0037c22092007201054ad22" + "0e20022903a0067c2207200241e0046a41086a2903002006200c54ad7c22" + "1020022903f0047c220b20022903b0057c220a200241a0056a41086a2903" + "002008200654ad7c7c22064201862008423f88847c22147c22157c220820" + "02290390037c220c200241a0036a41086a2903002004200f54ad7c200520" + "0454ad7c7c22167c2204200241c0026a41086a29030020022903c0022203" + "20057c200354ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5" + "feffffffbfffb97f4200108781808000200241c0016a2003420042ffffcf" + "8aebffffd51e4200108781808000200241b0016a2003420042a4ecc3b58f" + "d4b498e7004200108781808000200241a0016a2003420042bfa5949ccff0" + "d2bbe400420010878180800020024190016a2003420042d7d9ae9ae4f6e9" + "8dcb00420010878180800020024180016a20034200429acdffcba3bdc480" + "1a4200108781808000200241e0006a20022903c0012217200241a0066a41" + "086a2903002007200e54ad7c2014200754ad7c2214200241f0046a41086a" + "290300200b201054ad7c22182002290380057c220720022903c0057c220e" + "200241b0056a41086a290300200a200b54ad7c2006200a54ad7c7c220b20" + "022903f0057c220a4201862006423f88847c220620022903e0037c220f20" + "0241f0036a41086a2903002009201354ad7c2015200954ad7c7c22092002" + "2903707c2210200241e0016a41086a290300200d201254ad7c2008200d54" + "ad7c7c220d2002290380037c221220024190036a41086a290300200c2008" + "54ad7c2016200c54ad7c7c220820022903a0027c220c200241b0026a4108" + "6a2903002004201154ad7c2005200454ad7c7c22157c2204200241d0016a" + "41086a29030020022903d001220320057c200354ad7c7c220542fdfff3ff" + "cffffff9897f7e2203420042abd5feffffffbfffb97f4200108781808000" + "200241d0006a2003420042ffffcf8aebffffd51e42001087818080002002" + "41c0006a2003420042a4ecc3b58fd4b498e7004200108781808000200241" + "306a2003420042bfa5949ccff0d2bbe4004200108781808000200241206a" + "2003420042d7d9ae9ae4f6e98dcb004200108781808000200241106a2003" + "4200429acdffcba3bdc4801a4200108781808000200241086a2903002116" + "200241d0066a41086a290300211920024180066a41086a290300211a2002" + "41d0056a41086a290300211b200229039006211c20022903b006211d2002" + "2903e002211e200241e0026a41086a290300211f200241f0026a41086a29" + "03002120200241b0066a41086a290300212120024190066a41086a290300" + "212220022903c006212320022903f006210320022903f0012124200241f0" + "016a41086a2903002125200229038002212620024180026a41086a290300" + "212720024190026a41086a2903002128200241c0066a41086a2903002129" + "20022903e006212a200241f0066a41086a290300212b200229038001212c" + "20024180016a41086a290300212d200229039001212e20024190016a4108" + "6a290300212f20022903a0012130200241a0016a41086a29030021312002" + "41b0016a41086a2903002132200241e0066a41086a290300213320022903" + "8007211120022903102134200241106a41086a2903002135200229032021" + "36200241206a41086a290300213720022903302138200241306a41086a29" + "030021392002290340213a200241c0006a41086a290300213b2002200229" + "0350223c2006201454ad223d20022903d0067c221320024180056a41086a" + "2903002007201854ad7c221820022903d0057c2214200241c0056a41086a" + "290300200e200754ad7c200b200e54ad7c7c22072002290380067c220e20" + "0241f0056a41086a290300200a200b54ad7c7c220b420186200a423f8884" + "7c220a200241e0036a41086a290300200f200654ad7c2009200f54ad7c7c" + "220620022903007c220f200241f0006a41086a2903002010200954ad7c20" + "0d201054ad7c7c220920022903f0027c221020024180036a41086a290300" + "2012200d54ad7c2008201254ad7c7c220d2002290390027c2212200241a0" + "026a41086a290300200c200854ad7c2015200c54ad7c7c220820022903b0" + "017c220c200241c0016a41086a2903002004201754ad7c2005200454ad7c" + "7c22157c2204200241e0006a41086a2903002002290360221720057c2017" + "54ad7c7c2217370390072002203a20302026201e20192013203d54ad7c20" + "0a201354ad7c2213201d201c201b2014201854ad7c2007201454ad7c2214" + "7c2205201a200e200754ad7c200b200e54ad7c7c22077c220e420186200b" + "423f88847c220b2006200a54ad7c220a2016200f200654ad7c2009200f54" + "ad7c7c22067c220f20202010200954ad7c200d201054ad7c7c22097c2210" + "20282012200d54ad7c2008201254ad7c7c220d7c22122032200c200854ad" + "7c2015200c54ad7c7c22087c220c200241d0006a41086a2903002004203c" + "54ad7c2017200454ad7c7c22153703980720022038202e2024200a200b54" + "ad2006200a54ad7c22162003202320222005201454ad7c2007200554ad7c" + "22147c22042021200e200754ad7c7c2205420186200e423f88847c220720" + "0b201354ad7c22137c220b201f200f200654ad7c2009200f54ad7c7c2206" + "7c220a20272010200954ad7c200d201054ad7c7c22097c220e2031201220" + "0d54ad7c2008201254ad7c7c220d7c220f203b200c200854ad7c2015200c" + "54ad7c7c220c3703a00720022036202c200b201654ad2006200b54ad7c22" + "0b202b2007200354ad7c2013200754ad7c2210202a20292004201454ad7c" + "2005200454ad7c22127c22034201862005423f88847c22137c2204202520" + "0a200654ad7c2009200a54ad7c7c22057c2206202f200e200954ad7c200d" + "200e54ad7c7c22077c22082039200f200d54ad7c200c200f54ad7c7c2209" + "3703a807200220342004200b54ad2005200454ad7c220d20112033200320" + "1254ad7c220b4201862003423f88847c22032013201054ad7c220a7c2204" + "202d2006200554ad7c2007200654ad7c7c22057c220620372008200754ad" + "7c2009200854ad7c7c22073703b00720022004200d54ad2005200454ad7c" + "200b423f8820024180076a41086a2903002003201154ad7c200a200354ad" + "7c7c7c20352006200554ad7c2007200654ad7c7c3703b807200020024190" + "076a10d680808000200241c0076a2480808080000be60101037f23808080" + "80004180126b220324808080800020032001200210b480808000200341a0" + "026a200141a0026a2204200241a0026a220510b480808000200341c0046a" + "2002200510c380808000200341e0066a2004200110c38080800020034180" + "096a200341e0066a200341c0046a10b480808000200341a00b6a20034180" + "096a200310b780808000200341c00d6a200341a00b6a200341a0026a10b7" + "80808000200341e00f6a200341a0026a10b6808080002000200341e00f6a" + "200310c380808000200041a0026a200341c00d6a41a0021086818080001a" + "20034180126a2480808080000b3c01017f23808080800041c0046b220224" + "808080800020022000200110be808080002000200241c004108681808000" + "1a200241c0046a2480808080000bd80701077f23808080800041c00d6b22" + "022480808080002002200141e000108681808000220241e0006a200141e0" + "006a220341e0001086818080001a200241c0016a200141c0016a220441e0" + "001086818080001a200241a0026a200141a0026a220541e0001086818080" + "001a20024180036a20014180036a220641e0001086818080001a200241e0" + "036a200141e0036a220741e0001086818080001a200241a00b6a20012006" + "10eb80808000200241c0046a200241a00b6a41e0001086818080001a2002" + "41a0056a200241a00b6a41e0006a220841e0001086818080001a20022002" + "41c0046a200110bb80808000200241a00b6a2002200210bc808080002002" + "200241a00b6a200241c0046a10bc8080800020024180036a200241a0056a" + "200610bc80808000200241a00b6a20024180036a20024180036a10bc8080" + "800020024180036a200241a00b6a200241a0056a10bc80808000200241a0" + "0b6a2005200410eb8080800020024180066a200241a00b6a41e000108681" + "8080001a200241e0066a200841e0001086818080001a200241a00b6a2003" + "200710eb80808000200241c0076a200241a00b6a41e0001086818080001a" + "200241a0086a200841e0001086818080001a200241e0006a20024180066a" + "200310bb80808000200241a00b6a200241e0006a200241e0006a10bc8080" + "8000200241e0006a200241a00b6a20024180066a10bc80808000200241e0" + "036a200241e0066a200710bc80808000200241a00b6a200241e0036a2002" + "41e0036a10bc80808000200241e0036a200241a00b6a200241e0066a10bc" + "80808000200241a00b6a200241a0086a200241a0086a41306a220110b880" + "808000200241a00b6a41306a200241a0086a200110b98080800020024180" + "066a200241a00b6a41e0001086818080001a200241a0026a20024180066a" + "200510bc80808000200241a00b6a200241a0026a200241a0026a10bc8080" + "8000200241a0026a200241a00b6a20024180066a10bc80808000200241c0" + "016a200241c0076a200410bb80808000200241a00b6a200241c0016a2002" + "41c0016a10bc80808000200241c0016a200241a00b6a200241c0076a10bc" + "8080800020024180096a200241e0001086818080001a20024180096a41e0" + "006a200241e0006a41e0001086818080001a20024180096a41c0016a2002" + "41c0016a41e0001086818080001a200241a00b6a200241a0026a41e00010" + "86818080001a200820024180036a41e0001086818080001a200241a00b6a" + "41c0016a200241e0036a41e0001086818080001a200020024180096a41a0" + "0210868180800041a0026a200241a00b6a41a0021086818080001a200241" + "c00d6a2480808080000bcd0102037f017e2380808080004180096b220224" + "8080808000200210ac8080800041002103413f2104034002400240024020" + "04417f460d0042012004413f71ad8642808084808080c080528321052003" + "4101710d01200542005221030c020b200041a0026a200241a0026a10b180" + "8080002000200241a0021086818080001a20024180096a2480808080000f" + "0b200241c0046a200210c0808080002002200241c0046a41c00410868180" + "80001a410121030b02402005500d002002200110bf808080000b2004417f" + "6a21040c000b0b23002000200110db80808000200041306a200141306a10" + "db808080007110a3808080000b3e0020002001200210bc80808000200041" + "e0006a200141e0006a200241e0006a10bc80808000200041c0016a200141" + "c0016a200241c0016a10bc808080000bbc0101047f23808080800041106b" + "2202248080808000200141086a21030340200241086a200310e680808000" + "02400240024020022d0008450d0020022d00092101410121040c010b0240" + "20012802002204450d00200420012802042205470d020b2002200141146a" + "10e68080800020022d0001210120022d000021040b200020013a00012000" + "20044101713a0000200241106a2480808080000f0b200142808080808001" + "37020c20012005417f6a2204360208200120043602040c000b0b6f01057f" + "23808080800041106b220324808080800041002104410121054100210602" + "400340200120062207460d01200341086a200210d080808000200741016a" + "210620032d00080d000b200120076b2104410021050b2000200436020420" + "002005360200200341106a2480808080000bf50401037f23808080800041" + "b0096b22022480808080002002200141306a220310bd8080800020024130" + "6a2002200210b980808000200241e0006a200241306a200241306a10b980" + "80800020024190016a200241e0006a200241e0006a10b980808000200241" + "c0016a2003200141e0006a220410a780808000200241f0016a200410bd80" + "808000200241d0086a200241f0016a200241f0016a10b980808000200241" + "80096a200241d0086a200241d0086a10b980808000200241c0076a200241" + "80096a20024180096a10b980808000200241a0026a200241c0076a200241" + "80096a10b980808000200241d0026a200241a0026a20024190016a10a780" + "80800020024180036a2002200241a0026a10b980808000200241b0036a20" + "0241c0016a20024190016a10a780808000200241e0036a200241a0026a20" + "0241a0026a10b98080800020024190046a200241e0036a200241a0026a10" + "b980808000200241c0046a200220024190046a10b880808000200241f004" + "6a200241c0046a20024180036a10a780808000200241a0056a200241d002" + "6a200241f0046a10b980808000200241d0056a2001200310a78080800020" + "024180066a200241c0046a200241d0056a10a780808000200241b0066a20" + "024180066a20024180066a10b980808000200241b0066a41306a200241a0" + "056a41301086818080001a200241b0066a41e0006a200241b0036a413010" + "86818080001a200241c0076a410041301085818080001a200241c0076a41" + "e0006a410041301085818080001a200241c0076a41306a41e086c0800041" + "301086818080001a2000200241b0066a200241c0076a200410a980808000" + "10c880808000200241b0096a2480808080000bf60601057f238080808000" + "41900d6b220324808080800020032001200210a780808000200341306a20" + "0141306a2204200241306a220510a780808000200341e0006a200141e000" + "6a2206200241e0006a220710a78080800020034190016a2001200410b980" + "808000200341c0016a2002200510b980808000200341f0016a2003419001" + "6a200341c0016a10a780808000200341a0026a2003200341306a10b98080" + "8000200341d0026a200341f0016a200341a0026a10b88080800020034180" + "036a2004200610b980808000200341b0036a2005200710b9808080002003" + "41e0036a20034180036a200341b0036a10a78080800020034190046a2003" + "41306a200341e0006a10b980808000200341c0046a200341e0036a200341" + "90046a10b880808000200341f0046a2001200610b980808000200341a005" + "6a2002200710b980808000200341d0056a200341f0046a200341a0056a10" + "a78080800020034180066a2003200341e0006a10b980808000200341b006" + "6a200341d0056a20034180066a10b880808000200341e0066a2003200310" + "b98080800020034190076a200341e0066a200310b980808000200341800c" + "6a200341e0006a200341e0006a10b980808000200341b00c6a200341800c" + "6a200341800c6a10b980808000200341e00c6a200341b00c6a200341b00c" + "6a10b980808000200341c0076a200341e00c6a200341b00c6a10b9808080" + "00200341f0076a200341306a200341c0076a10b980808000200341a0086a" + "200341306a200341c0076a10b880808000200341a00b6a200341b0066a20" + "0341b0066a10b980808000200341d00b6a200341a00b6a200341a00b6a10" + "b980808000200341e00c6a200341d00b6a200341d00b6a10b98080800020" + "0341d0086a200341e00c6a200341d00b6a10b98080800020034180096a20" + "0341c0046a200341d0086a10a780808000200341b0096a200341d0026a20" + "0341a0086a10a7808080002000200341b0096a20034180096a10b8808080" + "00200341e0096a200341d0086a20034190076a10a780808000200341900a" + "6a200341a0086a200341f0076a10a780808000200041306a200341900a6a" + "200341e0096a10b980808000200341c00a6a20034190076a200341d0026a" + "10a780808000200341f00a6a200341f0076a200341c0046a10a780808000" + "200041e0006a200341f00a6a200341c00a6a10b980808000200341900d6a" + "2480808080000b41002000200120022003109080808000200041306a2001" + "41306a200241306a2003109080808000200041e0006a200141e0006a2002" + "41e0006a20031090808080000bbe0601057f200041786a22012000417c6a" + "280200220241787122006a21030240024020024101710d00200241027145" + "0d012001280200220220006a21000240200120026b2201410028029c97c0" + "8000470d0020032802044103714103470d014100200036029497c0800020" + "032003280204417e7136020420012000410172360204200320003602000f" + "0b2001200210cc808080000b024002400240024002400240200328020422" + "024102710d00200341002802a097c08000460d022003410028029c97c080" + "00460d0320032002417871220210cc808080002001200220006a22004101" + "72360204200120006a20003602002001410028029c97c08000470d014100" + "200036029497c080000f0b20032002417e71360204200120004101723602" + "04200120006a20003602000b2000418002490d0220012000108481808000" + "41002101410041002802b497c08000417f6a22003602b497c0800020000d" + "04024041002802fc94c080002200450d00410021010340200141016a2101" + "200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602b497c0" + "80000f0b410020013602a097c080004100410028029897c0800020006a22" + "0036029897c080002001200041017236020402402001410028029c97c080" + "00470d004100410036029497c080004100410036029c97c080000b200041" + "002802ac97c0800022044d0d0341002802a097c080002200450d03410021" + "02410028029897c0800022054129490d0241f494c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b2001280208" + "21010c000b0b4100200136029c97c080004100410028029497c080002000" + "6a220036029497c0800020012000410172360204200120006a2000360200" + "0f0b200041f80171418495c080006a210302400240410028028c97c08000" + "220241012000410376742200710d004100200220007236028c97c0800020" + "0321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802fc94c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff" + "1f200241ff1f4b1b3602b497c08000200520044d0d004100417f3602ac97" + "c080000b0b4d01017f23808080800041206b220224808080800020024100" + "36021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110a480808000000b800601057f0240" + "024002402000417c6a220328020022044178712205410441082004410371" + "22061b20016a490d0002402006450d002005200141276a4b0d020b411020" + "02410b6a4178712002410b491b210102400240024020060d002001418002" + "490d0120052001410472490d01200520016b418180084f0d010c020b2000" + "41786a220720056a21060240024002400240200520014f0d002006410028" + "02a097c08000460d032006410028029c97c08000460d0220062802042204" + "4102710d042004417871220420056a22052001490d042006200410cc8080" + "8000200520016b22024110490d0120032001200328020041017172410272" + "360200200720016a22012002410372360204200720056a22052005280204" + "4101723602042001200210cd8080800020000f0b200520016b2202410f4d" + "0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210cd8080800020000f0b" + "20032005200328020041017172410272360200200720056a220220022802" + "0441017236020420000f0b410028029497c0800020056a22052001490d01" + "02400240200520016b2202410f4b0d002003200441017120057241027236" + "0200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236" + "0204200720056a2205200236020020052005280204417e713602040b4100" + "200136029c97c080004100200236029497c0800020000f0b410028029897" + "c0800020056a220520014b0d040b0240200210ce8080800022050d004100" + "0f0b20052000417c4178200328020022014103711b20014178716a220120" + "0220012002491b1086818080002102200010c980808000200221000b2000" + "0f0b41e992c08000419893c0800010ca80808000000b41a893c0800041d8" + "93c0800010ca80808000000b200320012004410171724102723602002007" + "20016a2202200520016b22054101723602044100200536029897c0800041" + "0020023602a097c0800020000b820301047f200028020c21020240024002" + "402001418002490d002000280218210302400240024020022000470d0020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000" + "2802082201200236020c200220013602080c010b200041146a200041106a" + "20021b21040340200421052001220241146a200241106a20022802142201" + "1b210420024114411020011b6a28020022010d000b200541003602000b20" + "03450d020240200028021c41027441f493c080006a22012802002000460d" + "0020034110411420032802102000461b6a20023602002002450d030c020b" + "2001200236020020020d014100410028029097c08000417e200028021c77" + "7136029097c080000c020b0240200220002802082204460d002004200236" + "020c200220043602080f0b4100410028028c97c08000417e200141037677" + "7136028c97c080000f0b20022003360218024020002802102201450d0020" + "022001360210200120023602180b20002802142201450d00200220013602" + "14200120023602180f0b0ba00401027f200020016a210202400240200028" + "020422034101710d002003410271450d012000280200220320016a210102" + "40200020036b2200410028029c97c08000470d0020022802044103714103" + "470d014100200136029497c0800020022002280204417e71360204200020" + "01410172360204200220013602000c020b2000200310cc808080000b0240" + "024002400240200228020422034102710d00200241002802a097c0800046" + "0d022002410028029c97c08000460d0320022003417871220310cc808080" + "002000200320016a2201410172360204200020016a200136020020004100" + "28029c97c08000470d014100200136029497c080000f0b20022003417e71" + "36020420002001410172360204200020016a20013602000b024020014180" + "02490d00200020011084818080000f0b200141f80171418495c080006a21" + "0202400240410028028c97c08000220341012001410376742201710d0041" + "00200320017236028c97c08000200221010c010b200228020821010b2002" + "20003602082001200036020c2000200236020c200020013602080f0b4100" + "20003602a097c080004100410028029897c0800020016a220136029897c0" + "8000200020014101723602042000410028029c97c08000470d0141004100" + "36029497c080004100410036029c97c080000f0b4100200036029c97c080" + "004100410028029497c0800020016a220136029497c08000200020014101" + "72360204200020016a20013602000f0b0bc12502087f017e024002400240" + "02400240024002400240200041f4014b0d00410028028c97c08000220141" + "102000410b6a41f803712000410b491b220241037622037622004103710d" + "012002410028029497c080004d0d0720000d02410028029097c080002200" + "0d030c070b2000410b6a22034178712102410028029097c080002204450d" + "06411f21050240200041f4ffff074b0d002002410620034108766722006b" + "7641017120004101746b413e6a21050b410020026b210302402005410274" + "41f493c080006a28020022010d0041002100410021060c040b4100210020" + "024100411920054101766b2005411f461b74210741002106034002402001" + "220128020441787122082002490d00200820026b220820034f0d00200821" + "032001210620080d004100210320012106200121000c060b200128021422" + "082000200820012007411d764104716a41106a2802002201471b20002008" + "1b2100200741017421072001450d040c000b0b024002402000417f734101" + "7120036a22074103742200418495c080006a22022000418c95c080006a28" + "020022032802082206460d002006200236020c200220063602080c010b41" + "002001417e2007777136028c97c080000b20032000410372360204200320" + "006a22002000280204410172360204200341086a0f0b0240024020002003" + "7441022003742200410020006b72716822084103742203418495c080006a" + "22062003418c95c080006a28020022002802082207460d00200720063602" + "0c200620073602080c010b41002001417e2008777136028c97c080000b20" + "002002410372360204200020026a2207200320026b220241017236020420" + "0020036a20023602000240410028029497c080002201450d002001417871" + "418495c080006a2106410028029c97c08000210302400240410028028c97" + "c08000220841012001410376742201710d004100200820017236028c97c0" + "8000200621010c010b200628020821010b20062003360208200120033602" + "0c2003200636020c200320013602080b4100200736029c97c08000410020" + "0236029497c08000200041086a0f0b20006841027441f493c080006a2802" + "00220628020441787120026b210320062101024002400340024020062802" + "1022000d00200628021422000d0020012802182105024002400240200128" + "020c22002001470d00200141144110200128021422001b6a28020022060d" + "01410021000c020b20012802082206200036020c200020063602080c010b" + "200141146a200141106a20001b21070340200721082006220041146a2000" + "41106a200028021422061b210720004114411020061b6a28020022060d00" + "0b200841003602000b2005450d030240200128021c41027441f493c08000" + "6a22062802002001460d0020054110411420052802102001461b6a200036" + "02002000450d040c030b2006200036020020000d024100410028029097c0" + "8000417e200128021c777136029097c080000c030b200028020441787120" + "026b22062003200620034922061b21032000200120061b2101200021060c" + "000b0b20002005360218024020012802102206450d002000200636021020" + "0620003602180b20012802142206450d0020002006360214200620003602" + "180b02400240024020034110490d0020012002410372360204200120026a" + "22022003410172360204200220036a2003360200410028029497c0800022" + "07450d012007417871418495c080006a2106410028029c97c08000210002" + "400240410028028c97c08000220841012007410376742207710d00410020" + "0820077236028c97c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200120" + "0320026a2200410372360204200120006a22002000280204410172360204" + "0c010b4100200236029c97c080004100200336029497c080000b20014108" + "6a0f0b024020002006720d004100210641022005742200410020006b7220" + "04712200450d0320006841027441f493c080006a28020021000b2000450d" + "010b0340200020062000280204417871220120026b220820034922051b21" + "04200120024921072008200320051b21080240200028021022010d002000" + "28021421010b2006200420071b21062003200820071b2103200121002001" + "0d000b0b2006450d000240410028029497c0800022002002490d00200320" + "0020026b4f0d010b20062802182105024002400240200628020c22002006" + "470d00200641144110200628021422001b6a28020022010d01410021000c" + "020b20062802082201200036020c200020013602080c010b200641146a20" + "0641106a20001b21070340200721082001220041146a200041106a200028" + "021422011b210720004114411020011b6a28020022010d000b2008410036" + "02000b02402005450d0002400240200628021c41027441f493c080006a22" + "012802002006460d0020054110411420052802102006461b6a2000360200" + "2000450d020c010b2001200036020020000d004100410028029097c08000" + "417e200628021c777136029097c080000c010b2000200536021802402006" + "2802102201450d0020002001360210200120003602180b20062802142201" + "450d0020002001360214200120003602180b0240024020034110490d0020" + "062002410372360204200620026a22002003410172360204200020036a20" + "0336020002402003418002490d00200020031084818080000c020b200341" + "f80171418495c080006a210202400240410028028c97c080002201410120" + "03410376742203710d004100200120037236028c97c08000200221030c01" + "0b200228020821030b200220003602082003200036020c2000200236020c" + "200020033602080c010b2006200320026a2200410372360204200620006a" + "220020002802044101723602040b200641086a0f0b024002400240024002" + "4002400240410028029497c08000220020024f0d000240410028029897c0" + "8000220020024b0d0041002100200241af80046a22064110764000220341" + "7f4622070d0720034110742201450d07410041002802a497c08000410020" + "064180807c7120071b22086a22003602a497c08000410041002802a897c0" + "800022032000200320004b1b3602a897c0800002400240024041002802a0" + "97c080002203450d0041f494c08000210003402000280200220620002802" + "0422076a2001460d02200028020822000d000c030b0b0240024041002802" + "b097c080002200450d00200020014d0d010b410020013602b097c080000b" + "410041ff1f3602b497c08000410020083602f894c08000410020013602f4" + "94c080004100418495c0800036029095c080004100418c95c08000360298" + "95c080004100418495c0800036028c95c080004100419495c080003602a0" + "95c080004100418c95c0800036029495c080004100419c95c080003602a8" + "95c080004100419495c0800036029c95c08000410041a495c080003602b0" + "95c080004100419c95c080003602a495c08000410041ac95c080003602b8" + "95c08000410041a495c080003602ac95c08000410041b495c080003602c0" + "95c08000410041ac95c080003602b495c08000410041bc95c080003602c8" + "95c08000410041b495c080003602bc95c080004100410036028095c08000" + "410041c495c080003602d095c08000410041bc95c080003602c495c08000" + "410041c495c080003602cc95c08000410041cc95c080003602d895c08000" + "410041cc95c080003602d495c08000410041d495c080003602e095c08000" + "410041d495c080003602dc95c08000410041dc95c080003602e895c08000" + "410041dc95c080003602e495c08000410041e495c080003602f095c08000" + "410041e495c080003602ec95c08000410041ec95c080003602f895c08000" + "410041ec95c080003602f495c08000410041f495c0800036028096c08000" + "410041f495c080003602fc95c08000410041fc95c0800036028896c08000" + "410041fc95c0800036028496c080004100418496c0800036029096c08000" + "4100418c96c0800036029896c080004100418496c0800036028c96c08000" + "4100419496c080003602a096c080004100418c96c0800036029496c08000" + "4100419c96c080003602a896c080004100419496c0800036029c96c08000" + "410041a496c080003602b096c080004100419c96c080003602a496c08000" + "410041ac96c080003602b896c08000410041a496c080003602ac96c08000" + "410041b496c080003602c096c08000410041ac96c080003602b496c08000" + "410041bc96c080003602c896c08000410041b496c080003602bc96c08000" + "410041c496c080003602d096c08000410041bc96c080003602c496c08000" + "410041cc96c080003602d896c08000410041c496c080003602cc96c08000" + "410041d496c080003602e096c08000410041cc96c080003602d496c08000" + "410041dc96c080003602e896c08000410041d496c080003602dc96c08000" + "410041e496c080003602f096c08000410041dc96c080003602e496c08000" + "410041ec96c080003602f896c08000410041e496c080003602ec96c08000" + "410041f496c0800036028097c08000410041ec96c080003602f496c08000" + "410041fc96c0800036028897c08000410041f496c080003602fc96c08000" + "410020013602a097c08000410041fc96c0800036028497c0800041002008" + "41586a220036029897c0800020012000410172360204200120006a412836" + "0204410041808080013602ac97c080000c080b200320014f0d0020062003" + "4b0d00200028020c450d030b410041002802b097c0800022002001200020" + "01491b3602b097c08000200120086a210641f494c0800021000240024002" + "400340200028020022072006460d01200028020822000d000c020b0b2000" + "28020c450d010b41f494c080002100024003400240200028020022062003" + "4b0d002003200620002802046a2206490d020b200028020821000c000b0b" + "410020013602a097c080004100200841586a220036029897c08000200120" + "00410172360204200120006a4128360204410041808080013602ac97c080" + "002003200641606a41787141786a22002000200341106a491b2207411b36" + "020441002902f494c080002109200741106a41002902fc94c08000370200" + "20072009370208410020083602f894c08000410020013602f494c0800041" + "00200741086a3602fc94c080004100410036028095c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072003460d07" + "20072007280204417e713602042003200720036b22004101723602042007" + "200036020002402000418002490d00200320001084818080000c080b2000" + "41f80171418495c080006a210602400240410028028c97c0800022014101" + "2000410376742200710d004100200120007236028c97c08000200621000c" + "010b200628020821000b200620033602082000200336020c200320063602" + "0c200320003602080c070b200020013602002000200028020420086a3602" + "04200120024103723602042007410f6a41787141786a2206200120026a22" + "006b2103200641002802a097c08000460d032006410028029c97c0800046" + "0d040240200628020422024103714101470d0020062002417871220210cc" + "80808000200220036a2103200620026a220628020421020b20062002417e" + "7136020420002003410172360204200020036a2003360200024020034180" + "02490d00200020031084818080000c060b200341f80171418495c080006a" + "210202400240410028028c97c08000220641012003410376742203710d00" + "4100200620037236028c97c08000200221030c010b200228020821030b20" + "0220003602082003200036020c2000200236020c200020033602080c050b" + "4100200020026b220336029897c08000410041002802a097c08000220020" + "026a22063602a097c0800020062003410172360204200020024103723602" + "04200041086a21000c060b410028029c97c0800021030240024020002002" + "6b2206410f4b0d004100410036029c97c080004100410036029497c08000" + "20032000410372360204200320006a220020002802044101723602040c01" + "0b4100200636029497c080004100200320026a220136029c97c080002001" + "2006410172360204200320006a2006360200200320024103723602040b20" + "0341086a0f0b2000200720086a360204410041002802a097c08000220041" + "0f6a417871220341786a22063602a097c080004100200020036b41002802" + "9897c0800020086a22036a41086a220136029897c0800020062001410172" + "360204200020036a4128360204410041808080013602ac97c080000c030b" + "410020003602a097c080004100410028029897c0800020036a2203360298" + "97c08000200020034101723602040c010b4100200036029c97c080004100" + "410028029497c0800020036a220336029497c08000200020034101723602" + "04200020036a20033602000b200141086a0f0b41002100410028029897c0" + "8000220320024d0d004100200320026b220336029897c080004100410028" + "02a097c08000220020026a22063602a097c0800020062003410172360204" + "20002002410372360204200041086a0f0b20000b4301017f238080808000" + "41206b2201248080808000200141003602182001410136020c200141d085" + "c0800036020820014204370210200141086a200010a480808000000b4e01" + "037f024020012802042202200128020822034e0d0020012003417f6a2204" + "36020820012802002d000020044107717641017110a38080800021040b20" + "0020043a0001200020022003483a00000b18002001200085220042002000" + "7d84427f5510a3808080000b10002000417f7341017110a3808080000bf2" + "0202017f017e23808080800041f0006b2206248080808000200620013602" + "0c2006200036020820062003360214200620023602102006410236021c20" + "0641c08dc08000360218024020042802000d002006410336025c200641f4" + "8dc08000360258200642033702642006418280808000ad42208622072006" + "41106aad8437034820062007200641086aad843703402006418380808000" + "ad422086200641186aad843703382006200641386a360260200641d8006a" + "200510a480808000000b200641206a41106a200441106a29020037030020" + "0641206a41086a200441086a290200370300200620042902003703202006" + "410436025c200641a88ec080003602582006420437026420064182808080" + "00ad4220862207200641106aad8437035020062007200641086aad843703" + "482006418480808000ad422086200641206aad8437034020064183808080" + "00ad422086200641186aad843703382006200641386a360260200641d800" + "6a200510a480808000000bb30301037f2380808080004180016b22022480" + "8080800020002802002100024002400240200128021422034110710d0020" + "03412071450d0120002d0000210341810121000340200220006a417e6a20" + "03410f712204413072200441376a2004410a491b3a0000200341ff017122" + "0441047621032000417f6a21002004410f4b0d000b200141fd8ec0800041" + "02200220006a417f6a41810120006b10d58080800021000c020b20002d00" + "00210341810121000340200220006a417e6a2003410f7122044130722004" + "41d7006a2004410a491b3a0000200341ff0171220441047621032000417f" + "6a21002004410f4b0d000b200141fd8ec080004102200220006a417f6a41" + "810120006b10d58080800021000c010b024002400240024020002d000022" + "0341e400490d002002200341e4006e2204419c7f6c20036a41ff01714101" + "7441ff8ec080006a2f00003b0001410021000c010b410221002003410a4f" + "0d01200321040b200220006a20044130723a00000c010b41012100200220" + "0341017441ff8ec080006a2f00003b00010b200141014100200220006a20" + "0041037310d58080800021000b20024180016a24808080800020000bb605" + "01087f20002802142205410171220620046a21070240024020054104710d" + "00410021010c010b0240024020020d00410021080c010b02402002410371" + "22090d000c010b410021082001210a03402008200a2c000041bf7f4a6a21" + "08200a41016a210a2009417f6a22090d000b0b200820076a21070b412b41" + "8080c40020061b2106024020002802000d000240200028021c220a200028" + "0220220820062001200210f480808000450d0041010f0b200a2003200420" + "0828020c11808080800080808080000f0b02400240024002402000280204" + "220a20074b0d00200028021c220a2000280220220820062001200210f480" + "808000450d0141010f0b2005410871450d01200028021021052000413036" + "021020002d0018210b4101210c200041013a0018200028021c2208200028" + "0220220920062001200210f4808080000d02200a20076b41016a210a0240" + "0340200a417f6a220a450d01200841302009280210118180808000808080" + "8000450d000b41010f0b0240200820032004200928020c11808080800080" + "80808000450d0041010f0b2000200b3a00182000200536021041000f0b20" + "0a20032004200828020c1180808080008080808000210c0c010b200a2007" + "6b2105024002400240410120002d0018220a200a4103461b220a0e030200" + "01020b2005210a410021050c010b2005410176210a200541016a41017621" + "050b200a41016a210a2000280210210720002802202108200028021c2109" + "02400340200a417f6a220a450d0120092007200828021011818080800080" + "80808000450d000b41010f0b4101210c2009200820062001200210f48080" + "80000d00200920032004200828020c11808080800080808080000d004100" + "210a034002402005200a470d0020052005490f0b200a41016a210a200920" + "0720082802101181808080008080808000450d000b200a417f6a2005490f" + "0b200c0be802010d7e2000200129032822022001290300220342d5aa8180" + "8080c080c6007c2204200354ad427f7c22052005200129030822067c2205" + "200654ad7c2005428180b0f5948080aa617c2207200554ad7c427f7c423f" + "8722052005200129031022087c2205200854ad7c200542dc93bccaf0abcb" + "e7987f7c2209200554ad7c427f7c423f87220520052001290318220a7c22" + "05200a54ad7c200542c1daebe3b08fadc49b7f7c220b200554ad7c427f7c" + "423f87220520052001290320220c7c2205200c54ad7c200542a9a6d1e59b" + "8996f2b47f7c220d200554ad7c427f7c423f872205200220057c22052002" + "54ad7c200542e6b280b4dcc2bbff657c220e200554ad7c2205427f7c2202" + "83420020057d2205200e83843703282000200c2002832005200d83843703" + "202000200a2002832005200b838437031820002008200283200520098384" + "370310200020062002832005200783843703082000200320028320052004" + "83843703000b2c0002402002450d0041002d00e893c080001a200210ce80" + "80800021010b20002002360204200020013602000b5a01017f2380808080" + "0041106b2202248080808000200241086a20002000280200410141a00210" + "8b80808000024020022802082200418180808078460d002000200228020c" + "2001108c80808000000b200241106a2480808080000b4800200020012002" + "200310b080808000200041e0006a200141e0006a200241e0006a200310b0" + "80808000200020022d00c00120012d00c001220273410020036b71200273" + "3a00c0010b2b00200020012002200310b080808000200020022d00602001" + "2d0060220273410020036b712002733a00600b8501002000290300200129" + "030010d1808080002000290308200129030810d1808080007110a3808080" + "002000290310200129031010d1808080007110a380808000200029031820" + "0129031810d1808080007110a3808080002000290320200129032010d180" + "8080007110a3808080002000290328200129032810d1808080007110a380" + "8080000bda0602017f067e23808080800041306b22022480808080002002" + "2001290000220342388620034280fe0383422886842003428080fc078342" + "1886200342808080f80f834208868484200342088842808080f80f832003" + "421888428080fc07838420034228884280fe038320034238888484842204" + "37032820022001290008220342388620034280fe03834228868420034280" + "80fc0783421886200342808080f80f834208868484200342088842808080" + "f80f832003421888428080fc07838420034228884280fe03832003423888" + "848484220537032020022001290010220342388620034280fe0383422886" + "842003428080fc0783421886200342808080f80f83420886848420034208" + "8842808080f80f832003421888428080fc07838420034228884280fe0383" + "2003423888848484220637031820022001290018220342388620034280fe" + "0383422886842003428080fc0783421886200342808080f80f8342088684" + "84200342088842808080f80f832003421888428080fc0783842003422888" + "4280fe038320034238888484842207370310200220012900202203423886" + "20034280fe0383422886842003428080fc0783421886200342808080f80f" + "834208868484200342088842808080f80f832003421888428080fc078384" + "20034228884280fe03832003423888848484220837030820022001290028" + "220342388620034280fe0383422886842003428080fc0783421886200342" + "808080f80f834208868484200342088842808080f80f8320034218884280" + "80fc07838420034228884280fe0383200342388884848422033703002002" + "419087c0800010dd80808000200342d5aa81808080c080c6007c200354ad" + "427f7c2203200820037c2203200854ad7c2003428180b0f5948080aa617c" + "200354ad7c427f7c423f872203200720037c2203200754ad7c200342dc93" + "bccaf0abcbe7987f7c200354ad7c427f7c423f872203200620037c220320" + "0654ad7c200342c1daebe3b08fadc49b7f7c200354ad7c427f7c423f8722" + "03200520037c2203200554ad7c200342a9a6d1e59b8996f2b47f7c200354" + "ad7c427f7c423f872203200420037c2203200454ad7c200342e6b280b4dc" + "c2bbff657c200354ad7ca741016a41017110a38080800021012000200241" + "3010868180800020013a0030200241306a2480808080000b3901017f2380" + "8080800041306b220224808080800020022000200110a780808000200020" + "0241301086818080001a200241306a2480808080000b9b1602017f177e23" + "808080800041a0056b2201248080808000200141b0046a20002903002202" + "42fdfff3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010" + "8781808000200141a0046a2003420042ffffcf8aebffffd51e4200108781" + "80800020014190046a2003420042a4ecc3b58fd4b498e700420010878180" + "800020014180046a2003420042bfa5949ccff0d2bbe40042001087818080" + "00200141f0036a2003420042d7d9ae9ae4f6e98dcb004200108781808000" + "200141e0036a20034200429acdffcba3bdc4801a42001087818080002001" + "41d0036a20012903a004220420002903087c2205200141b0046a41086a29" + "0300200220012903b00422037c200354ad7c7c220242fdfff3ffcffffff9" + "897f7e2203420042abd5feffffffbfffb97f4200108781808000200141c0" + "036a2003420042ffffcf8aebffffd51e4200108781808000200141d0026a" + "2003420042a4ecc3b58fd4b498e7004200108781808000200141e0016a20" + "03420042bfa5949ccff0d2bbe4004200108781808000200141f0006a2003" + "420042d7d9ae9ae4f6e98dcb004200108781808000200120034200429acd" + "ffcba3bdc4801a4200108781808000200141b0036a20012903c003220620" + "0129039004220720002903107c2208200141a0046a41086a290300200520" + "0454ad7c2002200554ad7c7c22097c2205200141d0036a41086a29030020" + "012903d003220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e" + "2203420042abd5feffffffbfffb97f4200108781808000200141a0036a20" + "03420042ffffcf8aebffffd51e420010878180800020014190036a200342" + "0042a4ecc3b58fd4b498e700420010878180800020014180036a20034200" + "42bfa5949ccff0d2bbe4004200108781808000200141f0026a2003420042" + "d7d9ae9ae4f6e98dcb004200108781808000200141e0026a20034200429a" + "cdffcba3bdc4801a4200108781808000200141c0026a20012903a003220a" + "200129038004220b20002903187c220420014190046a41086a2903002008" + "200754ad7c2009200854ad7c7c220820012903d0027c2207200141c0036a" + "41086a2903002005200654ad7c2002200554ad7c7c220c7c2205200141b0" + "036a41086a29030020012903b003220320027c200354ad7c7c220242fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200141b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200141a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "014190026a2003420042bfa5949ccff0d2bbe40042001087818080002001" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200141" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200141d001" + "6a20012903b002220d20012903f003220e20002903207c22062001418004" + "6a41086a2903002004200b54ad7c2008200454ad7c7c220420012903e001" + "7c2209200141d0026a41086a2903002007200854ad7c200c200754ad7c7c" + "22082001290390037c2207200141a0036a41086a2903002005200a54ad7c" + "2002200554ad7c7c220c7c2205200141c0026a41086a29030020012903c0" + "02220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e22034200" + "42abd5feffffffbfffb97f4200108781808000200141c0016a2003420042" + "ffffcf8aebffffd51e4200108781808000200141b0016a2003420042a4ec" + "c3b58fd4b498e7004200108781808000200141a0016a2003420042bfa594" + "9ccff0d2bbe400420010878180800020014190016a2003420042d7d9ae9a" + "e4f6e98dcb00420010878180800020014180016a20034200429acdffcba3" + "bdc4801a4200108781808000200141e0006a20012903c001220f20012903" + "e003221020002903287c220a200141f0036a41086a2903002006200e54ad" + "7c2004200654ad7c7c220620012903707c220b200141e0016a41086a2903" + "002009200454ad7c2008200954ad7c7c22042001290380037c2209200141" + "90036a41086a2903002007200854ad7c200c200754ad7c7c220820012903" + "a0027c2207200141b0026a41086a2903002005200d54ad7c2002200554ad" + "7c7c220c7c2205200141d0016a41086a29030020012903d001220320027c" + "200354ad7c7c220242fdfff3ffcffffff9897f7e2203420042abd5feffff" + "ffbfffb97f4200108781808000200141d0006a2003420042ffffcf8aebff" + "ffd51e4200108781808000200141c0006a2003420042a4ecc3b58fd4b498" + "e7004200108781808000200141306a2003420042bfa5949ccff0d2bbe400" + "4200108781808000200141206a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200141106a20034200429acdffcba3bdc4801a4200108781" + "808000200141b0016a41086a290300210d20014190026a41086a29030021" + "0e200141f0026a41086a2903002111200141086a290300211220012903e0" + "022113200129038002211420012903a001211520012903402116200141c0" + "006a41086a2903002117200120012903502218200141e0036a41086a2903" + "00200a201054ad7c2006200a54ad7c221020012903007c2203200141f000" + "6a41086a290300200b200654ad7c2004200b54ad7c7c220620012903f002" + "7c220a20014180036a41086a2903002009200454ad7c2008200954ad7c7c" + "22042001290390027c2209200141a0026a41086a2903002007200854ad7c" + "200c200754ad7c7c220820012903b0017c2207200141c0016a41086a2903" + "002005200f54ad7c2002200554ad7c7c220b7c2205200141e0006a41086a" + "2903002001290360220c20027c200c54ad7c7c220c3703f0042001201620" + "152014201320122003201054ad7c2006200354ad7c220f7c22032011200a" + "200654ad7c2004200a54ad7c7c22027c2206200e2009200454ad7c200820" + "0954ad7c7c22047c2209200d2007200854ad7c200b200754ad7c7c22087c" + "2207200141d0006a41086a2903002005201854ad7c200c200554ad7c7c22" + "0a3703f8042001200141e0026a41086a2903002003200f54ad7c20022003" + "54ad7c220b20012903f0017c220320014180026a41086a29030020062002" + "54ad7c2004200654ad7c7c22052001290390017c2202200141a0016a4108" + "6a2903002009200454ad7c2008200954ad7c7c220420012903307c220620" + "172007200854ad7c200a200754ad7c7c2208370380052001200141f0016a" + "41086a2903002003200b54ad7c2005200354ad7c22072001290380017c22" + "0320014190016a41086a2903002002200554ad7c2004200254ad7c7c2205" + "20012903207c2202200141306a41086a2903002006200454ad7c20082006" + "54ad7c7c220837038805200120014180016a41086a2903002003200754ad" + "7c2005200354ad7c220420012903107c2203200141206a41086a29030020" + "02200554ad7c2008200254ad7c7c2205370390052001200141106a41086a" + "2903002003200454ad7c2005200354ad7c37039805200141c0046a200141" + "f0046a10d68080800020012903c004220342aad580808080a080237c2003" + "54ad427f7c2203200320012903c80422057c2203200554ad7c2003428180" + "d8ba8a8080d5707c200354ad7c427f7c423f872203200320012903d00422" + "057c2203200554ad7c200342ee899ea5f8d5e5b3cc007c200354ad7c427f" + "7c423f872203200320012903d80422057c2203200554ad7c200342a1edf5" + "b1d8c796e2cd007c200354ad7c427f7c423f872203200320012903e00422" + "057c2203200554ad7c20034295d3e8f2cd848bb95a7c200354ad7c427f7c" + "423f872203200320012903e80422057c2203200554ad7c200342b399809a" + "aee1ddff727c200354ad7ca741016a41017110a38080800010d280808000" + "2100200141a0056a24808080800020000bb60103037f017e017f23808080" + "800041e0006b2203248080808000200341e086c080004130108681808000" + "2104200241306a21050240034020052002460d01200541786a2205290300" + "2106413f210303402003417f460d01200441306a200410bd808080002004" + "200441306a41301086818080002107024020062003413f71ad8842018350" + "0d002007200110dd808080000b2003417f6a21030c000b0b0b2000200441" + "301086818080001a200441e0006a2480808080000b1c00200010a9808080" + "00200041306a10a9808080007110a3808080000bf50706027f067e027f01" + "7e017f027e23808080800041f0016b220324808080800041002104420021" + "05420021064200210742002108420021094200210a02400340200441054b" + "0d01200420044106496a210b200120044103746a210c4200210d41a07f21" + "0e02400340200e450d01200341b0016a2002200e6a220441e0006a290300" + "4200200c200e6a41e0006a290300220f4200108781808000200341a0016a" + "200441e8006a2903004200200f420010878180800020034190016a200441" + "f0006a2903004200200f420010878180800020034180016a200441f8006a" + "2903004200200f4200108781808000200341f0006a20044180016a290300" + "4200200f4200108781808000200341e0006a20044188016a290300420020" + "0f4200108781808000200d200341e0006a41086a29030020032903602210" + "200a7c220f201054ad7c200f200341f0006a41086a290300200329037022" + "1020097c220a201054ad7c200a20034180016a41086a2903002003290380" + "01221020087c2209201054ad7c200920034190016a41086a290300200329" + "039001221020077c2208201054ad7c2008200341a0016a41086a29030020" + "032903a001221020067c2207201054ad7c2007200341b0016a41086a2903" + "0020032903b001220620057c2205200654ad7c7c2206200754ad7c7c2207" + "200854ad7c7c2208200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c" + "210d200e41306a210e0c000b0b200341d0006a200542fdfff3ffcffffff9" + "897f7e220f420042abd5feffffffbfffb97f4200108781808000200341c0" + "006a200f420042ffffcf8aebffffd51e4200108781808000200341306a20" + "0f420042a4ecc3b58fd4b498e7004200108781808000200341206a200f42" + "0042bfa5949ccff0d2bbe4004200108781808000200341106a200f420042" + "d7d9ae9ae4f6e98dcb0042001087818080002003200f4200429acdffcba3" + "bdc4801a4200108781808000200d200341086a2903002003290300221020" + "0a7c220f201054ad7c200f200341106a41086a2903002003290310221020" + "097c220a201054ad7c200a200341206a41086a2903002003290320221020" + "087c2209201054ad7c2009200341306a41086a2903002003290330221020" + "077c2208201054ad7c2008200341c0006a41086a29030020032903402210" + "20067c2207201054ad7c2007200341d0006a41086a290300200329035022" + "0620057c200654ad7c7c2205200754ad7c7c2206200854ad7c7c22072009" + "54ad7c7c2208200a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b" + "2003200a3703e801200320093703e001200320083703d801200320073703" + "d001200320063703c801200320053703c0012000200341c0016a10d68080" + "8000200341f0016a2480808080000b1c002000200110b280808000200041" + "306a200141306a10b2808080000be20103037f017e017f23808080800041" + "c0016b2203248080808000200341306a410041301085818080001a200341" + "e086c0800041301086818080002104200241306a21050240034020052002" + "460d01200541786a22052903002106413f210303402003417f460d012004" + "41e0006a200410ba808080002004200441e0006a41e00010868180800021" + "07024020062003413f71ad88420183500d00200741e0006a2007200110b3" + "808080002007200741e0006a41e0001086818080001a0b2003417f6a2103" + "0c000b0b0b2000200441e0001086818080001a200441c0016a2480808080" + "000b900202017f017e23808080800041b0036b2202248080808000200241" + "004130108581808000220241e0006a410041301085818080001a20024130" + "6a41e086c0800041301086818080001a20024190016a2001419001108681" + "8080001a42808082808080a080e90021030240034020034200510d012002" + "41a0026a20024190016a10c68080800020024190016a200241a0026a4190" + "011086818080001a02402003420183500d00200241a0026a200220024190" + "016a10c7808080002002200241a0026a4190011086818080001a0b200342" + "018821030c000b0b200241a0026a200210e58080800020002002200241a0" + "026a41900110868180800022024190011086818080001a200241b0036a24" + "80808080000b3400200041306a200141306a10b280808000200041e0006a" + "200141e0006a41301086818080001a2000200141301086818080001a0b6b" + "01037f23808080800041106b22022480808080000240024020012802000d" + "00410021030c010b200241086a200110d0808080004101210320022d0009" + "210420022d00080d0041002103200141003602000b200020043a00012000" + "20033a0000200241106a2480808080000b7501027f23808080800041e000" + "6b2201248080808000200141306a410041301085818080001a200141e086" + "c0800041301086818080002101410110a38080800021022000410041e000" + "108581808000220041e0006a200141e0001086818080001a200020023a00" + "c001200141e0006a2480808080000b920101017f23808080800041c0016b" + "2202248080808000200041e0006a200141e0006a41e0001086818080001a" + "200241306a410041301085818080001a200241e086c08000413010868180" + "8000220241e0006a410041e0001085818080001a200041c0016a20022002" + "41e0006a20012d00c00110b0808080002000200141e0001086818080001a" + "200241c0016a2480808080000baa0201047f23808080800041e0036b2204" + "24808080800020042001200210b380808000200441e0006a200141e0006a" + "2205200310b38080800020044180036a200141c0016a2206200310b38080" + "8000200441a0026a20044180036a20044180036a41306a220710b8808080" + "00200441a0026a41306a20044180036a200710b9808080002000200441a0" + "026a200410bc80808000200441a0026a2002200310bc8080800020044180" + "036a2001200510bc80808000200441c0016a200441a0026a20044180036a" + "10b38080800020044180036a200441c0016a200410bb80808000200041e0" + "006a20044180036a200441e0006a10bb8080800020044180036a20062002" + "10b380808000200041c0016a20044180036a200441e0006a10bc80808000" + "200441e0036a2480808080000bf50706027f067e027f017e017f027e2380" + "8080800041f0016b22032480808080004100210442002105420021064200" + "210742002108420021094200210a02400340200441054b0d012004200441" + "06496a210b200120044103746a210c4200210d41e07d210e02400340200e" + "450d01200341b0016a2002200e6a220441a0026a2903004200200c200e6a" + "41a0026a290300220f4200108781808000200341a0016a200441a8026a29" + "03004200200f420010878180800020034190016a200441b0026a29030042" + "00200f420010878180800020034180016a200441b8026a2903004200200f" + "4200108781808000200341f0006a200441c0026a2903004200200f420010" + "8781808000200341e0006a200441c8026a2903004200200f420010878180" + "8000200d200341e0006a41086a29030020032903602210200a7c220f2010" + "54ad7c200f200341f0006a41086a2903002003290370221020097c220a20" + "1054ad7c200a20034180016a41086a290300200329038001221020087c22" + "09201054ad7c200920034190016a41086a29030020032903900122102007" + "7c2208201054ad7c2008200341a0016a41086a29030020032903a0012210" + "20067c2207201054ad7c2007200341b0016a41086a29030020032903b001" + "220620057c2205200654ad7c7c2206200754ad7c7c2207200854ad7c7c22" + "08200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c210d200e41306a" + "210e0c000b0b200341d0006a200542fdfff3ffcffffff9897f7e220f4200" + "42abd5feffffffbfffb97f4200108781808000200341c0006a200f420042" + "ffffcf8aebffffd51e4200108781808000200341306a200f420042a4ecc3" + "b58fd4b498e7004200108781808000200341206a200f420042bfa5949ccf" + "f0d2bbe4004200108781808000200341106a200f420042d7d9ae9ae4f6e9" + "8dcb0042001087818080002003200f4200429acdffcba3bdc4801a420010" + "8781808000200d200341086a29030020032903002210200a7c220f201054" + "ad7c200f200341106a41086a2903002003290310221020097c220a201054" + "ad7c200a200341206a41086a2903002003290320221020087c2209201054" + "ad7c2009200341306a41086a2903002003290330221020077c2208201054" + "ad7c2008200341c0006a41086a2903002003290340221020067c22072010" + "54ad7c2007200341d0006a41086a2903002003290350220620057c200654" + "ad7c7c2205200754ad7c7c2206200854ad7c7c2207200954ad7c7c220820" + "0a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b2003200a3703e8" + "01200320093703e001200320083703d801200320073703d0012003200637" + "03c801200320053703c0012000200341c0016a10d680808000200341f001" + "6a2480808080000bdc0101027f2380808080004180036b22032480808080" + "002003200110ba80808000200341e0006a200210ba80808000200341c001" + "6a200341e0006a200341e0006a41306a220410b880808000200341c0016a" + "41306a200341e0006a200410b9808080002000200341c0016a200310bc80" + "808000200341c0016a2001200210bc80808000200341a0026a200341c001" + "6a10ba80808000200341c0016a200341a0026a41e0001086818080001a20" + "0341c0016a200310ec80808000200041e0006a200341c0016a200341e000" + "6a10bb8080800020034180036a2480808080000b3c01017f238080808000" + "41e0006b220224808080800020022000200110bb808080002000200241e0" + "001086818080001a200241e0006a2480808080000b9f0701037f23808080" + "800041a0116b2201248080808000200141a0026a200010ba808080002001" + "4180036a200041e0006a220210ba80808000200141e0036a20014180036a" + "10ba80808000200141c0106a20014180036a200010bc80808000200141e0" + "0f6a200141c0106a10ba80808000200141800f6a200141e00f6a200141a0" + "026a10bb80808000200141c0046a200141800f6a200141e0036a10bb8080" + "8000200141a0056a200141c0046a200141c0046a10bc80808000200141c0" + "106a200141a0026a200141a0026a10bc8080800020014180066a200141c0" + "106a200141a0026a10bc80808000200141e0066a200020014180066a10bc" + "80808000200141c0076a20014180066a10ba80808000200141a0086a2000" + "41c0016a220310ba80808000200141c0106a200141c0076a200141a0056a" + "10bb80808000200141e00f6a200141c0106a200141a0056a10bb80808000" + "2000200141e00f6a41e0001086818080002100200141c0106a2003200210" + "bc80808000200141e00f6a200141c0106a10ba80808000200141800f6a20" + "0141e00f6a20014180036a10bb80808000200141e00f6a200141800f6a20" + "0141a0086a10bb808080002003200141e00f6a41e0001086818080002103" + "200141c0106a200141a0056a200010bb80808000200141e00f6a200141c0" + "106a20014180066a10b3808080002002200141e00f6a41e0001086818080" + "00210220014180096a200141e0036a200141e0036a10bc80808000200141" + "e0096a20014180096a20014180096a10bc80808000200141c00a6a200141" + "e0096a200141e0096a10bc808080002002200141c00a6a10ec8080800020" + "0141a00b6a20014180066a200141a0086a10b380808000200141800c6a20" + "0141a00b6a200141a00b6a10bc80808000200141e00c6a200141800c6a10" + "e280808000200141c0106a200141e0066a10ba80808000200141e00f6a20" + "0141c0106a200141a0026a10bb80808000200141c00d6a200141e00f6a20" + "0141c0076a10bb80808000200141a00e6a20014180036a20014180036a10" + "bc80808000200141800f6a200141a00e6a200141a00e6a10bc8080800020" + "0141e00f6a200141c00d6a200141800f6a10bb80808000200141c0106a20" + "03200141a0086a10b3808080002001200141c0106a200141c0106a10bc80" + "808000200141e0006a200141e00c6a41e0001086818080001a200141c001" + "6a200141e00f6a41e0001086818080001a200041e8036a200141ac8cc080" + "0010ee80808000200141a0116a2480808080000b4201017f024020002802" + "0822032000280200470d002000200210d8808080000b2000280204200341" + "a0026c6a200141a0021086818080001a2000200341016a3602080b4c0101" + "7f23808080800041106b2202248080808000200241988cc0800036020c20" + "022000360208200241086a41b08dc080002002410c6a41b08dc080002001" + "419c8cc0800010d380808000000b7902017f017e23808080800041306b22" + "0324808080800020032001360204200320003602002003410236020c2003" + "41a08dc08000360208200342023702142003418580808000ad4220862204" + "2003ad8437032820032004200341046aad843703202003200341206a3602" + "10200341086a200210a480808000000b0f002000280200200110f2808080" + "000be10201067f23808080800041106b2202248080808000410a21030240" + "024020004190ce004f0d00200021040c010b410a21030340200241066a20" + "036a2205417c6a20004190ce006e220441f0b1036c20006a220641ffff03" + "7141e4006e220741017441ff8ec080006a2f00003b00002005417e6a2007" + "419c7f6c20066a41ffff037141017441ff8ec080006a2f00003b00002003" + "417c6a2103200041ffc1d72f4b21052004210020050d000b0b0240024020" + "0441e3004b0d00200421000c010b200241066a2003417e6a22036a200441" + "ffff037141e4006e2200419c7f6c20046a41ffff037141017441ff8ec080" + "006a2f00003b00000b024002402000410a490d00200241066a2003417e6a" + "22036a200041017441ff8ec080006a2f00003b00000c010b200241066a20" + "03417f6a22036a20004130723a00000b200141014100200241066a20036a" + "410a20036b10d5808080002100200241106a24808080800020000b380201" + "7f017e23808080800041106b220124808080800020002902002102200120" + "0036020c20012002370204200141046a108181808000000b490002402002" + "418080c400460d002000200220012802101181808080008080808000450d" + "0041010f0b024020030d0041000f0b200020032004200128020c11808080" + "800080808080000b7902017f017e23808080800041306b22032480808080" + "0020032001360204200320003602002003410236020c2003419c91c08000" + "360208200342023702142003418580808000ad4220862204200341046aad" + "84370328200320042003ad843703202003200341206a360210200341086a" + "200210a480808000000b1c0020002802002001200028020428020c118180" + "80800080808080000b14002001200028020020002802041092808080000b" + "1400200128021c2001280220200010f9808080000bbb05010a7f23808080" + "800041306b22032480808080002003200136022c20032000360228200341" + "033a00242003422037021c41002104200341003602142003410036020c02" + "400240024002400240200228021022050d00200228020c2200450d012002" + "280208220120004103746a21062000417f6a41ffffffff017141016a2104" + "2002280200210003400240200041046a2802002207450d00200328022820" + "002802002007200328022c28020c11808080800080808080000d040b2001" + "2802002003410c6a200141046a28020011818080800080808080000d0320" + "0041086a2100200141086a22012006470d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a21042002280208" + "2109200228020021004100210703400240200041046a2802002201450d00" + "200328022820002802002001200328022c28020c11808080800080808080" + "000d030b2003200520076a220141106a28020036021c20032001411c6a2d" + "00003a00242003200141186a2802003602202001410c6a28020021064100" + "210a4100210b024002400240200141086a2802000e03010002010b200641" + "0374210c4100210b2009200c6a220c2802000d01200c28020421060b4101" + "210b0b200320063602102003200b36020c200141046a2802002106024002" + "40024020012802000e03010002010b2006410374210b2009200b6a220b28" + "02000d01200b28020421060b4101210a0b200320063602182003200a3602" + "142009200141146a2802004103746a22012802002003410c6a200141046a" + "28020011818080800080808080000d02200041086a21002008200741206a" + "2207470d000b0b200420022802044f0d0120032802282002280200200441" + "03746a22012802002001280204200328022c28020c118080808000808080" + "8000450d010b410121010c010b410021010b200341306a24808080800020" + "010b6001027f20002802042102200028020021030240200028020822002d" + "0000450d00200341f48ec080004104200228020c11808080800080808080" + "00450d0041010f0b20002001410a463a0000200320012002280210118180" + "80800080808080000b1200200041dc8ec08000200110f9808080000b7902" + "017f017e23808080800041306b2203248080808000200320013602042003" + "20003602002003410236020c200341d091c0800036020820034202370214" + "2003418580808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b" + "ab0201037f2380808080004180016b220224808080800020002802002100" + "024002400240200128021422034110710d0020034120710d012000280200" + "200110f28080800021000c020b2000280200210041810121030340200220" + "036a417e6a2000410f712204413072200441d7006a2004410a491b3a0000" + "2003417f6a21032000410f4b21042000410476210020040d000b200141fd" + "8ec080004102200220036a417f6a41810120036b10d58080800021000c01" + "0b2000280200210041810121030340200220036a417e6a2000410f712204" + "413072200441376a2004410a491b3a00002003417f6a21032000410f4b21" + "042000410476210020040d000b200141fd8ec080004102200220036a417f" + "6a41810120036b10d58080800021000b20024180016a2480808080002000" + "0b0900200041003602000b990101027f23808080800041106b2204248080" + "808000410041002802f093c08000220541016a3602f093c0800002402005" + "4100480d000240024041002d00bc97c080000d00410041002802b897c080" + "0041016a3602b897c0800041002802ec93c08000417f4a0d010c020b2004" + "41086a200020011182808080008080808000000b410041003a00bc97c080" + "002002450d00108081808000000b000b0300000b0b002000108281808000" + "000bba0101037f23808080800041106b2201248080808000200028020022" + "0228020c2103024002400240024020022802040e020001020b20030d0141" + "012102410021030c020b20030d0020022802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c200141868080" + "8000200028020822002d000820002d000910ff80808000000b2001200336" + "0204200120023602002001418780808000200028020822002d000820002d" + "000910ff80808000000b0c00200020012902003703000bc30201047f411f" + "21020240200141ffffff074b0d002001410620014108766722026b764101" + "7120024101746b413e6a21020b200042003702102000200236021c200241" + "027441f493c080006a21030240410028029097c080004101200274220471" + "0d0020032000360200200020033602182000200036020c20002000360208" + "4100410028029097c0800020047236029097c080000f0b02400240024020" + "0328020022042802044178712001470d00200421020c010b200141004119" + "20024101766b2002411f461b742103034020042003411d764104716a4110" + "6a22052802002202450d0220034101742103200221042002280204417871" + "2001470d000b0b20022802082203200036020c2002200036020820004100" + "3602182000200236020c200020033602080f0b2005200036020020002004" + "3602182000200036020c200020003602080baa0301057f02400240200241" + "104f0d00200021030c010b02402000410020006b41037122046a22052000" + "4d0d002004417f6a21062000210302402004450d00200421072000210303" + "40200320013a0000200341016a21032007417f6a22070d000b0b20064107" + "490d000340200320013a0000200341076a20013a0000200341066a20013a" + "0000200341056a20013a0000200341046a20013a0000200341036a20013a" + "0000200341026a20013a0000200341016a20013a0000200341086a220320" + "05470d000b0b024020052005200220046b2202417c716a22034f0d002001" + "41ff017141818284086c2107034020052007360200200541046a22052003" + "490d000b0b200241037121020b02402003200320026a22074f0d00200241" + "7f6a2104024020024107712205450d000340200320013a0000200341016a" + "21032005417f6a22050d000b0b20044107490d000340200320013a000020" + "0341076a20013a0000200341066a20013a0000200341056a20013a000020" + "0341046a20013a0000200341036a20013a0000200341026a20013a000020" + "0341016a20013a0000200341086a22032007470d000b0b20000ba5050108" + "7f02400240200241104f0d00200021030c010b02402000410020006b4103" + "7122046a220520004d0d002004417f6a2106200021032001210702402004" + "450d002004210820002103200121070340200320072d00003a0000200741" + "016a2107200341016a21032008417f6a22080d000b0b20064107490d0003" + "40200320072d00003a0000200341016a200741016a2d00003a0000200341" + "026a200741026a2d00003a0000200341036a200741036a2d00003a000020" + "0341046a200741046a2d00003a0000200341056a200741056a2d00003a00" + "00200341066a200741066a2d00003a0000200341076a200741076a2d0000" + "3a0000200741086a2107200341086a22032005470d000b0b200520022004" + "6b2208417c7122066a210302400240200120046a22074103710d00200520" + "034f0d0120072101034020052001280200360200200141046a2101200541" + "046a22052003490d000c020b0b200520034f0d0020074103742202411871" + "21042007417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220047620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20084103712102200720066a21010b" + "02402003200320026a22054f0d002002417f6a2108024020024107712207" + "450d000340200320012d00003a0000200141016a2101200341016a210320" + "07417f6a22070d000b0b20084107490d000340200320012d00003a000020" + "0341016a200141016a2d00003a0000200341026a200141026a2d00003a00" + "00200341036a200141036a2d00003a0000200341046a200141046a2d0000" + "3a0000200341056a200141056a2d00003a0000200341066a200141066a2d" + "00003a0000200341076a200141076a2d00003a0000200141086a21012003" + "41086a22032005470d000b0b20000b6e01067e2000200342ffffffff0f83" + "2205200142ffffffff0f8322067e22072003422088220820067e22062005" + "200142208822097e7c22054220867c220a3703002000200820097e200520" + "0654ad4220862005422088847c200a200754ad7c200420017e200320027e" + "7c7c3703080bea0901087f024002400240200020016b20024f0d00200120" + "026a2103200020026a210420024110490d014100200441037122056b2106" + "02402004417c71220720044f0d002005417f6a21080240024020050d0020" + "0321090c010b2005210a2003210903402004417f6a22042009417f6a2209" + "2d00003a0000200a417f6a220a0d000b0b20084103490d002009417c6a21" + "0903402004417f6a200941036a2d00003a00002004417e6a200941026a2d" + "00003a00002004417d6a200941016a2d00003a00002004417c6a22042009" + "2d00003a00002009417c6a210920072004490d000b0b2007200220056b22" + "09417c7122026b2104410020026b210a02400240200320066a2203410371" + "0d00200420074f0d01200920016a417c6a210103402007417c6a22072001" + "2802003602002001417c6a210120042007490d000c020b0b200420074f0d" + "002003410374220241187121052003417c712208417c6a2101410020026b" + "41187121062008280200210203402007417c6a2207200220067420012802" + "002202200576723602002001417c6a210120042007490d000b0b20094103" + "7121022003200a6a21030c010b02400240200241104f0d00200021040c01" + "0b02402000410020006b410371220a6a220920004d0d00200a417f6a2105" + "20002104200121070240200a450d00200a21032000210420012107034020" + "0420072d00003a0000200741016a2107200441016a21042003417f6a2203" + "0d000b0b20054107490d000340200420072d00003a0000200441016a2007" + "41016a2d00003a0000200441026a200741026a2d00003a0000200441036a" + "200741036a2d00003a0000200441046a200741046a2d00003a0000200441" + "056a200741056a2d00003a0000200441066a200741066a2d00003a000020" + "0441076a200741076a2d00003a0000200741086a2107200441086a220420" + "09470d000b0b20092002200a6b2203417c7122056a210402400240200120" + "0a6a22074103710d00200920044f0d012007210103402009200128020036" + "0200200141046a2101200941046a22092004490d000c020b0b200920044f" + "0d0020074103742202411871210a2007417c71220841046a210141002002" + "6b411871210620082802002102034020092002200a762001280200220220" + "067472360200200141046a2101200941046a22092004490d000b0b200341" + "03712102200720056a21010b2004200420026a22094f0d012002417f6a21" + "03024020024107712207450d000340200420012d00003a0000200141016a" + "2101200441016a21042007417f6a22070d000b0b20034107490d01034020" + "0420012d00003a0000200441016a200141016a2d00003a0000200441026a" + "200141026a2d00003a0000200441036a200141036a2d00003a0000200441" + "046a200141046a2d00003a0000200441056a200141056a2d00003a000020" + "0441066a200141066a2d00003a0000200441076a200141076a2d00003a00" + "00200141086a2101200441086a22042009470d000c020b0b200420026b22" + "0720044f0d002002417f6a2109024020024103712201450d000340200441" + "7f6a22042003417f6a22032d00003a00002001417f6a22010d000b0b2009" + "4103490d002003417c6a210103402004417f6a200141036a2d00003a0000" + "2004417e6a200141026a2d00003a00002004417d6a200141016a2d00003a" + "00002004417c6a220420012d00003a00002001417c6a210120072004490d" + "000b0b20000b0e002000200120021088818080000b0bf2130100418080c0" + "000be8132f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f697465722f7472616974732f6974657261746f722e" + "72730000100058000000b307000009000000000000000000000001000000" + "0800000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f72757374632f346562313631" + "323530653334306338663438663636653262393239656634613562656437" + "633138312f6c6962726172792f616c6c6f632f7372632f736c6963652e72" + "73000000a30010004a000000a10000001900000054727946726f6d536c69" + "63654572726f720000000100000000000000d80210005e000000b4020000" + "090000002f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f736c6963652f697465722e727300002c0110004e00" + "0000f6050000150000007372632f6c69622e727300008c0110000a000000" + "1f000000160000008c0110000a00000028000000310000008c0110000a00" + "000028000000440000004661696c656420746f20646573657269616c697a" + "6520766b8c0110000a0000002f000000310000008c0110000a0000002f00" + "0000440000008c0110000a000000620000001f0000008c0110000a000000" + "630000000a0000008c0110000a00000064000000170000008c0110000a00" + "0000650000000a0000008c0110000a00000066000000170000008c011000" + "0a000000670000000a0000004661696c656420746f20646573657269616c" + "697a6520614661696c656420746f20646573657269616c697a6520624661" + "696c656420746f20646573657269616c697a652063496e76616c69642062" + "7974657320666f72205363616c61726361706163697479206f766572666c" + "6f770000bd021000110000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f737562746c652d" + "322e362e312f7372632f6c69622e72730000000000000400000004000000" + "0900000001000000d80210005e000000bd0200000900000000000000fdff" + "02000000097602000cc40b00f4ebba58c7535798485f455752705358ce77" + "6dec56a2971a075c93e480fac35ef6154617341c341fdff4f104d109a6e6" + "760ad5b6954c6c47e58dc0839d93a988eb672d9519b5853e799aaae3ca92" + "e58f9811abeaffffffbf7feeffff54acffffaa07893dac3da834ccd9af44" + "e13ce1d21dd935ebd290ede9c692a6f95f8e7a448006a9aafffffffffeb9" + "ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764d7ac4b43b6a7" + "1b4b9ae67f39ea11011aaaeaffffffbf7feeffff54acffffaa07893dac3d" + "a834ccd9af44e13ce1d21dd935ebd290ede9c692a6f95f8e7a44800655d5" + "ffffff7fffdcffffa958ffff550f127b587b506998b35f89c279c2a53bb2" + "6bd6a521dbd38d254df3bf1cf588000df3ff0c00000027aa0a0034fc3200" + "cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d" + "5145d609e8648a791b36f1302a5ace7eabddb8f3f77715c63acaa8169b02" + "fd74f82f6ac26e1c706066b7363660611b24aba41b05f3ff0c00000027aa" + "0a0034fc3200cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73" + "c98e7ede833d5145d609f3ff0c00000027aa0a0034fc3200cc537f800a6b" + "7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d5145d6092e55" + "270000007644200048439a00b8dc598b6e4acee97e6fc65ba9c0b73003b1" + "b7541efbfcb14061e1b40b7f09be81032e55270000007644200048439a00" + "b8dc598b6e4acee97e6fc65ba9c0b73003b1b7541efbfcb14061e1b40b7f" + "09be81032f686f6d652f6f706964736b6f706e79692f2e636172676f2f72" + "656769737472792f7372632f696e6465782e6372617465732e696f2d3139" + "34396366386336623562353537662f626c7331325f3338312d302e382e30" + "2f7372632f70616972696e67732e72730000a00510006600000016020000" + "1500000044000000a0051000660000001b02000009000000a00510006600" + "0000050200001d000000a005100066000000090200001d000000a0051000" + "660000003802000032000000a00510006600000044020000320000002969" + "6e646578206f7574206f6620626f756e64733a20746865206c656e206973" + "20206275742074686520696e64657820697320006d061000200000008d06" + "1000120000000000000004000000040000000a0000003d3d617373657274" + "696f6e20606c6566742020726967687460206661696c65640a20206c6566" + "743a200a2072696768743a200000c206100010000000d206100017000000" + "e90610000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000c2061000100000000c071000100000001c07100009000000" + "e9061000090000003a200000010000000000000048071000020000000000" + "00000c000000040000000b0000000c0000000d000000202020202c0a2828" + "0a3078303030313032303330343035303630373038303931303131313231" + "333134313531363137313831393230323132323233323432353236323732" + "383239333033313332333333343335333633373338333934303431343234" + "333434343534363437343834393530353135323533353435353536353735" + "383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939617474656d7074" + "20746f20646976696465206279207a65726f4708100019000000206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820" + "72616e676520656e6420696e6465782000008a0810001000000068081000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e64732061742000ac08100016000000c20810000d00000028292f72" + "757374632f34656231363132353065333430633866343866363665326239" + "3239656634613562656437633138312f6c6962726172792f616c6c6f632f" + "7372632f7261775f7665632e72730000e20810004c000000280200001100" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e372f7372" + "632f646c6d616c6c6f632e7273617373657274696f6e206661696c65643a" + "207073697a65203e3d2073697a65202b206d696e5f6f7665726865616400" + "4009100029000000a804000009000000617373657274696f6e206661696c" + "65643a207073697a65203c3d2073697a65202b206d61785f6f7665726865" + "616400004009100029000000ae0400000d00000000c94e046e616d65000e" + "0d7761736d5f6c69622e7761736d01914e8a01008a015f5a4e3130325f24" + "4c5424636f72652e2e697465722e2e61646170746572732e2e6d61702e2e" + "4d6170244c5424492443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f72244754243973697a655f68696e7431376833383630386236" + "62663263303736666145014c5f5a4e34636f72653970616e69636b696e67" + "313170616e69635f636f6e7374323370616e69635f636f6e73745f646976" + "5f62795f7a65726f3137683033346433623765633138373166373545024d" + "5f5a4e34636f726533707472343364726f705f696e5f706c616365244c54" + "247761736d5f6c69622e2e566572696679696e674b657924475424313768" + "393064303131346662343063613937644503475f5a4e35616c6c6f633772" + "61775f7665633230526177566563496e6e6572244c542441244754243130" + "6465616c6c6f636174653137683235303163353461663065323831336145" + "04505f5a4e34636f726533707472343664726f705f696e5f706c61636524" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447" + "5424313768663462323737666433376462353031654505565f5a4e34636f" + "726533707472353264726f705f696e5f706c616365244c5424626c733132" + "5f3338312e2e70616972696e67732e2e4732507265706172656424475424" + "313768623964653634383231343939353539344506675f5a4e34636f7265" + "33707472363964726f705f696e5f706c616365244c5424616c6c6f632e2e" + "7665632e2e566563244c5424626c7331325f3338312e2e7363616c61722e" + "2e5363616c61722447542424475424313768376265333235646130373238" + "386634384507385f5a4e35616c6c6f63337665633136566563244c542454" + "244324412447542434707573683137686236356465366561306165303964" + "31374508435f5a4e35616c6c6f63377261775f7665633139526177566563" + "244c54245424432441244754243867726f775f6f6e653137686531306535" + "65303538376531393262664509495f5a4e35616c6c6f6335736c69636532" + "395f244c5424696d706c2475323024247535622454247535642424475424" + "36746f5f76656331376836333665656464383765653761373437450a4d5f" + "5a4e35616c6c6f63377261775f7665633230526177566563496e6e657224" + "4c542441244754243136776974685f63617061636974795f696e31376861" + "653336636161393636356566343833450b4b5f5a4e35616c6c6f63377261" + "775f7665633230526177566563496e6e6572244c54244124475424313467" + "726f775f616d6f7274697a65643137686439353064656131373163323030" + "3035450c335f5a4e35616c6c6f63377261775f766563313268616e646c65" + "5f6572726f7231376863613161646630343635323765396532450d0e5f5f" + "727573745f6465616c6c6f630e4c5f5a4e35616c6c6f63377261775f7665" + "633230526177566563496e6e6572244c5424412447542431357472795f61" + "6c6c6f636174655f696e3137686534626630623334333637646136646345" + "0f5e5f5a4e36355f244c5424626c7331325f3338312e2e67312e2e473141" + "6666696e65247532302461732475323024636f72652e2e6f70732e2e6172" + "6974682e2e4e656724475424336e65673137683434323138626332316532" + "65356663314510725f5a4e36395f244c5424626c7331325f3338312e2e66" + "702e2e4670247532302461732475323024737562746c652e2e436f6e6469" + "74696f6e616c6c7953656c65637461626c65244754243138636f6e646974" + "696f6e616c5f73656c656374313768386165306466613830666434313139" + "364511605f5a4e36375f244c5424636f72652e2e61727261792e2e547279" + "46726f6d536c6963654572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863303634386262" + "31393264393231376545122e5f5a4e34636f726533666d7439466f726d61" + "747465723370616431376833316663303133336231396665333065451367" + "5f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e" + "2e50616441646170746572247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376834353537" + "3732653638643462343039364514385f5a4e36737562746c65313743744f" + "7074696f6e244c5424542447542436657870656374313768623863663632" + "323139313530313333334515495f5a4e34345f244c542424524624542475" + "32302461732475323024636f72652e2e666d742e2e446973706c61792447" + "542433666d74313768353633396538653836623831393165364516355f5a" + "4e34636f72653970616e69636b696e6731336173736572745f6661696c65" + "64313768393337633632373834633734396537664517385f5a4e36737562" + "746c65313743744f7074696f6e244c542454244754243665787065637431" + "3768633764316533383030323138386237654518705f5a4e38315f244c54" + "24616c6c6f632e2e7665632e2e566563244c542454244324412447542424" + "7532302461732475323024636f72652e2e6f70732e2e696e6465782e2e49" + "6e646578244c542449244754242447542435696e64657831376862376565" + "6135613738316438393239374519405f5a4e34636f726535736c69636535" + "696e6465783232736c6963655f696e6465785f6f726465725f6661696c31" + "376866663036393161306536326561633864451a425f5a4e34636f726535" + "736c69636535696e6465783234736c6963655f656e645f696e6465785f6c" + "656e5f6661696c31376861383936346133343065666132346537451b0861" + "6c6c6f636174651c13646573657269616c697a655f67315f7761736d1d32" + "5f5a4e34636f726536726573756c743133756e777261705f6661696c6564" + "31376861313838333239383461636266333830451e3e5f5a4e39626c7331" + "325f333831326731384731416666696e65313566726f6d5f636f6d707265" + "7373656431376832333963336331363436646339303436451f355f5a4e38" + "7761736d5f6c69623139646573657269616c697a655f67325f7761736d31" + "37683530336430613839336365653362666645203e5f5a4e39626c733132" + "5f333831326732384732416666696e65313566726f6d5f636f6d70726573" + "7365643137686333616566303334336638323663626245211462656c6c6d" + "616e5f67726f746831365f7465737422335f5a4e39626c7331325f333831" + "367363616c6172365363616c617233737562313768656363643066636134" + "373035653937364523285f5a4e36737562746c6539626c61636b5f626f78" + "313768633661663135363636663731396234384524305f5a4e34636f7265" + "3970616e69636b696e673970616e69635f666d7431376862393162616461" + "636536656538323837452585015f5a4e3130325f244c5424626c7331325f" + "3338312e2e67312e2e473150726f6a656374697665247532302461732475" + "323024636f72652e2e636f6e766572742e2e46726f6d244c542424524624" + "626c7331325f3338312e2e67312e2e4731416666696e6524475424244754" + "243466726f6d3137686634356430353636343237373335316445262e5f5a" + "4e39626c7331325f33383132667032467036696e76657274313768366335" + "3632643539653638646633633245272b5f5a4e39626c7331325f33383132" + "6670324670336d756c313768646666623336663036373139613633374528" + "365f5a4e39626c7331325f333831326731384731416666696e6538696465" + "6e746974793137686236366162643638326233626339356345292f5f5a4e" + "39626c7331325f3338313266703246703769735f7a65726f313768333962" + "31303634343730313433376536452a785f5a4e37355f244c5424626c7331" + "325f3338312e2e67312e2e4731416666696e652475323024617324753230" + "24737562746c652e2e436f6e646974696f6e616c6c7953656c6563746162" + "6c65244754243138636f6e646974696f6e616c5f73656c65637431376833" + "323735393935653930646636613863452b85015f5a4e3130325f244c5424" + "626c7331325f3338312e2e70616972696e67732e2e473250726570617265" + "64247532302461732475323024636f72652e2e636f6e766572742e2e4672" + "6f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e6524" + "475424244754243466726f6d313768353930643863663565363536346465" + "66452c2f5f5a4e39626c7331325f33383134667031323446703132336f6e" + "6531376839346666616330666264306163343332452d90015f5a4e313033" + "5f244c5424626c7331325f3338312e2e70616972696e67732e2e6d756c74" + "695f6d696c6c65725f6c6f6f702e2e416464657224753230246173247532" + "3024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65724c" + "6f6f70447269766572244754243133646f75626c696e675f737465703137" + "6833346536393232613038346336343933452e705f5a4e38315f244c5424" + "616c6c6f632e2e7665632e2e566563244c54245424432441244754242475" + "32302461732475323024636f72652e2e6f70732e2e696e6465782e2e496e" + "646578244c542449244754242447542435696e6465783137686539346538" + "6262303063326535366564452f2e5f5a4e39626c7331325f333831387061" + "6972696e677333656c6c3137683264393865303762336132336635313345" + "30745f5a4e37315f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e646974696f6e" + "616c6c7953656c65637461626c65244754243138636f6e646974696f6e61" + "6c5f73656c6563743137686366633738633362393036656661383945315a" + "5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e46703624" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e4e" + "656724475424336e65673137686230666536353636326461326334343345" + "322b5f5a4e39626c7331325f333831326670324670336e65673137683861" + "363566633733316133386134393745332d5f5a4e39626c7331325f333831" + "3366703233467032336d756c313768326433373464346666306563343037" + "6245345a5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e" + "467036247532302461732475323024636f72652e2e6f70732e2e61726974" + "682e2e4d756c24475424336d756c31376865613934393735323931313764" + "3166634535305f5a4e39626c7331325f3338313366703633467036367371" + "756172653137683866633831663539663666313530643145363c5f5a4e39" + "626c7331325f333831336670363346703631376d756c5f62795f6e6f6e72" + "6573696475653137686432663865613131393236643732653945375a5f5a" + "4e36315f244c5424626c7331325f3338312e2e6670362e2e467036247532" + "302461732475323024636f72652e2e6f70732e2e61726974682e2e537562" + "24475424337375623137686137396663636566323762323631323445382b" + "5f5a4e39626c7331325f3338313266703246703373756231376865646439" + "32336439323032346633366445392b5f5a4e39626c7331325f3338313266" + "703246703361646431376863366562626430363731666432643965453a30" + "5f5a4e39626c7331325f3338313366703233467032367371756172653137" + "6865663238666434623836356230653732453b2d5f5a4e39626c7331325f" + "333831336670323346703233737562313768636330663365343532313765" + "61393964453c2d5f5a4e39626c7331325f33383133667032334670323361" + "646431376864363030363832376137333934646563453d2e5f5a4e39626c" + "7331325f3338313266703246703673717561726531376835616337663530" + "666666393136623065453e605f5a4e36375f244c542424524624626c7331" + "325f3338312e2e667031322e2e4670313224753230246173247532302463" + "6f72652e2e6f70732e2e61726974682e2e4d756c24475424336d756c3137" + "6863613137343239383666636366353565453f6a5f5a4e36395f244c5424" + "626c7331325f3338312e2e667031322e2e46703132247532302461732475" + "323024636f72652e2e6f70732e2e61726974682e2e4d756c41737369676e" + "2447542431306d756c5f61737369676e3137683037326534616130343436" + "63356334314540655f5a4e39626c7331325f3338313870616972696e6773" + "31364d696c6c65724c6f6f70526573756c74323066696e616c5f6578706f" + "6e656e74696174696f6e31376379636c6f746f6d69635f73717561726531" + "3768613463633461633966316338323538644541635f5a4e39626c733132" + "5f3338313870616972696e677331364d696c6c65724c6f6f70526573756c" + "74323066696e616c5f6578706f6e656e74696174696f6e31356379636f6c" + "6f746f6d69635f6578703137686166636437313637356662666432373645" + "425d5f5a4e36325f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e7374616e7454" + "696d654571244754243563745f6571313768316264323735363036643361" + "6461366445435a5f5a4e36315f244c5424626c7331325f3338312e2e6670" + "362e2e467036247532302461732475323024636f72652e2e6f70732e2e61" + "726974682e2e416464244754243361646431376835343330336164316564" + "646333613837454491015f5a4e3131345f244c5424636f72652e2e697465" + "722e2e61646170746572732e2e666c617474656e2e2e466c61744d617024" + "4c542449244324552443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f7224475424346e657874313768633964373737363930666232" + "373033334545385f5a4e34636f7265336f70733866756e6374696f6e3546" + "6e4d75743863616c6c5f6d75743137686638313366653737616237633761" + "35634546395f5a4e39626c7331325f3338313267313132473150726f6a65" + "637469766536646f75626c65313768386366636435343461313633326664" + "384547365f5a4e39626c7331325f3338313267313132473150726f6a6563" + "74697665336164643137686338666437656633383137383263636145487c" + "5f5a4e37395f244c5424626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024737562746c652e2e436f6e" + "646974696f6e616c6c7953656c65637461626c65244754243138636f6e64" + "6974696f6e616c5f73656c65637431376839346663383463303336386533" + "3262334549415f5a4e38646c6d616c6c6f6338646c6d616c6c6f63313744" + "6c6d616c6c6f63244c542441244754243466726565313768623937643238" + "61316165313165356635454a2c5f5a4e34636f72653970616e69636b696e" + "673570616e696331376832323065356136376635653365303666454b0e5f" + "5f727573745f7265616c6c6f634c4a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c" + "696e6b5f6368756e6b31376831623634356162376339333032303939454d" + "4b5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c542441244754243133646973706f73655f6368756e6b31376832" + "633732313930393066616265323362454e435f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424366d" + "616c6c6f6331376863663263663139323661376530646165454f385f5a4e" + "35616c6c6f63377261775f766563313763617061636974795f6f76657266" + "6c6f7731376863393936333961626361313337633131455085015f5a4e31" + "30325f244c5424636f72652e2e697465722e2e61646170746572732e2e6d" + "61702e2e4d6170244c542449244324462447542424753230246173247532" + "3024636f72652e2e697465722e2e7472616974732e2e6974657261746f72" + "2e2e4974657261746f7224475424346e6578743137683161356136633566" + "303263666237373445514d5f5a4e34365f244c5424753634247532302461" + "732475323024737562746c652e2e436f6e7374616e7454696d6545712447" + "54243563745f657131376839613065366130383065643661303532455253" + "5f5a4e35345f244c5424737562746c652e2e43686f696365247532302461" + "732475323024636f72652e2e6f70732e2e6269742e2e4e6f742447542433" + "6e6f743137686532353261643837343163616538663445533b5f5a4e3463" + "6f72653970616e69636b696e6731396173736572745f6661696c65645f69" + "6e6e6572313768363939386636356530343630623966324554475f5a4e34" + "325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866396562386538303434" + "3436393737334555385f5a4e34636f726533666d7439466f726d61747465" + "7231327061645f696e74656772616c313768336538303336383966363939" + "303466334556335f5a4e39626c7331325f33383132667032467031307375" + "6274726163745f7031376833353337643137643839306564373430455736" + "5f5a4e35616c6c6f6335616c6c6f6336476c6f62616c3130616c6c6f635f" + "696d706c313768636263383565313966363066396565314558435f5a4e35" + "616c6c6f63377261775f7665633139526177566563244c54245424432441" + "244754243867726f775f6f6e653137683761366133613131343862316565" + "66624559785f5a4e37355f244c5424626c7331325f3338312e2e67322e2e" + "4732416666696e65247532302461732475323024737562746c652e2e436f" + "6e646974696f6e616c6c7953656c65637461626c65244754243138636f6e" + "646974696f6e616c5f73656c656374313768346631633532376163323663" + "39393332455a7a5f5a4e37375f244c5424737562746c652e2e43744f7074" + "696f6e244c54245424475424247532302461732475323024737562746c65" + "2e2e436f6e646974696f6e616c6c7953656c65637461626c652447542431" + "38636f6e646974696f6e616c5f73656c6563743137686230353564346638" + "6331363261313862455b5b5f5a4e36305f244c5424626c7331325f333831" + "2e2e66702e2e4670247532302461732475323024737562746c652e2e436f" + "6e7374616e7454696d654571244754243563745f65713137683764613737" + "3038613961336631623237455c335f5a4e39626c7331325f333831326670" + "324670313066726f6d5f6279746573313768663632643265653863383835" + "61616633455d665f5a4e36355f244c5424626c7331325f3338312e2e6670" + "2e2e4670247532302461732475323024636f72652e2e6f70732e2e617269" + "74682e2e4d756c41737369676e2447542431306d756c5f61737369676e31" + "376862613864393933386331336334313962455e425f5a4e39626c733132" + "5f33383132667032467032356c657869636f67726170686963616c6c795f" + "6c61726765737431376864623239383362653765626662373630455f345f" + "5a4e39626c7331325f3338313266703246703131706f775f76617274696d" + "65313768386339643861353637336531663765654560315f5a4e39626c73" + "31325f33383133667032334670323769735f7a65726f3137683232633162" + "33626231383039373337664561385f5a4e39626c7331325f333831326670" + "324670313573756d5f6f665f70726f647563747331376864373831613962" + "66366162336638386645622d5f5a4e39626c7331325f3338313366703233" + "467032336e6567313768336535623432323139303537623839334563365f" + "5a4e39626c7331325f33383133667032334670323131706f775f76617274" + "696d653137683839356266623030643732663461646145643b5f5a4e3962" + "6c7331325f3338313267313132473150726f6a656374697665386d756c5f" + "62795f78313768313830336335636330383333313036354565665f5a4e37" + "335f244c542424524624626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024636f72652e2e6f70732e2e" + "61726974682e2e4e656724475424336e6567313768363961333962383136" + "613036626237614566455f5a4e34636f7265346974657238616461707465" + "727337666c617474656e3137616e645f7468656e5f6f725f636c65617231" + "3768373932316661373530366638613637624567365f5a4e39626c733132" + "5f333831326732384732416666696e65386964656e746974793137683532" + "3261303037353662633832613639456885015f5a4e3130325f244c542462" + "6c7331325f3338312e2e67322e2e473250726f6a65637469766524753230" + "2461732475323024636f72652e2e636f6e766572742e2e46726f6d244c54" + "2424524624626c7331325f3338312e2e67322e2e4732416666696e652447" + "5424244754243466726f6d31376831393034396666373534383632623533" + "4569335f5a4e39626c7331325f3338313366703633467036396d756c5f62" + "795f303131376837316231356266356135313961376133456a385f5a4e39" + "626c7331325f333831326670324670313573756d5f6f665f70726f647563" + "747331376862306665663033383436356461336561456b5e5f5a4e39626c" + "7331325f3338313870616972696e677331364d696c6c65724c6f6f705265" + "73756c74323066696e616c5f6578706f6e656e74696174696f6e31306670" + "345f73717561726531376835333530613232303537323261303037456c68" + "5f5a4e36375f244c5424626c7331325f3338312e2e6670322e2e46703224" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e53" + "756241737369676e2447542431307375625f61737369676e313768656138" + "64663864303262303833343633456dd5015f5a4e3137325f244c5424244c" + "5424626c7331325f3338312e2e70616972696e67732e2e47325072657061" + "726564247532302461732475323024636f72652e2e636f6e766572742e2e" + "46726f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e" + "6524475424244754242e2e66726f6d2e2e41646465722475323024617324" + "75323024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65" + "724c6f6f70447269766572244754243133646f75626c696e675f73746570" + "31376833303230646632373566636537643064456e385f5a4e35616c6c6f" + "63337665633136566563244c542454244324412447542434707573683137" + "6836633466633030383766393064366561456f355f5a4e34636f72653970" + "616e69636b696e6731336173736572745f6661696c656431376838396134" + "30623862613963643736636345703a5f5a4e34636f72653970616e69636b" + "696e67313870616e69635f626f756e64735f636865636b31376835613339" + "3334316633393435306165354571625f5a4e34636f726533666d74336e75" + "6d33696d7035325f244c5424696d706c2475323024636f72652e2e666d74" + "2e2e446973706c61792475323024666f7224753230247533322447542433" + "666d74313768646131373032323936653330396138624572445f5a4e3463" + "6f726533666d74336e756d33696d7032315f244c5424696d706c24753230" + "2475333224475424345f666d743137686531613333633761616434313031" + "3465457311727573745f626567696e5f756e77696e6474465f5a4e34636f" + "726533666d7439466f726d617474657231327061645f696e74656772616c" + "313277726974655f70726566697831376865323164633232613535336139" + "3935324575535f5a4e34636f726535736c69636535696e6465783234736c" + "6963655f656e645f696e6465785f6c656e5f6661696c38646f5f70616e69" + "633772756e74696d65313768623465303239633465666136373431314576" + "475f5a4e34325f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e44656275672447542433666d743137683763663234" + "64633163663734653663354577495f5a4e34345f244c5424245246245424" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363963313766643162653433346236384578585f" + "5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e747324" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768356530663632333530333933336330664579265f" + "5a4e34636f726533666d7435777269746531376862633530306361396130" + "663033323632457a695f5a4e36385f244c5424636f72652e2e666d742e2e" + "6275696c646572732e2e5061644164617074657224753230246173247532" + "3024636f72652e2e666d742e2e577269746524475424313077726974655f" + "6368617231376837323761393336343062616631636662457b305f5a4e34" + "636f726533666d743557726974653977726974655f666d74313768653264" + "32326663306535326231396336457c515f5a4e34636f726535736c696365" + "35696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "38646f5f70616e69633772756e74696d6531376836346563303433376262" + "666263656363457d475f5a4e34325f244c54242452462454247532302461" + "732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "31376837396432393730376137363931633337457e375f5a4e34636f7265" + "3570616e6963313250616e69635061796c6f61643661735f737472313768" + "33653762626665396537333233373036457f3b5f5a4e337374643970616e" + "69636b696e673230727573745f70616e69635f776974685f686f6f6b3137" + "68396561303139313462356439323635394580010a727573745f70616e69" + "638101455f5a4e3373746433737973396261636b747261636532365f5f72" + "7573745f656e645f73686f72745f6261636b747261636531376865376239" + "323038656534343338376436458201585f5a4e337374643970616e69636b" + "696e673139626567696e5f70616e69635f68616e646c657232385f247537" + "62242475376224636c6f7375726524753764242475376424313768393666" + "3161333534313164393334366245830183015f5a4e39395f244c54247374" + "642e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e64" + "6c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447" + "54243661735f737472313768653362376630636337353061633833394584" + "01505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f636875" + "6e6b31376866646432333135363766663933346634458501066d656d7365" + "748601066d656d6370798701085f5f6d756c7469338801365f5a4e313763" + "6f6d70696c65725f6275696c74696e73336d656d376d656d6d6f76653137" + "6830343030366431613866396435653532458901076d656d6d6f76650712" + "01000f5f5f737461636b5f706f696e746572090a0100072e726f64617461" + "004d0970726f64756365727302086c616e6775616765010452757374000c" + "70726f6365737365642d6279010572757374631d312e38352e3120283465" + "6231363132353020323032352d30332d31352900490f7461726765745f66" + "65617475726573042b0a6d756c746976616c75652b0f6d757461626c652d" + "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const sp1_wasm = + "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" + "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" + "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" + "7e7e7e7e7e0060037f7e7e0060047f7e7e7f000351500906010004010001" + "000000060100000001010107040800000000000102080202040101000505" + "00010502000a0b0c00010100000100000401040000010100000101000200" + "0100000107010202030d0e000405017001080805030100110619037f0141" + "8080c0000b7f0041b0abc0000b7f0041b0abc0000b073c04066d656d6f72" + "790200147370315f67726f746831365f766572696669657200000a5f5f64" + "6174615f656e6403010b5f5f686561705f626173650302090d010041010b" + "071c1f1e323429420a81c10950add60202537f2d7e230041c0206b220124" + "0041e8a5c0002d0000410247044041e8a5c00041e8a5c0002d0000220541" + "0120051b3a00000240200504400340024002400240200541016b0e030005" + "01020b034041e8a5c0002d000022054101460d000b02400240200541016b" + "0e03000601030b000b41a49bc000412641cc9bc0001011000b41a89ac000" + "410d41949bc0001011000b41e8a5c00041e8a5c0002d0000220541012005" + "1b3a000020050d000b0b41e8a5c00041023a000041e4a5c000418c033602" + "0041e0a5c00041e892c0003602000b0b41bda9c0002d00001a41e4a5c000" + "280200211241e0a5c000280200211f024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002" + "400240024002404184021001220a450d00200a41c1befe827c3600800220" + "0a42e5979c9b97e3c7eb897f3700f801200a42cbb091f7e585f1e3d30037" + "00f001200a4285cca8c2988cc0acd0003700e801200a42c29391f580c1f3" + "da093700e001200a42d1f9cfc9da8dc8bcb37f3700d801200a42c1a5a5db" + "99d68fcfc8003700d001200a42a4e6aeaa96968ae30c3700c801200a42bb" + "86f4fee5c1aa8eab7f3700c001200a42ecff83a2ceee9ae7173700b80120" + "0a429fc5d69be5fafb80763700b001200a42bcd1e08deea2cfa58b7f3700" + "a801200a42aeb3eac1cda3e3c0bf7f3700a001200a42e2d8abdbae8cd3ae" + "5c37009801200a42eafbbf9fa891deb20437009001200a42afd29dfa8281" + "ecce9f7f37008801200a42b799d9dcb883f8df3b37008001200a42b3c1c2" + "a8e0a2cbc0cc00370078200a4295af8cdda2f981d269370070200a42f4eb" + "86b4cfc69bc339370068200a42f8e5b7c0c1e199bff000370060200a42c1" + "e7c485b4aac3c28c7f370058200a42f3e7ec98bff992d83b370050200a42" + "e880deac81addbc8967f370048200a4288c5f6c6eba0ef9844370040200a" + "42bdb2cf80ada892e5ec00370038200a42f887b4d9f0accbdb4c37003020" + "0a42e1c6ffa3c2dec48dcb00370028200a42fc81d7948085c1fc2c370020" + "200a42f79d8ff3bcb283ece500370018200a42beb6d5a58deadbe2d90037" + "0010200a4291c09b97b2989bf3b97f370008200a4291ec82edf9a3afba48" + "37000041bda9c0002d00001a41e0001001221d450d00201d420037000020" + "1d4200370020201d41053a001f201d4200370040201d41053a003f201d41" + "083a005f201d41176a4200370000201d41106a4200370000201d41086a42" + "00370000201d41286a4200370000201d41306a4200370000201d41376a42" + "00370000201d41c8006a4200370000201d41d0006a4200370000201d41d7" + "006a420037000041bda9c0002d00001a41c20010012205450d0020054180" + "80c00041c200104c2152200141a00f6a201f20121002024020012802a00f" + "200a280000470d002001418280c4003602e01c2001410036029c03200142" + "c080808020370294032001205241026a360290032001200141e01c6a3602" + "a003200141106a20014190036a100320012d0010044020012d0011210502" + "4020012802a003280200418280c400470d00200128029403450d00200128" + "029803450d040b41bda9c0002d00001a410810012202450d02200141d000" + "6a2116200a41e4016a2109200a41c4016a2122200a41a4016a2120200220" + "053a0000200141013602a80c200120023602a40c200141083602a00c2001" + "41b00f6a200141a0036a280200360200200141a80f6a20014198036a2902" + "0037030020012001290290033703a00f4101210503400240200141086a20" + "0141a00f6a100320012d0008450d0020012d0009210620012802a00c2005" + "460440024020012802b00f280200418280c400470d0020012802a40f450d" + "0020012802a80f450d070b230041206b220f240002404108200141a00c6a" + "220e280200220c4101742208200541016a220220022008491b2202200241" + "084d1b220241004e047f200f200c047f200f200c36021c200f200e280204" + "36021441010541000b360218200f41086a41012002200f41146a1028200f" + "2802084101470d01200f2802101a200f28020c0541000b41c096c0001019" + "000b200f28020c210c200e2002360200200e200c360204200f41206a2400" + "20012802a40c21020b200220056a20063a00002001200541016a22053602" + "a80c0c010b0b20012802a00c210220012802a40c210620012802e01c4182" + "80c4004704402002450d02200641046b2802002205417871221241044108" + "200541037122051b20026a490d05200541002012200241276a4b1b0d0620" + "0610040c020b2002418080808078460d0102400240024002402005412046" + "0440200141a80f6a2205200641176a290000370300200141b00f6a222320" + "06411f6a2d00003a00002001200629000f3703a00f200628000b21242006" + "28000721262006280003213520062d0002212d20062d0001214720062d00" + "00214820020440200641046b2802002208417871220c4104410820084103" + "7122081b20026a490d0c20084100200c200241276a4b1b0d0d200610040b" + "200141206a22062005290300370300200141286a220520232d00003a0000" + "200120012903a00f370318200141f0006a201d41e0001002200141c7006a" + "2006290300370000200141cf006a20052d00003a0000201641086a200141" + "f8006a290000370000201641106a20014180016a29000037000020164118" + "6a20014188016a290000370000200120012d0070411f713a007020162001" + "2900703700002001202436003b2001202636003720012035360033200120" + "2d3a0032200120473a0031200120483a00302001200129031837003f200a" + "290014225742388620574280fe0383422886842057428080fc0783421886" + "205742808080f80f834208868484205742088842808080f80f8320574218" + "88428080fc07838420574228884280fe03832057423888848484215e200a" + "411c6a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "65417f200a290004225742b0c8b99297bc8cd02985200a410c6a29000022" + "5842b8a195b29bb0a0acdd008584420052205842388620584280fe038342" + "2886842058428080fc0783421886205842808080f80f8342088684842058" + "42088842808080f80f832058421888428080fc07838420584228884280fe" + "03832058423888848484225842ddb0858ce8b691a8b87f54205742388620" + "574280fe0383422886842057428080fc0783421886205742808080f80f83" + "4208868484205742088842808080f80f832057421888428080fc07838420" + "574228884280fe03832057423888848484225742a9c0c689aece93b23054" + "205742a9c0c689aece93b230511b1b2205417f470440200541ff01710d07" + "206542c6faf3c3ed82a3903c56205e428d95c7c396d2dac0977f56205e42" + "8d95c7c396d2dac0977f511b0d070b200120583703b018200120653703a0" + "18200120573703b8182001205e3703a818200a2900342257423886205742" + "80fe0383422886842057428080fc0783421886205742808080f80f834208" + "868484205742088842808080f80f832057421888428080fc078384205742" + "28884280fe03832057423888848484215e200a413c6a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe038320574238888484842165417f200a290024225742" + "b0c8b99297bc8cd02985200a412c6a290000225842b8a195b29bb0a0acdd" + "008584420052205842388620584280fe0383422886842058428080fc0783" + "421886205842808080f80f834208868484205842088842808080f80f8320" + "58421888428080fc07838420584228884280fe0383205842388884848422" + "5842ddb0858ce8b691a8b87f54205742388620574280fe03834228868420" + "57428080fc0783421886205742808080f80f834208868484205742088842" + "808080f80f832057421888428080fc07838420574228884280fe03832057" + "423888848484225742a9c0c689aece93b23054205742a9c0c689aece93b2" + "30511b1b2205417f470440200541ff01710d07206542c6faf3c3ed82a390" + "3c56205e428d95c7c396d2dac0977f56205e428d95c7c396d2dac0977f51" + "1b0d070b200120583703d01a200120653703c01a200120573703d81a2001" + "205e3703c81a200141e0066a200141a0186a200141c01a6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222320014190076a290300370000200141c50c6a" + "222420014188076a290300370000200141bd0c6a222620014180076a2903" + "00370000200141b50c6a2235200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222d20052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022023290000370000200141851d6a22232024290000370000200141fd" + "1c6a22242026290000370000200141f51c6a222620352900003700002001" + "20012900ad0c3700ed1c200141d80a6a202d290000370300200141d00a6a" + "2005290000370300200141c80a6a2006290000370300200141c00a6a2002" + "290000370300200141b80a6a2023290000370300200141b00a6a20242900" + "00370300200120262900003703a80a200120012900ed1c3703a00a200a29" + "0054225742388620574280fe0383422886842057428080fc078342188620" + "5742808080f80f834208868484205742088842808080f80f832057421888" + "428080fc07838420574228884280fe038320574238888484842165200a41" + "dc006a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "6a417f200a290044225742b0c8b99297bc8cd02985200a41cc006a290000" + "225842b8a195b29bb0a0acdd008584420052205842388620584280fe0383" + "422886842058428080fc0783421886205842808080f80f83420886848420" + "5842088842808080f80f832058421888428080fc07838420584228884280" + "fe03832058423888848484226242ddb0858ce8b691a8b87f542057423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484225e42a9c0c689aece93b230" + "54205e42a9c0c689aece93b230511b1b2205417f470440200541ff01710d" + "07206a42c6faf3c3ed82a3903c562065428d95c7c396d2dac0977f562065" + "428d95c7c396d2dac0977f511b0d070b200a290074225742388620574280" + "fe0383422886842057428080fc0783421886205742808080f80f83420886" + "8484205742088842808080f80f832057421888428080fc07838420574228" + "884280fe03832057423888848484215a200a41fc006a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484215c417f200a290064225742" + "b0c8b99297bc8cd02985200a41ec006a290000225842b8a195b29bb0a0ac" + "dd008584420052205842388620584280fe0383422886842058428080fc07" + "83421886205842808080f80f834208868484205842088842808080f80f83" + "2058421888428080fc07838420584228884280fe03832058423888848484" + "225942ddb0858ce8b691a8b87f54205742388620574280fe038342288684" + "2057428080fc0783421886205742808080f80f8342088684842057420888" + "42808080f80f832057421888428080fc07838420574228884280fe038320" + "57423888848484225442a9c0c689aece93b23054205442a9c0c689aece93" + "b230511b1b2205417f470440200541ff01710d07205c42c6faf3c3ed82a3" + "903c56205a428d95c7c396d2dac0977f56205a428d95c7c396d2dac0977f" + "511b0d070b200a29009401225742388620574280fe038342288684205742" + "8080fc0783421886205742808080f80f8342088684842057420888428080" + "80f80f832057421888428080fc07838420574228884280fe038320574238" + "88848484215b200a419c016a290000225742388620574280fe0383422886" + "842057428080fc0783421886205742808080f80f83420886848420574208" + "8842808080f80f832057421888428080fc07838420574228884280fe0383" + "20574238888484842161417f200a29008401225742b0c8b99297bc8cd029" + "85200a418c016a290000225842b8a195b29bb0a0acdd0085844200522058" + "42388620584280fe0383422886842058428080fc07834218862058428080" + "80f80f834208868484205842088842808080f80f832058421888428080fc" + "07838420584228884280fe03832058423888848484225842ddb0858ce8b6" + "91a8b87f54205742388620574280fe0383422886842057428080fc078342" + "1886205742808080f80f834208868484205742088842808080f80f832057" + "421888428080fc07838420574228884280fe038320574238888484842257" + "42a9c0c689aece93b23054205742a9c0c689aece93b230511b1b2205417f" + "470440200541ff01710d07206142c6faf3c3ed82a3903c56205b428d95c7" + "c396d2dac0977f56205b428d95c7c396d2dac0977f511b0d070b200141e0" + "066a2020100620012d00e0060d06200141f51c6a200141f8066a29030022" + "53370000200141b80b6a20014188076a290300370300200141b00b6a2001" + "4180076a290300370300200120012903f0063703a00b200120533703a80b" + "200120623703900b2001206a3703800b200120593703f00a2001205c3703" + "e00a2001205e3703980b200120653703880b200120543703f80a2001205a" + "3703e80a200120573703d80b200120583703d00b2001205b3703c80b2001" + "20613703c00b200141e0066a200141e00a6a200141a00b6a100720012d00" + "e0060d06200141801f6a200141ad186a200141cd1a6a200141ee1c6a2001" + "41ae0c6a200141f0066a418001104c418001104c418001104c418001104c" + "418001104c1a200141e0066a2022100620012d00e0060d06200141b5186a" + "2205200141f8066a22062903002257370000200141f80a6a20014188076a" + "2202290300370300200141f00a6a20014180076a22202903003703002001" + "20012903f0063703e00a200120573703e80a200141e0066a200910062001" + "2d00e0060d06200520062903002257370000200141b80b6a200229030037" + "0300200141b00b6a2020290300370300200120012903f0063703a00b2001" + "20573703a80b200141e0066a200141e00a6a200141a00b6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222020014190076a290300370000200141c50c6a" + "222220014188076a290300370000200141bd0c6a220920014180076a2903" + "00370000200141b50c6a2223200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222420052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022020290000370000200141851d6a22202022290000370000200141fd" + "1c6a22222009290000370000200141f51c6a220920232900003700002001" + "20012900ad0c3700ed1c200141d8086a2024290000370300200141d0086a" + "2005290000370300200141c8086a2006290000370300200141c0086a2002" + "290000370300200141b8086a2020290000370300200141b0086a20222900" + "00370300200141a8086a2009290000370300200120012900ed1c3703a008" + "200141e8076a20012903a80a370300200141f0076a200141b00a6a290300" + "370300200141f8076a200141b80a6a29030037030020014180086a200141" + "c00a6a29030037030020014188086a200141c80a6a290300370300200141" + "90086a200141d00a6a29030037030020014198086a200141d80a6a290300" + "370300200120012903a00a3703e007200141e0066a200141801f6a418001" + "104c1a20014190016a2001419d036a200141ad0f6a200141e0066a418002" + "104c418002104c418002104c1a2012411f4d0d0f200141a00f6a201f1008" + "20012d00a00f0d06200141e50c6a200141e80f6a29030022573700002001" + "41dd0c6a200141e00f6a2903002258370000200141d50c6a200141d80f6a" + "290300225e370000200141cd0c6a200141d00f6a29030022653700002001" + "41f00b6a200141c00f6a290300370300200141f80b6a200141c80f6a2903" + "00370300200141800c6a2065370300200141880c6a205e37030020014190" + "0c6a2058370300200141980c6a2057370300200120012903b00f3703e00b" + "2001200141b80f6a2903003703e80b201241ff004d0d10200141a00f6a20" + "1f41406b100920012d00a00f0d06200141a0186a200141ad0c6a200141b0" + "0f6a418001104c418001104c1a201241bf014d0d11200141a00f6a201f41" + "80016a100920012d00a00f0d06200141c01a6a200141ad0c6a200141b00f" + "6a418001104c418001104c1a2012419f024d0d12200141a00f6a201f41e0" + "016a100920012d00a00f0d06200141e01c6a200141ad0c6a200141b00f6a" + "418001104c418001104c1a201241a002460d13201241a102460d14201241" + "a2024d0d15201241a302460d16201f2d00a0022105201f2d00a102210620" + "1f2d00a3022102201f2d00a202212041002126200141003602a80b200142" + "8080808080023702a00b2005200641087472202041107472200241187472" + "220504404101200541187420054180fe03714108747220054108764180fe" + "0371200541187672722205200541014d1b210c200141ad0c6a2105200141" + "b00f6a210641a40221024100212241102108410021200340202041f6ffff" + "3f460d19200241206a220920124b0d1a200141a00f6a2002201f6a100820" + "012d00a00f0d0320052006290000370000200541386a2202200641386a29" + "0000370000200541306a2223200641306a290000370000200541286a2224" + "200641286a290000370000200541206a2226200641206a29000037000020" + "0541186a2235200641186a290000370000200541106a222d200641106a29" + "0000370000200541086a2247200641086a290000370000200141901f6a22" + "48202d290000370300200141981f6a222d2035290000370300200141a01f" + "6a22352026290000370300200141a81f6a22262024290000370300200141" + "b01f6a22242023290000370300200141b81f6a2223200229000037030020" + "0120052900003703801f200120472900003703881f20012802a00b202046" + "044041002108230041206b2203240002400240200141a00b6a221b280200" + "220f417f460d00200f4101742202200f41016a220e2002200e4b1b220241" + "ffffff1f4b0d0041042002200241044d1b2202410674220e41f0ffffff07" + "4b0d002003200f047f2003200f41067436021c2003201b28020436021441" + "100541000b360218200341086a4110200e200341146a1028200328020841" + "01470d0120032802101a200328020c21080b200841dc90c0001019000b20" + "0328020c210f201b2002360200201b200f360204200341206a2400200128" + "02a40b21080b200820226a220220012903801f370300200241386a202329" + "0300370300200241306a2024290300370300200241286a20262903003703" + "00200241206a2035290300370300200241186a202d290300370300200241" + "106a2048290300370300200241086a20012903881f370300200120204101" + "6a22203602a80b202241406b212220092102200c2020470d000b20012802" + "a00b21260b20012902a40b216a200141a00c6a200141a0186a100a200141" + "a00d6a200141e01c6a418001104c1a200141a00e6a200141c01a6a418001" + "104c1a200141d6126a200141980c6a290300370100200141ce126a200141" + "900c6a290300370100200141c6126a200141880c6a290300370100200141" + "be126a200141800c6a290300370100200141b6126a200141f80b6a290300" + "370100200141ae126a200141f00b6a290300370100200141a6126a200129" + "03e80b370100200120012903e00b37019e1220012d00a00c210520012d00" + "a10c2106200141a00f6a200141a00c6a41027241fe02104c1a200141e006" + "6a200141a00f6a41be03104c1a2026418080808078460d0620014190036a" + "410272200141e0066a41be03104c1a200120263602d006200120063a0091" + "03200120053a0090034100210241bda9c0002d00001a2001206a3702d406" + "41c000100b2220450d07206a4220882262a72122206aa72135200141b00f" + "6a2105200141306a2106410021120340230041206b22092400200941186a" + "221b2006290000225342388620534280fe0383422886842053428080fc07" + "83421886205342808080f80f834208868484205342088842808080f80f83" + "2053421888428080fc07838420534228884280fe03832053423888848484" + "370300200941106a2208200641086a290000225342388620534280fe0383" + "422886842053428080fc0783421886205342808080f80f83420886848420" + "5342088842808080f80f832053421888428080fc07838420534228884280" + "fe0383205342388884848437030020092006290010225342388620534280" + "fe0383422886842053428080fc0783421886205342808080f80f83420886" + "8484205342088842808080f80f832053421888428080fc07838420534228" + "884280fe038320534238888484843703082009200641186a290000225342" + "388620534280fe0383422886842053428080fc0783421886205342808080" + "f80f834208868484205342088842808080f80f832053421888428080fc07" + "838420534228884280fe0383205342388884848437030020094201420042" + "0042004281808080bfb2fdf0c3004291e1e5cd8789fa9928102b200141a0" + "0f6a220c41003a0000200c41286a201b290300370300200c41206a200829" + "0300370300200c41186a2009290308370300200c20092903003703102009" + "41206a240020012d00a00f4101460d1a200141f8066a200541186a290300" + "2257370300200141f0066a200541106a2903002258370300200120052903" + "00225e3703e0062001200541086a29030022653703e80620202012410574" + "6a220641186a2057370300200641106a2058370300200641086a20653703" + "002006205e370300410121122002410171211f4101210220162106201f45" + "0d000b206a42ffffffffffffffff03560d1a2022410674220541f1ffffff" + "074f0d1a2005450d0341bda9c0002d00001a2005100b2206450d07200620" + "352005104c211220624203520d02206a428080808010540d042001419006" + "6a212d20014190056a214720014190046a2148200141f81a6a221f201241" + "386a290300370300200141f01a6a2216201241306a290300370300200141" + "e81a6a2222201241286a290300370300200141e01a6a2209201241206a29" + "0300370300200141d81a6a2223201241186a290300370300200141d01a6a" + "2224201241106a290300370300200120122903003703c01a200120124108" + "6a2903003703c81a2020210541c00021060340200141d80c6a201f290300" + "370300200141d00c6a2016290300370300200141c80c6a20222903003703" + "00200141c00c6a2009290300370300200141b80c6a202329030037030020" + "0141b00c6a2024290300370300200120012903c81a3703a80c2001200129" + "03c01a3703a00c200120053602e00c2001200620126a22023602e40c2001" + "41e01c6a21312002210c4100212e41002136230041a0046b220424002004" + "41306a212b20044180036a2137200441e0036a210f200441f0016a210e20" + "0441c0026a211b200441e0026a2108200441b0026a2149200441d0026a21" + "4a41ff012141034002402004204141ff0071104f2005204141037641f0ff" + "ffff01716a22422903002004290300832159204241086a29030020044108" + "6a29030083215302400240027f0240024002400240024020364101714504" + "4041002053205984500d061a200441e0006a200441206a29030037030020" + "0441e8006a200441286a290300370300200441f0006a202b290300370300" + "200441f8006a200441386a29030037030020044180016a200441406b2903" + "0037030020044188016a200441c8006a2903003703002004200429031037" + "035020042004290318370358202e0d010c030b202e450d0120044188026a" + "200441c8006a222e29030037030020044180026a200441406b2250290300" + "370300200441f8016a200441386a2203290300370300200e202b29030037" + "0300200441e8016a200441286a2236290300370300200441e0016a200441" + "206a2242290300370300200420042903183703d801200420042903103703" + "d001200441d8036a224b4200370300200441d0036a220242003703002004" + "42003703f803200442003703f003200442003703e803200442013703e003" + "200442003703c803200442003703c003024002400240200441d0016a2004" + "41c0036a104a450440200e200f104a450d010b204b420037030020024200" + "370300200442003703f803200442003703f003200442003703e803200442" + "013703e003200442003703c803200442003703c003027f0240200441d001" + "6a200441c0036a104a450440200e200f104a450d010b2049202b29030037" + "0300204941186a202b41186a290300370300204941106a202b41106a2903" + "00370300204941086a202b41086a290300370300200441a0026a20422903" + "00370300200441a8026a2036290300370300200420042903103703900220" + "0420042903183703980220082102204a0c010b204a4200370300200441a0" + "026a4200370300200441a8026a4200370300204a41086a4200370300204a" + "41106a4200370300204a41186a4200370300200442003703900220044200" + "37039802201b210220490b214b2002420037030820024200370300204b42" + "00370308204b4201370300200441c0036a20044190026a20044190026a10" + "40200441f0026a200441c0036a104120042802f002410171450d01200441" + "c8016a203741386a290300370300200441c0016a203741306a2903003703" + "00200441b8016a203741286a290300370300200441b0016a203741206a29" + "0300370300200441a8016a203741186a290300370300200441a0016a2037" + "41106a29030037030020042037290300370390012004203741086a290300" + "370398010c020b200441a0016a2042290300370300200441a8016a203629" + "0300370300200441b0016a202b290300370300200441b8016a2003290300" + "370300200441c0016a2050290300370300200441c8016a202e2903003703" + "00200420042903103703900120042004290318370398010c010b41c4a0c0" + "00412041e4a0c0001021000b2042200441a0016a29030037030020362004" + "41a8016a290300370300202b200441b0016a2903003703002003200441b8" + "016a2903003703002050200441c0016a290300370300202e200441c8016a" + "290300370300200420042903900137031020042004290398013703182053" + "205984500d04200441e0006a2042290300370300200441e8006a20362903" + "00370300200441f0006a202b290300370300200441f8006a200329030037" + "030020044180016a205029030037030020044188016a202e290300370300" + "20042004290310370350200420042903183703580b200441c0036a200441" + "d0006a200c100c0c020b20532059844200520d002041450d044101213641" + "00212e0c050b200441f8036a200c41386a290300370300200441f0036a20" + "0c41306a290300370300200441e8036a200c41286a290300370300200f20" + "0c41206a290300370300200441d8036a200c41186a290300370300200441" + "d0036a200c41106a2903003703002004200c2903003703c0032004200c41" + "086a2903003703c8030b200441c8006a200441f8036a2903003703002004" + "41406b200441f0036a290300370300200441386a200441e8036a29030037" + "0300202b200f290300370300200441286a200441d8036a29030037030020" + "0441206a200441d0036a290300370300200420042903c803370318200420" + "042903c0033703100b4101212e41010b213620410d01202e0d020b4184a1" + "c0001020000b204141016b21410c010b0b20312004290310370300203141" + "086a2004290318370300203141386a200441c8006a290300370300203141" + "306a200441406b290300370300203141286a200441386a29030037030020" + "3141206a200441306a290300370300203141186a200441286a2903003703" + "00203141106a200441206a290300370300200441a0046a2400200541206a" + "2105200141c01a6a200141a00c6a200141e01c6a100c200641406b220641" + "c001470d000b200141b00f6a2205200141c01a6a100d201241c001100e20" + "0141c01a6a200141ed066a200541e000104c41e000104c1a200141e0066a" + "20014190026a100d200141a0186a21024200215c42002154420021532001" + "41e0066a220541386a2903002161200541286a290300215b200529033021" + "592005290320215e027e200529034022652005290350226a84200541c800" + "6a2903002262200541d8006a290300225a84845004402059215c20612154" + "205b2153205e0c010b42002059205e84205b20618484500d001a427f4200" + "427f4200205e42788342c7faf3c3ed82a3903c561b225c205b205c56ad7d" + "205c205b7d225b42f3eab8bce9ada5bfe8007d2253205b54ad7c42017c22" + "5b20597d225442a4cffaf397c9eed7c7007d225c205454ad2059205b56ad" + "7d427f511b20617d42a9c0c689aece93b2307c215442c7faf3c3ed82a390" + "3c205e7d0b21612002206a370350200220653703402002205c3703302002" + "20613703202002205a370358200220623703482002205437033820022053" + "37032820022005290300370300200241186a200541186a29030037030020" + "0241106a200541106a290300370300200241086a200541086a2903003703" + "0020014180196a20014190016a100f200141a01b6a2047100f200141e01c" + "6a200141d0026a100d200141c01d6a2048100f200141e0066a202d100d20" + "0141801f6a20014190036a100f200141c0076a2108420021654200215b42" + "00215c42002153024002400240200141801f6a2202290380012002418801" + "6a290300844200520d0020022903900120024198016a290300844200520d" + "0020022903a001200241a8016a290300844200520d0020022903b0012002" + "41b8016a29030084500d010b200241f8006a2903002159200241e8006a29" + "0300215e2002290370215420022903602161200229035022582002290340" + "226a84200241d8006a290300225a200241c8006a29030022628484420052" + "0440427f4200427f4200206a42788342c7faf3c3ed82a3903c561b226520" + "62206556ad7d206520627d226542f3eab8bce9ada5bfe8007d2253206554" + "ad7c42017c225c20587d225b42a4cffaf397c9eed7c7007d2265205b54ad" + "2058205c56ad7d427f511b205a7d42a9c0c689aece93b2307c215c42c7fa" + "f3c3ed82a3903c206a7d215b0b420021584200216a420021624200215a20" + "542061842059205e84844200520440427f4200427f4200206142788342c7" + "faf3c3ed82a3903c561b22582058205e54ad7d2058205e7d225e42f3eab8" + "bce9ada5bfe8007d226a205e54ad7c42017c225e20547d225842a4cffaf3" + "97c9eed7c7007d2262205854ad2054205e56ad7d427f511b20597d42a9c0" + "c689aece93b2307c215a42c7faf3c3ed82a3903c20617d21580b20082002" + "4180016a22052903003703800120082002290300370300200841b8016a20" + "0541386a290300370300200841b0016a200541306a290300370300200841" + "a8016a200541286a290300370300200841a0016a200541206a2903003703" + "0020084198016a200541186a29030037030020084190016a200541106a29" + "030037030020084188016a200541086a290300370300200841086a200241" + "086a290300370300200841106a200241106a290300370300200841186a20" + "0241186a290300370300200841206a200241206a29030037030020084128" + "6a200241286a290300370300200841306a200241306a2903003703002008" + "41386a200241386a2903003703002008205a370378200820623703702008" + "206a370368200820583703602008205c3703582008206537035020082053" + "3703482008205b3703400c010b2008200241c001104c1a0b200141a00f6a" + "200141a0186a41a002104c1a200141c0116a200141c01a6a41a002104c1a" + "200141e0136a200141e01c6a41a002104c1a20014180166a200141e0066a" + "41a002104c1a200141a00c6a2131230041b0d1006b220024002000410036" + "023820004280808080800237023020004100360244200042808080808002" + "37023c41102133200041306a10362000280234223b200141a00f6a220341" + "e000104c1a20004101360238200341e0006a2102200028023c4504402000" + "413c6a1038200028024021330b2033200241c001104c1a200341a0026a21" + "022000410136024420002802304101460440200041306a10362000280234" + "213b0b203b41e0006a200241e000104c1a2000410236023820034180036a" + "2102200028023c41014604402000413c6a1038200028024021330b203341" + "c0016a200241c001104c1a200341c0046a21022000410236024420002802" + "304102460440200041306a10362000280234213b0b203b41c0016a200241" + "e000104c1a20004103360238200341a0056a2102200028023c4102460440" + "2000413c6a1038200028024021330b20334180036a200241c001104c1a20" + "0341e0066a21022000410336024420002802304103460440200041306a10" + "362000280234213b0b203b41a0026a200241e000104c1a20004104360238" + "200341c0076a2103200028023c41034604402000413c6a10382000280240" + "21330b203341c0046a200341c001104c1a20004104360244200041003602" + "502000428080808080023702482000410036025c20004280808080800237" + "025420004180046a2151200041e00d6a2104200041b0076a212c20004190" + "c1006a2143200041d0c0006a2128200041f0c0006a2144200041c00d6a21" + "0b200041d0286a2106200041d01f6a211820004180c7006a212b200041b0" + "c7006a2107200041c0c7006a213c200041f0c6006a2102200041800e6a21" + "2d200041903b6a213d200041f03a6a2127200041d03a6a213e200041f00d" + "6a213f200041b00d6a221041086a212e200041f8c6006a214c200041b8c7" + "006a214d20004188c7006a214e200041c8c7006a211220004198c7006a21" + "1f200041d8c7006a2122200041a8c7006a2123200041e8c7006a21244110" + "2138411021050340200041e0006a203b204f41e0006c6a22031041200041" + "b0016a2033204f41c0016c6a220d104502402000280260410171450d0020" + "002802b001410171450d00200041a00d6a2003104120002802a00d410171" + "45044041a4a3c0001020000b200041f8026a2211201041386a2903003703" + "00200041f0026a2213201041306a290300370300200041e8026a22092010" + "41286a290300370300200041e0026a2215201041206a2903003703002000" + "41d8026a220f201041186a290300370300200041d0026a2225201041106a" + "290300370300200020102903003703c0022000202e2903003703c8022000" + "280248203946044041002108230041206b220e240002400240200041c800" + "6a221b280200220c417f460d00200c4101742205200c41016a2216200520" + "164b1b220541ffffff1f4b0d0041042005200541044d1b22054106742216" + "41f0ffffff074b0d00200e200c047f200e200c41067436021c200e201b28" + "020436021441100541000b360218200e41086a2016200e41146a1037200e" + "2802084101470d01200e2802101a200e28020c21080b200841b4a3c00010" + "19000b200e28020c210c201b2005360200201b200c360204200e41206a24" + "00200028024c21050b200520394106746a220320002903c0023703002003" + "41386a2011290300370300200341306a2013290300370300200341286a20" + "09290300370300200341206a2015290300370300200341186a200f290300" + "370300200341106a2025290300370300200341086a20002903c802370300" + "2000203941016a2239360250200041a00d6a200d10450240024020002802" + "a00d4101710440200041b03a6a2010418001104c1a200041d80d6a222542" + "00370300200041d00d6a223a4200370300200041c80d6a22294200370300" + "200b4200370300200041b80d6a220d420037030020104200370300203f42" + "00370300203f41086a4200370300203f41106a4200370300203f41186a42" + "00370300203f41206a4200370300203f41286a4200370300200042003703" + "e80d200042013703e00d200042003703a80d200042003703a00d027f0240" + "0240200041b03a6a200041a00d6a104a0d00203e200b104a0d0020272004" + "104a0d00203d202d104a450d010b203c4200370300200220272903003703" + "00203c41086a4200370300203c41106a4200370300203c41186a42003703" + "00203c41206a4200370300203c41286a4200370300200241386a20274138" + "6a290300370300200241306a202741306a290300370300200241286a2027" + "41286a290300370300200241206a202741206a290300370300200241186a" + "202741186a290300370300200241106a202741106a290300370300200241" + "086a202741086a290300370300200041e8c6006a200041e83a6a29030037" + "0300200041e0c6006a200041e03a6a290300370300200041d8c6006a2000" + "41d83a6a290300370300200041d0c6006a203e290300370300200041c8c6" + "006a200041c83a6a290300370300200041c0c6006a200041c03a6a290300" + "370300200020002903b83a3703b846200020002903b03a3703b04620070c" + "010b200041c0c6006a4200370300200041c8c6006a4200370300200041d0" + "c6006a4200370300200041d8c6006a4200370300200041e0c6006a420037" + "0300200041e8c6006a4200370300200042003703b046200042003703b846" + "202b41f000104b1a20020b220342003703082003420137030041bda9c000" + "2d00001a41809901100b221e450d0141002109200041003602b819200020" + "1e3602b419200041e6003602b019200041b03d6a200041b03a6a100a4140" + "212a0340200041a00d6a200041b0c6006a2002102f200041c8c3006a2215" + "200d290300370300200041c0c3006a220f20102903003703002000200029" + "03a80d3703b843200020002903a00d3703b043200041b0c3006a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200041a8076a2211200b41186a221b290300370300200041a0076a221320" + "0b41106a22342903003703002000200b41086a2240290300370398072000" + "200b2903003703900720004190076a42a4fdf9e1b6c191889e7f42c6cae3" + "a18ba9ade04b42aed88286b4db88945c4294a0e38497e789991842c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200041c81f6a2015290300" + "370300200041c01f6a200f29030037030020182000290390073703002018" + "41086a200029039807370300201841106a2013290300370300201841186a" + "2011290300370300200020002903b8433703b81f200020002903b0433703" + "b01f200041e8346a2203200241386a290300370300200041e0346a200241" + "306a290300370300200041d8346a2232200241286a290300370300200041" + "d0346a200241206a290300370300200041c8346a220e200241186a290300" + "370300200041c0346a200241106a2903003703002000200241086a290300" + "3703b834200020022903003703b034200041b0346a20022002102f200041" + "e8376a2219200741386a290300370300200041e0376a200741306a290300" + "370300200041d8376a221a200741286a290300370300200041d0376a2007" + "41206a290300370300200041c8376a222f200741186a2903003703002000" + "41c0376a2230200741106a2903003703002000200741086a2903003703b8" + "37200020072903003703b037200041b0376a20072007102f20002903b837" + "226942018620002903b037226b423f88842155206b420186215402400240" + "027e203029030022664201862069423f8884225342ddb0858ce8b691a8b8" + "7f85202f290300227820787c2066423f887c225642a9c0c689aece93b230" + "8584500440205442c7faf3c3ed82a3903c542055428d95c7c396d2dac097" + "7f542055428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230" + "215642ddb0858ce8b691a8b87f0c010b205342deb0858ce8b691a8b87f54" + "205642a9c0c689aece93b23054205642a9c0c689aece93b230511b450d01" + "20530b215a2054215f205521580c010b205620532055205442c7faf3c3ed" + "82a3903c7d225f20545aad22547d225942f3eab8bce9ada5bfe8007c2258" + "205954ad2054205556ad7d7c2255205354ad205542a2cffaf397c9eed7c7" + "007c225a205554ad7c50ad7d42a9c0c689aece93b2307d21560b201a2903" + "00226742018620002903d037226f423f88842154206f4201862153024002" + "4020002903e037225e4201862067423f8884225942ddb0858ce8b691a8b8" + "7f852019290300227720777c205e423f887c225542a9c0c689aece93b230" + "8584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2dac097" + "7f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230" + "215542ddb0858ce8b691a8b87f21602053215b205421700c020b205942de" + "b0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689" + "aece93b230511b450d002053215b20542170205921600c010b2055205920" + "54205342c7faf3c3ed82a3903c7d225b20535aad22537d226042f3eab8bc" + "e9ada5bfe8007c2270206054ad2053205456ad7d7c2254205954ad205442" + "a2cffaf397c9eed7c7007c2260205454ad7c50ad7d42a9c0c689aece93b2" + "307d21550b02400240027e205a20667c225a205820697c2254206954ad20" + "54205f206b7c2259206b54ad7c2253205454ad7c7c225442ddb0858ce8b6" + "91a8b87f85205a206654ad2054205a54ad7c205620787c7c225642a9c0c6" + "89aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95c7" + "c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8" + "b691a8b87f54205642a9c0c689aece93b23054205642a9c0c689aece93b2" + "30511b450d0120540b215f205921582053215c0c010b2056205420532059" + "42c7faf3c3ed82a3903c7d225820595aad22597d225a42f3eab8bce9ada5" + "bfe8007c225c205a54ad2053205954ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c225f205354ad7c50ad7d42a9c0c689aece93b2307d21" + "560b02400240205e20607c225a206720707c2254206754ad2054205b206f" + "7c2259206f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f85" + "205a205e54ad2054205a54ad7c205520777c7c225542a9c0c689aece93b2" + "308584500440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0" + "977f542053428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30215542ddb0858ce8b691a8b87f21542059215a205321590c020b205442" + "deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c6" + "89aece93b230511b450d002059215a205321590c010b2055205420532059" + "42c7faf3c3ed82a3903c7d225a20595aad22607d225b42f3eab8bce9ada5" + "bfe8007c2259205b54ad2053206054ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21" + "550b200020543703e0222000205a3703d0222000205f3703c02220002058" + "3703b022200020553703e822200020593703d822200020563703c8222000" + "205c3703b822200042d4fdc3d783f6c4cb003703d80d200042f4fbe3f6de" + "f5ab964d3703d00d200042d2b0b4a9ce90e8a7a77f3703c80d200042d2ab" + "8caee8a0afd1643703c00d200042aed5e2f58ca8a78a2b3703b80d200042" + "c3d581df919386df817f3703b00d200042a3dfefced5bcb1dab57f3703a8" + "0d200042e5f184a5c2dbf9b3323703a00d200041b0256a200041a00d6a20" + "0041b0226a102f20002903b825226442018620002903b025226e423f8884" + "2155206e420186215402400240027e20002903c02522704201862064423f" + "8884225342ddb0858ce8b691a8b87f85200041c8256a2219290300226020" + "607c2070423f887c225642a9c0c689aece93b2308584500440205442c7fa" + "f3c3ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396" + "d2dac0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691" + "a8b87f0c010b205342deb0858ce8b691a8b87f54205642a9c0c689aece93" + "b23054205642a9c0c689aece93b230511b450d0120530b215a2054215f20" + "5521580c010b205620532055205442c7faf3c3ed82a3903c7d225f20545a" + "ad22547d225942f3eab8bce9ada5bfe8007c2258205954ad2054205556ad" + "7d7c2255205354ad205542a2cffaf397c9eed7c7007c225a205554ad7c50" + "ad7d42a9c0c689aece93b2307d21560b200041d8256a221a290300227142" + "018620002903d0252265423f888421542065420186215302400240200029" + "03e025225c4201862071423f8884225942ddb0858ce8b691a8b87f852000" + "41e8256a2217290300225b205b7c205c423f887c225542a9c0c689aece93" + "b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2da" + "c0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f21682053216c205421730c020b2059" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d002053216c20542173205921680c010b205520" + "592054205342c7faf3c3ed82a3903c7d226c20535aad22537d226842f3ea" + "b8bce9ada5bfe8007c2273206854ad2053205456ad7d7c2254205954ad20" + "5442a2cffaf397c9eed7c7007c2268205454ad7c50ad7d42a9c0c689aece" + "93b2307d21550b02400240027e205a20707c225a205820647c2254206454" + "ad2054205f206e7c2259206e54ad7c2253205454ad7c7c225442ddb0858c" + "e8b691a8b87f85205a207054ad2054205a54ad7c205620607c7c225a42a9" + "c0c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d" + "95c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9" + "c0c689aece93b230215a42ddb0858ce8b691a8b87f0c010b205442deb085" + "8ce8b691a8b87f54205a42a9c0c689aece93b23054205a42a9c0c689aece" + "93b230511b450d0120540b21742059217d2053216a0c010b205a20542053" + "205942c7faf3c3ed82a3903c7d227d20595aad22567d225942f3eab8bce9" + "ada5bfe8007c226a205954ad2053205654ad7d7c2256205454ad205642a2" + "cffaf397c9eed7c7007c2274205654ad7c50ad7d42a9c0c689aece93b230" + "7d215a0b02400240205c20687c2259207120737c2256207154ad20562065" + "206c7c2253206554ad7c2254205654ad7c7c225642ddb0858ce8b691a8b8" + "7f852059205c54ad2056205954ad7c2055205b7c7c225f42a9c0c689aece" + "93b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2" + "dac0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece" + "93b230215f42ddb0858ce8b691a8b87f21732053217b205421790c020b20" + "5642deb0858ce8b691a8b87f54205f42a9c0c689aece93b23054205f42a9" + "c0c689aece93b230511b450d002053217b20542179205621730c010b205f" + "20562054205342c7faf3c3ed82a3903c7d227b20535aad22557d225342f3" + "eab8bce9ada5bfe8007c2279205354ad2054205554ad7d7c2255205654ad" + "205542a2cffaf397c9eed7c7007c2273205554ad7c50ad7d42a9c0c689ae" + "ce93b2307d215f0b02400240027e207420002903c03422547c2256206a20" + "002903b83422537c2255206a54ad2055207d20002903b03422587c226820" + "7d54ad7c2259205554ad7c7c225542ddb0858ce8b691a8b87f8520562074" + "54ad2055205654ad7c205a200e29030022567c7c226d42a9c0c689aece93" + "b2308584500440206842c7faf3c3ed82a3903c542059428d95c7c396d2da" + "c0977f542059428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b205542deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120550b2172206821752059217a0c010b206d20552059206842c7faf3" + "c3ed82a3903c7d227520685aad22687d226c42f3eab8bce9ada5bfe8007c" + "227a206c54ad2059206854ad7d7c2259205554ad205942a2cffaf397c9ee" + "d7c7007c2272205954ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "0240207320002903e03422597c22552079203229030022687c2263207954" + "ad2063207b20002903d034226c7c2261207b54ad7c2262206354ad7c7c22" + "5d42ddb0858ce8b691a8b87f852055207354ad2055205d56ad7c205f2003" + "29030022557c7c226342a9c0c689aece93b2308584500440206142c7faf3" + "c3ed82a3903c542062428d95c7c396d2dac0977f542062428d95c7c396d2" + "dac0977f511b450d0142a9c0c689aece93b230216342ddb0858ce8b691a8" + "b87f215d20612157206221610c020b205d42deb0858ce8b691a8b87f5420" + "6342a9c0c689aece93b23054206342a9c0c689aece93b230511b450d0020" + "612157206221610c010b2063205d2062206142c7faf3c3ed82a3903c7d22" + "5720615aad227c7d227642f3eab8bce9ada5bfe8007c2261207654ad2062" + "207c54ad7d7c2262205d54ad206242a2cffaf397c9eed7c7007c225d2062" + "54ad7c50ad7d42a9c0c689aece93b2307d21630b2011206d370300201320" + "723703002000207a37039807200020753703900720004190076a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200d20633703002010205d370300200020613703a80d200020573703a00d" + "200041a00d6a42a4fdf9e1b6c191889e7f42c6cae3a18ba9ade04b42aed8" + "8286b4db88945c4294a0e38497e789991842c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200041c8286a22032011290300370300200041c0" + "286a220e2013290300370300200620002903a00d370300200641086a2000" + "2903a80d370300200641106a2010290300370300200641186a200d290300" + "37030020002000290398073703b82820002000290390073703b028024002" + "40027e20002903c04722612000290380477c226d204d290300225d204c29" + "03007c2263205d54ad206320002903b047225d20002903f0467c2262205d" + "54ad7c225d206354ad7c7c226342ddb0858ce8b691a8b87f852061206d56" + "ad2063206d54ad7c2012290300204e2903007c7c226d42a9c0c689aece93" + "b2308584500440206242c7faf3c3ed82a3903c54205d428d95c7c396d2da" + "c0977f54205d428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b206342deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120630b217220622175205d217a0c010b206d2063205d206242c7faf3" + "c3ed82a3903c7d227520625aad22627d226142f3eab8bce9ada5bfe8007c" + "227a206154ad205d206254ad7d7c225d206354ad205d42a2cffaf397c9ee" + "d7c7007c2272205d54ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "024020002903e047225720002903a0477c226320222903002262201f2903" + "007c225d206254ad205d20002903d04722622000290390477c2261206254" + "ad7c2262205d54ad7c7c225d42ddb0858ce8b691a8b87f852057206356ad" + "205d206354ad7c202429030020232903007c7c226342a9c0c689aece93b2" + "308584500440206142c7faf3c3ed82a3903c542062428d95c7c396d2dac0" + "977f542062428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30216342ddb0858ce8b691a8b87f215d20612157206221610c020b205d42" + "deb0858ce8b691a8b87f54206342a9c0c689aece93b23054206342a9c0c6" + "89aece93b230511b450d0020612157206221610c010b2063205d20622061" + "42c7faf3c3ed82a3903c7d225720615aad227c7d227642f3eab8bce9ada5" + "bfe8007c2261207654ad2062207c54ad7d7c2262205d54ad206242a2cffa" + "f397c9eed7c7007c225d206254ad7c50ad7d42a9c0c689aece93b2307d21" + "630b200d206d3703002010207237030020292061370300200b2057370300" + "203a205d37030020252063370300200041c0c0006a224520723703002000" + "41c8c0006a2232206d37030020282057370300200041d8c0006a22142061" + "370300200041e0c0006a205d370300200041e8c0006a221c206337030020" + "0020753703a00d200020753703b0402000207a3703a80d2000207a3703b8" + "40200041b0c0006a200041a00d6a200041a00d6a102f02400240027e2054" + "20667c226d205320697c2262206954ad20622058206b7c2263206b54ad7c" + "225d206254ad7c7c226b42ddb0858ce8b691a8b87f852066206d56ad206b" + "206d54ad7c205620787c7c226942a9c0c689aece93b23085845004402063" + "42c7faf3c3ed82a3903c54205d428d95c7c396d2dac0977f54205d428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b230216942ddb0858c" + "e8b691a8b87f0c010b206b42deb0858ce8b691a8b87f54206942a9c0c689" + "aece93b23054206942a9c0c689aece93b230511b450d01206b0b216d2063" + "2178205d21630c010b2069206b205d206342c7faf3c3ed82a3903c7d2278" + "20635aad22667d226d42f3eab8bce9ada5bfe8007c2263206d54ad205d20" + "6654ad7d7c2266206b54ad206642a2cffaf397c9eed7c7007c226d206654" + "ad7c50ad7d42a9c0c689aece93b2307d21690b024002402059205e7c226b" + "206720687c2266206754ad2066206c206f7c225d206f54ad7c2267206654" + "ad7c7c226642ddb0858ce8b691a8b87f85205e206b56ad2066206b54ad7c" + "205520777c7c226b42a9c0c689aece93b2308584500440205d42c7faf3c3" + "ed82a3903c542067428d95c7c396d2dac0977f542067428d95c7c396d2da" + "c0977f511b450d0142a9c0c689aece93b230216b42ddb0858ce8b691a8b8" + "7f216f205d21772067215e0c020b206642deb0858ce8b691a8b87f54206b" + "42a9c0c689aece93b23054206b42a9c0c689aece93b230511b450d00205d" + "21772067215e2066216f0c010b206b20662067205d42c7faf3c3ed82a390" + "3c7d2277205d5aad226f7d225d42f3eab8bce9ada5bfe8007c225e205d54" + "ad2067206f54ad7d7c2267206654ad206742a2cffaf397c9eed7c7007c22" + "6f206754ad7c50ad7d42a9c0c689aece93b2307d216b0b20002903b84021" + "5d20002903b040216102400240417f20002903c0402267206d8520322903" + "002266206985844200522067206d54206620695420662069511b1b222141" + "7f470440202141ff01710d01206120785a205d20635a205d2063511b0d01" + "0b20662067205d206142c7faf3c3ed82a3903c7c2262206154ad7c226120" + "5d54ad206142f3eab8bce9ada5bfe8007d225d206154ad7c7c2261206754" + "ad7c206142a3cffaf397c9eed7c7007d2275206154ad7c42a9c0c689aece" + "93b2307c21660c010b20672175206121620b205d20637d227a2062207854" + "ad225754ad217c205d206354ad21762014290300215d20002903d0402172" + "02400240417f20002903e0402263206f85201c2903002267206b85844200" + "522063206f542067206b542067206b511b1b2214417f470440201441ff01" + "710d01207220775a205d205e5a205d205e511b0d010b20672063205d2072" + "42c7faf3c3ed82a3903c7c2261207254ad7c2272205d54ad207242f3eab8" + "bce9ada5bfe8007d225d207254ad7c7c2272206354ad7c207242a3cffaf3" + "97c9eed7c7007d227e207254ad7c42a9c0c689aece93b2307c21670c010b" + "2063217e207221610b206d427f85216d2076207c7c2172206f427f852163" + "205d205e54ad205d205e7d225d2061207754ad227c54ad7c217602400240" + "417f20542070852056206085844200522054207056205620605620562060" + "511b1b2214417f470440201441ff01710d012058206e5820532064582053" + "2064511b0d010b206020702064206e42c7faf3c3ed82a3903c7c225e206e" + "54ad7c226f206454ad206f42f3eab8bce9ada5bfe8007d226e206f54ad7c" + "7c2264207054ad206442a3cffaf397c9eed7c7007d2270206454ad7c7c42" + "a9c0c689aece93b2307c21600c010b206e215e2064216e0b206d20757c21" + "64420120727d21722063207e7c216f420120767d2175206020567d205442" + "7f85227620707c2260207654ad206042012053206e56ad7d206e20537d22" + "702058205e56ad226e54ad7d7c227f206054ad7c50ad7d21762070206e7d" + "216e205e20587d217e02400240417f2059205c852055205b858442005220" + "59205c562055205b562055205b511b1b2214417f470440201441ff01710d" + "012065206c5a206820715820682071511b0d010b205b205c2071206542c7" + "faf3c3ed82a3903c7c225e206554ad7c2260207154ad206042f3eab8bce9" + "ada5bfe8007d2271206054ad7c7c2260205c54ad206042a3cffaf397c9ee" + "d7c7007d225c206054ad7c7c42a9c0c689aece93b2307c215b0c010b2065" + "215e0b206420727c2160206f20757c2170200f200041c0c6006a29030037" + "03002015200041c8c6006a290300370300200041d0c3006a200041d0c600" + "6a290300370300200041d8c3006a2214200041d8c6006a29030037030020" + "0041e0c3006a200041e0c6006a290300370300200041e8c3006a221c2000" + "41e8c6006a2903003703002000207f3703c02b2000207e3703b02b200020" + "002903b0463703b043200020002903b8463703b8432000205e206c7d3703" + "d02b200020763703c82b2000206e3703b82b2000207120687d226e205e20" + "6c54ad225e7d3703d82b20002059427f852265205c7c225c420120682071" + "56ad7d205e206e56ad7d7c22713703e02b2000205b20557d205c207156ad" + "205c206554ad7c50ad7d3703e82b200041b0c3006a200041b0c6006a2000" + "41b0c6006a102f200041c8076a22212017290300370300200041c0076a20" + "0041e0256a290300370300200041b8076a2217201a290300370300202c20" + "0041d0256a290300370300201120192903003703002013200041c0256a29" + "0300370300200020002903b82537039807200020002903b0253703900720" + "004190076a200041b0256a200041b0256a102f0240417f20542074852056" + "205a858442005220542074542056205a542056205a511b1b2219417f4704" + "40201941ff01710d012058207d5a2053206a5a2053206a511b0d010b2056" + "20542053205842c7faf3c3ed82a3903c7c225b205854ad7c2258205354ad" + "205842f3eab8bce9ada5bfe8007d225c205854ad7c7c2253205454ad2053" + "42a3cffaf397c9eed7c7007d2254205354ad7c7c42a9c0c689aece93b230" + "7c2156205b2158205c21530b2064206d5421192060206454211a2063206f" + "56210c206f20705621162056205a7d2074427f85225a20547c2256205a54" + "ad205642012053206a54ad7d2053206a7d22542058207d54ad225354ad7d" + "7c225a205654ad7c50ad7d215b205420537d21532058207d7d2158024002" + "40417f20592073852055205f858442005220592073542055205f54205520" + "5f511b1b2208417f470440200841ff01710d01206c207b5a206820795a20" + "682079511b0d010b205520592068206c42c7faf3c3ed82a3903c7c225620" + "6c54ad7c225c206854ad205c42f3eab8bce9ada5bfe8007d2254205c54ad" + "7c7c225c205954ad205c42a3cffaf397c9eed7c7007d2259205c54ad7c7c" + "42a9c0c689aece93b2307c21550c010b206c2156206821540b2019ad215c" + "201aad2164200cad21712016ad216c2000205a3703c031200020583703b0" + "3120002056207b7d3703d0312000205b3703c831200020533703b8312000" + "205420797d22532056207b54ad225a7d3703d83120002073427f85225820" + "597c225642012054207954ad7d2053205a54ad7d7c22543703e031200020" + "55205f7d2054205654ad2056205854ad7c50ad7d3703e831200041b0c600" + "6a200041b01f6a200041b0316a102f2010200e290300370300200d200329" + "0300370300200b20062903003703002029200041d8286a29030037030020" + "3a200041e0286a2903003703002025200041e8286a290300370300200020" + "002903b0283703a00d200020002903b8283703a80d200041a00d6a200041" + "b0286a200041b0286a102f20002903980722544201862000290390072253" + "423f888421552053420186215a02400240027e20002903a0072259420186" + "2054423f8884225f42ddb0858ce8b691a8b87f852011290300226820687c" + "2059423f887c225642a9c0c689aece93b2308584500440205a42c7faf3c3" + "ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205f42deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d01205f0b216f205a215e205521" + "740c010b2056205f2055205a42c7faf3c3ed82a3903c7d225e205a5aad22" + "5a7d225842f3eab8bce9ada5bfe8007c2274205854ad2055205a54ad7d7c" + "2255205f54ad205542a2cffaf397c9eed7c7007c226f205554ad7c50ad7d" + "42a9c0c689aece93b2307d21560b205c20647c2173206c20717c216c2017" + "290300225a42018620002903b007225f423f8884215b205f420186215c02" + "40024020002903c0072258420186205a423f8884226442ddb0858ce8b691" + "a8b87f852021290300227120717c2058423f887c225542a9c0c689aece93" + "b2308584500440205c42c7faf3c3ed82a3903c54205b428d95c7c396d2da" + "c0977f54205b428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f216e205c2165205b216a0c020b2064" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d00205c2165205b216a2064216e0c010b205520" + "64205b205c42c7faf3c3ed82a3903c7d2265205c5aad225c7d226e42f3ea" + "b8bce9ada5bfe8007c226a206e54ad205b205c54ad7d7c225b206454ad20" + "5b42a2cffaf397c9eed7c7007c226e205b54ad7c50ad7d42a9c0c689aece" + "93b2307d21550b2073502103206c50210e02400240027e2059206f7c225b" + "205420747c2264205454ad20642053205e7c225c205354ad7c2253206454" + "ad7c7c225442ddb0858ce8b691a8b87f852059205b56ad2054205b54ad7c" + "205620687c7c225642a9c0c689aece93b2308584500440205c42c7faf3c3" + "ed82a3903c542053428d95c7c396d2dac0977f542053428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205442deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d0120540b215b205c2164205321" + "5c0c010b205620542053205c42c7faf3c3ed82a3903c7d2264205c5aad22" + "597d225b42f3eab8bce9ada5bfe8007c225c205b54ad2053205954ad7d7c" + "2253205454ad205342a2cffaf397c9eed7c7007c225b205354ad7c50ad7d" + "42a9c0c689aece93b2307d21560b2003ad2168206620697d216c200ead21" + "662067206b7d2167024002402058206e7c2269205a206a7c2254205a54ad" + "2054205f20657c2259205f54ad7c2253205454ad7c7c225442ddb0858ce8" + "b691a8b87f852058206956ad2054206954ad7c205520717c7c225542a9c0" + "c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95" + "c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0142a9c0" + "c689aece93b230215542ddb0858ce8b691a8b87f215a2059217120532169" + "0c020b205442deb0858ce8b691a8b87f54205542a9c0c689aece93b23054" + "205542a9c0c689aece93b230511b450d0020592171205321692054215a0c" + "010b205520542053205942c7faf3c3ed82a3903c7d227120595aad22597d" + "225a42f3eab8bce9ada5bfe8007c2269205a54ad2053205954ad7d7c2253" + "205454ad205342a2cffaf397c9eed7c7007c225a205354ad7c50ad7d42a9" + "c0c689aece93b2307d21550b206c20687d216b207a20577d215320672066" + "7d2168205d207c7d215920002903a80d215820002903a00d216602400240" + "417f20002903b00d225f205b85200d290300225420568584420052205b20" + "5f56205420565420542056511b1b2203417f470440200341ff01710d0120" + "642066582058205c5a2058205c511b0d010b2054205f2058206642c7faf3" + "c3ed82a3903c7c226c206654ad7c2267205854ad206742f3eab8bce9ada5" + "bfe8007d2266206754ad7c7c2258205f54ad7c205842a3cffaf397c9eed7" + "c7007d2267205854ad7c42a9c0c689aece93b2307c21540c010b205f2167" + "2066216c205821660b206220787d215f206120777d2158205420567d205b" + "427f85225420677c2256205454ad2056205c206656ad2066205c7d225420" + "64206c56ad225b54ad7c7d42017c2266205654ad7c50ad7d21672054205b" + "7d216f206c20647d216c2029290300215b20002903c00d21640240024041" + "7f20002903d00d2254205a8520252903002256205585844200522054205a" + "54205520565620552056511b1b2203417f470440200341ff01710d012064" + "20715a205b20695a205b2069511b0d010b20562054205b206442c7faf3c3" + "ed82a3903c7c225c206454ad7c2264205b54ad206442f3eab8bce9ada5bf" + "e8007d225b206454ad7c7c2264205454ad7c206442a3cffaf397c9eed7c7" + "007d2254206454ad7c42a9c0c689aece93b2307c21560c010b2064215c0b" + "20002066370380472000206c3703f0462000205c20717d37039047200020" + "67370388472000206f3703f8462000205b20697d2264205c207154ad225c" + "7d370398472000205a427f85225a20547c2254205b206954ad205c206456" + "ad7c7d42017c225b3703a0472000205620557d2054205a54ad2054205b56" + "ad7c50ad7d3703a847200020683703e831200020703703e0312000205937" + "03d831200020583703d031200020603703c0312000206b3703c831200020" + "5f3703b031200020533703b8312007200041b0346a200041b0316a102f42" + "002164200042003703e831200042003703e031200042003703d831200042" + "013703d031200042003703c831200042003703c031200042003703b83120" + "0042093703b031200041b02e6a200041b0316a200041b02b6a102f420021" + "714200216c4200216642002167205f2060842053206b8484420052044042" + "c7faf3c3ed82a3903c205f7d2166427f4200427f4200205f42788342c7fa" + "f3c3ed82a3903c561b22562053205656ad7d205620537d225642f3eab8bc" + "e9ada5bfe8007d2267205654ad7c42017c225620607d225542a4cffaf397" + "c9eed7c7007d2271205554ad2056206054ad7d427f511b206b7d42a9c0c6" + "89aece93b2307c216c0b4200216b4200216f4200215e2058207084205920" + "688484420052044042c7faf3c3ed82a3903c20587d2164427f4200427f42" + "00205842788342c7faf3c3ed82a3903c561b22562056205954ad7d205620" + "597d225642f3eab8bce9ada5bfe8007d226b205654ad7c42017c22562070" + "7d225542a4cffaf397c9eed7c7007d226f205554ad2056207054ad7d427f" + "511b20687d42a9c0c689aece93b2307c215e0b20002903b8432254420186" + "20002903b0432253423f888421552053420186215a02400240027e200029" + "03c04322594201862054423f8884225f42ddb0858ce8b691a8b87f852015" + "290300227020707c2059423f887c225642a9c0c689aece93b23085845004" + "40205a42c7faf3c3ed82a3903c542055428d95c7c396d2dac0977f542055" + "428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230215642dd" + "b0858ce8b691a8b87f0c010b205f42deb0858ce8b691a8b87f54205642a9" + "c0c689aece93b23054205642a9c0c689aece93b230511b450d01205f0b21" + "68205a2174205521730c010b2056205f2055205a42c7faf3c3ed82a3903c" + "7d2274205a5aad225a7d225842f3eab8bce9ada5bfe8007c2273205854ad" + "2055205a54ad7d7c2255205f54ad205542a2cffaf397c9eed7c7007c2268" + "205554ad7c50ad7d42a9c0c689aece93b2307d21560b2014290300225a42" + "018620002903d043225f423f88842160205f420186215b02400240200029" + "03e0432258420186205a423f8884226942ddb0858ce8b691a8b87f85201c" + "290300225c205c7c2058423f887c225542a9c0c689aece93b23085845004" + "40205b42c7faf3c3ed82a3903c542060428d95c7c396d2dac0977f542060" + "428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542dd" + "b0858ce8b691a8b87f216e205b21652060216a0c020b206942deb0858ce8" + "b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93b2" + "30511b450d00205b21652060216a2069216e0c010b205520692060205b42" + "c7faf3c3ed82a3903c7d2265205b5aad225b7d226e42f3eab8bce9ada5bf" + "e8007c226a206e54ad205b206056ad7d7c2260206954ad206042a2cffaf3" + "97c9eed7c7007c226e206054ad7c50ad7d42a9c0c689aece93b2307d2155" + "0b02400240027e205920687c225b205420737c2269205454ad2069205320" + "747c2260205354ad7c2253206954ad7c7c225442ddb0858ce8b691a8b87f" + "852059205b56ad2054205b54ad7c205620707c7c225642a9c0c689aece93" + "b2308584500440206042c7faf3c3ed82a3903c542053428d95c7c396d2da" + "c0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8b691a8b8" + "7f54205642a9c0c689aece93b23054205642a9c0c689aece93b230511b45" + "0d0120540b215b20602170205321690c010b205620542053206042c7faf3" + "c3ed82a3903c7d227020605aad22597d226042f3eab8bce9ada5bfe8007c" + "2269206054ad2053205954ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c225b205354ad7c50ad7d42a9c0c689aece93b2307d21560b0240" + "02402058206e7c2260205a206a7c2254205a54ad2054205f20657c225920" + "5f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f8520582060" + "56ad2054206054ad7c2055205c7c7c225542a9c0c689aece93b230858450" + "0440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0977f5420" + "53428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542" + "ddb0858ce8b691a8b87f21542059215a205321590c020b205442deb0858c" + "e8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93" + "b230511b450d002059215a205321590c010b205520542053205942c7faf3" + "c3ed82a3903c7d225a20595aad225f7d225842f3eab8bce9ada5bfe8007c" + "2259205854ad2053205f54ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21550b2000" + "41e81c6a2203200041e82e6a290300370300200041e01c6a220e200041e0" + "2e6a290300370300200041d81c6a2219200041d82e6a2903003703002000" + "41d01c6a221a200041d02e6a290300370300200041c81c6a2217200041c8" + "2e6a290300370300200041c01c6a2214200041c02e6a2903003703002000" + "20002903b82e3703b81c200020002903b02e3703b01c20002802b0192009" + "460440200041b0196a41c4a2c000103920002802b419211e0b2017290300" + "21532019290300215f2003290300215820002903b81c2160201e200941c0" + "016c6a220320553703b80120142903002155201a290300215c200e290300" + "216820002903b01c2174200320543703b001200320593703a8012003205a" + "3703a00120032056370398012003205b3703900120032069370388012003" + "2070370380012003205e3703782003206f3703702003206b370368200320" + "643703602003206c37035820032071370350200320673703482003206637" + "034020032074370300200341386a2058370300200341306a206837030020" + "0341286a205f370300200341206a205c370300200341186a205337030020" + "0341106a2055370300200341086a20603703002000200941016a22033602" + "b81902400240200041b0196a027f02400240202a41e4a1c0006a2d000041" + "016b0e03000401040b200041b0c9006a200041b0c6006a200041b03a6a10" + "49200041b0c9006a210e200320002802b019470d0241d4a2c0000c010b20" + "0041b0ce006a200041b0c6006a200041b03d6a1049200041b0ce006a210e" + "200320002802b019470d0141e4a2c0000b103920002802b419211e0b201e" + "200341c0016c6a200e41c001104c1a2000200941026a22033602b8190b20" + "032109202a41016a222a0d000b200042a0dcae8f86aaf9e4163703c80720" + "0042948fe8babd91b3d2cb003703c007200042cebbf2dbd0c38ad7323703" + "b807200042a297bfa0c6a3f5b2163703b007200042f7a3e4fb84f3d1d92f" + "3703a807200042c3e2e6aacf87fb85cc003703a0072000428ce68c968ce2" + "b0c6b77f37039807200042bdaabdbbf1aae5f1997f370390072015203e41" + "186a290300370300200f203e41106a2903003703002000203e41086a2903" + "003703b8432000203e2903003703b043200041b0c3006a42c6faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200d" + "200041c83a6a2903003703002010200041c03a6a290300370300200b2000" + "2903b043370300204020002903b8433703002034200f290300370300201b" + "2015290300370300200020002903b83a3703a80d200020002903b03a3703" + "a00d200041b0c0006a20004190076a200041a00d6a102f2000429a8984e2" + "ca978fe0073703c807200042abdee5e3feb4ad82073703c007200042d2b7" + "89fd98b99fc0213703b807200042e3e18eb1b2ecdfe9827f3703b0072000" + "42dcebebc4d4e0bc9e063703a807200042b9f38bb78bd3b1af5c3703a007" + "20004298b3a5ceda9db8d55b37039807200042daa6808de7a880aa5c3703" + "90072015203d41186a290300370300200f203d41106a2903003703002000" + "203d41086a2903003703b8432000203d2903003703b043200041b0c3006a" + "42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200d202741186a2903003703002010202741106a2903003703" + "00200b20002903b043370300204020002903b8433703002034200f290300" + "370300201b20152903003703002000202741086a2903003703a80d200020" + "272903003703a00d204420004190076a200041a00d6a102f200042a0dcae" + "8f86aaf9e4163703e843200042948fe8babd91b3d2cb003703e043200042" + "cebbf2dbd0c38ad7323703d843200042a297bfa0c6a3f5b2163703d04320" + "0042f7a3e4fb84f3d1d92f3703c843200042c3e2e6aacf87fb85cc003703" + "c0432000428ce68c968ce2b0c6b77f3703b843200042bdaabdbbf1aae5f1" + "997f3703b043202f202841186a2903003703002030202841106a29030037" + "03002000202841086a2903003703b837200020282903003703b037200041" + "b0376a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2011203229030037030020132045290300370300202c" + "20002903b037370300202c41086a220d20002903b837370300202c41106a" + "22092030290300370300202c41186a2215202f2903003703002000200029" + "03b84037039807200020002903b04037039007200041a00d6a200041b0c3" + "006a20004190076a102f2000429a8984e2ca978fe0073703e843200042ab" + "dee5e3feb4ad82073703e043200042d2b789fd98b99fc0213703d8432000" + "42e3e18eb1b2ecdfe9827f3703d043200042dcebebc4d4e0bc9e063703c8" + "43200042b9f38bb78bd3b1af5c3703c04320004298b3a5ceda9db8d55b37" + "03b843200042daa6808de7a880aa5c3703b043202f204341186a29030037" + "03002030204341106a2903003703002000204341086a2903003703b83720" + "0020432903003703b037200041b0376a42c6faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2011204441186a2903" + "003703002013204441106a290300370300202c20002903b037370300200d" + "20002903b837370300200920302903003703002015202f29030037030020" + "00204441086a2903003703980720002044290300370390072004200041b0" + "c3006a20004190076a102f200041b0c3006a200041a00d6a100a20004190" + "076a200041b0c6006a200041b0c0006a104920002802b019221120034604" + "40200041b0196a41a4a2c000103920002802b019211120002802b419211e" + "0b201e200341c0016c6a20004190076a41c001104c1a2000200341016a22" + "0d3602b819200041a00d6a200041b0c6006a200041b0c3006a1049200d20" + "11470d02200041b0196a41b4a2c000103920002802b419211e0c020b41c4" + "a3c00010200b000b201e200d41c0016c6a200041a00d6a41c001104c1a20" + "0041b8196a220d200341026a36020020004180036a200041b03a6a418001" + "104c1a205141086a200d280200360200205120002902b019370200200028" + "025420464604404100211b230041206b220e240002400240200041d4006a" + "22162802002209417f460d00410420094101742208200941016a220c2008" + "200c4b1b2208200841044d1b220cad4290017e22534220884200520d0020" + "53a7220841f0ffffff074b0d00200e2009047f200e20094190016c36021c" + "200e201628020436021441100541000b360218200e41086a2008200e4114" + "6a1037200e2802084101470d01200e2802101a200e28020c211b0b201b41" + "d4a3c0001019000b200e28020c21092016200c3602002016200936020420" + "0e41206a2400200028025821380b203820464190016c6a20004180036a41" + "9001104c1a2000204641016a224636025c0b204f41016a224f4104470d00" + "0b0240024002400240024002400240024002400240024002402046450440" + "2000280254210320004190076a41f002104b1a20030d010c020b41002118" + "200041a0076a41f002104b1a200042003703980720004201370390072046" + "2039203920464b1b210820384184016a211b200041e00e6a2134200041b0" + "cf006a2119200041f0ce006a211a200041f0c3006a2114200041b0c4006a" + "2121200041b0ca006a2140200041f0c9006a2145200041b0c7006a214c20" + "004190086a212c200041f0c6006a214d200041d0076a212820004190096a" + "211c200041d0096a214e200041d0086a2117200041d0ce006a2110200041" + "d0c9006a21134100210c0240024002400340200041b0c3006a2000419007" + "6a2017103b200042003703e849200042003703e049200042003703d84920" + "0042013703d049200042003703c849200042003703c049200042003703b8" + "49200042093703b049200041b0ce006a204e200041b0c9006a102f201941" + "386a2203201c41386a290300370300201941306a2202201c41306a290300" + "370300201941286a2207201c41286a290300370300201941206a220b201c" + "41206a290300370300201941186a220d201c41186a290300370300201941" + "106a2211201c41106a290300370300201941086a2206201c41086a290300" + "3703002019201c290300370300201a2017290300370300201a41086a2209" + "201741086a290300370300201a41106a2215201741106a29030037030020" + "1a41186a220f201741186a290300370300201a41206a2225201741206a29" + "0300370300201a41286a2229201741286a290300370300201a41306a222a" + "201741306a290300370300201a41386a221e201741386a29030037030020" + "0041b0c6006a200041b0ce006a20004190076a1030204d201a2028103020" + "4c2019202c1030200041b0ce006a201741c001104c1a200041b0c9006a20" + "004190076a2017103020452028201a10302040202c20191030200041b0ce" + "006a200041b0c6006a200041b0c9006a103b200041b0c9006a200041b0ce" + "006a200041b0c3006a103c200042003703e846200042003703e046200042" + "003703d846200042013703d046200042003703c846200042003703c04620" + "0042003703b846200042093703b046200041b0ce006a2021200041b0c600" + "6a102f201a20002903b043370300200920002903b8433703002015200041" + "c0c3006a290300370300200f200041c8c3006a2903003703002025200041" + "d0c3006a2903003703002029200041d8c3006a290300370300202a200041" + "e0c3006a290300370300201e200041e8c3006a2903003703002003201441" + "386a2903003703002002201441306a2903003703002007201441286a2903" + "00370300200b201441206a290300370300200d201441186a290300370300" + "2011201441106a2903003703002006201441086a29030037030020192014" + "290300370300200041a00d6a200041b0c9006a200041b0ce006a103c2000" + "41b0ce006a200041b0c3006a200041b0c3006a1030201a20142014103020" + "192021202110302034200041b0ce006a41c001104c1a20004190076a2000" + "41a00d6a418003104c1a200c41016a2116201b2106200521022008210f02" + "7f02402039450440200c41a4a1c0006a2d00000d01201841016a21182016" + "220c41c000460d040c030b02400340200641046a280200220320184b0440" + "200241386a2903002156200241306a2903002155200241286a2903002154" + "200241206a2903002153200041c8ce006a220d2006280200201841c0016c" + "6a220341d8006a290300370300200041c0ce006a2211200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2207200341f8006a2903003703002000" + "41b00d6a220b200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2225" + "200d290300370300200041c0c9006a222920112903003703002013200029" + "03a00d370300201341086a222a20002903a80d370300201341106a221e20" + "0b290300370300201341186a222f2007290300370300200020002903b84e" + "3703b849200020002903b04e3703b049200241186a290300215620024110" + "6a2903002155200241086a290300215420022903002153200041c8c6006a" + "220920034198016a290300370300200041c0c6006a221520034190016a29" + "0300370300200020034188016a2903003703b84620002003290380013703" + "b046200041b0c6006a205320542055205642c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b2007200341b8016a290300370300200b200341b0" + "016a2903003703002000200341a8016a2903003703a80d200020032903a0" + "013703a00d200041a00d6a205320542055205642c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200d20092903003703002011201529030037" + "0300201020002903a00d370300201041086a223020002903a80d37030020" + "1041106a223a200b290300370300201041186a2232200729030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20064190016a2106200241406b2102200f4101" + "6b220f0d010c020b0b201820034194a2c0001010000b201b210620052102" + "2008210e201841016a220f200c41a4a1c0006a2d0000450d011a03402006" + "41046a2802002203200f4b0440200241386a2903002156200241306a2903" + "002155200241286a2903002154200241206a2903002153200d2006280200" + "200f41c0016c6a220341d8006a2903003703002011200341d0006a290300" + "3703002000200341c8006a2903003703b84e200020032903403703b04e20" + "0041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2007200341f8006a290300370300200b200341f0006a29" + "03003703002000200341e8006a2903003703a80d200020032903603703a0" + "0d200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2025200d290300370300202920112903003703002013" + "20002903a00d370300202a20002903a80d370300201e200b290300370300" + "202f2007290300370300200020002903b84e3703b849200020002903b04e" + "3703b049200241186a2903002156200241106a2903002155200241086a29" + "0300215420022903002153200920034198016a2903003703002015200341" + "90016a290300370300200020034188016a2903003703b846200020032903" + "80013703b046200041b0c6006a205320542055205642c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f102b2007200341b8016a290300370300200b" + "200341b0016a2903003703002000200341a8016a2903003703a80d200020" + "032903a0013703a00d200041a00d6a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b200d200929030037030020112015" + "290300370300201020002903a00d370300203020002903a80d370300203a" + "200b29030037030020322007290300370300200020002903b8463703b84e" + "200020002903b0463703b04e200041a00d6a20004190076a2003200041b0" + "c9006a200041b0ce006a104820004190076a200041a00d6a418003104c1a" + "20064190016a2106200241406b2102200e41016b220e0d010c020b0b200f" + "20034184a2c0001010000b201841026a0b21182016220c41c000470d000b" + "2039450d0020384184016a2107200041d0ce006a210b200041d0c9006a21" + "0d201841c0016c2125200521022008210903402018200741046a28020022" + "034f0d02200241386a2903002156200241306a2903002155200241286a29" + "03002154200241206a2903002153200041c8ce006a221320072802002025" + "6a220341d8006a290300370300200041c0ce006a2206200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2211200341f8006a2903003703002000" + "41b00d6a2210200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2013" + "290300370300200041c0c9006a2006290300370300200d20002903a00d37" + "0300200d41086a20002903a80d370300200d41106a201029030037030020" + "0d41186a2011290300370300200020002903b84e3703b849200020002903" + "b04e3703b049200241186a2903002156200241106a290300215520024108" + "6a290300215420022903002153200041c8c6006a221520034198016a2903" + "00370300200041c0c6006a220f20034190016a2903003703002000200341" + "88016a2903003703b84620002003290380013703b046200041b0c6006a20" + "5320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2011200341b8016a2903003703002010200341b0016a2903003703002000" + "200341a8016a2903003703a80d200020032903a0013703a00d200041a00d" + "6a205320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b201320152903003703002006200f290300370300200b20002903a00d" + "370300200b41086a20002903a80d370300200b41106a2010290300370300" + "200b41186a2011290300370300200020002903b8463703b84e2000200029" + "03b0463703b04e200041a00d6a20004190076a2003200041b0c9006a2000" + "41b0ce006a104820004190076a200041a00d6a418003104c1a2007419001" + "6a2107200241406b2102200941016b22090d000b20384184016a21072000" + "41d0ce006a210b200041d0c9006a210d201841016a221841c0016c210f20" + "05210203402018200741046a28020022034f0d03200241386a2903002156" + "200241306a2903002155200241286a2903002154200241206a2903002153" + "200041c8ce006a22132007280200200f6a220341d8006a29030037030020" + "0041c0ce006a2206200341d0006a2903003703002000200341c8006a2903" + "003703b84e200020032903403703b04e200041b0ce006a20532054205520" + "5642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041b80d6a" + "2211200341f8006a290300370300200041b00d6a2210200341f0006a2903" + "003703002000200341e8006a2903003703a80d200020032903603703a00d" + "200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200041c8c9006a2013290300370300200041c0c9006a20" + "06290300370300200d20002903a00d370300200d41086a20002903a80d37" + "0300200d41106a2010290300370300200d41186a20112903003703002000" + "20002903b84e3703b849200020002903b04e3703b049200241186a290300" + "2156200241106a2903002155200241086a29030021542002290300215320" + "0041c8c6006a220920034198016a290300370300200041c0c6006a221520" + "034190016a290300370300200020034188016a2903003703b84620002003" + "290380013703b046200041b0c6006a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2011200341b8016a290300370300" + "2010200341b0016a2903003703002000200341a8016a2903003703a80d20" + "0020032903a0013703a00d200041a00d6a205320542055205642c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f102b201320092903003703002006" + "2015290300370300200b20002903a00d370300200b41086a20002903a80d" + "370300200b41106a2010290300370300200b41186a201129030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20074190016a2107200241406b210220084101" + "6b22080d000b0b20004190046a20004190076a418003104c1a200041b03d" + "6a20004190046a103d200041b03a6a200041d0056a221f103d2000420037" + "03e834200042003703e034200042003703d834200042013703d034200042" + "003703c834200042003703c034200042003703b834200042093703b03420" + "0041b0ce006a200041b03b6a200041b0346a102f200041b8cf006a223620" + "0041f83a6a290300370300200041c0cf006a2237200041803b6a29030037" + "0300200041c8cf006a2242200041883b6a290300370300200041d0cf006a" + "2241200041903b6a290300370300200041d8cf006a2247200041983b6a29" + "0300370300200041e0cf006a2248200041a03b6a290300370300200041e8" + "cf006a224b200041a83b6a290300370300200041f8ce006a222220002903" + "b83a37030020004180cf006a2223200041c03a6a22492903003703002000" + "4188cf006a2224200041c83a6a224a29030037030020004190cf006a224f" + "200041d03a6a225029030037030020004198cf006a2227200041d83a6a22" + "39290300370300200041a0cf006a223f200041e03a6a223c290300370300" + "200041a8cf006a223e200041e83a6a2244290300370300200020002903f0" + "3a3703b04f200020002903b03a3703f04e200041b0376a200041b03d6a20" + "0041b0ce006a103c200041e8106a2217200041e8376a220f290300370300" + "200041e0106a2214200041e0376a2225290300370300200041d8106a221c" + "200041d8376a2229290300370300200041d0106a2221200041d0376a222a" + "290300370300200041c8106a220c200041c8376a221e2903003703002000" + "41c0106a2216200041c0376a222f290300370300200020002903b8373703" + "b810200020002903b0373703b010200041b0106a200041b0376a200041b0" + "376a102f200041e8136a2208200041a8386a222c290300370300200041e0" + "136a2228200041a0386a221b290300370300200041d8136a223420004198" + "386a2240290300370300200041d0136a224520004190386a224c29030037" + "0300200041c8136a221020004188386a224d290300370300200041c0136a" + "221320004180386a224e290300370300200041c0316a2230200041c0386a" + "223d290300370300200041c8316a223a200041c8386a2243290300370300" + "200041d0316a2232200041d0386a2251290300370300200041d8316a220e" + "200041d8386a2204290300370300200041e0316a2219200041e0386a222e" + "290300370300200041e8316a221a200041e8386a222d2903003703002000" + "200041f8376a22122903003703b813200020002903f0373703b013200020" + "002903b0383703b0312000200041b8386a222b2903003703b831200041b0" + "136a200041f0376a2215200041b0386a2218102f200042003703e8342000" + "42003703e034200042003703d834200042013703d034200042003703c834" + "200042003703c034200042003703b834200042093703b034200041b0ce00" + "6a200041b0136a200041b0346a102f2008200041e8ce006a220329030037" + "03002028200041e0ce006a22022903003703002034200041d8ce006a2207" + "2903003703002045200041d0ce006a220d2903003703002010200041c8ce" + "006a22112903003703002013200041c0ce006a220b290300370300200020" + "002903b84e3703b813200020002903b04e3703b013200041b80a6a220620" + "0c290300370300200041b00a6a22092016290300370300200020002903b8" + "103703a80a200020002903b0103703a00a200041a00a6a20002903b01320" + "002903b8132013290300201029030042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "0041c83d6a22132017290300370300200041c03d6a221020142903003703" + "002000201c2903003703b83d200020212903003703b03d200041b03d6a20" + "4529030020342903002028290300200829030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d201120062903002256370300200b20092903002255370300200d20" + "002903b03d2254370300200220102903002253370300200720002903b83d" + "225937030020032013290300225a370300200020002903a80a225f3703b8" + "4e200020002903a00a22583703b04e2017205a3703002014205337030020" + "1c205937030020212054370300200c205637030020162055370300200020" + "5f3703b810200020583703b010200041e8166a2217202d29030037030020" + "0041e0166a2214202e290300370300200041d8166a221c20042903003703" + "00200041d0166a22212051290300370300200041c8166a220c2043290300" + "370300200041c0166a2216203d2903003703002000202b2903003703b816" + "200020002903b0383703b016200041b0166a20182018102f200041b0ce00" + "6a200041b0166a200041b0346a102f201720032903003703002014200229" + "0300370300201c20072903003703002021200d290300370300200c201129" + "03003703002016200b290300370300200041c0196a2208202f2903003703" + "00200041c8196a2228201e290300370300200041d0196a2234202a290300" + "370300200041d8196a22452029290300370300200041e0196a223d202529" + "0300370300200041e8196a2243200f290300370300200020002903b84e37" + "03b816200020002903b04e3703b016200020002903b0373703b019200020" + "002903b8373703b819200041e8226a202c290300370300200041e0226a20" + "1b290300370300200041d8226a2040290300370300200041d0226a204c29" + "0300370300200041c8226a204d290300370300200041c0226a204e290300" + "370300200020122903003703b822200020002903f0373703b022200041b0" + "196a200041b0376a2015102f2006200c2903003703002009201629030037" + "0300200020002903b8163703a80a200020002903b0163703a00a200041a0" + "0a6a20002903b01920002903b8192008290300202829030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20132017290300370300201020142903003703002000" + "201c2903003703b83d200020212903003703b03d200041b03d6a20342903" + "002045290300203d290300204329030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201120062903002256370300200b20092903002255370300200d20002903" + "b03d2254370300200220102903002253370300200720002903b83d225937" + "030020032013290300225a370300200020002903a80a225f3703b84e2000" + "20002903a00a22583703b04e2017205a37030020142053370300201c2059" + "37030020212054370300200c2056370300201620553703002000205f3703" + "b816200020583703b016200041e81c6a2217202c290300370300200041e0" + "1c6a2214201b290300370300200041d81c6a221c20402903003703002000" + "41d01c6a2221204c290300370300200041c81c6a220c204d290300370300" + "200041c01c6a2216204e290300370300200020122903003703b81c200020" + "002903f0373703b01c200041b01c6a20152015102f200041e81f6a220820" + "0f290300370300200041e01f6a222c2025290300370300200041d81f6a22" + "282029290300370300200041d01f6a221b202a290300370300200041c81f" + "6a2234201e290300370300200041c01f6a2240202f290300370300200020" + "002903b8373703b81f200020002903b0373703b01f200041b01f6a200041" + "b0376a2018102f2006200c29030037030020092016290300370300200020" + "002903b81c3703a80a200020002903b01c3703a00a200041a00a6a200029" + "03b01f20002903b81f2040290300203429030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20132017290300370300201020142903003703002000201c290300" + "3703b83d200020212903003703b03d200041b03d6a201b29030020282903" + "00202c290300200829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2011200629" + "03002256370300200b20092903002255370300200d20002903b03d225437" + "0300200220102903002253370300200720002903b83d2259370300200320" + "13290300225a370300200020002903a80a225f3703b84e200020002903a0" + "0a22583703b04e2017205a37030020142053370300201c20593703002021" + "2054370300200c2056370300201620553703002000205f3703b81c200020" + "583703b01c200041b0316a2018200041b0166a102f200041b0226a201520" + "0041b01c6a102f200041b0ce006a200041b0316a200041b0226a1030201a" + "200329030037030020192002290300370300200e20072903003703002032" + "200d290300370300203a20112903003703002030200b2903003703002000" + "20002903b84e3703b831200020002903b04e3703b031200041b0ce006a20" + "0041b0316a200041b0346a102f201a200329030037030020192002290300" + "370300200e20072903003703002032200d290300370300203a2011290300" + "3703002030200b290300370300200041c0256a202f290300370300200041" + "c8256a201e290300370300200041d0256a202a290300370300200041d825" + "6a2029290300370300200041e0256a2025290300370300200041e8256a20" + "0f290300370300200020002903b84e3703b831200020002903b04e3703b0" + "31200020002903b0373703b025200020002903b8373703b825200041b025" + "6a200041b0376a200041b0106a102f200041b0ce006a200041b0316a2000" + "41b0256a1030201a200329030037030020192002290300370300200e2007" + "2903003703002032200d290300370300203a20112903003703002030200b" + "290300370300200020002903b84e3703b831200020002903b04e3703b031" + "200041b03d6a200041b0316a103120002802b03d4101710440200041e82e" + "6a2206200041f83d6a22092903002256370300200041e02e6a2229200041" + "f03d6a222a2903002255370300200041d82e6a221e200041e83d6a221529" + "03002254370300200041d02e6a222f200041e03d6a221829030022533703" + "00200041c82e6a2230200041d83d6a220f2903002259370300200041c02e" + "6a223a200041d03d6a2225290300225a370300200041c0286a2232205a37" + "0300200041c8286a220e2059370300200041d0286a221920533703002000" + "41d8286a221a2054370300200041e0286a22172055370300200041e8286a" + "22142056370300200020002903c03d22563703b02e200020563703b02820" + "00201329030022563703b82e200020563703b828200041b0286a20102000" + "41b0106a102f200041e82b6a221c2009290300370300200041e02b6a2221" + "202a290300370300200041d82b6a222a2015290300370300200041d02b6a" + "220c2018290300370300200041c82b6a2216200f290300370300200041c0" + "2b6a22082025290300370300200020132903003703b82b200020002903c0" + "3d3703b02b200041b02b6a2010200041b0166a102f200041b02e6a201020" + "0041b01c6a102f2003201429030037030020022017290300370300200720" + "1a290300370300200d20192903003703002011200e290300370300200b20" + "32290300370300202220002903b82b370300202320082903003703002024" + "2016290300370300204f200c2903003703002027202a290300370300203f" + "2021290300370300203e201c290300370300200020002903b8283703b84e" + "200020002903b0283703b04e200020002903b02b3703f04e204b20062903" + "00370300204820292903003703002047201e2903003703002041202f2903" + "00370300204220302903003703002037203a290300370300203620002903" + "b82e370300200020002903b02e3703b04f200041c0c0006a200041b0ce00" + "6a41c001104c2106200042003703b840200042013703b040200041b0ce00" + "6a20004190046a2006103b200041b03d6a201f2006103b200041f0cf006a" + "200041b03d6a103e200041b00d6a200041b0ce006a418003104c21292000" + "42003703a80d200042013703a00d200041f0c4006a201f103e200041b0c3" + "006a20004190046a41c001104c1a200041b0c6006a200041b0c3006a2029" + "103f200742003703002002420037030020034200370300200042a9c0c689" + "aece93b2303703c84e200042b099b385febcf6b6de003703c04e200042bd" + "dcd9dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e2000" + "42003703d04e200041b0c0006a200041f0c6006a200041b0ce006a102f20" + "0742003703002002420037030020034200370300200042003703c84e2000" + "42ac97d286eaf99af1d9003703c04e200042cfb8ede69afe98f9543703b8" + "4e200042feffffbf97e6d1b1d7003703b04e200042003703d04e200041b0" + "3e6a200041b0c7006a200041b0ce006a102f2010200041c0c6006a290300" + "3703002013200041c8c6006a2903003703002025200041d0c6006a290300" + "370300200f200041d8c6006a2903003703002018200041e0c6006a290300" + "3703002015200041e8c6006a290300370300200920002903b84037030020" + "0041803e6a2006290300370300200041883e6a200041c8c0006a29030037" + "0300200041903e6a200041d0c0006a290300370300200041983e6a200041" + "d8c0006a2210290300370300200041a03e6a200041e0c0006a2213290300" + "370300200041a83e6a200041e8c0006a2206290300370300200020002903" + "b0463703b03d200020002903b8463703b83d200020002903b0403703f03d" + "200742003703002002420037030020034200370300200042a9c0c689aece" + "93b2303703c84e200042b099b385febcf6b6de003703c04e200042bddcd9" + "dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e20004200" + "3703d04e200041b03a6a200041b0c8006a200041b0ce006a102f20104200" + "3703002013420037030020064200370300200042003703c840200042ac97" + "d286eaf99af1d9003703c040200042cfb8ede69afe98f9543703b8402000" + "42feffffbf97e6d1b1d7003703b040200042003703d040200041b0cf006a" + "2210200041f0c8006a200041b0c0006a102f200b20004180c8006a290300" + "370300201120004188c8006a290300370300200d20004190c8006a290300" + "370300200720004198c8006a2903003703002002200041a0c8006a290300" + "3703002003200041a8c8006a290300370300202220002903b83a37030020" + "2320492903003703002024204a290300370300204f205029030037030020" + "272039290300370300203f203c290300370300203e204429030037030020" + "0020002903f0473703b04e2000200041f8c7006a2903003703b84e200020" + "002903b03a3703f04e20394200370300203c420037030020444200370300" + "200042a9c0c689aece93b2303703c83a200042b099b385febcf6b6de0037" + "03c03a200042bddcd9dcfbd3c1c7423703b83a200042c9faf383d69cd1de" + "643703b03a200042003703d03a200041b0c0006a200041b0ce006a200041" + "b03a6a102f200041f0c0006a200041f0ce006a200041b03a6a102f200041" + "b0c1006a2010200041b03a6a102f200041b0c9006a200041b03d6a41c001" + "104c1a200041f0ca006a200041b0c0006a41c001104c1a200041a0076a22" + "0d200041b0c9006a200041b0c6006a103f20004200370398072000420137" + "039007200041a00a6a200d418003104c1a200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200b41f002104b1a200042003703b84e200042013703b04e41ff0121" + "03200041286a210b0340200041206a200341ff0071104f200b2903002000" + "41b0c9006a200341037641f0ffffff01716a220229030883215620002903" + "20200229030083215520074101710440200041a00d6a200041b0ce006a10" + "46200041b0ce006a200041a00d6a418003104c1a0b205520568442005204" + "40200041a00d6a200d200041b0ce006a103f200041b0ce006a200041a00d" + "6a418003104c1a410121070b200341016b2203417f470d000b200041f011" + "6a200041f0cf006a103e200041b0106a200041b0ce006a41c001104c1a20" + "0041b0136a200041b0106a1046200041b0166a200041b0136a1046200041" + "b0196a200041b0166a200041b0136a103f200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200041c0ce006a41f002104b1a200042003703b84e200042013703b0" + "4e41ff012103200041186a210b0340200041106a200341ff0071104f200b" + "290300200041b0c9006a200341037641f0ffffff01716a22022903088321" + "562000290310200229030083215520074101710440200041a00d6a200041" + "b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b20552056" + "844200520440200041a00d6a200041b0196a200041b0ce006a103f200041" + "b0ce006a200041a00d6a418003104c1a410121070b200341016b2203417f" + "470d000b200041f01d6a200041f0cf006a103e200041b01c6a200041b0ce" + "006a41c001104c1a200041b01f6a200041b01c6a1046200042003703c849" + "200042003703c049200042003703b849200042f193a4d3c4d6e4f4c40037" + "03b04941002107200041c0ce006a41f002104b1a200042003703b84e2000" + "42013703b04e41ff012103200041086a210b03402000200341ff0071104f" + "200b290300200041b0c9006a200341037641f0ffffff01716a2202290308" + "8321562000290300200229030083215520074101710440200041a00d6a20" + "0041b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b2055" + "2056844200520440200041a00d6a200041b01f6a200041b0ce006a103f20" + "0041b0ce006a200041a00d6a418003104c1a410121070b200341016b2203" + "417f470d000b200041f0236a2203200041f0cf006a2211103e200041b022" + "6a200041b0ce006a41c001104c1a200041f0266a200041f01a6a103e2000" + "41b0256a200041b0196a41c001104c1a200041f0296a2003103e200041b0" + "286a200041b0226a41c001104c1a200041b02b6a200041b0286a200041b0" + "1c6a103f200041b02e6a200041b02b6a200041b0256a103f200041b0316a" + "200041b02e6a200041b0136a103f200041b0346a200041b02e6a200041b0" + "1c6a103f200041b0376a200d200041b0346a103f200041b03a6a200041b0" + "316a41011047200041a00d6a200041f0326a41011047200042e6cfeba7bb" + "dee5b4243703e8492000428e97d490e19f9f99a67f3703e049200042e58f" + "bbf7f8cee4bcf4003703d849200042acc5cd87f88bbcae4a3703d0492000" + "42dfcf96c3c2e3adc2123703c849200042e0969ab7d7fbe7dc683703c049" + "200042f6c2bcc982c187a9dc003703b849200042f0c8a7e6adbbcd855637" + "03b049200041b0ce006a200041a00d6a200041b0c9006a102f200041f0ce" + "006a2210200041e00d6a220d200041b0c9006a102f200041b0cf006a2213" + "200041a00e6a2203200041b0c9006a102f200041f03b6a200041b0ce006a" + "41c001104c1a200041b03d6a200041b03a6a200041b0376a103f200041c8" + "0d6a22024200370300200041d00d6a22074200370300200041d80d6a220b" + "4200370300200042a9c0c689aece93b2303703b80d200042b099b385febc" + "f6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d200042c8faf3" + "83d69cd1de643703a00d200042003703c00d200041b0ce006a200041f02e" + "6a200041a00d6a102f2002420037030020074200370300200b4200370300" + "200042003703b80d200042ac97d286eaf99af1d9003703b00d200042cfb8" + "ede69afe98f9543703a80d200042feffffbf97e6d1b1d7003703a00d2000" + "42003703c00d200041b0ca006a200041b02f6a200041a00d6a102f200041" + "c0c9006a200041c02e6a290300370300200041c8c9006a200041c82e6a29" + "0300370300200041d0c9006a200041d02e6a290300370300200041d8c900" + "6a200041d82e6a290300370300200041e0c9006a200041e02e6a29030037" + "0300200041e8c9006a200041e82e6a290300370300200041f8c9006a2000" + "2903b84e37030020004180ca006a200041c0ce006a290300370300200041" + "88ca006a200041c8ce006a29030037030020004190ca006a200041d0ce00" + "6a29030037030020004198ca006a200041d8ce006a220629030037030020" + "0041a0ca006a200041e0ce006a2209290300370300200041a8ca006a2000" + "41e8ce006a2215290300370300200020002903b02e3703b0492000200029" + "03b82e3703b849200020002903b04e3703f0492002420037030020074200" + "370300200b4200370300200042a9c0c689aece93b2303703b80d200042b0" + "99b385febcf6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d20" + "0042c8faf383d69cd1de643703a00d200042003703c00d200041b0c6006a" + "200041b0306a200041a00d6a102f20064200370300200942003703002015" + "4200370300200042003703c84e200042ac97d286eaf99af1d9003703c04e" + "200042cfb8ede69afe98f9543703b84e200042feffffbf97e6d1b1d70037" + "03b04e200042003703d04e2003200041f0306a200041b0ce006a102f2000" + "41b00d6a220620004180306a290300370300200041b80d6a220920004188" + "306a290300370300200041c00d6a221520004190306a2903003703002002" + "20004198306a2903003703002007200041a0306a290300370300200b2000" + "41a8306a290300370300200041e80d6a20002903b846370300200041f00d" + "6a200041c0c6006a290300370300200041f80d6a200041c8c6006a290300" + "370300200041800e6a200041d0c6006a290300370300200041880e6a2000" + "41d8c6006a2202290300370300200041900e6a200041e0c6006a22072903" + "00370300200041980e6a200041e8c6006a220b2903003703002000200029" + "03f02f3703a00d2000200041f82f6a2903003703a80d200020002903b046" + "3703e00d2002420037030020074200370300200b4200370300200042a9c0" + "c689aece93b2303703c846200042b099b385febcf6b6de003703c0462000" + "42bddcd9dcfbd3c1c7423703b846200042c9faf383d69cd1de643703b046" + "200042003703d046200041b0ce006a200041a00d6a200041b0c6006a102f" + "2010200d200041b0c6006a102f20132003200041b0c6006a102f200041b0" + "c0006a200041b0c9006a41c001104c1a200041f0c1006a200041b0ce006a" + "41c001104c1a200041b0c3006a200041b0c0006a200041b03d6a103f2000" + "41f0c7006a200041e00b6a103e200041b0c6006a200041a00a6a41c00110" + "4c1a200041b0c9006a200041b0c6006a200041b0316a103f200041b0ce00" + "6a200041b0c9006a41031047200041a00d6a200041f0ca006a4103104720" + "0042f3fa9ddfe096fed5003703a84e2000429da7d8abb3dcfbe5063703a0" + "4e200042ecf3d0beb9bce981ff003703984e200042818283a6bfc5aacaf6" + "003703904e200042bbc98be4fcb9a0ee193703884e20004290d5b285cd91" + "d8f46f3703804e200042caa4d7f2dbf1aca6897f3703f84d200042ffccd2" + "f691a7dfb7683703f04d200041b0cc006a200041a00d6a200041f0cd006a" + "102f200041f0cc006a200d200041f0cd006a102f200041b0cd006a200320" + "0041f0cd006a102f2011200041b0cc006a41c001104c1a2006200041b0ce" + "006a200041b0c3006a103f2009290300215620002903b00d215520004190" + "076a201541f002104c1a20384184016a2103024002400240024002400240" + "0340200341046b280200220204402003280200220b41046b280200220741" + "7871220d200241c0016c220241044108200741037122071b72490d022007" + "4100200d20024127724b1b0d03200b10040b20034190016a210320464101" + "6b22460d000b200028025422030440203841046b28020022024178712207" + "20034190016c220341044108200241037122021b72490d03200241002007" + "200341276a4b1b0d04203810040b20002802482203450d0b200541046b28" + "0200220241787122072003410674220341044108200241037122021b7249" + "0d0420024100200720034127724b1b0d05200510040c0b0b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f4a2c000411f4194a3c0001021000b2018200341f4a1c0001010000b20" + "18200341e4a1c0001010000b203841046b28020022024178712207200341" + "90016c220341044108200241037122021b72490d02200241002007200341" + "276a4b1b0d03203810040b200028024822030440200541046b2802002202" + "41787122072003410674220341044108200241037122021b72490d042002" + "4100200720034127724b1b0d05200510040b42002156420121550b203120" + "5637030820312055370300203141106a20004190076a41f002104c1a2000" + "28023c22030440203341046b28020022024178712207200341c0016c2203" + "41044108200241037122021b72490d0520024100200720034127724b1b0d" + "06203310040b200028023022030440203b41046b28020022024178712207" + "200341e0006c220341044108200241037122021b72490d07200241002007" + "200341276a4b1b0d08203b10040b200041b0d1006a24000c080b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b41f996c000412e41a897c0001011000b41b897c000412e41e897c000" + "1011000b200141f0066a41f002104b1a200142003703e806200142013703" + "e006200141a00c6a200141e0066a104a0d03200141c00c6a20014180076a" + "104a0d03200141e00c6a200141a0076a104a0d03200141800d6a200141c0" + "076a104a0d03200141a00d6a200141e0076a104a0d03200141c00d6a2001" + "4180086a104a0d03200141e00d6a200141a0086a104a0d03200141800e6a" + "200141c0086a104a0d03200141a00e6a200141e0086a104a0d03200141c0" + "0e6a20014180096a104a0d03200141e00e6a200141a0096a104a0d032001" + "41800f6a200141c0096a104a1a0c030b2002450d05200641046b28020022" + "05417871221241044108200541037122051b20026a490d0c200541002012" + "200241276a4b1b0d0d200610040c050b20012802a00b2205450d04200820" + "05410674100e0c040b206a428080808010540d0020122005100e0b202041" + "c000100e2026450d0220352026410674100e0c020b4100410041dc91c000" + "1010000b20012802e01c1a0b205241046b2802002205417871220641c600" + "41ca00200541037122051b490d1420054100200641ea004f1b0d15205210" + "04201d41046b280200220541787141e40041e800200541037122061b490d" + "162006410020054188014f1b0d17201d1004200a41046b28020022054178" + "71221d418802418c02200541037122051b490d1820054100201d41ac024f" + "1b0d19200a1004200141c0206a240041010f0b000b230041206b22052400" + "200541003602182005410136020c200541a099c000360208200542043702" + "10200541086a41f88bc000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b4120201241cc8fc000" + "1012000b418001201241dc8fc0001012000b41c001201241ec8fc0001012" + "000b41a002201241fc8fc0001012000b41a00241a002418c90c000101000" + "0b41a10241a102419c90c0001010000b41a20241a20241ac90c000101000" + "0b41a30241a30241bc90c0001010000b230041306b220224002002410436" + "0204200241643602002002410236020c200241b884c00036020820024202" + "3702142002200241046aad4280808080108437032820022002ad42808080" + "8010843703202002200241206a360210200241086a41cc90c000101a000b" + "2009201241cc90c0001012000b200120012d00a10f3a00e00641b89cc000" + "412b200141e0066a41988ec00041d892c0001013000b41a89cc000101400" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b962502087f017e02400240024002400240024002402000" + "41f4014d0440418ca9c000280200220341102000410b6a41f80371200041" + "0b491b220441037622017622004103710d0120044194a9c0002802004d0d" + "0720000d024190a9c00028020022000d030c070b2000410b6a2201417871" + "21044190a9c0002802002208450d06411f2107200041f4ffff074d044020" + "04410620014108766722006b7641017120004101746b413e6a21070b4100" + "20046b2101200741027441f4a5c0006a2802002203450440410021000c04" + "0b410021002004411920074101766b41002007411f471b74210503400240" + "200328020441787122062004490d00200620046b220620014f0d00200321" + "02200622010d0041002101200321000c060b200328021422062000200620" + "032005411d764104716a41106a2802002203471b200020061b2100200541" + "0174210520030d000b0c030b02402000417f7341017120016a2205410374" + "22004184a7c0006a22042000418ca7c0006a280200220128020822024704" + "402002200436020c200420023602080c010b418ca9c0002003417e200577" + "713602000b20012000410372360204200020016a22002000280204410172" + "360204200141086a0f0b0240200020017441022001742200410020006b72" + "7168220641037422014184a7c0006a22022001418ca7c0006a2802002200" + "28020822054704402005200236020c200220053602080c010b418ca9c000" + "2003417e200677713602000b20002004410372360204200020046a220520" + "0120046b2204410172360204200020016a20043602004194a9c000280200" + "2203044020034178714184a7c0006a2102419ca9c0002802002101027f41" + "8ca9c00028020022064101200341037674220371450440418ca9c0002003" + "20067236020020020c010b20022802080b21032002200136020820032001" + "36020c2001200236020c200120033602080b419ca9c00020053602004194" + "a9c0002004360200200041086a0f0b20006841027441f4a5c0006a280200" + "220228020441787120046b21012002210302400340024002402002280210" + "22000d00200228021422000d002003280218210702400240200320032802" + "0c2200460440200341144110200328021422001b6a28020022020d014100" + "21000c020b20032802082202200036020c200020023602080c010b200341" + "146a200341106a20001b21050340200521062002220041146a200041106a" + "200028021422021b210520004114411020021b6a28020022020d000b2006" + "41003602000b2007450d032003200328021c41027441f4a5c0006a220228" + "020047044020074110411420072802102003461b6a20003602002000450d" + "040c020b2002200036020020000d014190a9c0004190a9c000280200417e" + "200328021c77713602000c030b200028020441787120046b220220012001" + "20024b22021b21012000200320021b2103200021020c010b0b2000200736" + "021820032802102202044020002002360210200220003602180b20032802" + "142202450d0020002002360214200220003602180b02400240200141104f" + "044020032004410372360204200320046a22042001410172360204200120" + "046a20013602004194a9c0002802002205450d0120054178714184a7c000" + "6a2102419ca9c0002802002100027f418ca9c00028020022064101200541" + "037674220571450440418ca9c000200520067236020020020c010b200228" + "02080b2105200220003602082005200036020c2000200236020c20002005" + "3602080c010b2003200120046a2200410372360204200020036a22002000" + "2802044101723602040c010b419ca9c00020043602004194a9c000200136" + "02000b200341086a0f0b2000200272450440410021024102200774220041" + "0020006b722008712200450d0320006841027441f4a5c0006a2802002100" + "0b2000450d010b03402002200020022000280204417871220320046b2206" + "20014922071b200320044922051b210220012006200120071b20051b2101" + "20002802102203047f20030520002802140b22000d000b0b2002450d0020" + "044194a9c00028020022004d2001200020046b4f710d0020022802182107" + "024002402002200228020c2200460440200241144110200228021422001b" + "6a28020022030d01410021000c020b20022802082203200036020c200020" + "033602080c010b200241146a200241106a20001b21050340200521062003" + "220041146a200041106a200028021422031b210520004114411020031b6a" + "28020022030d000b200641003602000b02402007450d0002402002200228" + "021c41027441f4a5c0006a22032802004704402007411041142007280210" + "2002461b6a20003602002000450d020c010b2003200036020020000d0041" + "90a9c0004190a9c000280200417e200228021c77713602000c010b200020" + "0736021820022802102203044020002003360210200320003602180b2002" + "2802142203450d0020002003360214200320003602180b0240200141104f" + "044020022004410372360204200220046a22042001410172360204200120" + "046a200136020020014180024f0440411f210020044200370210200141ff" + "ffff074d04402001410620014108766722006b7641017120004101746b41" + "3e6a21000b2004200036021c200041027441f4a5c0006a21034101200074" + "22054190a9c0002802007145044020032004360200200420033602182004" + "200436020c200420043602084190a9c0004190a9c0002802002005723602" + "000c030b0240024020012003280200220528020441787146044020052100" + "0c010b2001411920004101766b41002000411f471b742103034020052003" + "411d764104716a41106a22062802002200450d0220034101742103200021" + "0520002802044178712001470d000b0b20002802082201200436020c2000" + "2004360208200441003602182004200036020c200420013602080c030b20" + "062004360200200420053602182004200436020c200420043602080c020b" + "200141f801714184a7c0006a2100027f418ca9c000280200220341012001" + "41037674220171450440418ca9c000200120037236020020000c010b2000" + "2802080b2101200020043602082001200436020c2004200036020c200420" + "013602080c010b2002200120046a2200410372360204200020026a220020" + "002802044101723602040b200241086a0f0b024002400240024002400240" + "20044194a9c00028020022004b044020044198a9c00028020022004f0440" + "41002100200441af80046a220241107640002201417f4622050d07200141" + "10742203450d0741a4a9c000410020024180807c7120051b220641a4a9c0" + "002802006a220036020041a8a9c00041a8a9c00028020022012000200020" + "01491b3602000240024041a0a9c0002802002201044041f4a6c000210003" + "4020002802002202200028020422056a2003460d02200028020822000d00" + "0b0c020b41b0a9c00028020022004100200020034d1b45044041b0a9c000" + "20033602000b41b4a9c00041ff1f36020041f8a6c000200636020041f4a6" + "c00020033602004190a7c0004184a7c0003602004198a7c000418ca7c000" + "360200418ca7c0004184a7c00036020041a0a7c0004194a7c00036020041" + "94a7c000418ca7c00036020041a8a7c000419ca7c000360200419ca7c000" + "4194a7c00036020041b0a7c00041a4a7c00036020041a4a7c000419ca7c0" + "0036020041b8a7c00041aca7c00036020041aca7c00041a4a7c000360200" + "41c0a7c00041b4a7c00036020041b4a7c00041aca7c00036020041c8a7c0" + "0041bca7c00036020041bca7c00041b4a7c0003602004180a7c000410036" + "020041d0a7c00041c4a7c00036020041c4a7c00041bca7c00036020041cc" + "a7c00041c4a7c00036020041d8a7c00041cca7c00036020041d4a7c00041" + "cca7c00036020041e0a7c00041d4a7c00036020041dca7c00041d4a7c000" + "36020041e8a7c00041dca7c00036020041e4a7c00041dca7c00036020041" + "f0a7c00041e4a7c00036020041eca7c00041e4a7c00036020041f8a7c000" + "41eca7c00036020041f4a7c00041eca7c0003602004180a8c00041f4a7c0" + "0036020041fca7c00041f4a7c0003602004188a8c00041fca7c000360200" + "4184a8c00041fca7c0003602004190a8c0004184a8c0003602004198a8c0" + "00418ca8c000360200418ca8c0004184a8c00036020041a0a8c0004194a8" + "c0003602004194a8c000418ca8c00036020041a8a8c000419ca8c0003602" + "00419ca8c0004194a8c00036020041b0a8c00041a4a8c00036020041a4a8" + "c000419ca8c00036020041b8a8c00041aca8c00036020041aca8c00041a4" + "a8c00036020041c0a8c00041b4a8c00036020041b4a8c00041aca8c00036" + "020041c8a8c00041bca8c00036020041bca8c00041b4a8c00036020041d0" + "a8c00041c4a8c00036020041c4a8c00041bca8c00036020041d8a8c00041" + "cca8c00036020041cca8c00041c4a8c00036020041e0a8c00041d4a8c000" + "36020041d4a8c00041cca8c00036020041e8a8c00041dca8c00036020041" + "dca8c00041d4a8c00036020041f0a8c00041e4a8c00036020041e4a8c000" + "41dca8c00036020041f8a8c00041eca8c00036020041eca8c00041e4a8c0" + "003602004180a9c00041f4a8c00036020041f4a8c00041eca8c000360200" + "4188a9c00041fca8c00036020041fca8c00041f4a8c00036020041a0a9c0" + "0020033602004184a9c00041fca8c0003602004198a9c000200641286b22" + "0036020020032000410172360204200020036a412836020441aca9c00041" + "808080013602000c080b200120034f0d0020012002490d00200028020c45" + "0d030b41b0a9c00041b0a9c0002802002200200320002003491b36020020" + "0320066a210241f4a6c00021000240024003402002200028020022054704" + "40200028020822000d010c020b0b200028020c450d010b41f4a6c0002100" + "034002402001200028020022024f04402001200220002802046a2202490d" + "010b200028020821000c010b0b41a0a9c00020033602004198a9c0002006" + "41286b220036020020032000410172360204200020036a412836020441ac" + "a9c00041808080013602002001200241206b41787141086b220020002001" + "41106a491b2205411b36020441f4a6c0002902002109200541106a41fca6" + "c0002902003702002005200937020841f8a6c000200636020041f4a6c000" + "200336020041fca6c000200541086a3602004180a7c00041003602002005" + "411c6a2100034020004107360200200041046a22002002490d000b200120" + "05460d0720052005280204417e713602042001200520016b220041017236" + "02042005200036020020004180024f04402001200010350c080b200041f8" + "01714184a7c0006a2102027f418ca9c00028020022034101200041037674" + "220071450440418ca9c000200020037236020020020c010b20022802080b" + "2100200220013602082000200136020c2001200236020c20012000360208" + "0c070b200020033602002000200028020420066a36020420032004410372" + "3602042005410f6a41787141086b2202200320046a22006b2101200241a0" + "a9c000280200460d032002419ca9c000280200460d042002280204220441" + "037141014604402002200441787122041016200120046a2101200220046a" + "220228020421040b20022004417e71360204200020014101723602042000" + "20016a200136020020014180024f04402000200110350c060b200141f801" + "714184a7c0006a2104027f418ca9c0002802002202410120014103767422" + "0171450440418ca9c000200120027236020020040c010b20042802080b21" + "01200420003602082001200036020c2000200436020c200020013602080c" + "050b4198a9c000200020046b220136020041a0a9c00041a0a9c000280200" + "220020046a22023602002002200141017236020420002004410372360204" + "200041086a21000c060b419ca9c00028020021010240200020046b220241" + "0f4d0440419ca9c00041003602004194a9c0004100360200200120004103" + "72360204200020016a220020002802044101723602040c010b4194a9c000" + "2002360200419ca9c000200120046a220336020020032002410172360204" + "200020016a2002360200200120044103723602040b200141086a0f0b2000" + "200520066a36020441a0a9c00041a0a9c0002802002200410f6a41787122" + "0141086b22023602004198a9c000200020016b4198a9c00028020020066a" + "22016a41086a220336020020022003410172360204200020016a41283602" + "0441aca9c00041808080013602000c030b41a0a9c00020003602004198a9" + "c0004198a9c00028020020016a2201360200200020014101723602040c01" + "0b419ca9c00020003602004194a9c0004194a9c00028020020016a220136" + "020020002001410172360204200020016a20013602000b200341086a0f0b" + "410021004198a9c000280200220120044d0d004198a9c000200120046b22" + "0136020041a0a9c00041a0a9c000280200220020046a2202360200200220" + "0141017236020420002004410372360204200041086a0f0b20000bc60602" + "037f037e230041a0026b22032400200341286a41c100104b210420034118" + "6a41f08bc000290300370300200341106a41e88bc0002903003703002003" + "41086a41e08bc00029030037030020034200370320200341d88bc0002903" + "003703000240200241c0004f0440200320024106762205ad370320200320" + "01200510272004200120024140716a2002413f712202104c1a0c010b2004" + "20012002104c1a0b200320023a0068200341f0006a200341f000104c1a20" + "034198016a220120032d00d80122026a22044180013a00002002ad220742" + "3b862003290390012206420986220820074203868422074280fe03834228" + "86842007428080fc0783421886200742808080f80f834208868484200642" + "018642808080f80f832006420f88428080fc0783842006421f884280fe03" + "8320084238888484842106024002402002413f470440200441016a200241" + "3f73104b1a200241387341074b0d010b200341f0006a2001410110272003" + "4190026a420037030020034188026a420037030020034180026a42003703" + "00200341f8016a4200370300200341f0016a4200370300200341e8016a42" + "00370300200342003703e0012003200637039802200341f0006a200341e0" + "016a410110270c010b200320063703d001200341f0006a2001410110270b" + "2000200328028c01220241187420024180fe037141087472200241087641" + "80fe03712002411876727236001c20002003280288012202411874200241" + "80fe03714108747220024108764180fe0371200241187672723600182000" + "200328028401220241187420024180fe03714108747220024108764180fe" + "0371200241187672723600142000200328028001220241187420024180fe" + "03714108747220024108764180fe03712002411876727236001020002003" + "28027c220241187420024180fe03714108747220024108764180fe037120" + "02411876727236000c20002003280278220241187420024180fe03714108" + "747220024108764180fe0371200241187672723600082000200328027422" + "0241187420024180fe03714108747220024108764180fe03712002411876" + "727236000420002003280270220241187420024180fe0371410874722002" + "4108764180fe037120024118767272360000200341a0026a24000bee0201" + "077f024020012802042202450440410021020c010b200128021021062001" + "200220022001280208220320022003491b22046b36020420012001280200" + "220720046a360200027f0240024002400240027f02400240024020030440" + "200128020c2208410174210520072d0000220241c1006b41ff0171410649" + "0d01200241e1006b41ff01714106490d02200241306b220341ff0171410a" + "490d0320050c040b4100410041848bc0001010000b200241376b21030c01" + "0b200241d7006b21030b20044101460d0320072d0001220241c1006b41ff" + "01714106490d01200241e1006b41ff01714106490d02200241306b220441" + "ff0171410a490d0420054101720b21032006200241ff0171360200200620" + "0541807e71200341ff01717236020441000c040b200241376b21040c020b" + "200241d7006b21040c010b4101410141948bc0001010000b200420034104" + "7472210341010b21022001200841016a36020c0b200020033a0001200020" + "023a00000bb40801057f200041086b2201200041046b2802002203417871" + "22006a21020240024020034101710d002003410271450d01200128020022" + "0320006a2100200120036b2201419ca9c000280200460440200228020441" + "03714103470d014194a9c000200036020020022002280204417e71360204" + "20012000410172360204200220003602000f0b2001200310160b02400240" + "0240024002400240024020022802042203410271450440200241a0a9c000" + "280200460d022002419ca9c000280200460d032002200341787122031016" + "2001200020036a2200410172360204200020016a20003602002001419ca9" + "c000280200470d014194a9c00020003602000f0b20022003417e71360204" + "20012000410172360204200020016a20003602000b2000418002490d0241" + "1f210220014200370210200041ffffff074d044020004106200041087667" + "22026b7641017120024101746b413e6a21020b2001200236021c20024102" + "7441f4a5c0006a2103410120027422044190a9c000280200710d03200320" + "01360200200120033602182001200136020c200120013602084190a9c000" + "4190a9c0002802002004723602000c040b41a0a9c00020013602004198a9" + "c0004198a9c00028020020006a220036020020012000410172360204419c" + "a9c00028020020014604404194a9c0004100360200419ca9c00041003602" + "000b200041aca9c00028020022044d0d0541a0a9c0002802002200450d05" + "410021034198a9c00028020022054129490d0441f4a6c000210103402000" + "200128020022024f04402000200220012802046a490d060b200128020821" + "010c000b000b419ca9c00020013602004194a9c0004194a9c00028020020" + "006a220036020020012000410172360204200020016a20003602000f0b20" + "0041f801714184a7c0006a2102027f418ca9c00028020022034101200041" + "037674220071450440418ca9c000200020037236020020020c010b200228" + "02080b2100200220013602082000200136020c2001200236020c20012000" + "3602080f0b02400240200020032802002204280204417871460440200421" + "020c010b2000411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712000470d000b0b20022802082200200136020c20" + "022001360208200141003602182001200236020c200120003602080c010b" + "20052001360200200120043602182001200136020c200120013602080b41" + "00210141b4a9c00041b4a9c00028020041016b220036020020000d0141fc" + "a6c000280200220004400340200141016a2101200028020822000d000b0b" + "41b4a9c00041ff1f2001200141ff1f4d1b3602000f0b41fca6c000280200" + "220104400340200341016a2103200128020822010d000b0b41b4a9c00041" + "ff1f2003200341ff1f4d1b360200200420054f0d0041aca9c000417f3602" + "000b0b810802077f067e230041c0026b2203240020034198026a20024118" + "6a290300220a37030020034190026a200241106a290300220d3703002003" + "200241086a290300220b3703880220032002290300220c3703800242ddb0" + "858ce8b691a8b87f210e20034180026a200c200b200d200a42c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f102b200341b0026a2204200141106a" + "290300220a370300200341b8026a2205200141186a290300220d37030020" + "032001290300220b3703a0022003200141086a290300220c3703a8022003" + "41a0026a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341a0026a200b200c200a200d42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b02400240024020032903a002220a42037c22" + "0c200a54ad220a20032903a8027c220b200a54ad220a20042903007c220d" + "42ddb0858ce8b691a8b87f852005290300200a200d56ad7c220a42a9c0c6" + "89aece93b2308584500440200c42c7faf3c3ed82a3903c54200b428d95c7" + "c396d2dac0977f54200b428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230210a0c010b200d42deb0858ce8b691a8b87f54200a42a9c0" + "c689aece93b23054200a42a9c0c689aece93b230511b450d01200d210e0b" + "200c210f200b210c0c010b200a200d200b200c42c7faf3c3ed82a3903c7d" + "220f200c5aad220e7d220a42f3eab8bce9ada5bfe8007c220c200a54ad20" + "0b200e54ad7d7c220b200d54ad200b42a2cffaf397c9eed7c7007c220e20" + "0b54ad7c50ad7d42a9c0c689aece93b2307d210a0b2003200e3703b00120" + "03200f3703a0012003200a3703b8012003200c3703a8012000027f200341" + "80026a200341a0016a104a45044020034180016a22042002290300370100" + "20034198016a2205200241186a29030037010020034190016a2206200241" + "106a29030037010020034188016a2207200241086a290300370100200341" + "f8006a2202200141186a290300370100200341f0006a2208200141106a29" + "0300370100200341e8006a2209200141086a290300370100200320012903" + "00370160200341ca006a22012005290100370100200341c2006a22052006" + "2901003701002003413a6a22062007290100370100200341326a22072004" + "2901003701002003412a6a22042002290100370100200341226a22022008" + "2901003701002003411a6a22082009290100370100200320032901603701" + "12200041c8006a2001290100370100200041406b20052901003701002000" + "41386a2006290100370100200041306a2007290100370100200041286a20" + "04290100370100200041206a2002290100370100200041186a2008290100" + "3701002000200329011237011041000c010b200041003a000141010b3a00" + "00200341c0026a24000baa0401047e2001290010220242388620024280fe" + "0383422886842002428080fc0783421886200242808080f80f8342088684" + "84200242088842808080f80f832002421888428080fc0783842002422888" + "4280fe038320024238888484842104200141186a29000022024238862002" + "4280fe0383422886842002428080fc0783421886200242808080f80f8342" + "08868484200242088842808080f80f832002421888428080fc0783842002" + "4228884280fe0383200242388884848421050240417f2001290000220242" + "b0c8b99297bc8cd02985200141086a290000220342b8a195b29bb0a0acdd" + "008584420052200342388620034280fe0383422886842003428080fc0783" + "421886200342808080f80f834208868484200342088842808080f80f8320" + "03421888428080fc07838420034228884280fe0383200342388884848422" + "0342ddb0858ce8b691a8b87f54200242388620024280fe03834228868420" + "02428080fc0783421886200242808080f80f834208868484200242088842" + "808080f80f832002421888428080fc07838420024228884280fe03832002" + "423888848484220242a9c0c689aece93b23054200242a9c0c689aece93b2" + "30511b1b2201417f470440200141ff01710d01200542c6faf3c3ed82a390" + "3c562004428d95c7c396d2dac0977f562004428d95c7c396d2dac0977f51" + "1b0d010b2000200337032020002005370310200020023703282000200437" + "0318200041003a00000f0b200041023a0001200041013a00000bb40c0204" + "7f027e230041d0066b2203240020034188036a200241386a290300370300" + "20034180036a200241306a290300370300200341f8026a200241286a2903" + "00370300200341f0026a2204200241206a290300370300200341e8026a20" + "0241186a290300370300200341e0026a200241106a290300370300200320" + "022903003703d0022003200241086a2903003703d802200341d0026a2002" + "2002102f200341a0036a200141106a290300370300200341a8036a200141" + "186a290300370300200341b0036a200141206a290300370300200341b803" + "6a200141286a290300370300200341c0036a200141306a29030037030020" + "0341c8036a200141386a2903003703002003200129030037039003200320" + "0141086a2903003703980320034190036a20012001102f200341d0006a20" + "034190036a2001102f200342d4fdc3d783f6c4cb003703c805200342f4fb" + "e3f6def5ab964d3703c005200342d2b0b4a9ce90e8a7a77f3703b8052003" + "42d2ab8caee8a0afd1643703b005200342aed5e2f58ca8a78a2b3703a805" + "200342c3d581df919386df817f3703a005200342a3dfefced5bcb1dab57f" + "37039805200342e5f184a5c2dbf9b33237039005200341106a200341d000" + "6a20034190056a103002400240200341d0026a200341106a104a45044020" + "04200341306a104a450d010b200041013b01000c010b200341c8026a4200" + "370300200341c0026a4200370300200341b8026a4200370300200341b002" + "6a4200370300200341a8026a4200370300200341a0016a200141106a2903" + "00370300200341a8016a200141186a290300370300200341b0016a200141" + "206a290300370300200341b8016a200141286a290300370300200341c001" + "6a200141306a290300370300200341c8016a200141386a29030037030020" + "0342003703a00220032001290300370390012003200141086a2903003703" + "980120034188026a200241386a29030037030020034180026a200241306a" + "290300370300200341f8016a200241286a290300370300200341f0016a20" + "0241206a290300370300200341e8016a200241186a290300370300200341" + "e0016a200241106a290300370300200341d8016a200241086a2903003703" + "0020034201370390022003420037039802200320022903003703d0012003" + "41e0036a4200370300200341e8036a4200370300200341f0036a42003703" + "00200341f8036a420037030020034180046a420037030020034188046a42" + "00370300200342003703d003200342003703d803200342a9c0c689aece93" + "b230370368200342ddb0858ce8b691a8b87f37036020034291e1e5cd8789" + "fa992837035820034280808080bfb2fdf0c300370350200341a0046a41f0" + "00104b1a2003420037039804200342013703900441ff0121040340200320" + "0441ff0071104f200341086a290300200341d0006a200441037641f0ffff" + "ff01716a2206290308832107200329030020062903008321082005044020" + "034190056a200341d0036a1043200341d0036a20034190056a41c001104c" + "1a0b2007200884420052044020034190056a200341d0036a20034190016a" + "1044200341d0036a20034190056a41c001104c1a410121050b200441016b" + "2204417f470d000b20034190056a200341d0036a20034190016a10440240" + "20032903900620034198066a290300844200520d0020032903a006200341" + "a8066a290300844200520d0020032903b006200341b8066a290300844200" + "520d0020032903c006200341c8066a290300844200520d00200341c8056a" + "200141386a290300370300200341c0056a200141306a2903003703002003" + "41b8056a200141286a290300370300200341b0056a200141206a29030037" + "0300200341a8056a200141186a290300370300200341a0056a200141106a" + "290300370300200341d8056a200241086a290300370300200341e0056a20" + "0241106a290300370300200341e8056a200241186a290300370300200341" + "f0056a200241206a290300370300200341f8056a200241286a2903003703" + "0020034180066a200241306a29030037030020034188066a200241386a29" + "03003703002003200129030037039005200320022903003703d005200320" + "0141086a29030037039805200041106a20034190056a418001104c1a2000" + "41003a00000c010b20004181023b01000b200341d0066a24000ba8150207" + "7f137e230041a0016b22022400200241106a2001102a20022d0011210620" + "022d001021072000027f024020022d0030220841c101470440200235011a" + "2109200233011e210a2002290112211620022903202114200241d8006a22" + "01200241286a29030022173703002002201437035020022009200a422086" + "842219421086201642308884220937034820022007ad42ff018320164210" + "862006ad42ff01834208868484220a37034042ddb0858ce8b691a8b87f21" + "0f200241406b200a20092014201742c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200241406b200a20092014201742c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b0240024002402002290340220942037c22" + "0b200954ad220920022903487c220a200954ad220c20022903507c220942" + "ddb0858ce8b691a8b87f8520012903002009200c54ad7c220e42a9c0c689" + "aece93b2308584500440200b42c7faf3c3ed82a3903c54200a428d95c7c3" + "96d2dac0977f54200a428d95c7c396d2dac0977f511b450d0242a9c0c689" + "aece93b230210e0c010b200942deb0858ce8b691a8b87f54200e42a9c0c6" + "89aece93b23054200e42a9c0c689aece93b230511b450d012009210f0b20" + "0b2110200a210d0c010b200e2009200a200b42c7faf3c3ed82a3903c7d22" + "10200b5aad220b7d220c42f3eab8bce9ada5bfe8007c220d200c54ad200a" + "200b54ad7d7c220a200954ad200a42a2cffaf397c9eed7c7007c220f200a" + "54ad7c50ad7d42a9c0c689aece93b2307d210e0b4190aac0002d00004102" + "470440230041e0006b220324004190aac0004190aac0002d000022044101" + "20041b3a00000240200404400340024002400240200441ff017141016b0e" + "03000501020b03404190aac0002d000022044101460d000b024002402004" + "41016b0e03000601030b000b41a49bc000412641cc9bc0001011000b41a8" + "9ac000410d41949bc0001011000b4190aac0004190aac0002d0000220441" + "0120041b3a000020040d000b0b200341186a220442a9c0c689aece93b230" + "370300200341106a220542ddb0858ce8b691a8b87f3703002003428d95c7" + "c396d2dac0977f370308200342c4faf3c3ed82a3903c370300200341386a" + "220142003703002003420037033020034200370328200342043703202003" + "42a9c0c689aece93b230370358200342ddb0858ce8b691a8b87f37035020" + "03428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3903c370340" + "200341206a200341406b103a200320032903202003290328200329033020" + "0129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b4190aa" + "c00041023a00004188aac00020042903003703004180aac0002005290300" + "37030041f8a9c000200329030837030041f0a9c00020032903003703000b" + "200341e0006a24000b20024198016a4188aac00029030037030020024190" + "016a4180aac000290300370300200241f8a9c00029030037038801200241" + "f0a9c00029030037038001420021094201210a41ff0121014200210b4200" + "210c0340200220024180016a200141037641f0ffffff01716a2205290300" + "2005290308200141ff0071104e200241286a2205200b3703002002200937" + "03202002200c3703182002200a370310200241106a200a200c2009200b42" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2005290300210b20" + "0229032021092002290318210c2002290310210a20022802004101710440" + "2005200b370300200220093703202002200a3703102002200c3703182002" + "41106a2010200d200f200e42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f102b2005290300210b2002290318210c200229032021092002290310" + "210a0b200141016b2201417f470d000b200241286a2201200b3703002002" + "20093703202002200c3703182002200a370310200241106a2010200d200f" + "200e42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200b37" + "0378200220093703702002200c3703682002200a370360200241e0006a20" + "02290310220e2002290318220b2002290320220c2001290300220a42c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f102b41e0a9c0002d00004102" + "470440102c0b20024198016a41d8a9c00029030037030020024190016a41" + "d0a9c000290300370300200241c8a9c00029030037038801200241c0a9c0" + "002903003703800141e0a9c0002d00004102470440102c0b20024180016a" + "420142004200420041c0a9c00029030041c8a9c00029030041d0a9c00029" + "030041d8a9c000290300102d2002290388012110200229038001210d0240" + "0240417f200229039001220f42ddb0858ce8b691a8b87f8520024198016a" + "290300220942a9c0c689aece93b2308584420052200f42ddb0858ce8b691" + "a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b23051" + "1b1b2201417f470440200141ff01710d01200d42c7faf3c3ed82a3903c54" + "2010428d95c7c396d2dac0977f542010428d95c7c396d2dac0977f511b45" + "0d010b2002200f3703202002200d37031020022009370328200220103703" + "18027e0240200241e0006a200241106a104a0440420021104200210f4200" + "2109200c200e84200a200b8484420052044042c7faf3c3ed82a3903c200e" + "7d2115427f4200427f4200200e42788342c7faf3c3ed82a3903c561b2209" + "2009200b54ad7d2009200b7d220942f3eab8bce9ada5bfe8007d22102009" + "54ad7c42017c2209200c7d220d42a4cffaf397c9eed7c7007d220f200d54" + "ad2009200c54ad7d427f511b200a7d42a9c0c689aece93b2307c21090b20" + "0e201554200b201054200b2010511b200c200f542009200a562009200a51" + "1b200c200f852009200a8584221b501b4101460d0120152111200f211220" + "09210d200e211a200b2118200c210f200a210920100c020b200041033a00" + "010c050b200e2111200c2112200a210d2015211a20102118200b0b211302" + "40024002400240417f201b420052200f2012562009200d562009200d511b" + "1b2201047f2001052011201a54201320185420132018511b0d01200e2015" + "85200b201085844200520b4101460d010b200841c001470d014200210942" + "00210a4200210b4200210c2011201284200d20138484500d04427f420042" + "7f4200201142788342c7faf3c3ed82a3903c561b22092009201354ad7d20" + "0920137d220942f3eab8bce9ada5bfe8007d220a200954ad7c42017c2209" + "20127d220c42a4cffaf397c9eed7c7007d220b200c54ad2009201254ad7d" + "427f511b200d7d42a9c0c689aece93b2307c210c42c7faf3c3ed82a3903c" + "20117d21090c040b2008418001460d010b201121092013210a2012210b20" + "0d210c0c020b420021094200210a4200210b4200210c2011201284200d20" + "138484500d01427f4200427f4200201142788342c7faf3c3ed82a3903c56" + "1b22092009201354ad7d200920137d220942f3eab8bce9ada5bfe8007d22" + "0a200954ad7c42017c220920127d220c42a4cffaf397c9eed7c7007d220b" + "200c54ad2009201254ad7d427f511b200d7d42a9c0c689aece93b2307c21" + "0c42c7faf3c3ed82a3903c20117d21090c010b41e09dc0001020000b2000" + "2014370320200020163701122000200b3703402000200937033020002006" + "3a0011200020073a0010200020193e011a200020173703282000200c3703" + "482000200a3703382000411e6a20194220883d010041000c020b20002006" + "3a0002200020073a00010b41010b3a0000200241a0016a24000ba02f0208" + "7f187e230041c0086b22022400200241f0046a2001102a20022d00f10421" + "0620022d00f0042107024002400240024020022d009005220941c1014704" + "4020024198016a220520022901fa04370300200241a6016a220420024188" + "056a2203290100370100200241a0016a220820024182056a290100370300" + "200220022901f20437039001200241f0046a200141206a102e20022d00f0" + "04450440200241d5076a2003290300220c37000020024188016a20024198" + "056a290300220b37030020024180016a20024190056a290300220a370300" + "200241c8006a200b370300200241406b200a370300200220022903800522" + "0b3703702002200c3703782002200b3703302002200c370338200220063a" + "0051200220073a0050200241e8006a22012004290100370100200241e200" + "6a2008290300370100200241da006a200529030037010020022002290390" + "01370152200941c000460d0220024180026a200241406b29030037030020" + "024188026a200241c8006a29030037030020024190026a200241d0006a29" + "030037030020024198026a200241d8006a290300370300200241a0026a20" + "0241e0006a290300370300200241a8026a20012903003703002002200229" + "03303703f001200220022903383703f801200241f0016a200241306a2002" + "41306a102f20024180086a200241f0016a200241306a102f200242d4fdc3" + "d783f6c4cb003703a805200242f4fbe3f6def5ab964d3703a005200242d2" + "b0b4a9ce90e8a7a77f37039805200242d2ab8caee8a0afd1643703900520" + "0242aed5e2f58ca8a78a2b37038805200242c3d581df919386df817f3703" + "8005200242a3dfefced5bcb1dab57f3703f804200242e5f184a5c2dbf9b3" + "323703f004200241b0016a20024180086a200241f0046a103041f0aac000" + "2d00004102470440230041e0006b2203240041f0aac00041f0aac0002d00" + "002204410120041b3a00000240200404400340024002400240200441ff01" + "7141016b0e03000501020b034041f0aac0002d000022044101460d000b02" + "400240200441016b0e03000601030b000b41a49bc000412641cc9bc00010" + "11000b41a89ac000410d41949bc0001011000b41f0aac00041f0aac0002d" + "00002204410120041b3a000020040d000b0b200341186a220442a9c0c689" + "aece93b230370300200341106a220842ddb0858ce8b691a8b87f37030020" + "03428d95c7c396d2dac0977f370308200342c4faf3c3ed82a3903c370300" + "200341386a22014200370300200342003703302003420037032820034204" + "370320200342a9c0c689aece93b230370358200342ddb0858ce8b691a8b8" + "7f3703502003428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3" + "903c370340200341206a200341406b103a20032003290320200329032820" + "03290330200129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b41f0aac00041023a000041e8aac000200429030037030041e0aac000" + "200829030037030041d8aac000200329030837030041d0aac00020032903" + "003703000b200341e0006a24000b200241c8046a41e8aac0002903003703" + "00200241c0046a41e0aac000290300370300200241d8aac0002903003703" + "b804200241d0aac0002903003703b0044200210c4201210b41ff01210120" + "0241a8076a2104200241b8076a21034200210a0340200241206a200241b0" + "046a200141037641f0ffffff01716a22052903002005290308200141ff00" + "71104e2002200a3703f8072002200c3703f0072002200f3703e807200220" + "0e3703e0072002200d3703d807200220103703d007200220113703c80720" + "02200b3703c0072002200a3703b8082002200c3703b0082002200f3703a8" + "082002200e3703a0082002200d3703980820022010370390082002201137" + "0388082002200b370380082002280220210520024180076a200241c0076a" + "20024180086a102f20024198076a290300210d2004290300210f20032903" + "00210a2002290388072111200229038007210b2002290390072110200229" + "03a007210e20022903b007210c200541017104402002200a3703b8082002" + "200c3703b0082002200f3703a8082002200e3703a0082002200d37039808" + "200220103703900820022011370388082002200b37038008200241c0076a" + "20024180086a200241b0016a102f200241e8076a290300210f200241f807" + "6a290300210a20022903c007210b20022903d007211020022903e007210e" + "20022903f007210c20022903c8072111200241d8076a290300210d0b2001" + "41016b2201417f470d000b2002200c3703e0022002200e3703d002200220" + "103703c0022002200b3703b0022002200a3703e8022002200f3703d80220" + "02200d3703c802200220113703b802200241f0026a200241b0026a200241" + "b0016a102f200241b0036a200241b0026a200241f0026a102f41c0aac000" + "2d0000410247044041c0aac00041c0aac0002d00002201410120011b3a00" + "000240200104400340024002400240200141016b0e03000501020b034041" + "c0aac0002d000022014101460d000b02400240200141016b0e0300060103" + "0b000b41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0" + "001011000b41c0aac00041c0aac0002d00002201410120011b3a00002001" + "0d000b0b41b8aac00042a9c0c689aece93b23037030041b0aac00042ddb0" + "858ce8b691a8b87f37030041a8aac000428d95c7c396d2dac0977f370300" + "41a0aac00042c7faf3c3ed82a3903c37030041c0aac00041023a00000b0b" + "200241d8066a41b8aac000290300370300200241d0066a41b0aac0002903" + "00370300200241a8aac0002903003703c806200241a0aac0002903003703" + "c0064200210c4201210b41ff012101200241a8076a2104200241b8076a21" + "034200210a4200210e4200210f420021104200210d420021110340200241" + "106a200241c0066a200141037641f0ffffff01716a220529030020052903" + "08200141ff0071104e2002200a3703f8072002200c3703f0072002200f37" + "03e8072002200e3703e0072002200d3703d807200220103703d007200220" + "113703c8072002200b3703c0072002200a3703b8082002200c3703b00820" + "02200f3703a8082002200e3703a0082002200d3703980820022010370390" + "0820022011370388082002200b370380082002280210210520024180076a" + "200241c0076a20024180086a102f20024198076a290300210d2004290300" + "210f2003290300210a2002290388072111200229038007210b2002290390" + "07211020022903a007210e20022903b007210c200541017104402002200a" + "3703b8082002200c3703b0082002200f3703a8082002200e3703a0082002" + "200d37039808200220103703900820022011370388082002200b37038008" + "200241c0076a20024180086a200241b0036a102f200241e8076a29030021" + "0f200241f8076a290300210a20022903c007210b20022903d00721102002" + "2903e007210e20022903f007210c20022903c8072111200241d8076a2903" + "00210d0b200141016b2201417f470d000b2002200c3703b0082002200e37" + "03a00820022010370390082002200b370380082002200a3703b808200220" + "0f3703a8082002200d370398082002201137038808200241f0036a200241" + "80086a200241b0036a102f200241a8086a22014200370300200241b0086a" + "22054200370300200241b8086a22044200370300200242a9c0c689aece93" + "b23037039808200242ddb0858ce8b691a8b87f370390082002428d95c7c3" + "96d2dac0977f37038808200242c6faf3c3ed82a3903c3703800820024200" + "3703a008200241a0086a21030240200241f0036a20024180086a104a4504" + "4020024190046a2003104a450d010b200142003703002005420037030020" + "044200370300200242a9c0c689aece93b23037039808200242ddb0858ce8" + "b691a8b87f370390082002428d95c7c396d2dac0977f37038808200242c6" + "faf3c3ed82a3903c37038008200242003703a008200241b0036a20024180" + "086a104a450440200241d0036a2003104a450d050b4200210c2002419808" + "6a4200370300200241a0086a4200370300200241a8086a42003703002002" + "41b0086a4200370300200241b8086a420037030020024200370388084201" + "210b20024201370380082002420037039008200241c0066a200241b0036a" + "20024180086a103041a0abc0002d00004102470440230041e0006b220324" + "0041a0abc00041a0abc0002d00002204410120041b3a0000024020040440" + "0340024002400240200441ff017141016b0e03000501020b034041a0abc0" + "002d000022044101460d000b02400240200441016b0e03000601030b000b" + "41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0001011" + "000b41a0abc00041a0abc0002d00002204410120041b3a000020040d000b" + "0b200341186a220442a9c0c689aece93b230370300200341106a220842dd" + "b0858ce8b691a8b87f3703002003428d95c7c396d2dac0977f3703082003" + "42c6faf3c3ed82a3903c370300200341386a220142003703002003420037" + "03302003420037032820034202370320200342a9c0c689aece93b2303703" + "58200342ddb0858ce8b691a8b87f3703502003428d95c7c396d2dac0977f" + "370348200342c7faf3c3ed82a3903c370340200341206a200341406b103a" + "2003200329032020032903282003290330200129030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b41a0abc00041023a00004198abc000" + "20042903003703004190abc00020082903003703004188abc00020032903" + "083703004180abc00020032903003703000b200341e0006a24000b200241" + "e8046a4198abc000290300370300200241e0046a4190abc0002903003703" + "0020024188abc0002903003703d80420024180abc0002903003703d00441" + "ff012101200241a8076a2104200241b8076a21034200210a4200210e4200" + "210f420021104200210d4200211103402002200241d0046a200141037641" + "f0ffffff01716a22052903002005290308200141ff0071104e2002200a37" + "03f8072002200c3703f0072002200f3703e8072002200e3703e007200220" + "0d3703d807200220103703d007200220113703c8072002200b3703c00720" + "02200a3703b8082002200c3703b0082002200f3703a8082002200e3703a0" + "082002200d37039808200220103703900820022011370388082002200b37" + "0380082002280200210520024180076a200241c0076a20024180086a102f" + "20024198076a290300210d2004290300210f2003290300210a2002290388" + "072111200229038007210b200229039007211020022903a007210e200229" + "03b007210c200541017104402002200a3703b8082002200c3703b0082002" + "200f3703a8082002200e3703a0082002200d370398082002201037039008" + "20022011370388082002200b37038008200241c0076a20024180086a2002" + "41c0066a102f200241e8076a290300210f200241f8076a290300210a2002" + "2903c007210b20022903d007211020022903e007210e20022903f007210c" + "20022903c8072111200241d8076a290300210d0b200141016b2201417f47" + "0d000b2002200c3703b0062002200e3703a0062002201037039006200220" + "0b370380062002200a3703b8062002200f3703a8062002200d3703980620" + "0220113703880620024180056a20024180066a200241f0026a102f0c050b" + "20004181063b01000c050b200020022d00f1043a0002200041810a3b0100" + "0c040b200020063a0002200020073a0001200041013a00000c030b200241" + "f8066a4200370300200241f0066a4200370300200241e8066a4200370300" + "200241e0066a4200370300200241d8066a4200370300200242003703d006" + "200242003703c806200242013703c006200242ba90b590b9f2a4c7193703" + "f807200242a5baed8ff3f6afb0f2003703f00720024292cea7adb3a692d5" + "713703e807200242c2a5ccf7fab6a1f2977f3703e007200242f6bcfc90f1" + "ddb780183703d807200242f988f1f2e58c80b5c2003703d007200242ddb5" + "fbbacfdac8a1e7003703c807200242ededcbcccdabafefc6003703c00720" + "0241f0046a200241c0066a10310240024020022802f00441017104402002" + "41b8086a2201200241b8056a2205290300370300200241b0086a200241b0" + "056a2204290300370300200241a8086a2203200241a8056a220629030037" + "0300200241a0086a200241a0056a29030037030020024198086a20024198" + "056a220729030037030020024190086a20024190056a2903003703002002" + "20022903800537038008200220024188056a290300370388082002418006" + "6a200241c0076a20024180086a102f200242f5e0ffc285baa283093703f8" + "0720024295e7b0c8d6b5a6cf6c3703f007200242f39dce85b7a6cca5bc7f" + "3703e807200242dbae8a89cddbb6d6d5003703e007200242ebdbb1dcddd4" + "97e4123703d8072002428f81adee88b0dcd5ca003703d007200242fba68f" + "e290edf9e8633703c807200242aafbe9b79680b3f3cc003703c007200241" + "f0046a200241c0066a103120022802f004410171450d0120012005290300" + "370300200241b0086a200429030037030020032006290300370300200241" + "a0086a200241a0056a29030037030020024198086a200729030037030020" + "024190086a20024190056a29030037030020022002290380053703800820" + "0220024188056a2903003703880820024180076a200241c0076a20024180" + "086a102f200241f0046a20024180066a20024180076a100720022d00f004" + "4101460d02200041106a20024180056a418001104c1a200041003a00000c" + "050b41f09dc000412c41989fc0001021000b41f09dc000412c41989fc000" + "1021000b200220022d00f1043a00800841b89cc000412b20024180086a41" + "a89fc00041b4a0c0001013000b20024198086a420037030020024190086a" + "4200370300200242003703b808200242003703b008200242003703a80820" + "0242013703a0082002420037038808200242003703800820024180056a20" + "024180086a200241f0026a102f0b200241a8056a290300210e200241b805" + "6a290300210c20022903a005210f20022903b005210b200229039005220d" + "20022903800522158420024198056a290300221220024188056a29030022" + "1384844200520440427f4200427f4200201542788342c7faf3c3ed82a390" + "3c561b220a200a201354ad7d200a20137d220a42f3eab8bce9ada5bfe800" + "7d2217200a54ad7c42017c220a200d7d221042a4cffaf397c9eed7c7007d" + "2218201054ad200a200d54ad7d427f511b20127d42a9c0c689aece93b230" + "7c211642c7faf3c3ed82a3903c20157d21190b4200211142002110420021" + "0a200b200f84200c200e84844200520440427f4200427f4200200f427883" + "42c7faf3c3ed82a3903c561b220a200a200e54ad7d200a200e7d220a42f3" + "eab8bce9ada5bfe8007d2211200a54ad7c42017c220a200b7d221442a4cf" + "faf397c9eed7c7007d2210201454ad200a200b54ad7d427f511b200c7d42" + "a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c200f7d21140b0240" + "0240417f200b201085200a200c8584420052200b201054200a200c56200a" + "200c511b1b2201450440200f201454200e201154200e2011511b0d01200f" + "201485200e2011858442005221010b2019211c2017211d2018211a201621" + "1b2014211e2011211f20102120200a21210240200141ff01710e02000201" + "0b027e200d20188520122016858450044020152019542013201754201320" + "17511b0d02200d211a20120c010b200d20185a201220165a20122016511b" + "450d0120160b211b0c010b2015211c2013211d200d211a2012211b200f21" + "1e200e211f200b2120200c212120192115201721132018210d2016211220" + "14210f2011210e2010210b200a210c0b200041186a200229037837030020" + "0020022903703703102000200229039001370132200041286a2002418801" + "6a290300370300200041206a20024180016a2903003703002000413a6a20" + "024198016a290300370100200041c2006a200241a0016a29030037010020" + "0041c8006a200241a6016a29010037010020094180014604402000202037" + "0380012000201e3703702000201a3703602000201c370350200020063a00" + "31200020073a0030200041003a000020002021370388012000201f370378" + "2000201b3703682000201d3703580c010b2000200b370380012000200f37" + "03702000200d37036020002015370350200020063a0031200020073a0030" + "200041003a00002000200c370388012000200e3703782000201237036820" + "0020133703580b200241c0086a24000b9f0602027f0c7e23004180016b22" + "022400200241386a4200370300200241306a4200370300200241286a4200" + "370300200241206a22034200370300200241186a4200370300200241106a" + "4200370300200241d8006a4200370300200241e0006a4200370300200241" + "e8006a4200370300200241f0006a4200370300200241f8006a4200370300" + "200242003703482002420137034020024200370308200242003703002002" + "420037035002400240024020012002104a0d00200141206a2003104a0d00" + "200141406b200241406b104a0d00200141e0006a200241e0006a104a450d" + "010b200141f8006a290300210e200141e8006a2903002106200129037021" + "0c2001290360210d200129035022042001290340220884200141d8006a29" + "0300220b200141c8006a290300220984844200520440427f4200427f4200" + "200842788342c7faf3c3ed82a3903c561b22052005200954ad7d20052009" + "7d220542f3eab8bce9ada5bfe8007d220f200554ad7c42017c220a20047d" + "220742a4cffaf397c9eed7c7007d2205200754ad2004200a56ad7d427f51" + "1b200b7d42a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c20087d" + "21070b4200210442002108420021094200210b200c200d842006200e8484" + "4200520440427f4200427f4200200d42788342c7faf3c3ed82a3903c561b" + "22042004200654ad7d200420067d220642f3eab8bce9ada5bfe8007d2208" + "200654ad7c42017c2206200c7d220442a4cffaf397c9eed7c7007d220920" + "0454ad2006200c54ad7d427f511b200e7d42a9c0c689aece93b2307c210b" + "42c7faf3c3ed82a3903c200d7d21040b2000200937037020002004370360" + "20002005370350200020073703402000200b370378200020083703682000" + "200a3703582000200f37034820002001290300370300200041386a200141" + "386a290300370300200041306a200141306a290300370300200041286a20" + "0141286a290300370300200041206a200141206a29030037030020004118" + "6a200141186a290300370300200041106a200141106a2903003703002000" + "41086a200141086a2903003703000c010b20002001418001104c1a0b2002" + "4180016a24000bc10201067f41102000410b6a4178712000410b491b2204" + "411c6a1001220045044041000f0b200041086b210102402000410f714504" + "40200121000c010b200041046b220528020022064178712000410f6a4170" + "7141086b2200200020016b4111494104746a220020016b22026b21032006" + "410371044020002003200028020441017172410272360204200020036a22" + "032003280204410172360204200520022005280200410171724102723602" + "00200120026a220320032802044101723602042001200210170c010b2001" + "2802002101200020033602042000200120026a3602000b02402000280204" + "2201410371450d0020014178712202200441106a4d0d0020002004200141" + "017172410272360204200020046a2201200220046b220441037236020420" + "0020026a220220022802044101723602042001200410170b200041086a0b" + "de0a01047f230041f0026b22032400200341a8026a220442003703002003" + "41a0026a22054200370300200342003703c802200342003703c002200342" + "003703b802200342013703b0022003420037039802200342003703900220" + "0341b0026a21060240024002400240200120034190026a104a4504402001" + "41206a2006104a450d010b20044200370300200542003703002003420037" + "03c802200342003703c002200342003703b802200342013703b002200342" + "00370398022003420037039002200220034190026a104a45044020024120" + "6a2006104a450d020b200341206a2104200341406b2105200341a8026a42" + "00370300200341a0026a4200370300200342003703c802200342003703c0" + "02200342003703b802200342013703b00220034200370398022003420037" + "039002027f0240200120034190026a104a450440200141206a200341b002" + "6a104a450d010b20042001290320370300200441186a200141386a290300" + "370300200441106a200141306a290300370300200441086a200141286a29" + "0300370300200341106a200141106a290300370300200341186a20014118" + "6a290300370300200320012903003703002003200141086a290300370308" + "200341d0006a0c010b20054200370300200341106a420037030020034118" + "6a4200370300200541086a4200370300200541106a420037030020054118" + "6a4200370300200342003703002003420037030820042105200341306a0b" + "210620034180016a2101200341a0016a2104200642003703082006420037" + "03002005420037030820054201370300200341a8026a4200370300200341" + "a0026a4200370300200342003703c802200342003703c002200342003703" + "b802200342013703b00220034200370398022003420037039002027f0240" + "200220034190026a104a450440200241206a200341b0026a104a450d010b" + "20012002290320370300200141186a200241386a29030037030020014110" + "6a200241306a290300370300200141086a200241286a2903003703002003" + "41f0006a200241106a290300370300200341f8006a200241186a29030037" + "0300200320022903003703602003200241086a290300370368200341b001" + "6a0c010b20044200370300200341f0006a4200370300200341f8006a4200" + "370300200441086a4200370300200441106a4200370300200441186a4200" + "37030020034200370360200342003703682001210420034190016a0b2205" + "420037030820054200370300200442003703082004420137030020034190" + "026a2003200341e0006a1040200341c0016a20034190026a104120032802" + "c001410171450d02200020032903d001370300200041386a20034188026a" + "290300370300200041306a20034180026a290300370300200041286a2003" + "41f8016a290300370300200041206a200341f0016a290300370300200041" + "186a200341e8016a290300370300200041106a200341e0016a2903003703" + "00200041086a200341d8016a2903003703000c030b200020022903003703" + "00200041386a200241386a290300370300200041306a200241306a290300" + "370300200041286a200241286a290300370300200041206a200241206a29" + "0300370300200041186a200241186a290300370300200041106a20024110" + "6a290300370300200041086a200241086a2903003703000c020b20002001" + "290300370300200041386a200141386a290300370300200041306a200141" + "306a290300370300200041286a200141286a290300370300200041206a20" + "0141206a290300370300200041186a200141186a29030037030020004110" + "6a200141106a290300370300200041086a200141086a2903003703000c01" + "0b41c4a0c000412041f4a0c0001021000b200341f0026a24000bf2020201" + "7f067e230041e0006b22022400200241386a4200370300200241306a4200" + "370300200242003703582002420037035020024200370348420121042002" + "42013703402002420037032820024200370320027e02402001200241206a" + "104a450440200141206a200241406b104a450d010b200241106a20014110" + "6a290300370300200241186a200141186a29030037030020022001290300" + "3703002002200141086a290300370308200141286a290300210520012903" + "30210620012903202107200141386a2903000c010b42002104200241106a" + "4200370300200241186a4200370300200242003703002002420037030842" + "01210742000b210820004200370358200042003703502000200437034020" + "002006370330200020073703202000200229030037030020002003370348" + "2000200837033820002005370328200041086a2002290308370300200041" + "186a200241186a290300370300200041106a200241106a29030037030020" + "0241e0006a24000b5b01027f0240200041046b2802002202417871220341" + "044108200241037122021b20016a4f0440200241002003200141276a4b1b" + "0d01200010040f0b41f996c000412e41a897c0001011000b41b897c00041" + "2e41e897c0001011000bc30802027f047e230041a0026b22022400200241" + "d8016a4200370300200241d0016a4200370300200241c8016a4200370300" + "200241c0016a22034200370300200241b8016a4200370300200241b0016a" + "4200370300200241f8016a420037030020024180026a4200370300200241" + "88026a420037030020024190026a420037030020024198026a4200370300" + "200242003703e80142012105200242013703e001200242003703a8012002" + "42003703a001200242003703f0010240024002402001200241a0016a104a" + "0d00200141206a2003104a0d00200141406b200241e0016a104a0d002001" + "41e0006a20024180026a104a450d010b200241106a420037030020024118" + "6a4200370300200241206a4200370300200241286a420037030020024140" + "6b200141e0006a290300370300200241c8006a200141e8006a2903003703" + "00200241d0006a200141f0006a290300370300200241d8006a200141f800" + "6a2903003703002002420037030020024200370308200220012903503703" + "302002200141d8006a290300370338200141c8006a290300210620012903" + "40210720024198016a200141386a29030037030020024190016a20014130" + "6a29030037030020024188016a200141286a29030037030020024180016a" + "200141206a290300370300200241f8006a200141186a2903003703002002" + "41f0006a200141106a2903003703002002200141086a2903003703682002" + "20012903003703600c010b42002105200241f0006a4200370300200241f8" + "006a420037030020024180016a420037030020024188016a420037030020" + "024190016a420037030020024198016a4200370300200241406b42003703" + "00200241c8006a4200370300200241d0006a4200370300200241d8006a42" + "00370300200241106a4200370300200241186a4200370300200241206a42" + "00370300200241286a420037030020024200370360200242003703682002" + "420037033020024200370338200242003703002002420037030842012107" + "0b2000200737034020002002290360370300200020022903303703502000" + "2006370348200041086a2002290368370300200041d8006a200229033837" + "0300200041386a20024198016a290300370300200041306a20024190016a" + "290300370300200041286a20024188016a290300370300200041206a2002" + "4180016a290300370300200041186a200241f8006a290300370300200041" + "106a200241f0006a290300370300200041e0006a200241406b2903003703" + "00200041e8006a200241c8006a290300370300200041f0006a200241d000" + "6a290300370300200041f8006a200241d8006a2903003703002000200437" + "0388012000200537038001200020022903003703900120004198016a2002" + "290308370300200041a0016a200241106a290300370300200041a8016a20" + "0241186a290300370300200041b0016a200241206a290300370300200041" + "b8016a200241286a290300370300200241a0026a24000b6802017f017e23" + "0041306b2203240020032001360204200320003602002003410236020c20" + "0341c481c00036020820034202370214200342808080801022042003ad84" + "37032820032004200341046aad843703202003200341206a360210200341" + "086a2002101a000b4101017f230041206b22032400200341003602102003" + "4101360204200342043702082003200136021c2003200036021820032003" + "41186a36020020032002101a000b6801017f230041306b22032400200320" + "01360204200320003602002003410236020c2003418484c0003602082003" + "42023702142003200341046aad4280808080108437032820032003ad4280" + "80808010843703202003200341206a360210200341086a2002101a000b79" + "01017f230041406a220524002005200136020c2005200036020820052003" + "360214200520023602102005410236021c200541d881c000360218200542" + "023702242005200541106aad428080808020843703382005200541086aad" + "428080808030843703302005200541306a360220200541186a2004101a00" + "0b3601017f230041206b22012400200141003602182001410136020c2001" + "41d480c00036020820014204370210200141086a2000101a000bcc060105" + "7f0240024002400240200041046b22062802002207417871220441044108" + "200741037122051b20016a4f044020054100200141276a22082004491b0d" + "0102400240200241094f04402003100b22040d0141000f0b41102003410b" + "6a4178712003410b491b2101024020054504402001418002490d01200420" + "01410472490d01200420016b418180084f0d010c030b200041086b220220" + "046a2105024002400240200120044b0440200541a0a9c000280200460d03" + "2005419ca9c000280200460d02200528020422074102710d042007417871" + "220720046a22042001490d04200520071016200420016b22034110490d01" + "20062001200628020041017172410272360200200120026a220120034103" + "72360204200220046a220420042802044101723602042001200310172000" + "0f0b200420016b2203410f4d0d0520062001200741017172410272360200" + "200120026a22012003410372360204200520052802044101723602042001" + "2003101720000f0b20062004200628020041017172410272360200200220" + "046a2201200128020441017236020420000f0b4194a9c00028020020046a" + "22042001490d010240200420016b2203410f4d0440200620074101712004" + "72410272360200200220046a220120012802044101723602044100210341" + "0021010c010b20062001200741017172410272360200200120026a220120" + "03410172360204200220046a2204200336020020042004280204417e7136" + "02040b419ca9c00020013602004194a9c000200336020020000f0b4198a9" + "c00028020020046a220420014b0d070b20031001220145044041000f0b20" + "012000417c4178200628020022044103711b20044178716a220420032003" + "20044b1b104c21012000100420010f0b200420002001200320012003491b" + "104c210420062802002203417871220541044108200341037122031b2001" + "6a490d0320034100200520084b1b0d0420001004200421000b20000f0b41" + "f996c000412e41a897c0001011000b41b897c000412e41e897c000101100" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b20062001200741017172410272360200200120026a220320042001" + "6b22014101723602044198a9c000200136020041a0a9c000200336020020" + "000bf10201047f200028020c21020240024020014180024f044020002802" + "1821040240024020002002460440200041144110200028021422021b6a28" + "020022010d01410021020c020b20002802082201200236020c2002200136" + "02080c010b200041146a200041106a20021b210303402003210520012202" + "41146a200241106a200228021422011b210320024114411020011b6a2802" + "0022010d000b200541003602000b2004450d022000200028021c41027441" + "f4a5c0006a220128020047044020044110411420042802102000461b6a20" + "023602002002450d030c020b2001200236020020020d014190a9c0004190" + "a9c000280200417e200028021c77713602000c020b200028020822032002" + "4704402003200236020c200220033602080f0b418ca9c000418ca9c00028" + "0200417e200141037677713602000f0b2002200436021820002802102201" + "044020022001360210200120023602180b20002802142201450d00200220" + "01360214200120023602180b0ba90601047f200020016a21020240024020" + "0028020422034101710d002003410271450d012000280200220320016a21" + "01200020036b2200419ca9c0002802004604402002280204410371410347" + "0d014194a9c000200136020020022002280204417e713602042000200141" + "0172360204200220013602000c020b2000200310160b0240024002402002" + "2802042203410271450440200241a0a9c000280200460d022002419ca9c0" + "00280200460d0320022003417871220310162000200120036a2201410172" + "360204200020016a20013602002000419ca9c000280200470d014194a9c0" + "0020013602000f0b20022003417e71360204200020014101723602042000" + "20016a20013602000b20014180024f0440411f2102200042003702102001" + "41ffffff074d04402001410620014108766722026b764101712002410174" + "6b413e6a21020b2000200236021c200241027441f4a5c0006a2103410120" + "027422044190a9c000280200714504402003200036020020002003360218" + "2000200036020c200020003602084190a9c0004190a9c000280200200472" + "3602000f0b02400240200120032802002204280204417871460440200421" + "020c010b2001411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712001470d000b0b20022802082201200036020c20" + "022000360208200041003602182000200236020c200020013602080f0b20" + "052000360200200020043602182000200036020c200020003602080f0b20" + "0141f801714184a7c0006a2102027f418ca9c00028020022034101200141" + "037674220171450440418ca9c000200120037236020020020c010b200228" + "02080b2101200220003602082001200036020c2000200236020c20002001" + "3602080f0b41a0a9c00020003602004198a9c0004198a9c0002802002001" + "6a2201360200200020014101723602042000419ca9c000280200470d0141" + "94a9c0004100360200419ca9c00041003602000f0b419ca9c00020003602" + "004194a9c0004194a9c00028020020016a22013602002000200141017236" + "0204200020016a20013602000b0b8e0201057f230041206b220324002000" + "2802002202417f460440410020011019000b410820024101742204200241" + "016a2205200420054b1b2204200441084d1b220441004804404100200110" + "19000b20032002047f2003200236021c2003200028020436021441010541" + "000b360218200341086a2105027f0240200341146a220228020404402002" + "280208220645044041bda9c0002d00001a0c020b20022802002006410120" + "0410150c020b41bda9c0002d00001a0b200410010b210220052004360208" + "20052002410120021b360204200520024536020020032802084101460440" + "20032802101a200328020c20011019000b200328020c2102200020043602" + "0020002002360204200341206a24000b0d002000450440200110140b000b" + "f40102027f017e230041106b22022400200241013b010c20022001360208" + "20022000360204230041106b22002400200241046a220129020021042000" + "200136020c20002004370204230041106b22022400200041046a22012802" + "00220028020c2103024002400240024020002802040e020001020b20030d" + "0141012100410021030c020b20030d002000280200220028020421032000" + "28020021000c010b20024180808080783602002002200136020c20012802" + "0822012d0008210020012d00091a2002410420001033000b200220033602" + "0420022000360200200128020822012d0008210020012d00091a20024105" + "20001033000b6801017f230041306b220324002003200136020420032000" + "3602002003410236020c200341e483c00036020820034202370214200320" + "0341046aad4280808080108437032820032003ad42808080801084370320" + "2003200341206a360210200341086a2002101a000bcf06010b7f20002802" + "002102230041106b22072400410a2103024020024190ce00490440200221" + "000c010b0340200741066a20036a220441046b20024190ce006e220041f0" + "b1036c20026a220541ffff037141e4006e220641017441e881c0006a2f00" + "003b0000200441026b2006419c7f6c20056a41ffff037141017441e881c0" + "006a2f00003b0000200341046b2103200241ffc1d72f4b21042000210220" + "040d000b0b0240200041e3004d0440200021020c010b200341026b220320" + "0741066a6a200041ffff037141e4006e2202419c7f6c20006a41ffff0371" + "41017441e881c0006a2f00003b00000b02402002410a4f0440200341026b" + "2203200741066a6a200241017441e881c0006a2f00003b00000c010b2003" + "41016b2203200741066a6a20024130723a00000b027f200741066a20036a" + "210941012108410a20036b220a2001280214220241017122056a21062008" + "410020024104711b2108412b418080c40020051b21052001280200450440" + "4101200128021c22002001280220220320052008101d0d011a2000200920" + "0a200328020c1103000c010b0240024002402006200128020422004f0440" + "200128021c22002001280220220320052008101d450d0141010c040b2002" + "410871450d01200128021021022001413036021020012d0018210c410121" + "0b200141013a0018200128021c22032001280220220420052008101d0d02" + "200020066b41016a210002400340200041016b2200450d01200341302004" + "280210110200450d000b41010c040b410120032009200a200428020c1103" + "000d031a2001200c3a00182001200236021041000c030b20002009200a20" + "0328020c110300210b0c010b200020066b2102024002400240410120012d" + "0018220020004103461b220041016b0e020001020b20022100410021020c" + "010b20024101762100200241016a41017621020b200041016a2100200128" + "0210210620012802202103200128021c210402400340200041016b220045" + "0d01200420062003280210110200450d000b41010c020b4101210b200420" + "0320052008101d0d0020042009200a200328020c1103000d004100210003" + "40410020002002460d021a200041016a2100200420062003280210110200" + "450d000b200041016b2002490c010b200b0b2102200741106a240020020b" + "380002402002418080c400460d00200020022001280210110200450d0041" + "010f0b200345044041000f0b200020034100200128020c1103000bfd0a01" + "0c7f20002802042107200028020021030240024020012802002209200128" + "0208220072044002402000410171450d00200320076a2106024020012802" + "0c2205450440200321020c010b200321020340200222002006460d02027f" + "200041016a20002c0000220241004e0d001a200041026a20024160490d00" + "1a200041036a20024170490d001a200041046a0b220220006b20046a2104" + "2005200841016a2208470d000b0b20022006460d0020022c00001a200420" + "07027f02402004450d00200420074f044020042007460d0141000c020b20" + "0320046a2c000041404e0d0041000c010b20030b22001b21072000200320" + "001b21030b2009450440200128021c20032007200128022028020c110300" + "0f0b2001280204210c200741104f044020072003200341036a417c712204" + "6b22086a220a41037121094100210541002100200320044704402008417c" + "4d04404100210603402000200320066a22022c000041bf7f4a6a20024101" + "6a2c000041bf7f4a6a200241026a2c000041bf7f4a6a200241036a2c0000" + "41bf7f4a6a2100200641046a22060d000b0b200321020340200020022c00" + "0041bf7f4a6a2100200241016a2102200841016a22080d000b0b02402009" + "450d002004200a417c716a22022c000041bf7f4a210520094101460d0020" + "0520022c000141bf7f4a6a210520094102460d00200520022c000241bf7f" + "4a6a21050b200a4102762106200020056a21050340200421092006450d04" + "41c0012006200641c0014f1b220a410371210b200a410274210d41002102" + "200641044f04402004200d41f007716a2108200421000340200028020c22" + "04417f7341077620044106767241818284087120002802082204417f7341" + "077620044106767241818284087120002802042204417f73410776200441" + "06767241818284087120002802002204417f734107762004410676724181" + "8284087120026a6a6a6a2102200041106a22002008470d000b0b2006200a" + "6b21062009200d6a2104200241087641ff81fc0771200241ff81fc07716a" + "418180046c41107620056a2105200b450d000b2009200a41fc0171410274" + "6a22022802002200417f734107762000410676724181828408712100200b" + "4101460d0220022802042204417f73410776200441067672418182840871" + "20006a2100200b4102460d0220022802082202417f734107762002410676" + "7241818284087120006a21000c020b2007450440410021050c030b200741" + "03712102027f200741044904404100210041000c010b20032c000041bf7f" + "4a20032c000141bf7f4a6a20032c000241bf7f4a6a20032c000341bf7f4a" + "6a22052007410c7122004104460d001a200520032c000441bf7f4a6a2003" + "2c000541bf7f4a6a20032c000641bf7f4a6a20032c000741bf7f4a6a2205" + "20004108460d001a200520032c000841bf7f4a6a20032c000941bf7f4a6a" + "20032c000a41bf7f4a6a20032c000b41bf7f4a6a0b21052002450d022000" + "20036a21000340200520002c000041bf7f4a6a2105200041016a21002002" + "41016b22020d000b0c020b200128021c20032007200128022028020c1103" + "000f0b200041087641ff811c71200041ff81fc07716a418180046c411076" + "20056a21050b02402005200c490440200c20056b21060240024002402001" + "2d00182200410020004103471b220041016b0e020001020b200621004100" + "21060c010b20064101762100200641016a41017621060b200041016a2100" + "2001280210210820012802202102200128021c21040340200041016b2200" + "450d02200420082002280210110200450d000b41010f0b200128021c2003" + "2007200128022028020c1103000f0b200420032007200228020c11030004" + "4041010f0b4100210003402000200646044041000f0b200041016a210020" + "0420082002280210110200450d000b200041016b2006490b140020002802" + "002001200028020428020c1102000b0e0041e480c000412b20001011000b" + "5901017f230041306b220324002003200136020c20032000360208200341" + "01360214200341dc80c0003602102003420137021c2003200341086aad42" + "8080808030843703282003200341286a360218200341106a2002101a000b" + "7f01017f027f0240027f0240200228020404402002280208220345044020" + "01450d0441bda9c0002d00001a0c020b200228020020034104200110150c" + "020b2001450d0241bda9c0002d00001a0b200110010b2202410420021b21" + "032002450c010b4104210341000b21022000200136020820002003360204" + "200020023602000bdd0101087f230041206b220224002000280200220341" + "7f460440410020011019000b20034101742204200341016a220620042006" + "4b1b220441ffffffff034b0440410020011019000b024041042004200441" + "044d1b2207410274220641fcffffff074d047f4100210420022003047f20" + "02200341027436021c2002200028020436021441040520040b3602182002" + "41086a2006200241146a102220022802084101470d012002280210210520" + "0228020c0520050b210820052109200820011019000b200228020c210320" + "00200736020020002003360204200241206a24000bd10d021c7f077e2300" + "41206b220c2400200341016b211102400240024002402003044020034102" + "6b210520034101460d0402402001280208221420036b221941016a220e41" + "ffffffff034b0d00200e410274220441fdffffff074f0d00200220114102" + "746a2802002115200220054102746a3502002123027f2004450440410421" + "0b41000c010b41bda9c0002d00001a20041001220b450d05200b41046b2d" + "00004103710440200b2004104b1a0b200e0b21102001280200211a201421" + "09200e044020012802042212200941027420034102746b6a211320034101" + "7121162003417e71210d201241086b211b201241046b211c42002015ad22" + "2242208622247d2125200e210f0340024020090440201c20094102742204" + "6a22050d010b41ec87c0001020000b027f0240200941024f044020052802" + "0021052004201b6a350200212120082015490d012005ad2008ad7c212041" + "7f0c020b417f417e20141b410141fc87c0001010000b2005ad2008ad4220" + "868422202020202280222620227e7d21202026a70b21070240202042ffff" + "ffff0f560d00202520204220867c20217c21210340202120247c22212007" + "ad20237e5a0d01200741016b2107202020227c2220428080808010540d00" + "0b0b02400240024002402009200f41016b220f4f0440200f410274211720" + "09200f460d04201220176a21182007ad212102400240201145044042ffff" + "ffff0f2120410021060c010b4100210642ffffffff0f2120201321042002" + "210503402004202020043502007c202120053502007e7d42ffffffff1f7d" + "22203e0200200441046a220a200a35020020204220887c2021200541046a" + "3502007e7d42ffffffff1f7d22203e020020204220882120200441086a21" + "04200541086a2105200d200641026a2206470d000b2016450d010b201820" + "0641027422046a2205202020053502007c2021200220046a3502007e7d42" + "ffffffff1f7d22203e0200202042208821200b20082020a7417f734f0d04" + "20114504404100210a410021080c030b41002104410021084100210a0340" + "200420136a22052005280200221d200220046a221e2802006a220620086a" + "2208360200200541046a22052005280200221f201e41046a2802006a2205" + "2006201d49200620084b726a22063602002005201f49200520064b722108" + "200441086a2104200d200a41026a220a470d000b0c010b200f2009418c88" + "c000101b000b2016450d010b2018200a41027422046a2205200528020020" + "0220046a2802006a20086a3602000b200741016b21070b200b20176a2007" + "3602002001200941016b2209360208201341046b2113201220094102746a" + "2802002108200f0d000b0b2009201a460440200141dc87c00010230b2001" + "200941016a220d3602082001280204220a200941027422046a2008360200" + "20080d03200d41ffffffff0371210702400340200721052004417c460d01" + "200541016b21072004200a6a2106200441046b21042006280200450d000b" + "2005200d4b0d040c030b410021050c020b41cc87c0001014000b20114100" + "41ac87c0001010000b200120053602082005210d0b024002400240024002" + "40200d200128020022044102764f0d002004200d490d012004450d002004" + "41027421040240200d450440200a41046b28020022054178712207410441" + "08200541037122051b20046a490d04200541002007200441276a4b1b0d05" + "200a1004410421040c010b200a20044104200d41027410152204450d060b" + "2001200d360200200120043602040b41002106200e450d03200b200e4102" + "746a41046b2802000440200e21060c040b201441027420034102746b2104" + "201941026a210503402004417c460d04200541016b21052004200b6a2107" + "200441046b21042007280200450d000b200e20052005200e4b1b21060c03" + "0b200c4100360218200c410136020c200c41ec84c000360208200c420437" + "0210200c41086a41f484c000101a000b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b024002400240024020104102" + "7620064d0440201021040c010b200620104b0d01410021042010450d0020" + "1041027421052006450440200b41046b2802002207417871220a41044108" + "200741037122071b20056a490d0320074100200a200541276a4b1b0d0420" + "0b10044104210b0c010b200b20054104200622044102741015220b450d04" + "0b200020063602082000200b360204200020043602002000200129020037" + "020c200041146a200141086a280200360200200c41206a24000f0b200c41" + "00360218200c410136020c200c41ec84c000360208200c4204370210200c" + "41086a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c00010110b000b2005410141bc87c0001010000be609" + "010c7f230041306b220724002001280200210c0240024002400240024002" + "400240024002400240024002400240024020024504402001280204210b20" + "0c418080808078470d02200b41086a280200220441ffffffff034d044020" + "04410274220641fdffffff07490d020b41a89cc0001014000b2001280204" + "220b2001200c418080808078461b2208280208220941feffffff014f0d04" + "41bda9c0002d00001a200941026a220141027410012205450d0720054100" + "360200200720053602102007200136020c41012101200741013602142008" + "2802082206410274210d200828020421082006200941016a4b0440200741" + "0c6a2105230041206b22042400024002402006417f460d00200528020022" + "09410174220a200641016a22012001200a491b220141ffffffff034b0d00" + "41042001200141044d1b220f410274220a41fcffffff074b0d0020042009" + "047f2004200941027436021c2004200528020436021441040541000b3602" + "18200441086a200a200441146a102220042802084101470d012004280210" + "1a200428020c210e0b200e41c096c0001019000b200428020c2101200520" + "0f36020020052001360204200441206a2400200728021021052007280214" + "21010b200520014102746a2008200d104c1a2007200120066a2204360214" + "0c030b200b41046a28020021092006450440410421054100210141042009" + "2006104c1a0c020b41bda9c0002d00001a20042101200610012205450d06" + "200520092006104c1a0c010b20012802082104200c2101200b21050b2007" + "2004360214200720053602102007200136020c0b200341ff0171450d0202" + "40200220044d044020022004470d01200221040c040b2002410041c889c0" + "00101b000b20044102742109200241027421012003411f71210841002003" + "6b411f71210d410021030340200120056a22062006280200220620087420" + "03723602002006200d7621032009200141046a2201470d000b0c010b41a8" + "89c00010140c020b2003450d00200728020c20044604402007410c6a41b8" + "89c0001023200728021021050b200520044102746a200336020020072004" + "41016a22043602140b41002108200728020c210a02402004450d00200520" + "0441027422016a41046b2802000440200421080c010b200541046b210d20" + "0441ffffffff037121030340200321062001450d01200641016b21032001" + "200d6a2109200141046b21012009280200450d000b200420062004200649" + "1b21080b0240200a41027620084d0440200a21010c010b2008200a4b0d02" + "41002101200a450d00200a41027421032008450440200541046b28020022" + "06417871220941044108200641037122061b20036a490d04200641002009" + "200341276a4b1b0d0520051004410421050c010b20052003410420082201" + "41027410152205450d010b20002008360208200020053602042000200136" + "02002002450d06200c41808080807872418080808078460d06200b41046b" + "28020022014178712203200c410274220641044108200141037122011b6a" + "490d04200141002003200641276a4b1b0d05200b10040c060b000b200741" + "003602282007410136021c200741ec84c000360218200742043702202007" + "41186a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c0001011000b41f996c000412e41a897c0001011000b" + "41b897c000412e41e897c0001011000b200741306a24000bc60201027f41" + "bda9c0002d00001a024002400240412010012202450d0020022001290000" + "370200200220012900083702082002200129001037021020022001280018" + "3602182002200128001c220336021c410821012000027f410820030d001a" + "41082002411c6a2802000d001a4107200241186a2802000d001a41062002" + "41146a2802000d001a4105200241106a2802000d001a41042002410c6a28" + "02000d001a4103200241086a2802000d001a4102200241046a2802000d00" + "1a2002280200450440200241046b28020022014178714124412820014103" + "7122031b490d0320034100200141c8004f1b0d0420021004410421024100" + "210141000c010b200241204104410410152202450d014101210141010b36" + "020820002002360204200020013602000f0b000b41f996c000412e41a897" + "c0001011000b41b897c000412e41e897c0001011000bcc3e01227f200120" + "024106746a2124200028021c21222000280218211f2000280214211e2000" + "280210211b200028020c2123200028020821202000280204211d20002802" + "002102034020022001280000220341187420034180fe0371410874722003" + "4108764180fe03712003411876727222152022201b411a77201b41157773" + "201b410777736a201e201f73201b71201f736a6a4198dfa894046a220420" + "1d202073200271201d202071732002411e772002411377732002410a7773" + "6a6a2203411e772003411377732003410a777320032002201d7371200220" + "1d71736a201f2001280004220541187420054180fe037141087472200541" + "08764180fe03712005411876727222136a200420236a2207201b201e7371" + "201e736a2007411a772007411577732007410777736a419189dd89076a22" + "066a2205411e772005411377732005410a77732005200220037371200220" + "0371736a201e2001280008220441187420044180fe037141087472200441" + "08764180fe03712004411876727222146a200620206a220c2007201b7371" + "201b736a200c411a77200c41157773200c410777736a41b188fcd1046b22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a201b200128000c220641187420064180fe037141087472200641" + "08764180fe03712006411876727222116a200d201d6a220d2007200c7371" + "2007736a200d411a77200d41157773200d410777736a41dbc8a8b2016b22" + "086a2206411e772006411377732006410a77732006200420057371200420" + "0571736a20072001280010220f411874200f4180fe037141087472200f41" + "08764180fe0371200f411876727222166a200220086a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41db84dbca036a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280014220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722218200c6a200320096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41f1a3c4cf056a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a2001280018220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722219200d6a200520096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a41dcfa81ee066b22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a200128001c220841187420084180fe0371410874722008410876" + "4180fe037120084118767272221a200f6a200420096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41abc28ea7056b22" + "096a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280020220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722202200c6a200620096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41e8aae1bf026b22" + "096a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280024220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220a200d6a200720096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a4181b68d94016a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280028220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220b200f6a200320096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41be8bc6a1026a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a200128002c220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722210200c6a200520096a2208200d200f7371" + "200d736a2008411a772008411577732008410777736a41c3fbb1a8056a22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a2001280030220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272221c200d6a200420096a22092008200f7371" + "200f736a2009411a772009411577732009410777736a41f4baf995076a22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280034220c411874200c4180fe037141087472200c410876" + "4180fe0371200c41187672722221200f6a2006200d6a220e200820097371" + "2008736a200e411a77200e41157773200e410777736a41829c85f9076b22" + "0d6a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280038220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272220c20086a2007200d6a22122009200e7371" + "2009736a2012411a772012411577732012410777736a41d9f28fa1066b22" + "0f6a2207411e772007411377732007410a77732007200420067371200420" + "0671736a200128003c220d411874200d4180fe037141087472200d410876" + "4180fe0371200d4118767272220d20096a2003200f6a2217200e20127371" + "200e736a2017411a772017411577732017410777736a418c9d90f3036b22" + "086a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20134119772013410e777320134103767320156a200a6a200c41" + "0f77200c410d7773200c410a76736a220f200e6a200520086a2215201220" + "1773712012736a2015411a772015411577732015410777736a41bfac92db" + "016b22096a2205411e772005411377732005410a77732005200320077371" + "2003200771736a20144119772014410e777320144103767320136a200b6a" + "200d410f77200d410d7773200d410a76736a220820126a200420096a2213" + "2015201773712017736a2013411a772013411577732013410777736a41fa" + "f08682016b220e6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20114119772011410e777320114103767320146a" + "20106a200f410f77200f410d7773200f410a76736a220920176a2006200e" + "6a22142013201573712015736a2014411a77201441157773201441077773" + "6a41c6bb86fe006a22126a2206411e772006411377732006410a77732006" + "2004200573712004200571736a20164119772016410e7773201641037673" + "20116a201c6a2008410f772008410d77732008410a76736a220e20156a20" + "0720126a22112013201473712013736a2011411a77201141157773201141" + "0777736a41ccc3b2a0026a22176a2207411e772007411377732007410a77" + "7320072004200673712004200671736a20184119772018410e7773201841" + "03767320166a20216a2009410f772009410d77732009410a76736a221220" + "136a200320176a22162011201473712014736a2016411a77201641157773" + "2016410777736a41efd8a4ef026a22156a2203411e772003411377732003" + "410a777320032006200773712006200771736a20194119772019410e7773" + "20194103767320186a200c6a200e410f77200e410d7773200e410a76736a" + "221720146a200520156a22182011201673712011736a2018411a77201841" + "1577732018410777736a41aa89d2d3046a22136a2205411e772005411377" + "732005410a777320052003200773712003200771736a201a411977201a41" + "0e7773201a4103767320196a200d6a2012410f772012410d77732012410a" + "76736a221520116a200420136a22192016201873712016736a2019411a77" + "2019411577732019410777736a41dcd3c2e5056a22146a2204411e772004" + "411377732004410a777320042003200573712003200571736a2002411977" + "2002410e7773200241037673201a6a200f6a2017410f772017410d777320" + "17410a76736a221320166a200620146a221a2018201973712018736a201a" + "411a77201a41157773201a410777736a41da91e6b7076a22116a2206411e" + "772006411377732006410a777320062004200573712004200571736a200a" + "411977200a410e7773200a4103767320026a20086a2015410f772015410d" + "77732015410a76736a221420186a200720116a22022019201a7371201973" + "6a2002411a772002411577732002410777736a41aedd86be066b22166a22" + "07411e772007411377732007410a77732007200420067371200420067173" + "6a200b411977200b410e7773200b41037673200a6a20096a2013410f7720" + "13410d77732013410a76736a221120196a200320166a220a2002201a7371" + "201a736a200a411a77200a41157773200a410777736a4193f3b8be056b22" + "186a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20104119772010410e7773201041037673200b6a200e6a201441" + "0f772014410d77732014410a76736a2216201a6a200520186a220b200220" + "0a73712002736a200b411a77200b41157773200b410777736a41b8b0f3ff" + "046b22196a2205411e772005411377732005410a77732005200320077371" + "2003200771736a201c411977201c410e7773201c4103767320106a20126a" + "2011410f772011410d77732011410a76736a221820026a200420196a2202" + "200a200b7371200a736a2002411a772002411577732002410777736a41b9" + "809a85046b221a6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20214119772021410e7773202141037673201c6a" + "20176a2016410f772016410d77732016410a76736a2219200a6a2006201a" + "6a220a2002200b7371200b736a200a411a77200a41157773200a41077773" + "6a418de8ffc8036b22106a2206411e772006411377732006410a77732006" + "2004200573712004200571736a200c411977200c410e7773200c41037673" + "20216a20156a2018410f772018410d77732018410a76736a221a200b6a20" + "0720106a220b2002200a73712002736a200b411a77200b41157773200b41" + "0777736a41b9dde1d2026b22106a2207411e772007411377732007410a77" + "7320072004200673712004200671736a200d411977200d410e7773200d41" + "037673200c6a20136a2019410f772019410d77732019410a76736a220c20" + "026a200320106a2202200a200b7371200a736a2002411a77200241157773" + "2002410777736a41d1c6a9366a22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200f411977200f410e777320" + "0f41037673200d6a20146a201a410f77201a410d7773201a410a76736a22" + "0d200a6a200520106a220a2002200b7371200b736a200a411a77200a4115" + "7773200a410777736a41e7d2a4a1016a22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20084119772008410e" + "7773200841037673200f6a20116a200c410f77200c410d7773200c410a76" + "736a220f200b6a200420106a220b2002200a73712002736a200b411a7720" + "0b41157773200b410777736a418595dcbd026a22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a200941197720" + "09410e777320094103767320086a20166a200d410f77200d410d7773200d" + "410a76736a220820026a200620106a2202200a200b7371200a736a200241" + "1a772002411577732002410777736a41b8c2ecf0026a22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a200e41" + "1977200e410e7773200e4103767320096a20186a200f410f77200f410d77" + "73200f410a76736a2209200a6a200720106a220a2002200b7371200b736a" + "200a411a77200a41157773200a410777736a41fcdbb1e9046a22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20124119772012410e7773201241037673200e6a20196a2008410f772008" + "410d77732008410a76736a220e200b6a200320106a220b2002200a737120" + "02736a200b411a77200b41157773200b410777736a41939ae099056a2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20174119772017410e777320174103767320126a201a6a2009410f" + "772009410d77732009410a76736a221220026a200520106a2202200a200b" + "7371200a736a2002411a772002411577732002410777736a41d4e6a9a806" + "6a22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20154119772015410e777320154103767320176a200c6a20" + "0e410f77200e410d7773200e410a76736a2217200a6a200420106a220a20" + "02200b7371200b736a200a411a77200a41157773200a410777736a41bb95" + "a8b3076a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20134119772013410e777320134103767320156a20" + "0d6a2012410f772012410d77732012410a76736a2215200b6a200620106a" + "220b2002200a73712002736a200b411a77200b41157773200b410777736a" + "41d2edf4f1076b22106a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20144119772014410e777320144103767320" + "136a200f6a2017410f772017410d77732017410a76736a221320026a2007" + "20106a2202200a200b7371200a736a2002411a7720024115777320024107" + "77736a41fba6b7ec066b22106a2207411e772007411377732007410a7773" + "20072004200673712004200671736a20114119772011410e777320114103" + "767320146a20086a2015410f772015410d77732015410a76736a2214200a" + "6a200320106a220a2002200b7371200b736a200a411a77200a4115777320" + "0a410777736a41dfae80ea056b22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20164119772016410e777320" + "164103767320116a20096a2013410f772013410d77732013410a76736a22" + "11200b6a200520106a220b2002200a73712002736a200b411a77200b4115" + "7773200b410777736a41b5b396bf056b22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20184119772018410e" + "777320184103767320166a200e6a2014410f772014410d77732014410a76" + "736a221620026a200420106a2202200a200b7371200a736a2002411a7720" + "02411577732002410777736a4190e9d1ed036b22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201941197720" + "19410e777320194103767320186a20126a2011410f772011410d77732011" + "410a76736a2218200a6a200620106a220a2002200b7371200b736a200a41" + "1a77200a41157773200a410777736a41dddccec4036b22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201a41" + "1977201a410e7773201a4103767320196a20176a2016410f772016410d77" + "732016410a76736a2219200b6a200720106a220b2002200a73712002736a" + "200b411a77200b41157773200b410777736a41e7afb4f3026b22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "200c411977200c410e7773200c41037673201a6a20156a2018410f772018" + "410d77732018410a76736a221a20026a200320106a2202200a200b737120" + "0a736a2002411a772002411577732002410777736a41dcf39bcb026b2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a200d411977200d410e7773200d41037673200c6a20136a2019410f" + "772019410d77732019410a76736a220c200a6a200520106a220a2002200b" + "7371200b736a200a411a77200a41157773200a410777736a41fb94c7df00" + "6b22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a200f411977200f410e7773200f41037673200d6a20146a20" + "1a410f77201a410d7773201a410a76736a220d200b6a200420106a220b20" + "02200a73712002736a200b411a77200b41157773200b410777736a41f0c0" + "aa83016a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20084119772008410e7773200841037673200f6a20" + "116a200c410f77200c410d7773200c410a76736a220f20026a200620106a" + "2202200a200b7371200a736a2002411a772002411577732002410777736a" + "41968293cd016a221c6a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20094119772009410e777320094103767320" + "086a20166a200d410f77200d410d7773200d410a76736a2210200a6a2007" + "201c6a22082002200b7371200b736a2008411a7720084115777320084107" + "77736a4188d8ddf1016a221c6a2207411e772007411377732007410a7773" + "20072004200673712004200671736a200e411977200e410e7773200e4103" + "767320096a20186a200f410f77200f410d7773200f410a76736a220a200b" + "6a2003201c6a22092002200873712002736a2009411a7720094115777320" + "09410777736a41cceea1ba026a221c6a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20124119772012410e777320" + "1241037673200e6a20196a2010410f772010410d77732010410a76736a22" + "0b20026a2005201c6a220e2008200973712008736a200e411a77200e4115" + "7773200e410777736a41b5f9c2a5036a22026a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20174119772017410e" + "777320174103767320126a201a6a200a410f77200a410d7773200a410a76" + "736a221220086a200220046a22082009200e73712009736a2008411a7720" + "08411577732008410777736a41b399f0c8036a22026a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201541197720" + "15410e777320154103767320176a200c6a200b410f77200b410d7773200b" + "410a76736a221720096a200220066a22092008200e7371200e736a200941" + "1a772009411577732009410777736a41cad4e2f6046a22026a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201341" + "19772013410e777320134103767320156a200d6a2012410f772012410d77" + "732012410a76736a2215200e6a200220076a220e2008200973712008736a" + "200e411a77200e41157773200e410777736a41cf94f3dc056a22026a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20144119772014410e777320144103767320136a200f6a2017410f772017" + "410d77732017410a76736a221320086a200220036a22082009200e737120" + "09736a2008411a772008411577732008410777736a41f3dfb9c1066a2202" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20114119772011410e777320114103767320146a20106a2015410f" + "772015410d77732015410a76736a221420096a200220056a22092008200e" + "7371200e736a2009411a772009411577732009410777736a41ee85bea407" + "6a22026a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20164119772016410e777320164103767320116a200a6a20" + "13410f772013410d77732013410a76736a2211200e6a200220046a220e20" + "08200973712008736a200e411a77200e41157773200e410777736a41efc6" + "95c5076a22026a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20184119772018410e777320184103767320166a20" + "0b6a2014410f772014410d77732014410a76736a221620086a200220066a" + "22082009200e73712009736a2008411a772008411577732008410777736a" + "41ec8fded9076b22026a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20194119772019410e777320194103767320" + "186a20126a2011410f772011410d77732011410a76736a221220096a2002" + "20076a22092008200e7371200e736a2009411a7720094115777320094107" + "77736a41f8fbe399076b22116a2207411e772007411377732007410a7773" + "20072004200673712004200671736a201a411977201a410e7773201a4103" + "767320196a20176a2016410f772016410d77732016410a76736a2217200e" + "6a200320116a220e2008200973712008736a200e411a77200e4115777320" + "0e410777736a41868084fa066b22116a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200c411977200c410e777320" + "0c41037673201a6a20156a2012410f772012410d77732012410a76736a22" + "1220086a200520116a22052009200e73712009736a2005411a7720054115" + "77732005410777736a4195a6bedd056b22156a2208411e77200841137773" + "2008410a777320082003200773712003200771736a200c200d411977200d" + "410e7773200d410376736a20136a2017410f772017410d77732017410a76" + "736a20096a200420156a22042005200e7371200e736a2004411a77200441" + "1577732004410777736a4189b89988046b22096a220c2003200873712003" + "200871736a200c411e77200c41137773200c410a77736a200d200f411977" + "200f410e7773200f410376736a20146a2012410f772012410d7773201241" + "0a76736a200e6a200620096a22062004200573712005736a2006411a7720" + "06411577732006410777736a418e8ebacc036b220d6a2102200c201d6a21" + "1d2007201b6a200d6a211b200820206a21202006201e6a211e200320236a" + "21232004201f6a211f200520226a2122200141406b22012024470d000b20" + "00202236021c2000201f3602182000201e3602142000201b360210200020" + "2336020c200020203602082000201d360204200020023602000b89010101" + "7f027f0240200328020404402003280208220445044020012002450d031a" + "41bda9c0002d00001a20014109490d022002100b0c030b20032802002004" + "2001200210150c020b20012002450d011a41bda9c0002d00001a20014109" + "490d002002100b0c010b200210010b210320002002360208200020032001" + "20031b36020420002003453602000b3000200128021c20002d0000410274" + "220041b4a5c0006a280200200041a8a5c0006a280200200128022028020c" + "1103000bfc0402037f017e23004180016b220224000240024020012d0000" + "220441c00171220341c000470440200241186a200141186a290000370300" + "200241106a200141106a290000370300200241086a200141086a29000037" + "030020022001290000220537030020022005a7413f713a0000200241406b" + "2002102e20022d0040450d01200220022d00413a007f41a88ec000411f20" + "0241ff006a41988ec00041c88ec0001013000b02402004413f710d002001" + "2d00010d0020012d00020d0020012d00030d0020012d00040d0020012d00" + "050d0020012d00060d0020012d00070d0020012d00080d0020012d00090d" + "0020012d000a0d0020012d000b0d0020012d000c0d0020012d000d0d0020" + "012d000e0d0020012d000f0d0020012d00100d0020012d00110d0020012d" + "00120d0020012d00130d0020012d00140d0020012d00150d0020012d0016" + "0d0020012d00170d0020012d00180d0020012d00190d0020012d001a0d00" + "20012d001b0d0020012d001c0d0020012d001d0d0020012d001e0d002001" + "2d001f0d00200041c1013a0020200041033a00000c020b20004200370300" + "200041c0003a0020200041186a4200370300200041106a42003703002000" + "41086a42003703000c010b200241386a200241e8006a2903003703002002" + "41306a200241e0006a290300370300200220022903503703202002200241" + "d8006a2903003703282003044020002002290320370300200020033a0020" + "200041086a2002290328370300200041186a200241386a29030037030020" + "0041106a200241306a2903003703000c010b200241003602502002410136" + "0244200241a88cc00036024020024204370248200241406b419c8dc00010" + "1a000b20024180016a24000bf90a02057f097e23004190036b2207240020" + "00290300220c200041086a290300220d8450047e420005200741f0016a20" + "0c2001104d20074190026a200d2001104d200741e0016a200c2002104d20" + "074180026a200d2002104d200741b0016a200c2003104d200741a0016a20" + "0d2003104d200741d0016a200c2004104d200741c0016a200d2004104d20" + "072903f0012112200741c8016a290300200741a8016a290300220d200729" + "03c0017c220c200d54ad7c200c200741d8016a2903007c220d200c54ad7c" + "200d20072903d001220e20072903a0017c220c200e54ad200c2007418802" + "6a29030020074198026a290300220f2007290380027c220e200f54ad7c20" + "0e200741e8016a2903007c220f200e54ad7c200f20072903e00122102007" + "290390027c220e201054ad200e200741f8016a2903007c2213200e54ad7c" + "7c2210200f54ad7c7c2211200c54ad7c2011200741b8016a290300201020" + "072903b0017c220e201054ad7c7c220f201154ad7c7c2210200d54ad7c0b" + "21112000290310220c200041186a290300220d8450047e420005200741f0" + "006a200c2001104d20074190016a200d2001104d200741e0006a200c2002" + "104d20074180016a200d2002104d200741306a200c2003104d200741206a" + "200d2003104d200741d0006a200c2004104d200741406b200d2004104d20" + "0741c8006a290300200741286a290300220320072903407c2204200354ad" + "7c2004200741d8006a2903007c2203200454ad7c20032007290350220220" + "117c2204200254ad200420072903207c2202200454ad7c20022007418801" + "6a29030020074198016a29030022012007290380017c2204200154ad7c20" + "04200741e8006a2903007c2201200454ad7c20012007290360220c200f7c" + "2204200c54ad20042007290390017c220c200454ad7c200c200741f8006a" + "29030020072903702204200e7c220e200454ad7c7c220f200c54ad7c7c22" + "0c200154ad7c7c2204200254ad7c2004200741386a290300200729033022" + "0120107c2202200154ad7c2002200c7c2210200254ad7c7c2211200454ad" + "7c7c2214200354ad7c0b2104200720143703d002200720103703c0022007" + "200e3703b002200720123703a002200720043703d802200720113703c802" + "2007200f3703b802200720133703a80220074188036a4200370300200741" + "80036a4200370300200741f8026a4200370300200742003703f002200741" + "f0026a210a41ff032109420021034200210442002101420021024201210d" + "0340200741106a2009410776410474220b200741a0026a6a220829030020" + "08290308200941ff00712208104e2004423f88210c20044201862003423f" + "888421042007290310420183200342018684210302400240024002400240" + "200c200142018684220c42ddb0858ce8b691a8b87f852002420186200142" + "3f8884220242a9c0c689aece93b230858450044020032005542004200654" + "20042006511b450d0142ddb0858ce8b691a8b87f210142a9c0c689aece93" + "b23021020c020b200c42ddb0858ce8b691a8b87f58200242a9c0c689aece" + "93b23058200242a9c0c689aece93b230511b450d00200c21010c010b2002" + "42a9c0c689aece93b2307d200c42a3cffaf397c9eed7c7007c2202200420" + "0654ad200420067d22042003200554ad220f54ad7c7d220142017c221020" + "0254ad200c42ddb0858ce8b691a8b87f54ad7d2010420052ad7c50ad7d21" + "022004200f7d2104200320057d2103200941016a41810249200d42005271" + "0d014200210d0b2009450d010c020b4201210d20072008104f200a200b6a" + "22082008290300200729030084370300200841086a220820082903002007" + "41086a2903008437030020090d010b200020023703182000200137031020" + "0020043703082000200337030020074190036a24000f0b200941016b2109" + "0c000b000beb0101017f41e0a9c00041e0a9c0002d00002200410120001b" + "3a00000240200004400340024002400240200041016b0e03000501020b03" + "4041e0a9c0002d000022004101460d000b02400240200041016b0e030006" + "01030b000b41a49bc000412641cc9bc0001011000b41a89ac000410d4194" + "9bc0001011000b41e0a9c00041e0a9c0002d00002200410120001b3a0000" + "20000d000b0b41d8a9c00042a9c0c689aece93b23037030041d0a9c00042" + "ddb0858ce8b691a8b87f37030041c8a9c000428d95c7c396d2dac0977f37" + "030041c0a9c00042c7faf3c3ed82a3903c37030041e0a9c00041023a0000" + "0b0b840202047e017f200041086a29030021092000290300210a0240417f" + "2000290310220b200385200041186a290300220c20048584420052200320" + "0b562004200c562004200c511b1b220d417f470440200d41ff01710d0120" + "01200a58200220095820022009511b0d010b20072007200b7c220756ad20" + "07200620097c220b200654ad200b2005200a7c220a200554ad7c2209200b" + "54ad7c7c220b200754ad7c2008200c7c7c210c0b2000200a20017d370300" + "2000200920027d22072001200a56ad22017d37030820002003427f852203" + "200b7c220a2002200956ad2001200756ad7c7d42017c2209370310200020" + "0c20047d2003200a56ad2009200a54ad7c50ad7d3703180bbe3c020e7f04" + "7e23004180016b2203240041bda9c0002d00001a0240412010012202450d" + "00200242a9c0c689aece93b230370018200242ddb0858ce8b691a8b87f37" + "00102002428d95c7c396d2dac0977f370008200242c7faf3c3ed82a3903c" + "3700002003200210262000027f0240024002400240024002400240024002" + "40024002400240024002400240027f024002400240024002400240024002" + "7f02400240027f0240024002400240024002400240024002400240024002" + "400240024002400240024002400240200241046b28020022044178714124" + "4128200441037122051b4f044020054100200441c8004f1b0d0120021004" + "41bda9c0002d00001a412010012202450d30200241186a2204200141186a" + "290000370000200220012900002210370000200241106a2205200141106a" + "290000370000200241086a2208200141086a29000037000020022002411f" + "6a22012d00003a0000200120103c000020022d0001210120022002411e6a" + "22072d00003a0001200720013a00002002411d6a22012d00002107200120" + "022d00023a0000200220073a00022002411c6a22012d0000210720012002" + "2d00033a0000200220073a00032002411b6a22012d00002107200120022d" + "00043a0000200220073a00042002411a6a22012d00002107200120022d00" + "053a0000200220073a0005200241196a22012d00002107200120022d0006" + "3a0000200220073a000620042d00002101200420022d00073a0000200220" + "013a0007200241176a22012d00002104200120082d00003a000020082004" + "3a0000200241166a22012d00002104200120022d00093a0000200220043a" + "0009200241156a22012d00002104200120022d000a3a0000200220043a00" + "0a200241146a22012d00002104200120022d000b3a0000200220043a000b" + "200241136a22012d00002104200120022d000c3a0000200220043a000c20" + "0241126a22012d00002104200120022d000d3a0000200220043a000d2002" + "41116a22012d00002104200120022d000e3a0000200220043a000e20052d" + "00002101200520022d000f3a0000200220013a000f2003410c6a20021026" + "200241046b280200220141787141244128200141037122041b490d022004" + "4100200141c8004f1b0d032002100420032802082202450d120240024002" + "40200241016b220241feffffff0371450440200241ffffffff0371220441" + "016a2205410371210142002110200328020422082102200441034f044020" + "0541fcffffff07712104034020104280017c2110200241106a2102200441" + "046b22040d000b0b2001450d020340200235020020108620117c21112010" + "42207c2110200241046a2102200141016b22010d000b2011428080808010" + "540d010b200341406b200341146a2802003602002003200329020c370338" + "200341d0006a200341086a28020022043602002003200329020037034820" + "04450d0720032802402207450440200341206a418098c000280200220236" + "02002003412c6a2002360200200341f897c0002902002210370318200320" + "10370224200328024822020440200328024c220441046b28020022014178" + "7122052002410274220241044108200141037122011b6a490d0a20014100" + "2005200241276a4b1b0d0b200410040b20032802382202450d2520032802" + "3c220441046b280200220141787122052002410274220241044108200141" + "037122011b6a490d0b200141002005200241276a4b1b0d0c200410040c25" + "0b0240027f02400240024020044101460440200328024c220c2802002202" + "4101470d012003412c6a418098c000280200360200200341206a20034114" + "6a2802003602002003200329020c370318200341f897c000290200370224" + "20032802482202450d2a200c41046b280200220141787122042002410274" + "220241044108200141037122011b6a490d12200141002004200241276a4b" + "1b0d13200c10040c2a0b200328024c210c200328023c210b0240417f2004" + "200747200420074b1b22050d0020074102742102200b41046b2106200441" + "02742101200c41046b2109200420076b21070340200204402001450d0720" + "0220066a2105200120096a2108200241046b2102200141046b2101417f20" + "082802002208200528020022054720052008491b2205450d010c020b0b41" + "7f4100200741ffffffff03711b21050b200541ff01710e020204010b2002" + "450d1220074102742101200328023c2109200241ffff034d044020094104" + "6b2106410021040340200120066a22052005280200220541107622082008" + "20044110747220026e220420026c6b411074200541ffff03717222052002" + "6e22082004411074723602002005200220086c6b2104200141046b22010d" + "000b0c280b2002ad2110200741ffffffff036a220541ffffffff03712202" + "45044042002111200120096a0c270b200241016a41feffffff0771210120" + "0741027420096a41086b2102420021110340200241046a22042004350200" + "201142208684221120108022123e0200200220023502002011201020127e" + "7d42208684221120108022123e02002011201020127e7d2111200241086b" + "2102200141026b22010d000b0c250b2003412c6a200341146a2802003602" + "002003200329020c370224200341186a0c010b2003410036024020032802" + "38047f200b05200341386a418c87c0001023200328023c0b410136020020" + "0341406b4101360200200341206a41013602002003200329033837031820" + "0341246a0b220241086a418098c000280200360200200241f897c0002902" + "0037020020032802482202450d25200c41046b2802002201417871220420" + "02410274220241044108200141037122011b6a490d102001410020042002" + "41276a4b1b0d11200c10040c250b200c20044102746a41046b2202450d20" + "20022802002202672208450440200341f8006a200341146a280200360200" + "2003200329020c370370200341186a200341f0006a200c20041024200328" + "02482202450d25200c41046b280200220141787122042002410274220241" + "044108200141037122011b6a490d12200141002004200241276a4b1b0d13" + "200c10040c250b024002402003280238418080808078470d00200b280208" + "0d002003410036026c20034280808080c0003702640c010b200341e4006a" + "2003410c6a2002452008411f7110250b200341186a200341e4006a027f02" + "402003280248418080808078470d00200c2802080d004100210420034100" + "3602704100210541040c010b200341f0006a20032002452008411f711025" + "200328027021042003280278210520032802740b220120051024200341e0" + "006a200341206a28020036020020032003290218370358200328022c2105" + "200328022821092003280224210c20040440200141046b28020022074178" + "7122062004410274220441044108200741037122071b6a490d1420074100" + "2006200441276a4b1b0d15200110040b02400240200c4180808080784604" + "404100210120092802080d0141042105410021040c220b41002101200545" + "0d20200520024522044d0d20200520046b210b20020d0102400240200b41" + "0274220a20092206200620044102746a22056b4b04402005200a6a210120" + "06200a6a2106200a4110490d0141002006410371220d6b210e0240200641" + "7c71220220064f0d00200d41016b210f0240200d450440200121040c010b" + "200d2107200121040340200641016b2206200441016b22042d00003a0000" + "200741016b22070d000b0b200f4103490d00200441046b21040340200641" + "016b200441036a2d00003a0000200641026b200441026a2d00003a000020" + "0641036b200441016a2d00003a0000200641046b220620042d00003a0000" + "200441046b210420022006490d000b0b2002200a200d6b2204417c71220a" + "6b21064100200a6b210702402001200e6a2201410371450440200220064d" + "0d01200420056a41046b21050340200241046b2202200528020036020020" + "0541046b2105200220064b0d000b0c010b200220064d0d00200141037422" + "0a411871210d2001417c71220f41046b21054100200a6b411871210e200f" + "280200210a0340200241046b2202200a200e742005280200220a200d7672" + "360200200541046b2105200220064b0d000b0b2004410371210a20012007" + "6a21010c010b200a41104f044002402006410020066b41037122076a2204" + "20064d0d00200741016b210d200521022007044020072101034020062002" + "2d00003a0000200241016a2102200641016a2106200141016b22010d000b" + "0b200d4107490d000340200620022d00003a0000200641016a200241016a" + "2d00003a0000200641026a200241026a2d00003a0000200641036a200241" + "036a2d00003a0000200641046a200241046a2d00003a0000200641056a20" + "0241056a2d00003a0000200641066a200241066a2d00003a000020064107" + "6a200241076a2d00003a0000200241086a2102200641086a22062004470d" + "000b0b2004200a20076b2201417c71220d6a21060240200520076a220241" + "0371450440200420064f0d01200221050340200420052802003602002005" + "41046a2105200441046a22042006490d000b0c010b200420064f0d002002" + "410374220a41187121072002417c71220f41046a21054100200a6b411871" + "210e200f280200210a03402004200a2007762005280200220a200e747236" + "0200200541046a2105200441046a22042006490d000b0b2001410371210a" + "2002200d6a21050b20062006200a6a22044f0d01200a41016b2101200a41" + "0771220204400340200620052d00003a0000200541016a2105200641016a" + "2106200241016b22020d000b0b20014107490d010340200620052d00003a" + "0000200641016a200541016a2d00003a0000200641026a200541026a2d00" + "003a0000200641036a200541036a2d00003a0000200641046a200541046a" + "2d00003a0000200641056a200541056a2d00003a0000200641066a200541" + "066a2d00003a0000200641076a200541076a2d00003a0000200541086a21" + "05200641086a22062004470d000b0c010b2006200a6b220220064f0d0020" + "0a41016b2104200a410371220504400340200641016b2206200141016b22" + "012d00003a0000200541016b22050d000b0b20044103490d00200141046b" + "21050340200641016b200541036a2d00003a0000200641026b200541026a" + "2d00003a0000200641036b200541016a2d00003a0000200641046b220620" + "052d00003a0000200541046b210520022006490d000b0b0c010b41042105" + "200941046a28020021072009280208220420024522024d04402004410274" + "21022004044041bda9c0002d00001a200210012205450d360b2005200720" + "02104c1a0c210b41bda9c0002d00001a200420026b220b41027422011001" + "2209450d342009200720024102746a2001104c1a200b210c0b2008411f71" + "2201450d1c200b450440410021010c1e0b41002105410020086b411f7121" + "042009200b4102746a2102200b41016b41ffffffff0371220741016a2206" + "410371210820074103490d1b200641fcffffff077121070340200241046b" + "220620062802002206200176200572360200200241086b22052006200474" + "20052802002205200176723602002002410c6b2206200520047420062802" + "00220620017672360200200241106b220220062004742002280200220520" + "01767236020020052004742105200741046b22070d000b0c1b0b2011500d" + "14200328021421022003280210210502402011428080045a04402002450d" + "0320024102742104200241ffffffff036a220741ffffffff037122020d01" + "42002110200420056a0c180b2002450d022011a721040c180b200241016a" + "41feffffff07712101200420056a41086b21024200211003402002350200" + "200241046a35020020104220868420118242208684201182211020024108" + "6b2102200141026b22010d000b0c150b2003280210210520032802142202" + "0d160b410421074100210241000c170b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b41f996c000412e41a897c000" + "1011000b41b897c000412e41e897c0001011000b20034100360228200341" + "0136021c200341a099c00036021820034204370220200341186a41fc86c0" + "00101a000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b41f996c000412e41a897c0001011000b41b897c000412e" + "41e897c0001011000b41f996c000412e41a897c0001011000b41b897c000" + "412e41e897c0001011000b200341003602282003410136021c200341a099" + "c00036021820034204370220200341186a41ec86c000101a000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b200341003602282003410136021c200341a099c00036021820034204" + "370220200341186a41989ac000101a000b200241086a0b21022007410171" + "047e201005200241046b3502002010422086842011820ba721010c010b20" + "0241027421024100210103402001411074200241046b220220056a280200" + "220141107672200470411074200141ffff037172200470210120020d000b" + "0b41002102200341206a418098c000280200360200200341f897c0002902" + "0037031820014504404104210741000c010b200341186a41f498c0001023" + "200328021c220720013602004101210220032802180b210a024002400240" + "0240200328020022010440200841046b2802002204417871220620014102" + "74220141044108200441037122041b6a490d01200441002006200141276a" + "4b1b0d02200810040b200328020c2201450d0e200541046b280200220441" + "787122082001410274220141044108200441037122041b6a490d02200441" + "002008200141276a4b1b0d03200510040c0e0b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b41f996c000412e41a8" + "97c0001011000b41b897c000412e41e897c0001011000b2008450d002002" + "41046b21020340200220022802002207200176200572360200200241046b" + "210220072004742105200841016b22080d000b0b41002101200b450d0020" + "09200b41027422026a41046b2802000440200b21010c010b200941046b21" + "07200b41ffffffff037121040340200421052002450d01200441016b2104" + "200220076a2108200241046b21022008280200450d000b200b2005200520" + "0b4b1b21010b2001200c4102764f0d00024002402001200c4d0440410021" + "04200c450440200921050c050b200c41027421022001450440200941046b" + "2802002205417871220841044108200541037122051b20026a490d022005" + "41002008200241276a4b1b0d0320091004410421050c050b200121042009" + "200241042001410274101522050d040c180b200341003602282003410136" + "021c200341ec84c00036021820034204370220200341186a41f484c00010" + "1a000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b200c2104200921050b200341206a200341e0006a2802003602" + "00200320032903583703182003200136022c200320053602282003200436" + "02240c040b419c87c0001020000b200241086a0b21022005410171047e20" + "1105200241046b22022002350200201142208684221120108022123e0200" + "2011201020127e7d0ba721040b2003280238210b02402009200741027422" + "026a41046b2802000d00200941046b210620072101034020012105200245" + "0440410021070c020b200541016b2101200220066a2108200241046b2102" + "2008280200450d000b20072005200520074b1b21070b0240200b41027620" + "074d0440200b21020c010b2007200b4b0d0341002102200b450d00200b41" + "027421012007450440200941046b28020022054178712208410441082005" + "41037122051b20016a490d05200541002008200141276a4b1b0d06200910" + "04410421090c010b2009200141042007220241027410152209450d100b20" + "034100360250200404402003280248047f200c05200341c8006a41dc86c0" + "001023200328024c0b2004360200200341013602500b2003412c6a200341" + "d0006a280200360200200320032903483702242003200936021c20032002" + "3602180b200328022c2102200328022821072003280224210a2003280218" + "2201450d00200328021c220541046b280200220441787122082001410274" + "220141044108200441037122041b6a490d04200441002008200141276a4b" + "1b0d05200510040b200245044041bda9c0002d00001a4101210d41011001" + "2204450d0e200441003a0000410121010c080b4100210102402002ad4205" + "86200720024102746a41046b28020067ad7d221042038820104207834200" + "52ad7c221050044041012104410021050c010b41bda9c0002d00001a2010" + "a7220510012204450d0e0b200341003602202003200436021c2003200536" + "02182007200241016b22054102746a210920050440200241027441046b21" + "06410021020340200220076a280200210120032802182002460440200341" + "186a41ac88c0001018200328021c21040b200220046a20013a0000200320" + "0241016a2205360220200141087621082003280218200546044020034118" + "6a41ac88c0001018200328021c21040b200220046a41016a20083a000020" + "03200541016a220536022020014110762108200328021820054604402003" + "41186a41ac88c0001018200328021c21040b200220046a41026a20083a00" + "002003200541016a22053602202001411876210120032802182005460440" + "200341186a41ac88c0001018200328021c21040b200220046a41036a2001" + "3a00002003200541016a2205360220200241046a21012005210220012006" + "470d000b0b20092802002202450d05034020032802182001460440200341" + "186a419c88c00010180b200328021c220420016a20023a00002003200141" + "016a2201360220200241ff014b21052002410876210220050d000b0c060b" + "200341003602282003410136021c200341ec84c000360218200342043702" + "20200341186a41f484c000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b200328021c21040b200328" + "0218210d200141014b0d010b200341306a4200370300200341286a420037" + "0300200341206a4200370300200342003703180c010b200120046a210c41" + "002102200141017622084101470440200141016b2105200841feffffff07" + "71210b0340200420056a22062d000021092006200220046a22082d00003a" + "0000200820093a0000200c2002417e736a22062d00002109200620084101" + "6a22082d00003a0000200820093a0000200541026b2105200b200241026a" + "2202470d000b0b20014102710440200220046a22052d000021082005200c" + "2002417f736a22022d00003a0000200220083a00000b200341306a420037" + "0300200341286a4200370300200341206a42003703002003420037031820" + "0141204b0d010b200320016b41386a20042001104c1a2003290328221042" + "388620104280fe0383422886842010428080fc0783421886201042808080" + "f80f834208868484201042088842808080f80f832010421888428080fc07" + "838420104228884280fe038320104238888484842112200341306a290300" + "221042388620104280fe0383422886842010428080fc0783421886201042" + "808080f80f834208868484201042088842808080f80f8320104218884280" + "80fc07838420104228884280fe038320104238888484842113417f200329" + "0318221042b0c8b99297bc8cd02985200341206a290300221142b8a195b2" + "9bb0a0acdd008584420052201142388620114280fe038342288684201142" + "8080fc0783421886201142808080f80f8342088684842011420888428080" + "80f80f832011421888428080fc07838420114228884280fe038320114238" + "88848484221142ddb0858ce8b691a8b87f54201042388620104280fe0383" + "422886842010428080fc0783421886201042808080f80f83420886848420" + "1042088842808080f80f832010421888428080fc07838420104228884280" + "fe03832010423888848484221042a9c0c689aece93b23054201042a9c0c6" + "89aece93b230511b1b2202417f47044041022101200241ff01710d022013" + "42c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95" + "c7c396d2dac0977f511b450d020b20002011370320200020133703102000" + "20103703282000201237031841000c020b410021010b200020013a000141" + "010b3a00000240024002400240200a0440200741046b2802002202417871" + "2201200a410274220541044108200241037122021b6a490d012002410020" + "01200541276a4b1b0d02200710040b200d0440200441046b280200220241" + "7871220141044108200241037122021b200d6a490d03200241002001200d" + "41276a4b1b0d04200410040b20034180016a24000f0b41f996c000412e41" + "a897c0001011000b41b897c000412e41e897c0001011000b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b000bc80d" + "02057f167e230041e0006b22032400200341386a2204200141186a290300" + "370300200341306a2205200141106a290300370300200320012903003703" + "202003200141086a29030037032842ddb0858ce8b691a8b87f2112200341" + "206a20022903002219200241086a290300221a2002290310221b20024118" + "6a290300221c42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "042903002113200529030021142003290320211520032903282116200341" + "106a2206200141306a290300370300200341186a2207200141386a290300" + "370300200320012903203703002003200141286a29030037030820032002" + "290320220e200241286a290300220c20022903302211200241386a290300" + "221d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004200729" + "030037030020052006290300370300200320032903083703282003200329" + "0300370320200341206a42c6faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b02400240024020142005290300220b" + "7c220d2016200329032822087c2209200854ad2009201520032903202208" + "7c220a200854ad7c2208200954ad7c7c220942ddb0858ce8b691a8b87f85" + "200b200d56ad2009200d54ad7c201320042903007c7c220d42a9c0c689ae" + "ce93b2308584500440200a42c7faf3c3ed82a3903c542008428d95c7c396" + "d2dac0977f542008428d95c7c396d2dac0977f511b450d0242a9c0c689ae" + "ce93b230210d0c010b200942deb0858ce8b691a8b87f54200d42a9c0c689" + "aece93b23054200d42a9c0c689aece93b230511b450d01200921120b200a" + "2117200821180c010b200d20092008200a42c7faf3c3ed82a3903c7d2217" + "200a5aad220a7d220b42f3eab8bce9ada5bfe8007c2218200b54ad200820" + "0a54ad7d7c2208200954ad200842a2cffaf397c9eed7c7007c2212200854" + "ad7c50ad7d42a9c0c689aece93b2307d210d0b42ddb0858ce8b691a8b87f" + "210f024002402001290330221020012903107c2209200141286a29030022" + "0a200141086a2903007c2208200a54ad20082001290320220a2001290300" + "7c220b200a54ad7c220a200854ad7c7c220842ddb0858ce8b691a8b87f85" + "2009201054ad2008200954ad7c200141386a290300200141186a2903007c" + "7c220942a9c0c689aece93b2308584500440200b42c7faf3c3ed82a3903c" + "54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f511b" + "450d01200b2110200a210b42a9c0c689aece93b23021090c020b200842de" + "b0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689" + "aece93b230511b450d00200b2110200a210b2008210f0c010b2009200820" + "0a200b42c7faf3c3ed82a3903c7d2210200b5aad220f7d220942f3eab8bc" + "e9ada5bfe8007c220b200954ad200a200f54ad7d7c220a200854ad200a42" + "a2cffaf397c9eed7c7007c220f200a54ad7c50ad7d42a9c0c689aece93b2" + "307d21090b2003200f37035020032010370340200320093703582003200b" + "37034842ddb0858ce8b691a8b87f210b024002402011201b7c2209200c20" + "1a7c2208200c54ad2008200e20197c220c200e54ad7c220a200854ad7c7c" + "220842ddb0858ce8b691a8b87f852009201154ad2008200954ad7c201c20" + "1d7c7c220942a9c0c689aece93b2308584500440200c42c7faf3c3ed82a3" + "903c54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f" + "511b450d01200c210e200a210c42a9c0c689aece93b23021090c020b2008" + "42deb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0" + "c689aece93b230511b450d00200c210e200a210c2008210b0c010b200920" + "08200a200c42c7faf3c3ed82a3903c7d220e200c5aad22117d220b42f3ea" + "b8bce9ada5bfe8007c220c200b54ad200a201154ad7d7c220a200854ad20" + "0a42a2cffaf397c9eed7c7007c220b200a54ad7c50ad7d42a9c0c689aece" + "93b2307d21090b200341406b200e200c200b200942c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341406b201520162014201342c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d200341406b200329030020032903082003290310" + "200341186a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2000200d37031820" + "002012370310200020183703082000201737030020002003290340370320" + "200041286a2003290348370300200041306a200341d0006a290300370300" + "200041386a200341d8006a290300370300200341e0006a24000ba706010a" + "7e42ddb0858ce8b691a8b87f210a02400240024020022903102206200129" + "03107c2207200241086a2903002203200141086a2903007c2204200354ad" + "20042002290300220320012903007c2205200354ad7c2203200454ad7c7c" + "220442ddb0858ce8b691a8b87f852006200756ad2004200754ad7c200241" + "186a290300200141186a2903007c7c220742a9c0c689aece93b230858450" + "0440200542c7faf3c3ed82a3903c542003428d95c7c396d2dac0977f5420" + "03428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021070c" + "010b200442deb0858ce8b691a8b87f54200742a9c0c689aece93b2305420" + "0742a9c0c689aece93b230511b450d012004210a0b2005210b2003210c0c" + "010b200720042003200542c7faf3c3ed82a3903c7d220b20055aad22057d" + "220642f3eab8bce9ada5bfe8007c220c200654ad2003200554ad7d7c2203" + "200454ad200342a2cffaf397c9eed7c7007c220a200354ad7c50ad7d42a9" + "c0c689aece93b2307d21070b42ddb0858ce8b691a8b87f21080240024020" + "02290330220920012903307c2204200241286a2903002205200141286a29" + "03007c2203200554ad20032002290320220520012903207c2206200554ad" + "7c2205200354ad7c7c220342ddb0858ce8b691a8b87f852004200954ad20" + "03200454ad7c200241386a290300200141386a2903007c7c220442a9c0c6" + "89aece93b2308584500440200642c7faf3c3ed82a3903c542005428d95c7" + "c396d2dac0977f542005428d95c7c396d2dac0977f511b450d0120062109" + "2005210642a9c0c689aece93b23021040c020b200342deb0858ce8b691a8" + "b87f54200442a9c0c689aece93b23054200442a9c0c689aece93b230511b" + "450d002006210920052106200321080c010b200420032005200642c7faf3" + "c3ed82a3903c7d220920065aad22087d220442f3eab8bce9ada5bfe8007c" + "2206200454ad2005200854ad7d7c2205200354ad200542a2cffaf397c9ee" + "d7c7007c2208200554ad7c50ad7d42a9c0c689aece93b2307d21040b2000" + "2008370330200020093703202000200a3703102000200b37030020002004" + "37033820002006370328200020073703182000200c3703080bf10802087f" + "087e23004180016b22022400200141386a290300210e200141286a290300" + "210b200141186a2203290300210d2001290330210f2001290320210a2001" + "290310210c02400240024020012903002210200141086a22042903002211" + "844200520d00200c200d844200520d00200a200b844200520d00200e200f" + "84500d010b200241186a22052003290300370300200241106a2206200141" + "106a22072903003703002002200429030037030820022001290300370300" + "200220102011200c200d42c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200241386a2204200141206a220341186a29030037030020024130" + "6a2208200341106a22092903003703002002200341086a29030037032820" + "022003290300370320200241206a200a200b200f200e42c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b200241206a42c6faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200229" + "032020022903282008290300200429030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2000027e2002290300220d2006290300220c842002290308220b200529" + "0300220a84845004404200210f42000c010b200241d8006a2204200a3703" + "002002200c3703502002200d3703402002200b370348200242a9c0c689ae" + "ce93b230370378200242ddb0858ce8b691a8b87f3703702002428d95c7c3" + "96d2dac0977f370368200242c7faf3c3ed82a3903c370360200241406b20" + "0241e0006a103a2004290300210d2002290348210c2002290340210b2002" + "290350210a200241d0006a20072903003703002004200141186a29030037" + "0300200220012903003703402002200141086a290300370348200241406b" + "200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200241f8006a2201200341186a290300370300200241f0006a22042009" + "2903003703002002200341086a2903003703682002200329030037036020" + "0241e0006a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f102b2004290300220c20022903602210842001290300220e2002" + "290368220b84845004404200210c4200210b4200210a4200210e4200210f" + "42010c010b4200210f427f4200427f4200201042788342c7faf3c3ed82a3" + "903c561b220a200a200b54ad7d200a200b7d220a42f3eab8bce9ada5bfe8" + "007d220b200a54ad7c42017c2211200c7d220d42a4cffaf397c9eed7c700" + "7d220a200d54ad200c201156ad7d427f511b200e7d42a9c0c689aece93b2" + "307c210e42c7faf3c3ed82a3903c20107d210c42010b3703002000200a37" + "03402000200c370330200020022903403703102000200f3703082000200e" + "3703482000200b370338200041186a2002290348370300200041206a2002" + "41d0006a290300370300200041286a200241d8006a2903003703000c010b" + "20004200370308200042003703000b20024180016a24000b090020004100" + "3602000b7b01027f230041106b2203240041f0a5c00041f0a5c000280200" + "220441016a360200024020044100480d00024041bca9c0002d0000450440" + "41b8a9c00041b8a9c00028020041016a36020041eca5c00028020041004e" + "0d010c020b200341086a20002001110000000b41bca9c00041003a000020" + "02450d00000b000b0c00200020012902003703000bba0201047f411f2102" + "20004200370210200141ffffff074d04402001410620014108766722026b" + "7641017120024101746b413e6a21020b2000200236021c200241027441f4" + "a5c0006a2103410120027422044190a9c000280200714504402003200036" + "0200200020033602182000200036020c200020003602084190a9c0004190" + "a9c0002802002004723602000f0b02400240200120032802002204280204" + "417871460440200421020c010b2001411920024101766b41002002411f47" + "1b742103034020042003411d764104716a41106a22052802002202450d02" + "200341017421032002210420022802044178712001470d000b0b20022802" + "082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080bd20102067f017e230041206b2201240002400240200028" + "02002203417f460d00410420034101742202200341016a2204200220044b" + "1b2202200241044d1b2204ad42e0007e22074220884200520d002007a722" + "0641f0ffffff074b0d004100210220012003047f2001200341e0006c3602" + "1c2001200028020436021441100520020b360218200141086a2006200141" + "146a103720012802084101470d0120012802102102200128020c21050b20" + "0541dca4c0001019000b200128020c210320002004360200200020033602" + "04200141206a24000b7f01017f027f0240027f0240200228020404402002" + "28020822034504402001450d0441bda9c0002d00001a0c020b2002280200" + "20034110200110150c020b2001450d0241bda9c0002d00001a0b2001100b" + "0b2202411020021b21032002450c010b4110210341000b21022000200136" + "020820002003360204200020023602000bd20102067f017e230041206b22" + "0124000240024020002802002203417f460d004104200341017422022003" + "41016a2204200220044b1b2202200241044d1b2204ad42c0017e22074220" + "884200520d002007a7220641f0ffffff074b0d004100210220012003047f" + "2001200341c0016c36021c2001200028020436021441100520020b360218" + "200141086a2006200141146a103720012802084101470d01200128021021" + "02200128020c21050b200541eca4c0001019000b200128020c2103200020" + "0436020020002003360204200141206a24000bdd0102067f017e23004120" + "6b2202240020002802002204417f460440410020011019000b4104200441" + "01742203200441016a2205200320054b1b2203200341044d1b2205ad42c0" + "017e22084220884200520440410020011019000b02402008a7220741f0ff" + "ffff074d04404100210320022004047f2002200441c0016c36021c200220" + "0028020436021441100520030b360218200241086a2007200241146a1037" + "20022802084101470d01200228020c2106200228021021030b2006200110" + "19000b200228020c21042000200536020020002004360204200241206a24" + "000b830b02037f167e230041c0016b22022400200241186a220320004118" + "6a290300370300200241106a2204200041106a2903003703002002200029" + "03003703002002200041086a290300370308200241386a200141186a2903" + "002218370300200241306a200141106a2903002213370300200220014108" + "6a2903002214370328200220012903002215370320200242003703582002" + "42003703502002420037034820024201370340200241f8006a2201420037" + "0300200241f0006a42003703002002420037036820024200370360200329" + "0300210e2004290300210f2002290308210a200229030021072013211020" + "182111201521082014210b03400240200242003703980120024200370390" + "0120024200370388012002420137038001200220024180016a104a450440" + "200241406b21010c010b200241b8016a20024198016a2903003703002002" + "41b0016a20024190016a29030037030020022002290388013703a8012002" + "2002290380013703a001200241206a200241a0016a104a450440200241e0" + "006a21010c010b200241d8006a2903002112200229035021052002290348" + "21162002290340210d2007a74101714504400340200a423f862007420188" + "8421070240200da74101714504402016423f86200d42018884210d200542" + "3f8620164201888421160c010b200520137c2209201420167c2205201454" + "ad2005200d20157c220d201554ad7c2206200554ad7c7c2205423f862006" + "4201888421162006423f86200d42018884210d2009201354ad2005200954" + "ad7c201220187c7c21120b200f423f86200a42018884210a200e423f8620" + "0f42018884210f200e420188210e2012423f862005420188842105201242" + "018821122007420183500d000b2002200f3703102002200e3703180b2002" + "20053703502002200d370340200220073703002002201237035820022016" + "3703482002200a3703082001290300210920022903702106200229036821" + "172002290360210c2008a74101714504400340200b423f86200842018884" + "21080240200c420183a70440200620137c2219201420177c2206201454ad" + "2006200c20157c221a201554ad7c220c200654ad7c7c2206423f86200c42" + "0188842117200c423f86201a42018884210c2013201956ad2006201954ad" + "7c200920187c7c21090c010b2017423f86200c42018884210c2006423f86" + "20174201888421170b2010423f86200b42018884210b2011423f86201042" + "0188842110201142018821112009423f8620064201888421062009420188" + "21092008420183500d000b20022010370330200220113703380b20022006" + "3703702002200c3703602002200837032020022009370378200220173703" + "682002200b37032802400240200f201085200e2011858450044020072008" + "54200a200b54200a200b511b0d010c020b200f201056200e201156200e20" + "11511b0d010b2002200820077d427e8322063703202002200b200a7d2209" + "2007200856ad22087d220c37032820024201200a200b56ad2008200956ad" + "7c7d2208200f7d220b20107c220942017d221037033020022011200e7d20" + "09420052ad2009200b54ad2008200f54ad7d7c50ad7d2211370338200241" + "e0006a200d2016200520122015201420132018102d20062108200c210b0c" + "020b2002200720087d427e8322123703002002200a200b7d220520072008" + "54ad22077d220d37030820024201200a200b54ad2005200754ad7c7d2207" + "200f7c220520107d220a42017d220f3703102002200e20117d200a420052" + "ad2005200754ad2005201054ad7d7c50ad7d220e370318200241406b200c" + "2017200620092015201420132018102d20122107200d210a0c010b0b2000" + "2001290300370300200041186a200141186a290300370300200041106a20" + "0141106a290300370300200041086a200141086a290300370300200241c0" + "016a24000bc92602357f187e230041c0066b22032400200341386a222b20" + "0141386a2226290300370300200341306a222c200141306a220e29030037" + "0300200341286a222d200141286a220f290300370300200341206a222e20" + "0141206a2210290300370300200341186a222f200141186a221129030037" + "0300200341106a2230200141106a22122903003703002003200129030037" + "03002003200141086a2227290300370308200320012002102f200341f800" + "6a2214200141f8006a2204290300370300200341f0006a2215200141f000" + "6a2205290300370300200341e8006a2216200141e8006a22062903003703" + "00200341e0006a2217200141e0006a2207290300370300200341d8006a22" + "0a200141d8006a2208290300370300200341d0006a220b200141d0006a22" + "092903003703002003200141c8006a220c29030037034820032001290340" + "370340200341406b200141406b2213200241406b2228102f200341b8016a" + "2220200141b8016a290300370300200341b0016a2221200141b0016a2903" + "00370300200341a8016a2222200141a8016a290300370300200341a0016a" + "2223200141a0016a29030037030020034198016a222420014198016a2903" + "0037030020034190016a222520014190016a290300370300200320014188" + "016a2903003703880120032001290380013703800120034180016a200141" + "80016a222920024180016a222a102f200341f8016a221820042903003703" + "00200341f0016a22192005290300370300200341e8016a221a2006290300" + "370300200341e0016a221b2007290300370300200341d8016a221c200829" + "0300370300200341d0016a221d20092903003703002003200c2903003703" + "c801200320012903403703c001200341c0016a201320291030200341b802" + "6a200241f8006a290300370300200341b0026a200241f0006a2903003703" + "00200341a8026a200241e8006a290300370300200341a0026a200241e000" + "6a29030037030020034198026a200241d8006a2903003703002003419002" + "6a200241d0006a2903003703002003200241c8006a290300370388022003" + "20022903403703800220034180026a2028202a1030200341c0056a200341" + "c0016a20034180026a102f2018200341f8056a2204290300370300201920" + "0341f0056a2205290300370300201a200341e8056a220629030037030020" + "1b200341e0056a2207290300370300201c200341d8056a22082903003703" + "00201d200341d0056a2209290300370300200320032903c8053703c80120" + "0320032903c0053703c00120034198066a220c201c290300370300200341" + "90066a220d201d290300370300200320032903c801370388062003200329" + "03c0013703800620034180066a2003290340223820032903482239200b29" + "0300223a200a290300223b42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341b806" + "6a220a2018290300370300200341b0066a220b2019290300370300200320" + "1a2903003703a8062003201b2903003703a006200341a0066a2017290300" + "223c2016290300223d2015290300223e2014290300223f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200c29030022403703002009200d29030022413703" + "00200720032903a00622423703002005200b290300224337030020062003" + "2903a80622443703002004200a2903002245370300200320032903880622" + "463703c805200320032903800622473703c0052018204537030020192043" + "370300201a2044370300201b2042370300201c2040370300201d20413703" + "00200320463703c801200320473703c001200c201c290300370300200d20" + "1d290300370300200320032903c80137038806200320032903c001370380" + "0620034180066a2003290380012003290388012025290300202429030042" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b8" + "7f42a9c0c689aece93b230102d200a2018290300370300200b2019290300" + "3703002003201a2903003703a8062003201b2903003703a006200341a006" + "6a202329030020222903002021290300202029030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d2008200c29030022403703002009200d290300224137030020" + "0720032903a00622423703002005200b2903002243370300200620032903" + "a80622443703002004200a29030022453703002003200329038806224637" + "03c805200320032903800622473703c00520182045370300201920433703" + "00201a2044370300201b2042370300201c2040370300201d204137030020" + "0320463703c801200320473703c001200342003703b805200342003703b0" + "05200342003703a805200342013703a00520034200370398052003420037" + "03900520034200370388052003420937038005200341c0056a200341c001" + "6a20034180056a102f201820042903003703002019200529030037030020" + "1a2006290300370300201b2007290300370300201c200829030037030020" + "1d2009290300370300200320032903c8053703c801200320032903c00537" + "03c001200341c0056a200341c0016a200310302018200429030037030020" + "192005290300370300201a2006290300370300201b200729030037030020" + "1c2008290300370300201d2009290300370300200320032903c8053703c8" + "01200320032903c0053703c001200341d0026a2214201229030037030020" + "0341d8026a22152011290300370300200341e0026a221620102903003703" + "00200341e8026a2217200f290300370300200341f0026a221e200e290300" + "370300200341f8026a221f2026290300370300200320012903003703c002" + "200320272903003703c802200341c0026a200120131030200341b8036a20" + "0241386a2231290300370300200341b0036a200241306a22322903003703" + "00200341a8036a200241286a2233290300370300200341a0036a20024120" + "6a223429030037030020034198036a200241186a22352903003703002003" + "4190036a200241106a22362903003703002003200241086a223729030037" + "038803200320022903003703800320034180036a200220281030200341c0" + "056a200341c0026a20034180036a102f201f2004290300370300201e2005" + "290300370300201720062903003703002016200729030037030020152008" + "29030037030020142009290300370300200320032903c8053703c8022003" + "20032903c0053703c002200c2015290300370300200d2014290300370300" + "200320032903c80237038806200320032903c0023703800620034180066a" + "200329030022402003290308224120302903002242202f290300224342c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200a201f290300370300200b201e29030037" + "0300200320172903003703a806200320162903003703a006200341a0066a" + "202e2903002244202d2903002245202c2903002246202b290300224742c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d2008200c29030022483703002009200d2903" + "002249370300200720032903a006224a3703002005200b290300224b3703" + "00200620032903a806224c3703002004200a290300224d37030020032003" + "29038806224e3703c8052003200329038006224f3703c005201f204d3703" + "00201e204b3703002017204c3703002016204a3703002015204837030020" + "1420493703002003204e3703c8022003204f3703c002200c201529030037" + "0300200d2014290300370300200320032903c80237038806200320032903" + "c0023703800620034180066a20382039203a203b42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200a201f290300370300200b201e290300370300200320172903" + "003703a806200320162903003703a006200341a0066a203c203d203e203f" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2008200c29030022383703002009200d" + "2903002239370300200720032903a006223a3703002005200b290300223b" + "370300200620032903a806223c3703002004200a290300223d3703002003" + "200329038806223e3703c8052003200329038006223f3703c005201f203d" + "370300201e203b3703002017203c3703002016203a370300201520383703" + "00201420393703002003203e3703c8022003203f3703c002200341f8036a" + "2020290300370300200341f0036a2021290300370300200341e8036a2022" + "290300370300200341e0036a2023290300370300200341d8036a20242903" + "00370300200341d0036a202529030037030020032003290388013703c803" + "20032003290380013703c003200341c0036a20034180016a20034180056a" + "102f200341c0056a200341c0026a200341c0036a1030201f200429030037" + "0300201e2005290300370300201720062903003703002016200729030037" + "03002015200829030037030020142009290300370300200320032903c805" + "3703c802200320032903c0053703c00220034190046a2213201229030037" + "030020034198046a22122011290300370300200341a0046a221120102903" + "00370300200341a8046a2210200f290300370300200341b0046a220f200e" + "290300370300200341b8046a220e20262903003703002003200129030037" + "038004200320272903003703880420034180046a200120291030200341f8" + "046a2031290300370300200341f0046a2032290300370300200341e8046a" + "2033290300370300200341e0046a2034290300370300200341d8046a2035" + "290300370300200341d0046a2036290300370300200320372903003703c8" + "04200320022903003703c004200341c0046a2002202a1030200341c0056a" + "20034180046a200341c0046a102f200e2004290300370300200f20052903" + "003703002010200629030037030020112007290300370300201220082903" + "0037030020132009290300370300200320032903c8053703880420032003" + "2903c00537038004200c2012290300370300200d20132903003703002003" + "2003290388043703880620032003290380043703800620034180066a2040" + "20412042204342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a200e290300370300" + "200b200f290300370300200320102903003703a806200320112903003703" + "a006200341a0066a204420452046204742c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2008200c29030022383703002009200d2903002239370300200720032903" + "a006223a3703002005200b290300223b370300200620032903a806223c37" + "03002004200a290300223d3703002003200329038806223e3703c8052003" + "200329038006223f3703c005200e203d370300200f203b3703002010203c" + "3703002011203a37030020122038370300201320393703002003203e3703" + "88042003203f37038004200341c0056a20034180046a200341406b103020" + "0e2004290300370300200f20052903003703002010200629030037030020" + "112007290300370300201220082903003703002013200929030037030020" + "0320032903c80537038804200320032903c00537038004200c2012290300" + "370300200d20132903003703002003200329038804370388062003200329" + "0380043703800620034180066a2003290380012003290388012025290300" + "202429030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d200a200e29030037030020" + "0b200f290300370300200320102903003703a806200320112903003703a0" + "06200341a0066a202329030020222903002021290300202029030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2008200c29030022383703002009200d290300" + "2239370300200720032903a006223a3703002005200b290300223b370300" + "200620032903a806223c3703002004200a290300223d3703002003200329" + "038806223e3703c8052003200329038006223f3703c005200e203d370300" + "200f203b3703002010203c3703002011203a370300201220383703002013" + "20393703002003203e370388042003203f37038004200041386a20182903" + "00370300200041306a2019290300370300200041286a201a290300370300" + "200041206a201b290300370300200041186a201c29030037030020004110" + "6a201d290300370300200041086a20032903c801370300200020032903c0" + "01370300200020032903c002370340200041c8006a20032903c802370300" + "200041d0006a2014290300370300200041d8006a20152903003703002000" + "41e0006a2016290300370300200041e8006a2017290300370300200041f0" + "006a201e290300370300200041f8006a201f290300370300200041b8016a" + "200e290300370300200041b0016a200f290300370300200041a8016a2010" + "290300370300200041a0016a201129030037030020004198016a20122903" + "0037030020004190016a201329030037030020004188016a200329038804" + "370300200020032903800437038001200341c0066a24000b830c02137f04" + "7e23004180026b22032400200341d8006a2207200141186a290300370300" + "200341d0006a2208200141106a2903003703002003200141086a29030037" + "034820032001290300370340200341406b2002290300200241086a290300" + "2002290310200241186a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "98016a2204200141386a29030037030020034190016a2205200141306a29" + "03003703002003200141286a290300370388012003200129032037038001" + "20034180016a2002290320200241286a2903002002290330200241386a29" + "030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200341186a220b20072903003703" + "00200341106a220c2008290300370300200341206a220d20032903800137" + "0300200341286a220e200329038801370300200341306a220f2005290300" + "370300200341386a22102004290300370300200320032903483703082003" + "2003290340370300200241f8006a2903002116200241e8006a2903002117" + "2002290370211820022903602119200341f8016a2209200141d8006a2903" + "00370300200341f0016a2206200141d0006a2903003703002003200141c8" + "006a2903003703e801200320012903403703e001200341e0016a20022903" + "40200241c8006a2903002002290350200241d8006a29030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2004200141f8006a2903003703002005200141f0006a" + "2903003703002003200141e8006a29030037038801200320012903603703" + "800120034180016a201920172018201642c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2007200929030037030020082006290300370300200341e0006a22112003" + "29038001370300200341e8006a2212200329038801370300200341f0006a" + "22132005290300370300200341f8006a2214200429030037030020032003" + "2903e801370348200320032903e001370340200241b8016a290300211620" + "0241a8016a290300211720022903b001211820022903a0012119200341d8" + "016a220a20014198016a290300370300200341d0016a221520014190016a" + "290300370300200320014188016a2903003703c801200320012903800137" + "03c001200341c0016a20022903800120024188016a290300200229039001" + "20024198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200141b801" + "6a2903003703002006200141b0016a2903003703002003200141a8016a29" + "03003703e801200320012903a0013703e001200341e0016a201920172018" + "201642c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2004200a29030037030020052015" + "290300370300200341a0016a220120032903e001370300200341a8016a22" + "0220032903e801370300200341b0016a220a2006290300370300200341b8" + "016a22062009290300370300200320032903c80137038801200320032903" + "c00137038001200041386a2010290300370300200041306a200f29030037" + "0300200041286a200e290300370300200041206a200d2903003703002000" + "41186a200b290300370300200041106a200c290300370300200041086a20" + "032903083703002000200329030037030020002003290340370340200041" + "c8006a2003290348370300200041d0006a2008290300370300200041d800" + "6a2007290300370300200041e0006a2011290300370300200041e8006a20" + "12290300370300200041f0006a2013290300370300200041f8006a201429" + "0300370300200041b8016a2006290300370300200041b0016a200a290300" + "370300200041a8016a2002290300370300200041a0016a20012903003703" + "0020004198016a200429030037030020004190016a200529030037030020" + "004188016a20032903880137030020002003290380013703800120034180" + "026a24000bf11902287f087e23004180056b22022400200241386a222420" + "0141386a220a290300370300200241306a2225200141306a220329030037" + "0300200241286a2226200141286a2204290300370300200241206a222720" + "0141206a2205290300370300200241186a2228200141186a220f29030037" + "0300200241106a2229200141106a22062903003703002002200129030037" + "03002002200141086a2207290300370308200220012001102f200241f800" + "6a2210200a290300370300200241f0006a22112003290300370300200241" + "e8006a22122004290300370300200241e0006a2213200529030037030020" + "0241d8006a2214200f290300370300200241d0006a221520062903003703" + "002002200729030037034820022001290300370340200241406b20012001" + "41406b2218102f20024180046a200241406b200241406b10302010200241" + "b8046a220b2903003703002011200241b0046a220c290300370300201220" + "0241a8046a220d2903003703002013200241a0046a220e29030037030020" + "1420024198046a2208290300370300201520024190046a22092903003703" + "0020022002290388043703482002200229038004370340200141f8006a22" + "19290300212a200141f0006a221a290300212b200141e8006a221b290300" + "212c200141e0006a221c290300212d200241f8046a2217200f2903003703" + "00200241f0046a220f2006290300370300200220072903003703e8042002" + "20012903003703e004200241e0046a2001290340200141c8006a221d2903" + "00200141d0006a221e290300200141d8006a221f29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200a29030037030020092003290300370300200220" + "0429030037038804200220052903003703800420024180046a202d202c20" + "2b202a42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20024198036a22032017290300" + "37030020024190036a2204200f290300370300200241a0036a2205200229" + "038004370300200241a8036a2206200229038804370300200241b0036a22" + "072009290300370300200241b8036a221620082903003703002002200229" + "03e80437038803200220022903e0043703800320024180046a2002418003" + "6a20014180016a220a10302016200b2903003703002007200c2903003703" + "002006200d2903003703002005200e290300370300200320082903003703" + "002004200929030037030020022002290388043703880320022002290380" + "043703800320024180046a20024180036a20024180036a102f2016200b29" + "03003703002007200c2903003703002006200d2903003703002005200e29" + "030037030020032008290300370300200420092903003703002002200229" + "0388043703880320022002290380043703800320024190016a2203201e29" + "030037030020024198016a2204201f290300370300200241a0016a220520" + "1c290300370300200241a8016a2206201b290300370300200241b0016a22" + "07201a290300370300200241b8016a221620192903003703002002200129" + "0340370380012002201d2903003703880120024180016a2018200a102f20" + "024180046a20024180016a20024180016a10302016200b29030037030020" + "07200c2903003703002006200d2903003703002005200e29030037030020" + "042008290300370300200320092903003703002002200229038804370388" + "01200220022903800437038001200241d0016a221820014190016a290300" + "370300200241d8016a221920014198016a290300370300200241e0016a22" + "1a200141a0016a290300370300200241e8016a221b200141a8016a290300" + "370300200241f0016a221c200141b0016a290300370300200241f8016a22" + "1d200141b8016a29030037030020022001290380013703c0012002200141" + "88016a2903003703c801200241c0016a200a200a102f200241b8026a221e" + "2016290300370300200241b0026a22162007290300370300200241a8026a" + "22072006290300370300200241a0026a2206200529030037030020024198" + "026a2205200429030037030020024190026a220420032903003703002002" + "42003703f803200242003703f003200242003703e803200242013703e003" + "200242003703d803200242003703d003200242003703c803200242093703" + "c00320022002290388013703880220022002290380013703800220024180" + "026a20024180016a200241c0036a102f20024180046a20024180026a2002" + "1030201e200b2903003703002016200c2903003703002007200d29030037" + "03002006200e290300370300200520082903003703002004200929030037" + "0300200241d0026a22032018290300370300200241d8026a221f20192903" + "00370300200241e0026a2220201a290300370300200241e8026a2221201b" + "290300370300200241f0026a2222201c290300370300200241f8026a2223" + "201d29030037030020022002290388043703880220022002290380043703" + "8002200220022903c0013703c002200220022903c8013703c802200241c0" + "026a200241c0016a200241c0036a102f20024180046a200241c0026a2002" + "41406b10302023200b2903003703002022200c2903003703002021200d29" + "03003703002020200e290300370300201f20082903003703002003200929" + "030037030020022002290388043703c80220022002290380043703c00220" + "024180046a200241406b20024180036a10302010200b2903003703002011" + "200c2903003703002012200d2903003703002013200e2903003703002014" + "200829030037030020152009290300370300200220022903880437034820" + "0220022903800437034020024180046a200241406b20024180016a103020" + "10200b2903003703002011200c2903003703002012200d29030037030020" + "13200e290300370300201420082903003703002015200929030037030020" + "022002290388043703482002200229038004370340200241d8046a220120" + "14290300370300200241d0046a220a201529030037030020022002290348" + "3703c804200220022903403703c004200241c0046a200229030020022903" + "082029290300202829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2017201029" + "0300370300200f2011290300370300200220122903003703e80420022013" + "2903003703e004200241e0046a2027290300202629030020252903002024" + "29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20082001290300222a37030020" + "09200a290300222b370300200e20022903e004222c370300200c200f2903" + "00222d370300200d20022903e804222e370300200b2017290300222f3703" + "00200220022903c804223037038804200220022903c00422313703800420" + "10202f3703002011202d3703002012202e3703002013202c370300201420" + "2a3703002015202b37030020022030370348200220313703402001201429" + "0300370300200a2015290300370300200220022903483703c80420022002" + "2903403703c004200241c0046a20022903c00120022903c8012018290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2017201029030037030020" + "0f2011290300370300200220122903003703e804200220132903003703e0" + "04200241e0046a201a290300201b290300201c290300201d29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d20082001290300222a3703002009200a290300" + "222b370300200e20022903e004222c370300200c200f290300222d370300" + "200d20022903e804222e370300200b2017290300222f3703002002200229" + "03c804223037038804200220022903c0042231370380042010202f370300" + "2011202d3703002012202e3703002013202c3703002014202a3703002015" + "202b3703002002203037034820022031370340200041386a201e29030037" + "0300200041306a2016290300370300200041286a20072903003703002000" + "41206a2006290300370300200041186a2005290300370300200041106a20" + "04290300370300200041086a200229038802370300200020022903800237" + "0300200020022903c002370340200041c8006a20022903c8023703002000" + "41d0006a2003290300370300200041d8006a201f290300370300200041e0" + "006a2020290300370300200041e8006a2021290300370300200041f0006a" + "2022290300370300200041f8006a2023290300370300200041b8016a2010" + "290300370300200041b0016a2011290300370300200041a8016a20122903" + "00370300200041a0016a201329030037030020004198016a201429030037" + "030020004190016a201529030037030020004188016a2002290348370300" + "200020022903403703800120024180056a24000bfe09011d7e2001290310" + "22022001290300220484200141186a2903002215200141086a2903002203" + "8484420052044042c7faf3c3ed82a3903c20047d2118427f4200427f4200" + "200442788342c7faf3c3ed82a3903c561b220b2003200b56ad7d200b2003" + "7d220342f3eab8bce9ada5bfe8007d2219200354ad7c42017c220320027d" + "220c42a4cffaf397c9eed7c7007d220b200c54ad2002200356ad7d427f51" + "1b20157d42a9c0c689aece93b2307c210c0b420021152001290330220220" + "01290320220484200141386a2903002208200141286a2903002203848442" + "00520440427f4200427f4200200442788342c7faf3c3ed82a3903c561b22" + "062003200656ad7d200620037d220342f3eab8bce9ada5bfe8007d221520" + "0354ad7c42017c220320027d220642a4cffaf397c9eed7c7007d221a2006" + "54ad2002200356ad7d427f511b20087d42a9c0c689aece93b2307c211b42" + "c7faf3c3ed82a3903c20047d21060b200141f8006a2903002108200141e8" + "006a290300210220012903702104200129036021032001290350220e2001" + "290340220f84200141d8006a2903002205200141c8006a29030022108484" + "4200520440427f4200427f4200200f42788342c7faf3c3ed82a3903c561b" + "22092009201054ad7d200920107d220942f3eab8bce9ada5bfe8007d221c" + "200954ad7c42017c2216200e7d220d42a4cffaf397c9eed7c7007d220920" + "0d54ad200e201656ad7d427f511b20057d42a9c0c689aece93b2307c2116" + "42c7faf3c3ed82a3903c200f7d210d0b4200210e4200210f420021102003" + "2004842002200884844200520440427f4200427f4200200342788342c7fa" + "f3c3ed82a3903c561b22072002200756ad7d200720027d220242f3eab8bc" + "e9ada5bfe8007d220e200254ad7c42017c220220047d220742a4cffaf397" + "c9eed7c7007d220f200754ad2002200454ad7d427f511b20087d42a9c0c6" + "89aece93b2307c211042c7faf3c3ed82a3903c20037d21070b200141b801" + "6a2903002108200141a8016a290300210220012903b001210420012903a0" + "01210342002105200129039001221220012903800122138420014198016a" + "290300221e20014188016a290300221484844200520440427f4200427f42" + "00201342788342c7faf3c3ed82a3903c561b220a200a201454ad7d200a20" + "147d220a42f3eab8bce9ada5bfe8007d221d200a54ad7c42017c22172012" + "7d221142a4cffaf397c9eed7c7007d220a201154ad2012201756ad7d427f" + "511b201e7d42a9c0c689aece93b2307c211742c7faf3c3ed82a3903c2013" + "7d21110b4200211242002113420021142003200484200220088484420052" + "0440427f4200427f4200200342788342c7faf3c3ed82a3903c561b220520" + "02200556ad7d200520027d220242f3eab8bce9ada5bfe8007d2212200254" + "ad7c42017c220220047d220542a4cffaf397c9eed7c7007d2213200554ad" + "2002200454ad7d427f511b20087d42a9c0c689aece93b2307c211442c7fa" + "f3c3ed82a3903c20037d21050b200020133703b001200020053703a00120" + "00200a3703900120002011370380012000200f3703702000200737036020" + "0020093703502000200d3703402000201a37033020002006370320200020" + "0b37031020002018370300200020143703b801200020123703a801200020" + "17370398012000201d37038801200020103703782000200e370368200020" + "163703582000201c3703482000201b370338200020153703282000200c37" + "0318200020193703080b960501057f230041800c6b220324002003200120" + "02103b20034180036a200141c0016a220441c001104c1a200341c0046a20" + "0241c0016a220541c001104c1a200341c0016a20042005103b2003420037" + "03b809200342003703b009200342003703a809200342013703a009200342" + "003703980920034200370390092003420037038809200342093703800920" + "0341c00a6a200341c0026a20034180096a102f200341c80b6a2003418802" + "6a290300370300200341d00b6a20034190026a290300370300200341d80b" + "6a20034198026a290300370300200341e00b6a200341a0026a2903003703" + "00200341e80b6a200341a8026a290300370300200341f00b6a200341b002" + "6a290300370300200341f80b6a200341b8026a290300370300200341880b" + "6a20032903c801370300200341900b6a200341d0016a2903003703002003" + "41980b6a200341d8016a290300370300200341a00b6a200341e0016a2903" + "00370300200341a80b6a200341e8016a290300370300200341b00b6a2003" + "41f0016a290300370300200341b80b6a200341f8016a2903003703002003" + "2003290380023703c00b200320032903c0013703800b20034180066a2003" + "41c00a6a20031030200341c0066a200341800b6a2206200341406b103020" + "034180076a200341c00b6a220720034180016a103020034180096a200120" + "041030200341c0096a200141406b200341c0036a1030200341800a6a2001" + "4180016a20034180046a1030200341c00a6a200220051030200620024140" + "6b20034180056a1030200720024180016a200341c0056a1030200341c007" + "6a20034180096a200341c00a6a103b200341c00a6a200341c0076a200310" + "3c200041c0016a200341c00a6a200341c0016a103c200020034180066a41" + "c001104c1a200341800c6a24000bd741020e7f227e230041c0036b220324" + "0002400240200129034022212001290350222084200141c8006a29030022" + "23200141d8006a2903002222848442005204402002290340221d20022903" + "50221584200241c8006a2903002224200241d8006a290300221e8484500d" + "01200341f8016a2204200141406b220641186a2205290300370300200341" + "f0016a2208200641106a220b290300370300200320062903003703e00120" + "03200641086a220c2903003703e801200341e0016a202120232020202242" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20034198026a2209" + "200241406b220741186a220d29030037030020034190026a220a20074110" + "6a220e2903003703002003200741086a220f290300370388022003200729" + "03003703800220034180026a201d20242015201e42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341186a2210200141186a2903003703" + "00200341106a200141106a2903003703002003200141086a290300370308" + "20032001290300370300200320032903800222162003290388022219200a" + "29030022252009290300222842c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341386a2209200241186a290300370300200341306a220a" + "200241106a2903003703002003200241086a290300370328200320022903" + "00370320200341206a20032903e001222c20032903e80122302008290300" + "22312004290300223242c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200341b8036a22042005290300370300200341b0036a2205200b2903" + "003703002003200c2903003703a803200320062903003703a003200341a0" + "036a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200429030021132005290300211f20032903a803211c20032903a0" + "0321172004200d2903003703002005200e2903003703002003200f290300" + "3703a803200320072903003703a003200341a0036a201620192025202842" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211220" + "05290300211420032903a803211120032903a003211a200341d0006a2001" + "41306a290300370300200341d8006a2206200141386a2903003703002003" + "20012903203703402003200141286a290300370348200341406b201a2011" + "2014201242c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341" + "f8006a2207200241386a290300370300200341f0006a2208200241306a29" + "03003703002003200241286a290300370368200320022903203703602003" + "41e0006a2017201c201f201342c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b02402003200341206a104a450440200341406b200341e0006a" + "104a450d010b200420092903003703002005200a29030037030020032003" + "2903283703a803200320032903203703a003200341a0036a200329030020" + "032903082003290310201029030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2004" + "290300211f2005290300211c20032903a003211720032903a80321122004" + "200729030037030020052008290300370300200320032903683703a80320" + "0320032903603703a003200341a0036a2003290340200329034820032903" + "50200629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20124201862017423f88" + "842114201742018621112004290300211a2005290300211b20032903a803" + "211820032903a003212602400240201c4201862012423f8884222942ddb0" + "858ce8b691a8b87f85201f201f7c201c423f887c221342a9c0c689aece93" + "b2308584500440201142c7faf3c3ed82a3903c542014428d95c7c396d2da" + "c0977f542014428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230211342ddb0858ce8b691a8b87f21292011212a201421110c020b2029" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d002011212a201421110c010b20132029201420" + "1142c7faf3c3ed82a3903c7d222a20115aad222d7d222742f3eab8bce9ad" + "a5bfe8007c2211202754ad2014202d54ad7d7c2214202954ad201442a2cf" + "faf397c9eed7c7007c2229201454ad7c50ad7d42a9c0c689aece93b2307d" + "21130b200341b8036a22012013370300200320293703b0032003202a3703" + "a003200320113703a80342ddb0858ce8b691a8b87f2114200341a0036a20" + "2a20112029201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2003201f3703d8012003201c3703d001200320123703c801200320173703" + "c001200341c0016a20032903a003222920032903a803222a20032903b003" + "222d2001290300222742c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b20184201862026423f888421112026420186212602400240201b4201" + "862018423f8884221842ddb0858ce8b691a8b87f85201a201a7c201b423f" + "887c221342a9c0c689aece93b2308584500440202642c7faf3c3ed82a390" + "3c542011428d95c7c396d2dac0977f542011428d95c7c396d2dac0977f51" + "1b450d012026211a2011211b42a9c0c689aece93b23021130c020b201842" + "deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c6" + "89aece93b230511b450d002026211a2011211b201821140c010b20132018" + "2011202642c7faf3c3ed82a3903c7d221a20265aad22147d222642f3eab8" + "bce9ada5bfe8007c221b202654ad2011201454ad7d7c2211201854ad2011" + "42a2cffaf397c9eed7c7007c2214201154ad7c50ad7d42a9c0c689aece93" + "b2307d21130b20034198016a2201200341186a2903003703002003419001" + "6a2202200341106a29030037030020032003290308370388012003200329" + "03003703800142ddb0858ce8b691a8b87f212e20034180016a2029202a20" + "2d202742c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341b8" + "036a2204200341d8006a290300370300200341b0036a2205200341d0006a" + "290300370300200320032903483703a803200320032903403703a0032003" + "41a0036a20032903c001221120032903c801221820032903d00122272003" + "41d8016a290300222b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200320133703b802200320143703b0022003201b3703a8022003201a" + "3703a002200429030021262005290300212920032903a803212a20032903" + "a003212d200341a0026a201a201b2014201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b200341a0026a201120182027202b42c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200329038801222b4201862003290380012211423f" + "88842118201142018621270240024020022903002211420186202b423f88" + "84222b42ddb0858ce8b691a8b87f852011423f882001290300221120117c" + "7c221142a9c0c689aece93b2308584500440202742c7faf3c3ed82a3903c" + "542018428d95c7c396d2dac0977f542018428d95c7c396d2dac0977f511b" + "450d012027212f2018212742a9c0c689aece93b23021110c020b202b42de" + "b0858ce8b691a8b87f54201142a9c0c689aece93b23054201142a9c0c689" + "aece93b230511b450d002027212f20182127202b212e0c010b2011202b20" + "18202742c7faf3c3ed82a3903c7d222f20275aad222e7d221142f3eab8bc" + "e9ada5bfe8007c2227201154ad2018202e54ad7d7c2218202b54ad201842" + "a2cffaf397c9eed7c7007c222e201854ad7c50ad7d42a9c0c689aece93b2" + "307d21110b42ddb0858ce8b691a8b87f2118200341a0026a202f2027202e" + "201142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200320133703b801200320143703" + "b0012003201b3703a8012003201a3703a00120034180016a20032903a002" + "20032903a80220032903b002200341b8026a29030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200341a0016a20032903800120032903880120032903900120" + "034198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b202a420186202d423f88842114202d4201862111024002402029420186" + "202a423f8884221a42ddb0858ce8b691a8b87f85202620267c2029423f88" + "7c221342a9c0c689aece93b2308584500440201142c7faf3c3ed82a3903c" + "542014428d95c7c396d2dac0977f542014428d95c7c396d2dac0977f511b" + "450d012011211b2014211142a9c0c689aece93b23021130c020b201a42de" + "b0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c689" + "aece93b230511b450d002011211b20142111201a21180c010b2013201a20" + "14201142c7faf3c3ed82a3903c7d221b20115aad22187d222642f3eab8bc" + "e9ada5bfe8007c2211202654ad2014201854ad7d7c2214201a54ad201442" + "a2cffaf397c9eed7c7007c2218201454ad7c50ad7d42a9c0c689aece93b2" + "307d21130b42ddb0858ce8b691a8b87f2114200341a0016a201b20112018" + "201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d02400240201520207c2213202320" + "247c2220202454ad2020201d20217c2224201d54ad7c2223202054ad7c7c" + "222042ddb0858ce8b691a8b87f852013201554ad2013202056ad7c201e20" + "227c7c222142a9c0c689aece93b2308584500440202442c7faf3c3ed82a3" + "903c542023428d95c7c396d2dac0977f542023428d95c7c396d2dac0977f" + "511b450d01202421222023211342a9c0c689aece93b23021210c020b2020" + "42deb0858ce8b691a8b87f54202142a9c0c689aece93b23054202142a9c0" + "c689aece93b230511b450d002024212220232113202021140c010b202120" + "202023202442c7faf3c3ed82a3903c7d222220245aad221d7d221542f3ea" + "b8bce9ada5bfe8007c2213201554ad201d202356ad7d7c2223202054ad20" + "2342a2cffaf397c9eed7c7007c2214202354ad7c50ad7d42a9c0c689aece" + "93b2307d21210b200341d8026a22012021370300200341d0026a22022014" + "370300200320223703c002200320133703c802200341c0026a2022201320" + "14202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341c0" + "026a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a" + "201620192025202842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a2017" + "2012201c201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "0041186a200341b8026a290300370300200041106a200341b0026a290300" + "370300200041086a20032903a802370300200020032903a0023703002000" + "20032903a001370320200041286a20032903a801370300200041306a2003" + "41b0016a290300370300200041386a200341b8016a290300370300200020" + "032903c002370340200041c8006a20032903c802370300200041d0006a20" + "02290300370300200041d8006a20012903003703000c030b200341b8036a" + "2204200141186a290300221b370300200341b0036a2205200141106a2903" + "0022183703002003200141086a29030022163703a8032003200129030022" + "193703a00342ddb0858ce8b691a8b87f2112200341a0036a201920162018" + "201b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300" + "211d2005290300211520032903a803212420032903a003211f2004200141" + "206a220241186a2903003703002005200241106a29030037030020032002" + "41086a2903003703a803200320022903003703a003200341a0036a200129" + "0320200141286a2903002001290330200141386a29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2005290300211320032903a00321" + "1c20032903a8032117200420042903002225370300200320133703b00320" + "0320173703a8032003201c3703a003200341a0036a201c20172013202542" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211420" + "032903b003211e20032903a803211120032903a003211a02400240024020" + "1320187c2218201620177c2216201754ad20162019201c7c2219201c54ad" + "7c2217201654ad7c7c221c42ddb0858ce8b691a8b87f852013201856ad20" + "18201c56ad7c201b20257c7c221342a9c0c689aece93b230858450044020" + "1942c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d" + "95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b20" + "1c42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9" + "c0c689aece93b230511b450d01201c21120b2019211b201721180c010b20" + "13201c2017201942c7faf3c3ed82a3903c7d221b20195aad22127d221642" + "f3eab8bce9ada5bfe8007c2218201654ad2012201756ad7d7c2217201c54" + "ad201742a2cffaf397c9eed7c7007c2212201754ad7c50ad7d42a9c0c689" + "aece93b2307d21130b200341b8036a22012013370300200341b0036a2204" + "20123703002003201b3703a003200320183703a80342ddb0858ce8b691a8" + "b87f211c200341a0036a201b20182012201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b20034198036a22052001290300370300200341" + "90036a22062004290300370300200320032903a803370388032003200329" + "03a0033703800320034180036a201f20242015201d42c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d20012005290300370300200420062903003703002003200329" + "0388033703a80320032003290380033703a003200341a0036a201a201120" + "1e201442c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20032903a803221b4201862003" + "2903a0032213423f88842117201342018621120240024002402004290300" + "2213420186201b423f8884221642ddb0858ce8b691a8b87f852013423f88" + "2001290300221320137c7c221342a9c0c689aece93b23085845004402012" + "42c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b2016" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d012016211c0b2012211b201721180c010b2013" + "20162017201242c7faf3c3ed82a3903c7d221b20125aad221c7d221242f3" + "eab8bce9ada5bfe8007c2218201254ad2017201c54ad7d7c2217201654ad" + "201742a2cffaf397c9eed7c7007c221c201754ad7c50ad7d42a9c0c689ae" + "ce93b2307d21130b2024420186201f423f8884211742ddb0858ce8b691a8" + "b87f2116201f42018621190240024020154201862024423f8884222842dd" + "b0858ce8b691a8b87f85201d201d7c2015423f887c221242a9c0c689aece" + "93b2308584500440201942c7faf3c3ed82a3903c542017428d95c7c396d2" + "dac0977f542017428d95c7c396d2dac0977f511b450d0120192125201721" + "1942a9c0c689aece93b23021120c020b202842deb0858ce8b691a8b87f54" + "201242a9c0c689aece93b23054201242a9c0c689aece93b230511b450d00" + "2019212520172119202821160c010b201220282017201942c7faf3c3ed82" + "a3903c7d222520195aad22167d222c42f3eab8bce9ada5bfe8007c221920" + "2c54ad2016201756ad7d7c2217202854ad201742a2cffaf397c9eed7c700" + "7c2216201754ad7c50ad7d42a9c0c689aece93b2307d21120b42ddb0858c" + "e8b691a8b87f211702400240201520167c2228201920247c2215201954ad" + "2015201f20257c221f202554ad7c2219201554ad7c7c221542ddb0858ce8" + "b691a8b87f852016202856ad2015202854ad7c2012201d7c7c221d42a9c0" + "c689aece93b2308584500440201f42c7faf3c3ed82a3903c542019428d95" + "c7c396d2dac0977f542019428d95c7c396d2dac0977f511b450d01201f21" + "242019211f42a9c0c689aece93b230211d0c020b201542deb0858ce8b691" + "a8b87f54201d42a9c0c689aece93b23054201d42a9c0c689aece93b23051" + "1b450d00201f21242019211f201521170c010b201d20152019201f42c7fa" + "f3c3ed82a3903c7d2224201f5aad22177d221242f3eab8bce9ada5bfe800" + "7c221f201254ad2017201956ad7d7c2212201554ad201242a2cffaf397c9" + "eed7c7007c2217201254ad7c50ad7d42a9c0c689aece93b2307d211d0b20" + "0320173703b003200320243703a0032003201d3703b8032003201f3703a8" + "0342ddb0858ce8b691a8b87f2119200341a0036a2024201f2017201d42c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2018420186201b423f" + "88842112201b420186211602400240201c4201862018423f8884222542dd" + "b0858ce8b691a8b87f85201320137c201c423f887c221542a9c0c689aece" + "93b2308584500440201642c7faf3c3ed82a3903c542012428d95c7c396d2" + "dac0977f542012428d95c7c396d2dac0977f511b450d0120162128201221" + "1642a9c0c689aece93b23021150c020b202542deb0858ce8b691a8b87f54" + "201542a9c0c689aece93b23054201542a9c0c689aece93b230511b450d00" + "2016212820122116202521190c010b201520252012201642c7faf3c3ed82" + "a3903c7d222820165aad22197d222c42f3eab8bce9ada5bfe8007c221620" + "2c54ad2012201954ad7d7c2212202554ad201242a2cffaf397c9eed7c700" + "7c2219201254ad7c50ad7d42a9c0c689aece93b2307d21150b42ddb0858c" + "e8b691a8b87f2112200341a0036a202820162019201542c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2011420186201a423f88842116201a420186211a02400240" + "201e4201862011423f8884221942ddb0858ce8b691a8b87f85201420147c" + "201e423f887c221542a9c0c689aece93b2308584500440201a42c7faf3c3" + "ed82a3903c542016428d95c7c396d2dac0977f542016428d95c7c396d2da" + "c0977f511b450d01201a21112016211a42a9c0c689aece93b23021150c02" + "0b201942deb0858ce8b691a8b87f54201542a9c0c689aece93b230542015" + "42a9c0c689aece93b230511b450d00201a21112016211a201921120c010b" + "201520192016201a42c7faf3c3ed82a3903c7d2211201a5aad22127d2214" + "42f3eab8bce9ada5bfe8007c221a201454ad2012201656ad7d7c22142019" + "54ad201442a2cffaf397c9eed7c7007c2212201454ad7c50ad7d42a9c0c6" + "89aece93b2307d21150b201a4201862011423f8884211e42ddb0858ce8b6" + "91a8b87f211420114201862111024002402012420186201a423f88842216" + "42ddb0858ce8b691a8b87f85201520157c2012423f887c221542a9c0c689" + "aece93b2308584500440201142c7faf3c3ed82a3903c54201e428d95c7c3" + "96d2dac0977f54201e428d95c7c396d2dac0977f511b450d012011211a20" + "1e211142a9c0c689aece93b23021150c020b201642deb0858ce8b691a8b8" + "7f54201542a9c0c689aece93b23054201542a9c0c689aece93b230511b45" + "0d002011211a201e2111201621140c010b20152016201e201142c7faf3c3" + "ed82a3903c7d221a20115aad22127d221442f3eab8bce9ada5bfe8007c22" + "11201454ad2012201e56ad7d7c2212201654ad201242a2cffaf397c9eed7" + "c7007c2214201254ad7c50ad7d42a9c0c689aece93b2307d21150b201142" + "0186201a423f8884211242ddb0858ce8b691a8b87f2116201a420186211e" + "0240024020144201862011423f8884221142ddb0858ce8b691a8b87f8520" + "1520157c2014423f887c221542a9c0c689aece93b2308584500440201e42" + "c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95c7" + "c396d2dac0977f511b450d01201e21142012211e42a9c0c689aece93b230" + "21150c020b201142deb0858ce8b691a8b87f54201542a9c0c689aece93b2" + "3054201542a9c0c689aece93b230511b450d00201e21142012211e201121" + "160c010b201520112012201e42c7faf3c3ed82a3903c7d2214201e5aad22" + "1a7d221642f3eab8bce9ada5bfe8007c221e201654ad2012201a54ad7d7c" + "2212201154ad201242a2cffaf397c9eed7c7007c2216201254ad7c50ad7d" + "42a9c0c689aece93b2307d21150b20034198036a2201200241186a290300" + "37030020034190036a2204200241106a2903003703002003200229030037" + "0380032003200241086a2903003703880342ddb0858ce8b691a8b87f2112" + "20034180036a202120232020202242c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2003201d3703f802200320173703f0022003201f3703e8" + "02200320243703e002200129030021212004290300212320032903800321" + "22200329038803211d200120133703002003201c37039003200320183703" + "88032003201b3703800320034180036a20032903a00320032903a8032003" + "2903b003200341b8036a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "e0026a200329038003200329038803200329039003200129030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200341e0026a2014201e20" + "16201542c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d201d4201862022423f88842120" + "20224201862122024002402023420186201d423f8884221342ddb0858ce8" + "b691a8b87f85202120217c2023423f887c222142a9c0c689aece93b23085" + "84500440202242c7faf3c3ed82a3903c542020428d95c7c396d2dac0977f" + "542020428d95c7c396d2dac0977f511b450d01202221232020212242a9c0" + "c689aece93b23021210c020b201342deb0858ce8b691a8b87f54202142a9" + "c0c689aece93b23054202142a9c0c689aece93b230511b450d0020222123" + "20202122201321120c010b202120132020202242c7faf3c3ed82a3903c7d" + "222320225aad221d7d221542f3eab8bce9ada5bfe8007c2222201554ad20" + "1d202056ad7d7c2220201354ad202042a2cffaf397c9eed7c7007c221220" + "2054ad7c50ad7d42a9c0c689aece93b2307d21210b200020123703502000" + "2023370340200020032903a003370300200020032903e002370320200020" + "2137035820002022370348200041086a20032903a803370300200041286a" + "20032903e802370300200041186a200341b8036a29030037030020004110" + "6a200341b0036a290300370300200041306a200341f0026a290300370300" + "200041386a200341f8026a2903003703000c020b2000200241e000104c1a" + "0c010b2000200141e000104c1a0b200341c0036a24000b970802067f087e" + "230041a0016b220224000240200129034022082001290350220984200141" + "c8006a290300220a200141d8006a290300220b8484420052044020024200" + "370318200242003703102002420037030820024201370300024020014140" + "6b2002104a450440200241206a2001290320220837030020002001290300" + "2209370310200041306a2008370300200241386a200141386a2903002208" + "370300200241306a200141306a290300220a370300200241286a20014128" + "6a290300220b370300200241106a200141106a290300220c370300200241" + "186a200141186a290300220d370300200041186a200141086a290300220e" + "370300200041206a200c370300200041286a200d370300200041386a200b" + "370300200041406b200a370300200041c8006a2008370300200220093703" + "002002200e3703080c010b20024198016a2204200b370300200220093703" + "900120022008370380012002200a37038801200242a9c0c689aece93b230" + "370318200242ddb0858ce8b691a8b87f3703102002428d95c7c396d2dac0" + "977f370308200242c7faf3c3ed82a3903c37030020024180016a2002103a" + "20022903800121082002290388012109200229039001210a200241186a22" + "032004290300220b3703002002200a370310200220093703082002200837" + "0300200220082009200a200b42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b2003290300210c2002290310210d2002290308210e20022903" + "00210f200241d0006a2204200141106a290300370300200241d8006a2205" + "200141186a290300370300200220012903003703402002200141086a2903" + "00370348200241406b200f200e200d200c42c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200241f8006a2206200141386a29030037030020" + "0241f0006a2207200141306a2903003703002002200141286a2903003703" + "68200220012903203703602003200b3703002002200a3703102002200937" + "0308200220083703002002200f200e200d200c42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200241e0006a200229030020022903082002" + "290310200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200320052903002208370300200241106a200429030022093703002002" + "41206a2002290360220a370300200241286a2002290368220b3703002002" + "41306a2007290300220c370300200241386a2006290300220d3703002000" + "2002290340220e370310200041186a2002290348220f370300200041206a" + "2009370300200041286a2008370300200041306a200a370300200041386a" + "200b370300200041406b200c370300200041c8006a200d3703002002200f" + "3703082002200e3703000b20004200370308200042013703000c010b2000" + "4200370308200042003703000b200241a0016a24000b3000200128021c20" + "002d0000410274220041cca5c0006a280200200041c0a5c0006a28020020" + "0128022028020c1103000bf917021d7f087e23004180066b220224002002" + "41b8036a2208200141386a290300370300200241b0036a2209200141306a" + "290300370300200241a8036a2213200141286a290300370300200241a003" + "6a2214200141206a29030037030020024198036a2203200141186a290300" + "37030020024190036a2204200141106a2903003703002002200129030037" + "0380032002200141086a2903003703880320024180036a20012001102f20" + "0241f8036a2205200141f8006a290300370300200241f0036a2206200141" + "f0006a290300370300200241e8036a2207200141e8006a29030037030020" + "0241e0036a220a200141e0006a290300370300200241d8036a220b200141" + "d8006a290300370300200241d0036a220c200141d0006a29030037030020" + "02200141c8006a2903003703c803200220012903403703c003200241c003" + "6a200141406b221e201e102f200241b8046a221520052903003703002002" + "41b0046a22162006290300370300200241a8046a22172007290300370300" + "200241a0046a2218200a29030037030020024198046a2219200b29030037" + "030020024190046a221a200c290300370300200220022903c80337038804" + "200220022903c0033703800420024180046a200241c0036a200241c0036a" + "102f200241c0026a2001200241c0036a1030200241f8046a221b200241f8" + "026a2205290300370300200241f0046a220e200241f0026a220a29030037" + "0300200241e8046a220f200241e8026a2206290300370300200241e0046a" + "2210200241e0026a220c290300370300200241d8046a220d200241d8026a" + "2207290300370300200241d0046a2211200241d0026a220b290300370300" + "200220022903c8023703c804200220022903c0023703c004200241c0046a" + "200241c0026a200241c0026a102f200241d8056a2212200d290300370300" + "200241d0056a220d2011290300370300200220022903c8043703c8052002" + "20022903c0043703c005200241c0056a2002290380032002290388032004" + "290300200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241f8056a2203" + "201b290300370300200241f0056a2204200e2903003703002002200f2903" + "003703e805200220102903003703e005200241e0056a2014290300201329" + "03002009290300200829030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20024198" + "026a2208201229030037030020024190026a2209200d2903003703002002" + "41a8026a221320022903e805370300200241b0026a221420042903003703" + "00200241b8026a221b2003290300370300200220022903c8053703880220" + "0220022903c00537038002200220022903e0053703a00220122008290300" + "370300200d200929030037030020022002290388023703c8052002200229" + "0380023703c005200241c0056a200229038004200229038804201a290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2003201b29030037030020" + "042014290300370300200220132903003703e805200220022903a0023703" + "e005200241e0056a201829030020172903002016290300201529030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200241186a22152012290300370300200241" + "106a2216200d290300370300200241206a221720022903e0053703002002" + "41286a221820022903e805370300200241306a2219200429030037030020" + "0241386a221a2003290300370300200220022903c8053703082002200229" + "03c005370300200241c0026a200220021030201a20052903003703002019" + "200a290300370300201820062903003703002017200c2903003703002015" + "20072903003703002016200b290300370300200220022903c80237030820" + "0220022903c002370300200241c0026a20024180036a20024180036a1030" + "200241406b200241c0026a20024180036a103020024190056a220e200241" + "d0006a29030037030020024198056a220f200241d8006a29030037030020" + "0241a0056a2210200241e0006a290300370300200241a8056a2211200241" + "e8006a290300370300200241b0056a221c200241f0006a29030037030020" + "0241b8056a221d200241f8006a2903003703002002200229034037038005" + "200220022903483703880520024180056a200241406b200241406b102f20" + "0241c0026a2002200210302003200f2903003703002004200e2903003703" + "0020022002290388053703e80520022002290380053703e005200241e005" + "6a20022903c00220022903c80220022903d002200729030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2008201d2903003703002009201c2903003703002002" + "201129030037038802200220102903003703800220024180026a20022903" + "e002200629030020022903f002200529030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d2008290300211f200929030021202003290300212120042903002122" + "2002290388022123200229038002212420022903e805212520022903e005" + "212620024180016a20024180046a20024180046a1030200241c0026a2002" + "4180016a20024180016a1030200241b8016a220e20052903003703002002" + "41b0016a220f200a290300370300200241a8016a22102006290300370300" + "200241a0016a2211200c29030037030020024198016a221c200729030037" + "030020024190016a221d200b290300370300200220022903c80237038801" + "200220022903c00237038001200241c0026a20024180016a20024180016a" + "1030200e2005290300370300200f200a2903003703002010200629030037" + "03002011200c290300370300201c2007290300370300201d200b29030037" + "0300200220022903c80237038801200220022903c00237038001200241c0" + "016a201e20014180016a102f200320152903003703002004201629030037" + "0300200220022903083703e805200220022903003703e005200241e0056a" + "202620252022202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2008201a29030037" + "030020092019290300370300200220182903003703880220022017290300" + "3703800220024180026a202420232020201f42c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d20072003290300370300200b20042903003703002006200229038802" + "370300200a200929030037030020052008290300370300200220022903e8" + "053703c802200220022903e0053703c00220022002290380023703e00220" + "024180026a200241406b200241c0026a102f20122008290300370300200d" + "200929030037030020022002290388023703c80520022002290380023703" + "c005200241c0056a200229038001200229038801201d290300201c290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2003201b290300370300200420142903" + "00370300200220132903003703e805200220022903a0023703e005200241" + "e0056a20112903002010290300200f290300200e29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20072012290300370300200b200d290300370300200c20" + "022903e005370300200620022903e805370300200a200429030037030020" + "052003290300370300200220022903c8053703c802200220022903c00537" + "03c00220004180016a200241c0016a200241c0016a10302000201f370338" + "200020203703302000202337032820002024370320200020213703182000" + "20223703102000202537030820002026370300200020022903c002370340" + "200041c8006a20022903c802370300200041d0006a200b29030037030020" + "0041d8006a2007290300370300200041e0006a200c290300370300200041" + "e8006a2006290300370300200041f0006a200a290300370300200041f800" + "6a200529030037030020024180066a24000bbd21021c7f087e230041800b" + "6b22032400024002400240024020012903800120014188016a2903008442" + "00520d0020012903900120014198016a290300844200520d0020012903a0" + "01200141a8016a290300844200520d0020012903b001200141b8016a2903" + "0084500d010b024020022903800120024188016a290300844200520d0020" + "022903900120024198016a290300844200520d0020022903a001200241a8" + "016a290300844200520d0020022903b001200241b8016a29030084500d02" + "0b200341b8086a221420014180016a220441386a290300370300200341b0" + "086a200441306a290300370300200341a8086a2215200441286a29030037" + "0300200341a0086a200441206a29030037030020034198086a2216200441" + "186a29030037030020034190086a200441106a2903003703002003200429" + "0300370380082003200441086a2903003703880820034180086a20042004" + "102f200341f8086a221720024180016a220541386a290300370300200341" + "f0086a200541306a290300370300200341e8086a2218200541286a290300" + "370300200341e0086a200541206a290300370300200341d8086a22192005" + "41186a290300370300200341d0086a200541106a29030037030020032005" + "41086a2903003703c808200320052903003703c008200341c0086a200520" + "05102f20032001200341c0086a102f200341406b200220034180086a102f" + "20034180016a200420034180086a102f200341c0016a2005200341c0086a" + "102f20034180026a200141406b200341c0016a102f200341c0026a200241" + "406b20034180016a102f024002402003200341406b104a0d00200341206a" + "200341e0006a104a0d0020034180026a200341c0026a104a0d00200341a0" + "026a200341e0026a104a450d010b200341386a290300211f200341286a29" + "03002120200329033021212003290320212220034198076a2201200341d8" + "006a29030037030020034190076a2202200341d0006a2903003703002003" + "200329034837038807200320032903403703800720034180076a20032903" + "0020032903082003290310200341186a29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d200341d8076a2206200341f8006a290300370300200341d0076a22" + "09200341f0006a2903003703002003200341e8006a2903003703c8072003" + "20032903603703c007200341c0076a202220202021201f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20034198036a200129030037030020034190036a200229" + "0300370300200341a8036a20032903c807370300200341b0036a20092903" + "00370300200341b8036a2006290300370300200320032903880737038803" + "200320032903800737038003200320032903c0073703a003200341b8026a" + "290300211f200341a8026a290300212020032903b002212120032903a002" + "21222001200341d8026a2903003703002002200341d0026a290300370300" + "200320032903c80237038807200320032903c0023703800720034180076a" + "20032903800220032903880220032903900220034198026a29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2006200341f8026a2903003703002009200341" + "f0026a2903003703002003200341e8026a2903003703c807200320032903" + "e0023703c007200341c0076a202220202021201f42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200341d8036a2001290300370300200341d0036a200229030037" + "0300200341e8036a20032903c807370300200341f0036a20092903003703" + "00200341f8036a200629030037030020032003290388073703c803200320" + "03290380073703c003200320032903c0073703e003200341c0076a200341" + "80036a20034180036a1030200341b8096a200341f8076a220c2903003703" + "00200341b0096a200341f0076a2211290300370300200341a8096a200341" + "e8076a220d290300370300200341a0096a200341e0076a221a2903003703" + "0020034198096a200629030037030020034190096a200929030037030020" + "0320032903c80737038809200320032903c0073703800920034180096a20" + "0341c0076a200341c0076a102f20034180046a20034180036a2003418009" + "6a102f200341c0046a200341c0036a200341c0036a103020034180056a20" + "0320034180096a102f200341c0056a20034180026a20034180046a102f20" + "0341d0096a220a200341d0046a290300370300200341d8096a2207200341" + "d8046a290300370300200341e0096a220b200341e0046a29030037030020" + "0341e8096a220e200341e8046a290300370300200341f0096a220f200341" + "f0046a290300370300200341f8096a2210200341f8046a29030037030020" + "0320032903c0043703c009200320032903c8043703c809200341c0096a20" + "0341c0046a200341c0046a102f200341d8066a2208200729030037030020" + "0341d0066a2207200a290300370300200320032903c8093703c806200320" + "032903c0093703c006200341c0066a200329038004200329038804200329" + "03900420034198046a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20062010" + "2903003703002009200f2903003703002003200e2903003703c807200320" + "0b2903003703c007200341c0076a20032903a004200341a8046a29030020" + "032903b004200341b8046a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2001" + "200829030037030020022007290300370300200341a8076a220e20032903" + "c807370300200341b0076a220f2009290300370300200341b8076a221020" + "06290300370300200320032903c80637038807200320032903c006370380" + "07200320032903c0073703a007200341c0076a20034180056a2003418005" + "6a103020034198066a2212200129030037030020034190066a2213200229" + "030037030020032003290388073703880620032003290380073703800620" + "034180066a20032903c00720032903c80720032903d007200629030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200820102903003703002007200f29030037" + "03002003200e2903003703c806200320032903a0073703c006200341c006" + "6a20032903e007200d29030020032903f007200c29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008290300211f20072903002120201229030021212013" + "290300212220032903c806212320032903c0062124200329038806212520" + "03290380062126200820034198056a290300370300200720034190056a29" + "030037030020032003290388053703c80620032003290380053703c00620" + "0341c0066a202620252022202142c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200120" + "0341b8056a2903003703002002200341b0056a2903003703002003200341" + "a8056a29030037038807200320032903a0053703800720034180076a2024" + "20232020201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20062008290300370300" + "20092007290300370300200d200329038807370300201120022903003703" + "00200c2001290300370300200320032903c8063703c807200320032903c0" + "063703c00720032003290380073703e00720034180076a200341c0046a20" + "0341c0076a102f200341c0076a200341c0056a200341c0056a1030200341" + "f80a6a220a2001290300370300200341f00a6a220b200229030037030020" + "032003290388073703e80a20032003290380073703e00a200341e00a6a20" + "032903c00720032903c80720032903d007200629030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d200820102903003703002007200f2903003703002003200e" + "2903003703c806200320032903a0073703c006200341c0066a20032903e0" + "07200d29030020032903f007200c29030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2012200a2903003703002013200b290300370300200341a0066a221b20" + "032903c006370300200341a8066a221c20032903c806370300200341b006" + "6a221d2007290300370300200341b8066a221e2008290300370300200320" + "032903e80a37038806200320032903e00a37038006200341c0076a200420" + "051030200341b80a6a2204200c290300370300200341b00a6a2205201129" + "0300370300200341a80a6a220c200d290300370300200341a00a6a220d20" + "1a290300370300200341980a6a22112006290300370300200341900a6a22" + "062009290300370300200320032903c8073703880a200320032903c00737" + "03800a200341800a6a200341c0076a200341c0076a102f200a2011290300" + "370300200b2006290300370300200320032903880a3703e80a2003200329" + "03800a3703e00a200341e00a6a2003290380082003290388082003290390" + "08201629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20082004290300370300" + "200720052903003703002003200c2903003703c8062003200d2903003703" + "c006200341c0066a20032903a008201529030020032903b0082014290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2001200a2903003703002002200b2903" + "00370300200e20032903c806370300200f20072903003703002010200829" + "0300370300200320032903e80a37038807200320032903e00a3703800720" + "0320032903c0063703a007200341d80a6a22042001290300370300200341" + "d00a6a2201200229030037030020032003290388073703c80a2003200329" + "0380073703c00a200341c00a6a20032903c00820032903c80820032903d0" + "08201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a2010290300370300" + "200b200f2903003703002003200e2903003703e80a200320032903a00737" + "03e00a200341e00a6a20032903e008201829030020032903f00820172903" + "0042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691" + "a8b87f42a9c0c689aece93b230102d200820042903003703002007200129" + "0300370300200341e8066a20032903e80a370300200341f0066a200b2903" + "00370300200341f8066a200a290300370300200320032903c80a3703c806" + "200320032903c00a3703c006200320032903e00a3703e00620004180016a" + "200341c0066a20034180036a102f2000201f370338200020203703302000" + "202337032820002024370320200020213703182000202237031020002025" + "370308200020263703002000200329038006370340200041c8006a200329" + "038806370300200041d0006a2013290300370300200041d8006a20122903" + "00370300200041e0006a201b290300370300200041e8006a201c29030037" + "0300200041f0006a201d290300370300200041f8006a201e290300370300" + "0c030b2000200110430c020b2000200241c001104c1a0c010b2000200141" + "c001104c1a0b200341800b6a24000bf50602037f067e230041c0026b2202" + "24000240024002400240024020012903800120014188016a290300844200" + "520d0020012903900120014198016a290300844200520d0020012903a001" + "200141a8016a290300844200520d0020012903b001200141b8016a290300" + "84500d010b200241d8006a4200370300200241e0006a2204420037030020" + "0241e8006a4200370300200241f0006a4200370300200241f8006a420037" + "030020024200370348200242013703402002420037035020014180016a22" + "03200241406b104a450440200141a0016a2004104a450d020b200241406b" + "200310312002280240410171450d02200241386a20024188016a29030022" + "05370300200241306a20024180016a22032903002206370300200241286a" + "200241f8006a2903002207370300200241206a200241f0006a2903002208" + "370300200241186a200241e8006a2903002209370300200241106a200241" + "e0006a290300220a37030020024190026a200a37030020024198026a2009" + "370300200241a0026a2008370300200241a8026a2007370300200241b002" + "6a2006370300200241b8026a200537030020022002290350220537030020" + "02200241d8006a2903002206370308200220053703800220022006370388" + "0220024180026a20022002102f200241406b200120024180026a102f2002" + "41c0016a200220024180026a102f2003200141406b200241c0016a102f20" + "0041106a200241406b418001104c1a20004200370308200042013703000c" + "030b20004200370308200042003703000c020b200241b8016a200141f800" + "6a290300370300200241b0016a200141f0006a290300370300200241a801" + "6a200141e8006a290300370300200241a0016a200141e0006a2903003703" + "0020024198016a200141d8006a29030037030020024190016a200141d000" + "6a29030037030020024188016a200141c8006a290300370300200241d000" + "6a200141106a290300370300200241d8006a200141186a29030037030020" + "0241e0006a200141206a290300370300200241e8006a200141286a290300" + "370300200241f0006a200141306a290300370300200241f8006a20014138" + "6a2903003703002002200129034037038001200220012903003703402002" + "200141086a290300370348200041106a200241406b418001104c1a200042" + "00370308200042013703000c010b4194a1c0001020000b200241c0026a24" + "000bd64502497f107e230041a00f6b22022400200241386a223f200141f8" + "006a220e290300370300200241306a2240200141f0006a220f2903003703" + "00200241286a2241200141e8006a2210290300370300200241206a224220" + "0141e0006a2211290300370300200241186a2243200141d8006a22122903" + "00370300200241106a2244200141d0006a22202903003703002002200129" + "03403703002002200141c8006a2221290300370308200141a8016a222329" + "03002153200141a0016a22242903002154200141b8016a22252903002155" + "200141b0016a2230290300215620014188016a2235290300215720014198" + "016a2236290300215820014190016a22372903002159200129038001215a" + "200241f8006a200141f8016a2213290300370300200241f0006a200141f0" + "016a2214290300370300200241e8006a200141e8016a2215290300370300" + "200241e0006a200141e0016a2216290300370300200241d8006a200141d8" + "016a2217290300370300200241d0006a200141d0016a220d290300370300" + "20024190016a20014190026a220429030037030020024198016a20014198" + "026a2206290300370300200241a0016a200141a0026a2207290300370300" + "200241a8016a200141a8026a2208290300370300200241b0016a200141b0" + "026a2205290300370300200241b8016a200141b8026a2209290300370300" + "2002200141c8016a2222290300370348200220012903c001370340200220" + "012903800237038001200220014188026a220a29030037038801200241f8" + "016a200141f8026a2238290300370300200241f0016a200141f0026a2245" + "290300370300200241e8016a200141e8026a2246290300370300200241e0" + "016a200141e0026a2247290300370300200241d8016a200141d8026a2248" + "290300370300200241d0016a200141d0026a2249290300370300200241b8" + "026a2226200141386a2231290300370300200241b0026a2227200141306a" + "2232290300370300200241a8026a2228200141286a223a29030037030020" + "0241a0026a2229200141206a223b29030037030020024198026a222a2001" + "41186a223c29030037030020024190026a222b200141106a223d29030037" + "03002002200141c8026a224a2903003703c801200220012903c0023703c0" + "012002200141086a223e2903003703880220022001290300370380022002" + "4180026a200120014180026a2203102f200241f8026a2219203129030037" + "0300200241f0026a221a2032290300370300200241e8026a221b203a2903" + "00370300200241e0026a221c203b290300370300200241d8026a221d203c" + "290300370300200241d0026a221e203d2903003703002002203e29030037" + "03c802200220012903003703c002200241c0026a200120031030200241b8" + "036a220b2009290300370300200241b0036a220920052903003703002002" + "41a8036a22052008290300370300200241a0036a220c2007290300370300" + "20024198036a2218200629030037030020024190036a221f200429030037" + "0300200242003703b80d200242003703b00d200242003703a80d20024201" + "3703a00d200242003703980d200242003703900d200242003703880d2002" + "42093703800d2002200a2903003703880320022001290380023703800320" + "024180036a2003200241800d6a102f200241c00b6a20024180036a200110" + "30200b200241f80b6a22062903003703002009200241f00b6a2207290300" + "3703002005200241e80b6a2208290300370300200c200241e00b6a220529" + "03003703002018200241d80b6a2203290300370300201f200241d00b6a22" + "04290300370300200220022903c80b37038803200220022903c00b370380" + "03200241c00b6a200241c0026a20024180036a102f201920062903003703" + "00201a2007290300370300201b2008290300370300201c20052903003703" + "00201d2003290300370300201e2004290300370300200220022903c80b37" + "03c802200220022903c00b3703c002200241980f6a220b201d2903003703" + "00200241900f6a220c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903800220022903880220" + "2b290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241980a6a22" + "092019290300370300200241900a6a220a201a2903003703002002201b29" + "03003703880a2002201c2903003703800a200241800a6a20292903002028" + "2903002027290300202629030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200320" + "0b290300224b3703002004200c290300224c370300200520022903800a22" + "4d3703002007200a290300224e370300200820022903880a224f37030020" + "0620092903002250370300200220022903880f22513703c80b2002200229" + "03800f22523703c00b20192050370300201a204e370300201b204f370300" + "201c204d370300201d204b370300201e204c370300200220513703c80220" + "0220523703c002200241c0036a20024180026a200241800d6a102f200b20" + "1d290300370300200c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903c00320022903c80320" + "022903d003200241d8036a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009" + "2019290300370300200a201a2903003703002002201b2903003703880a20" + "02201c2903003703800a200241800a6a20022903e003200241e8036a2903" + "0020022903f003200241f8036a29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2003200b290300224b3703002004200c290300224c370300200520022903" + "800a224d3703002007200a290300224e370300200820022903880a224f37" + "0300200620092903002250370300200220022903880f22513703c80b2002" + "20022903800f22523703c00b20192050370300201a204e370300201b204f" + "370300201c204d370300201d204b370300201e204c370300200220513703" + "c802200220523703c002200241c00b6a20024180026a20024180026a1030" + "202620062903003703002027200729030037030020282008290300370300" + "20292005290300370300202a2003290300370300202b2004290300370300" + "200220022903c80b37038802200220022903c00b3703800220024190046a" + "221f200d29030037030020024198046a222c2017290300370300200241a0" + "046a222d2016290300370300200241a8046a222e20152903003703002002" + "41b0046a222f2014290300370300200241b8046a22392013290300370300" + "200220012903c00137038004200220222903003703880420024180046a20" + "0141c0016a223320014180016a2234102f200241f8046a22182013290300" + "370300200241f0046a22132014290300370300200241e8046a2214201529" + "0300370300200241e0046a22152016290300370300200241d8046a221620" + "17290300370300200241d0046a2217200d29030037030020022022290300" + "3703c804200220012903c0013703c004200241c0046a2033203410302002" + "41b8056a220d2025290300370300200241b0056a22222030290300370300" + "200241a8056a22252023290300370300200241a0056a2223202429030037" + "030020024198056a2224203629030037030020024190056a223020372903" + "003703002002203529030037038805200220012903800137038005200241" + "80056a2034200241800d6a102f200241c00b6a20024180056a2033103020" + "0d2006290300370300202220072903003703002025200829030037030020" + "232005290300370300202420032903003703002030200429030037030020" + "0220022903c80b37038805200220022903c00b37038005200241c00b6a20" + "0241c0046a20024180056a102f2018200629030037030020132007290300" + "370300201420082903003703002015200529030037030020162003290300" + "37030020172004290300370300200220022903c80b3703c8042002200229" + "03c00b3703c004200b2016290300370300200c2017290300370300200220" + "022903c8043703880f200220022903c0043703800f200241800f6a200229" + "038004200229038804201f290300202c29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20092018290300370300200a201329030037030020022014290300" + "3703880a200220152903003703800a200241800a6a202d290300202e2903" + "00202f290300203929030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b29" + "0300224b3703002004200c290300224c370300200520022903800a224d37" + "03002007200a290300224e370300200820022903880a224f370300200620" + "092903002250370300200220022903880f22513703c80b20022002290380" + "0f22523703c00b201820503703002013204e3703002014204f3703002015" + "204d3703002016204b3703002017204c370300200220513703c804200220" + "523703c004200241c0056a20024180046a200241800d6a102f200b201629" + "0300370300200c2017290300370300200220022903c8043703880f200220" + "022903c0043703800f200241800f6a20022903c00520022903c805200229" + "03d005200241d8056a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20092018" + "290300370300200a2013290300370300200220142903003703880a200220" + "152903003703800a200241800a6a20022903e005200241e8056a29030020" + "022903f005200241f8056a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003" + "200b290300224b3703002004200c290300224c370300200520022903800a" + "224d3703002007200a290300224e370300200820022903880a224f370300" + "200620092903002250370300200220022903880f22513703c80b20022002" + "2903800f22523703c00b201820503703002013204e3703002014204f3703" + "002015204d3703002016204b3703002017204c370300200220513703c804" + "200220523703c004200241c00b6a20024180046a20024180046a10302039" + "2006290300370300202f2007290300370300202e2008290300370300202d" + "2005290300370300202c2003290300370300201f20042903003703002002" + "20022903c80b37038804200220022903c00b3703800420024190066a2222" + "202029030037030020024198066a22332012290300370300200241a0066a" + "22342011290300370300200241a8066a22232010290300370300200241b0" + "066a2224200f290300370300200241b8066a2225200e2903003703002002" + "200129034037038006200220212903003703880620024180066a20014140" + "6b200141c0026a2230102f200241f8066a220d200e290300370300200241" + "f0066a220e200f290300370300200241e8066a220f201029030037030020" + "0241e0066a22102011290300370300200241d8066a221120122903003703" + "00200241d0066a22122020290300370300200220212903003703c8062002" + "20012903403703c006200241c0066a200220301030200241b8076a222020" + "38290300370300200241b0076a22212045290300370300200241a8076a22" + "352046290300370300200241a0076a223620472903003703002002419807" + "6a2237204829030037030020024190076a22382049290300370300200220" + "4a29030037038807200220012903c0023703800720024180076a20302002" + "41800d6a102f200241c00b6a20024180076a200210302020200629030037" + "030020212007290300370300203520082903003703002036200529030037" + "03002037200329030037030020382004290300370300200220022903c80b" + "37038807200220022903c00b37038007200241c00b6a200241c0066a2002" + "4180076a102f200d2006290300370300200e2007290300370300200f2008" + "290300370300201020052903003703002011200329030037030020122004" + "290300370300200220022903c80b3703c806200220022903c00b3703c006" + "200b2011290300370300200c2012290300370300200220022903c8063703" + "880f200220022903c0063703800f200241800f6a20022903800620022903" + "88062022290300203329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200d" + "290300370300200a200e2903003703002002200f2903003703880a200220" + "102903003703800a200241800a6a20342903002023290300202429030020" + "2529030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b370300" + "2004200c290300224c370300200520022903800a224d3703002007200a29" + "0300224e370300200820022903880a224f37030020062009290300225037" + "0300200220022903880f22513703c80b200220022903800f22523703c00b" + "200d2050370300200e204e370300200f204f3703002010204d3703002011" + "204b3703002012204c370300200220513703c806200220523703c0062002" + "41c0076a20024180066a200241800d6a102f200b2011290300370300200c" + "2012290300370300200220022903c8063703880f200220022903c0063703" + "800f200241800f6a20022903c00720022903c80720022903d007200241d8" + "076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2009200d29030037030020" + "0a200e2903003703002002200f2903003703880a20022010290300370380" + "0a200241800a6a20022903e007200241e8076a29030020022903f0072002" + "41f8076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b" + "3703002004200c290300224c370300200520022903800a224d3703002007" + "200a290300224e370300200820022903880a224f37030020062009290300" + "2250370300200220022903880f22513703c80b200220022903800f225237" + "03c00b200d2050370300200e204e370300200f204f3703002010204d3703" + "002011204b3703002012204c370300200220513703c806200220523703c0" + "06200241c00b6a20024180066a20024180066a1030202520062903003703" + "002024200729030037030020232008290300370300203420052903003703" + "002033200329030037030020222004290300370300200220022903c80b37" + "038806200220022903c00b370380062009201d290300370300200a201e29" + "0300370300200220022903c8023703880a200220022903c0023703800a20" + "0241800a6a2001290300203e290300203d290300203c29030042c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200320192903003703002004201a29030037030020" + "02201b2903003703c80b2002201c2903003703c00b200241c00b6a203b29" + "0300203a2903002032290300203129030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d200241d80d6a221c2009290300370300200241d00d6a221d200a290300" + "370300200241e00d6a221e20022903c00b370300200241e80d6a22202002" + "2903c80b370300200241f00d6a22212004290300370300200241f80d6a22" + "312003290300370300200220022903880a3703c80d200220022903800a37" + "03c00d200241c00b6a200241c00d6a200241c00d6a103020312006290300" + "3703002021200729030037030020202008290300370300201e2005290300" + "370300201c2003290300370300201d2004290300370300200220022903c8" + "0b3703c80d200220022903c00b3703c00d200241c00b6a200241c00d6a20" + "0241c0026a10302031200629030037030020212007290300370300202020" + "08290300370300201e2005290300370300201c2003290300370300201d20" + "0429030037030020024190086a2232202b29030037030020024198086a22" + "2b202a290300370300200241a0086a222a2029290300370300200241a808" + "6a22292028290300370300200241b0086a22282027290300370300200241" + "b8086a22272026290300370300200220022903c80b3703c80d2002200229" + "03c00b3703c00d2002200229038002370380082002200229038802370388" + "0820024180086a20024180026a20024180016a1030200241c00b6a200241" + "80086a20024180086a103020272006290300370300202820072903003703" + "0020292008290300370300202a2005290300370300202b20032903003703" + "0020322004290300370300200220022903c80b37038808200220022903c0" + "0b37038008200241c00b6a20024180086a20024180026a10302027200629" + "03003703002028200729030037030020292008290300370300202a200529" + "0300370300202b200329030037030020322004290300370300200241d008" + "6a22012022290300370300200241d8086a220b2033290300370300200241" + "e0086a220c2034290300370300200241e8086a2219202329030037030020" + "0241f0086a221a2024290300370300200241f8086a221b20252903003703" + "00200220022903c80b37038808200220022903c00b370380082002200229" + "0380063703c00820022002290388063703c808200241c0086a2002418006" + "6a200241800d6a102f200241c00b6a200241c0086a200241406b1030201b" + "2006290300370300201a200729030037030020192008290300370300200c" + "2005290300370300200b2003290300370300200120042903003703002002" + "20022903c80b3703c808200220022903c00b3703c008200241c00b6a2002" + "41c0086a200241c0086a1030201b2006290300370300201a200729030037" + "030020192008290300370300200c2005290300370300200b200329030037" + "030020012004290300370300200220022903c80b3703c808200220022903" + "c00b3703c00820024180096a20024180066a200241800d6a102f200241c0" + "0b6a200241c0086a20024180096a1030201b2006290300370300201a2007" + "29030037030020192008290300370300200c2005290300370300200b2003" + "29030037030020012004290300370300200220022903c80b3703c8082002" + "20022903c00b3703c00820092011290300370300200a2012290300370300" + "200220022903c8063703880a200220022903c0063703800a200241800a6a" + "205a20572059205842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200d29030037" + "03002004200e2903003703002002200f2903003703c80b20022010290300" + "3703c00b200241c00b6a205420532056205542c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200241980e6a220d2009290300370300200241900e6a220e200a2903" + "00370300200241a00e6a220f20022903c00b370300200241a80e6a221020" + "022903c80b370300200241b00e6a22112004290300370300200241b80e6a" + "22122003290300370300200220022903880a3703880e200220022903800a" + "3703800e200241c00b6a200241800e6a200241800e6a1030201220062903" + "003703002011200729030037030020102008290300370300200f20052903" + "00370300200d2003290300370300200e2004290300370300200220022903" + "c80b3703880e200220022903c00b3703800e200241c00b6a200241800e6a" + "200241c0066a103020122006290300370300201120072903003703002010" + "2008290300370300200f2005290300370300200d2003290300370300200e" + "2004290300370300200220022903c80b3703880e200220022903c00b3703" + "800e20092016290300370300200a2017290300370300200220022903c804" + "3703880a200220022903c0043703800a200241800a6a2002290300200229" + "03082044290300204329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20032018" + "29030037030020042013290300370300200220142903003703c80b200220" + "152903003703c00b200241c00b6a20422903002041290300204029030020" + "3f29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d200241d80e6a221820092903" + "00370300200241d00e6a2213200a290300370300200241e00e6a22142002" + "2903c00b370300200241e80e6a221520022903c80b370300200241f00e6a" + "22162004290300370300200241f80e6a2217200329030037030020022002" + "2903880a3703c80e200220022903800a3703c00e200241c00b6a200241c0" + "0e6a200241c00e6a10302017200629030037030020162007290300370300" + "201520082903003703002014200529030037030020182003290300370300" + "20132004290300370300200220022903c80b3703c80e200220022903c00b" + "3703c00e200241c00b6a200241c00e6a200241c0046a1030201720062903" + "003703002016200729030037030020152008290300370300201420052903" + "003703002018200329030037030020132004290300370300200241d0096a" + "2226201f290300370300200241d8096a221f202c290300370300200241e0" + "096a222c202d290300370300200241e8096a222d202e2903003703002002" + "41f0096a222e202f290300370300200241f8096a222f2039290300370300" + "200220022903c80b3703c80e200220022903c00b3703c00e200220022903" + "80043703c00920022002290388043703c809200241c0096a20024180046a" + "200241c0016a1030200241c00b6a200241c0096a200241c0096a1030202f" + "2006290300370300202e2007290300370300202d2008290300370300202c" + "2005290300370300201f2003290300370300202620042903003703002002" + "20022903c80b3703c809200220022903c00b3703c009200241c00b6a2002" + "41c0096a20024180046a1030202f2006290300370300202e200729030037" + "0300202d2008290300370300202c2005290300370300201f200329030037" + "030020262004290300370300200220022903c80b3703c809200220022903" + "c00b3703c009200241b80a6a2031290300370300200241b00a6a20212903" + "00370300200241a80a6a2020290300370300200241a00a6a201e29030037" + "03002009201c290300370300200a201d290300370300200220022903c80d" + "3703880a200220022903c00d3703800a200241c80a6a20022903c80e3703" + "00200241d00a6a2013290300370300200241d80a6a201829030037030020" + "0241e00a6a2014290300370300200241e80a6a2015290300370300200241" + "f00a6a2016290300370300200241f80a6a20172903003703002002200229" + "03c00e3703c00a200241b80b6a2012290300370300200241b00b6a201129" + "0300370300200241a80b6a2010290300370300200241a00b6a200f290300" + "370300200241980b6a200d290300370300200241900b6a200e2903003703" + "00200241880b6a20022903880e370300200220022903800e3703800b2006" + "201b2903003703002007201a290300370300200820192903003703002005" + "200c2903003703002003200b290300370300200420012903003703002002" + "20022903c8083703c80b200220022903c0083703c00b200241880c6a2002" + "29038808370300200241900c6a2032290300370300200241980c6a202b29" + "0300370300200241a00c6a202a290300370300200241a80c6a2029290300" + "370300200241b00c6a2028290300370300200241b80c6a20272903003703" + "0020022002290380083703800c200241f80c6a202f290300370300200241" + "f00c6a202e290300370300200241e80c6a202d290300370300200241e00c" + "6a202c290300370300200241d80c6a201f290300370300200241d00c6a20" + "26290300370300200241c80c6a20022903c809370300200220022903c009" + "3703c00c2000200241800a6a41c001104c41c0016a200241c00b6a41c001" + "104c1a200241a00f6a24000bcc1101047f23004180026b22032400024020" + "024101712206450440200341386a200141386a290300370300200341306a" + "200141306a290300370300200341286a200141286a290300370300200341" + "206a200141206a290300370300200341186a200141186a29030037030020" + "0341106a200141106a290300370300200320012903003703002003200141" + "086a29030037030820034190016a200141d0006a29030037030020034198" + "016a200141d8006a290300370300200341a0016a200141e0006a29030037" + "0300200341a8016a200141e8006a290300370300200341b0016a200141f0" + "006a290300370300200341b8016a200141f8006a29030037030020032001" + "290340370380012003200141c8006a290300370388010c010b200341d801" + "6a2204200141386a290300370300200341d0016a2205200141306a290300" + "370300200320012903203703c0012003200141286a2903003703c8012003" + "41c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f102b200341186a200141186a290300370300200341106a" + "200141106a290300370300200341286a20032903c801370300200341306a" + "2005290300370300200341386a20042903003703002003200141086a2903" + "0037030820032001290300370300200320032903c0013703202004200141" + "f8006a2903003703002005200141f0006a2903003703002003200141e800" + "6a2903003703c801200320012903603703c001200341c0016a42c6faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "20034198016a200141d8006a29030037030020034190016a200141d0006a" + "290300370300200341a8016a20032903c801370300200341b0016a200529" + "0300370300200341b8016a20042903003703002003200141c8006a290300" + "370388012003200129034037038001200320032903c0013703a0010b0240" + "0240024002402002410670220441026b0e020102000b200342a0dcae8f86" + "aaf9e4163703f801200342948fe8babd91b3d2cb003703f001200342cebb" + "f2dbd0c38ad7323703e801200342a297bfa0c6a3f5b2163703e001200342" + "f7a3e4fb84f3d1d92f3703d801200342c3e2e6aacf87fb85cc003703d001" + "2003428ce68c968ce2b0c6b77f3703c801200342bdaabdbbf1aae5f1997f" + "3703c0010c020b200341e0016a22024200370300200241086a4200370300" + "200241106a4200370300200241186a4200370300200342a9c0c689aece93" + "b2303703d801200342b099b385febcf6b6de003703d001200342bddcd9dc" + "fbd3c1c7423703c801200342c8faf383d69cd1de643703c0010c010b2003" + "42efecc59e9bc8f7f8043703f801200342cf9298e1decdc3f9a97f3703f0" + "01200342b1ccfcc7f9b7ccef0f3703e801200342de8d96d5bae5aa863837" + "03e0012003428aded7ba8b8fb8ab083703d801200342accbfcacf98ec7ff" + "ba7f3703d001200342d385a5ebd5a7ffaf807f3703c801200342edf6f3de" + "87dd9bbafb003703c0010b20014180016a2102200341406b20034180016a" + "200341c0016a102f02402006450440200341b8016a200241386a29030037" + "0300200341b0016a200241306a290300370300200341a8016a200241286a" + "290300370300200341a0016a200241206a29030037030020034198016a20" + "0241186a29030037030020034190016a200241106a290300370300200320" + "02290300370380012003200241086a290300370388010c010b200341d801" + "6a2206200141b8016a290300370300200341d0016a2205200141b0016a29" + "0300370300200320012903a0013703c0012003200141a8016a2903003703" + "c801200341c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b20034198016a200241186a290300370300" + "20034190016a200241106a290300370300200341a8016a20032903c80137" + "0300200341b0016a2005290300370300200341b8016a2006290300370300" + "2003200241086a2903003703880120032002290300370380012003200329" + "03c0013703a0010b0240024002400240200441026b0e020102000b200342" + "ee95f6bfbedb978a2c3703f80120034292b9acd88396a09d9f7f3703f001" + "200342e38efbdea1ddf4c2363703e801200342a682aee99ce2d19d413703" + "e00120034281d0baa7e6ebd3da053703d80120034284bde0d0f596f0f980" + "7f3703d001200342f2d8d3f4fbbed999533703c801200342e2cefa90d9ea" + "87c5847f3703c0010c020b200341e0016a22014200370300200141086a42" + "00370300200141106a4200370300200141186a4200370300200342003703" + "d801200342ac97d286eaf99af1d9003703d001200342cfb8ede69afe98f9" + "543703c801200342feffffbf97e6d1b1d7003703c0010c010b2003429294" + "c48c9eb3faea233703f80120034284bac8e6f0ddbdd87e3703f001200342" + "e5adfe9b87c1a7a5a47f3703e8012003429fc7b098d7b3fbf1df003703e0" + "01200342ab9b828ee18ce3e20b3703d801200342ce88c9adfb9eb8df1937" + "03d001200342cbd7c1add7a8c299663703c801200342e6e0afe6c3d7a48d" + "0e3703c0010b20004180016a20034180016a200341c0016a102f20004138" + "6a200341386a290300370300200041306a200341306a2903003703002000" + "41286a200341286a290300370300200041206a200341206a290300370300" + "200041186a200341186a290300370300200041106a200341106a29030037" + "0300200041086a2003290308370300200020032903003703002000200329" + "0340370340200041c8006a2003290348370300200041d0006a200341d000" + "6a290300370300200041d8006a200341d8006a290300370300200041e000" + "6a200341e0006a290300370300200041e8006a200341e8006a2903003703" + "00200041f0006a200341f0006a290300370300200041f8006a200341f800" + "6a29030037030020034180026a24000bbd46027c7f107e230041e00b6b22" + "052400200541b8016a2234200141b8016a2235290300370300200541b001" + "6a2236200141b0016a2237290300370300200541a8016a2238200141a801" + "6a2239290300370300200541a0016a223a200141a0016a223b2903003703" + "0020054198016a223c20014198016a223d29030037030020054190016a22" + "3e20014190016a223f290300370300200541d0016a222e200141d0016a22" + "4f290300370300200541d8016a222f200141d8016a225029030037030020" + "0541e0016a2230200141e0016a2251290300370300200541e8016a223120" + "0141e8016a2252290300370300200541f0016a2232200141f0016a225329" + "0300370300200541f8016a2233200141f8016a2254290300370300200520" + "012903800137038001200520012903c0013703c001200520014188016a22" + "40290300370388012005200141c8016a22552903003703c801200541b802" + "6a2256200141f8026a2220290300370300200541b0026a2257200141f002" + "6a2221290300370300200541a8026a2258200141e8026a22282903003703" + "00200541a0026a2259200141e0026a222929030037030020054198026a22" + "5a200141d8026a222a29030037030020054190026a225b200141d0026a22" + "2b290300370300200541d0026a2241200141106a22062903003703002005" + "41d8026a2242200141186a2207290300370300200541e0026a2243200141" + "206a2208290300370300200541e8026a2244200141286a22092903003703" + "00200541f0026a2245200141306a220a290300370300200541f8026a2246" + "200141386a220b2903003703002005200141c8026a222c29030037038802" + "200520012903c00237038002200520012903003703c0022005200141086a" + "220c2903003703c802200541c0026a20012002102f200541b8036a225c20" + "35290300370300200541b0036a225d2037290300370300200541a8036a22" + "5e2039290300370300200541a0036a225f203b2903003703002005419803" + "6a2260203d29030037030020054190036a2261203f290300370300200520" + "402903003703880320052001290380013703800320054180036a20014180" + "016a220d2004102f200541f8036a2262200141b8026a2903003703002005" + "41f0036a2263200141b0026a290300370300200541e8036a2264200141a8" + "026a290300370300200541e0036a2265200141a0026a2903003703002005" + "41d8036a226620014198026a290300370300200541d0036a226720014190" + "026a290300370300200520014188026a2903003703c80320052001290380" + "023703c003200541c0036a20014180026a22472003102f200541b8046a22" + "68200b290300370300200541b0046a2269200a290300370300200541a804" + "6a226a2009290300370300200541a0046a226b2008290300370300200541" + "98046a226c200729030037030020054190046a226d200629030037030020" + "05200c29030037038804200520012903003703800420054180046a200120" + "471030200541f8046a226e200b290300370300200541f0046a226f200a29" + "0300370300200541e8046a22702009290300370300200541e0046a227120" + "08290300370300200541d8046a22722007290300370300200541d0046a22" + "7320062903003703002005200c2903003703c804200520012903003703c0" + "04200541c0046a2001200d1030200541b8056a2248200141f8006a221229" + "0300370300200541b0056a2249200141f0006a2213290300370300200541" + "a8056a224a200141e8006a2214290300370300200541a0056a224b200141" + "e0006a221529030037030020054198056a224c200141d8006a221c290300" + "37030020054190056a224d200141d0006a221d2903003703002005200141" + "c8006a221e29030037038805200520012903403703800520054180056a20" + "0141406b221f200141c0016a22741030200541c0096a20054180056a2001" + "41c0026a222d10302048200541f8096a220c2903003703002049200541f0" + "096a220d290300370300204a200541e8096a220e290300370300204b2005" + "41e0096a220f290300370300204c200541d8096a2210290300370300204d" + "200541d0096a2211290300370300200520052903c8093703880520052005" + "2903c00937038005200541d0056a2222201d290300370300200541d8056a" + "2223201c290300370300200541e0056a22242015290300370300200541e8" + "056a22252014290300370300200541f0056a222620132903003703002005" + "41f8056a22272012290300370300200520012903403703c0052005201e29" + "03003703c805200541c0056a201f2004102f200541b8066a221620272903" + "00370300200541b0066a22172026290300370300200541a8066a22182025" + "290300370300200541a0066a2219202429030037030020054198066a221a" + "202329030037030020054190066a221b2022290300370300200520052903" + "c80537038806200520052903c0053703800620054180066a200541c0056a" + "200541c0036a1030200542003703b80b200542003703b00b200542003703" + "a80b200542013703a00b200542003703980b200542003703900b20054200" + "3703880b200542093703800b200541c0096a20054180066a200541800b6a" + "102f2016200c2903003703002017200d2903003703002018200e29030037" + "03002019200f290300370300201a2010290300370300201b201129030037" + "0300200520052903c80937038806200520052903c00937038006200541c0" + "096a20054180066a200541c0026a10302016200c29030022810137030020" + "17200d2903002282013703002018200e2903002283013703002019200f29" + "0300228401370300201a2010290300228501370300201b20112903002286" + "01370300200541106a2275208601370300200541186a2276208501370300" + "200541206a2277208401370300200541286a227820830137030020054130" + "6a2279208201370300200541386a227a208101370300200520052903c809" + "22810137038806200520052903c009228201370380062005208201370300" + "2005208101370308200541f8066a22062020290300370300200541f0066a" + "22072021290300370300200541e8066a22082028290300370300200541e0" + "066a22092029290300370300200541d8066a220a202a2903003703002005" + "41d0066a220b202b2903003703002005202c2903003703c8062005200129" + "03c0023703c006200541c0066a202d2003102f200541c0096a200541c005" + "6a200541c0066a10302027200c2903003703002026200d29030037030020" + "25200e2903003703002024200f2903003703002023201029030037030020" + "222011290300370300200520052903c8093703c805200520052903c00937" + "03c005200541c0096a200541c0066a20054180036a10302006200c290300" + "2281013703002007200d2903002282013703002008200e29030022830137" + "03002009200f290300228401370300200a2010290300228501370300200b" + "2011290300228601370300201b208601370300201a208501370300201920" + "840137030020182083013703002017208201370300201620810137030020" + "0520052903c8092281013703c806200520052903c0092282013703c00620" + "052082013703800620052081013703880620054180066a200541c0066a20" + "0541800b6a102f2006201229030037030020072013290300370300200820" + "1429030037030020092015290300370300200a201c290300370300200b20" + "1d2903003703002005201e2903003703c806200520012903403703c00620" + "0541c0066a201f2002102f200541c0096a200541c0056a200541c0066a10" + "302027200c2903003703002026200d2903003703002025200e2903003703" + "002024200f29030037030020232010290300370300202220112903003703" + "00200520052903c8093703c805200520052903c0093703c005200541c009" + "6a20054180066a200541c0066a10302016200c2903002281013703002017" + "200d2903002282013703002018200e2903002283013703002019200f2903" + "00228401370300201a2010290300228501370300201b2011290300228601" + "370300200541d0006a227b208601370300200541d8006a227c2085013703" + "00200541e0006a227d208401370300200541e8006a227e20830137030020" + "0541f0006a227f208201370300200541f8006a2280012081013703002005" + "20052903c80922810137038806200520052903c009228201370380062005" + "2082013703402005208101370348200541b8076a221c200241386a222829" + "0300370300200541b0076a221d200241306a2229290300370300200541a8" + "076a221e200241286a222a290300370300200541a0076a221f200241206a" + "222b29030037030020054198076a2220200241186a222c29030037030020" + "054190076a2221200241106a222d2903003703002005200241086a224e29" + "030037038807200520022903003703800720054180076a20022004103020" + "06206e2903003703002007206f2903003703002008207029030037030020" + "092071290300370300200a2072290300370300200b207329030037030020" + "0520052903c8043703c806200520052903c0043703c006200541c0066a20" + "0541c0046a20054180076a102f200541d80b6a2214200a29030037030020" + "0541d00b6a2215200b290300370300200520052903c8063703c80b200520" + "052903c0063703c00b200541c00b6a20052903c00220052903c802204129" + "0300204229030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d20054198086a221220" + "0629030037030020054190086a2213200729030037030020052008290300" + "37038808200520092903003703800820054180086a204329030020442903" + "002045290300204629030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2010201429" + "030022810137030020112015290300228201370300200f20052903800822" + "8301370300200d2013290300228401370300200e20052903880822850137" + "0300200c2012290300228601370300200520052903c80b2287013703c809" + "200520052903c00b2288013703c009200620860137030020072084013703" + "0020082085013703002009208301370300200a208101370300200b208201" + "37030020052087013703c80620052088013703c0062014200a2903003703" + "002015200b290300370300200520052903c8063703c80b200520052903c0" + "063703c00b200541c00b6a20052903800322810120052903880322820120" + "61290300228301206029030022840142c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "122006290300370300201320072903003703002005200829030037038808" + "200520092903003703800820054180086a205f290300228501205e290300" + "228601205d290300228701205c29030022880142c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d2010201429030022890137030020112015290300228a0137030020" + "0f200529038008228b01370300200d2013290300228c01370300200e2005" + "29038808228d01370300200c2012290300228e01370300200520052903c8" + "0b228f013703c809200520052903c00b2290013703c0092006208e013703" + "002007208c013703002008208d013703002009208b01370300200a208901" + "370300200b208a013703002005208f013703c80620052090013703c00620" + "162054290300370300201720532903003703002018205229030037030020" + "192051290300370300201a2050290300370300201b204f29030037030020" + "05205529030037038806200520012903c0013703800620054180066a2074" + "2003102f200541c0096a200541c0056a20054180066a10302027200c2903" + "003703002026200d2903003703002025200e2903003703002024200f2903" + "003703002023201029030037030020222011290300370300200520052903" + "c8093703c805200520052903c0093703c005200541c0096a200541c0066a" + "20054180066a10302006200c2903003703002007200d2903003703002008" + "200e2903003703002009200f290300370300200a2010290300370300200b" + "2011290300370300200520052903c8093703c806200520052903c0093703" + "c0062021203f2903003703002020203d290300370300201f203b29030037" + "0300201e2039290300370300201d2037290300370300201c203529030037" + "030020052001290380013703800720052040290300370388072005418007" + "6a20054180016a2047103020342006290300370300203620072903003703" + "0020382008290300370300203a2009290300370300203c200a2903003703" + "00203e200b290300370300200541d0076a200441106a2903003703002005" + "41d8076a200441186a290300370300200541e0076a200441206a29030037" + "0300200541e8076a200441286a290300370300200541f0076a200441306a" + "290300370300200541f8076a200441386a290300370300200520052903c8" + "0637038801200520052903c00637038001200520042903003703c0072005" + "200441086a2903003703c807200541c0076a2004200310302006201c2903" + "003703002007201d2903003703002008201e2903003703002009201f2903" + "00370300200a2020290300370300200b2021290300370300200520052903" + "88073703c80620052005290380073703c006200541c0066a20054180076a" + "200541c0076a102f2014200a2903003703002015200b2903003703002005" + "20052903c8063703c80b200520052903c0063703c00b200541c00b6a2081" + "0120820120830120840142c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d201220062903" + "003703002013200729030037030020052008290300370388082005200929" + "03003703800820054180086a20850120860120870120880142c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20102014290300228101370300201120152903002282" + "01370300200f200529038008228301370300200d20132903002284013703" + "00200e200529038808228501370300200c20122903002286013703002005" + "20052903c80b2287013703c809200520052903c00b2288013703c0092006" + "208601370300200720840137030020082085013703002009208301370300" + "200a208101370300200b20820137030020052087013703c8062005208801" + "3703c0062014200a2903003703002015200b290300370300200520052903" + "c8063703c80b200520052903c0063703c00b200541c00b6a20052903c003" + "22810120052903c8032282012067290300228301206629030022840142c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d201220062903003703002013200729030037" + "03002005200829030037038808200520092903003703800820054180086a" + "206529030022850120642903002286012063290300228701206229030022" + "880142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2010201429030022890137030020" + "112015290300228a01370300200f200529038008228b01370300200d2013" + "290300228c01370300200e200529038808228d01370300200c2012290300" + "228e01370300200520052903c80b228f013703c809200520052903c00b22" + "90013703c0092006208e013703002007208c013703002008208d01370300" + "2009208b01370300200a208901370300200b208a013703002005208f0137" + "03c80620052090013703c006201620062903003703002017200729030037" + "03002018200829030037030020192009290300370300201a200a29030037" + "0300201b200b290300370300200520052903c80637038806200520052903" + "c0063703800620054180066a200541c0066a200541800b6a102f20062033" + "290300370300200720322903003703002008203129030037030020092030" + "290300370300200a202f290300370300200b202e29030037030020052005" + "2903c8013703c806200520052903c0013703c006200541c0066a200541c0" + "016a2002102f200541c0096a200541c0056a200541c0066a10302027200c" + "2903003703002026200d2903003703002025200e2903003703002024200f" + "290300370300202320102903003703002022201129030037030020052005" + "2903c8093703c805200520052903c0093703c005200541c0096a20054180" + "066a200541c0066a10302016200c2903002289013703002017200d290300" + "228a013703002018200e290300228b013703002019200f290300228c0137" + "0300201a2010290300228d01370300201b2011290300228e01370300202e" + "208e01370300202f208d013703002030208c013703002031208b01370300" + "2032208a013703002033208901370300200520052903c809228901370388" + "06200520052903c009228a01370380062005208a013703c0012005208901" + "3703c8012006205629030037030020072057290300370300200820582903" + "0037030020092059290300370300200a205a290300370300200b205b2903" + "0037030020052005290388023703c80620052005290380023703c0062005" + "41c0066a20054180026a2004102f200541c0096a200541c0056a200541c0" + "066a10302027200c2903003703002026200d2903003703002025200e2903" + "003703002024200f29030037030020232010290300370300202220112903" + "00370300201b200b290300370300201a200a290300370300201920092903" + "003703002018200829030037030020172007290300370300201620062903" + "00370300200520052903c8093703c805200520052903c0093703c0052005" + "20052903c00637038006200520052903c8063703880620054180066a2005" + "41c0066a200541800b6a102f201c2028290300370300201d202929030037" + "0300201e202a290300370300201f202b2903003703002020202c29030037" + "03002021202d2903003703002005204e2903003703880720052002290300" + "3703800720054180076a2002200310302006206829030037030020072069" + "2903003703002008206a2903003703002009206b290300370300200a206c" + "290300370300200b206d29030037030020052005290388043703c8062005" + "2005290380043703c006200541c0066a20054180046a20054180076a102f" + "2014200a2903003703002015200b290300370300200520052903c8063703" + "c80b200520052903c0063703c00b200541c00b6a20052903c00220052903" + "c8022041290300204229030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20122006" + "290300370300201320072903003703002005200829030037038808200520" + "092903003703800820054180086a20432903002044290300204529030020" + "4629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201020142903002289013703" + "0020112015290300228a01370300200f200529038008228b01370300200d" + "2013290300228c01370300200e200529038808228d01370300200c201229" + "0300228e01370300200520052903c80b228f013703c809200520052903c0" + "0b2290013703c0092006208e013703002007208c013703002008208d0137" + "03002009208b01370300200a208901370300200b208a013703002005208f" + "013703c80620052090013703c0062014200a2903003703002015200b2903" + "00370300200520052903c8063703c80b200520052903c0063703c00b2005" + "41c00b6a20810120820120830120840142c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201220062903003703002013200729030037030020052008290300370388" + "08200520092903003703800820054180086a208501208601208701208801" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d20102014290300228101370300201120" + "15290300228201370300200f200529038008228301370300200d20132903" + "00228401370300200e200529038808228501370300200c20122903002286" + "01370300200520052903c80b2287013703c809200520052903c00b228801" + "3703c0092006208601370300200720840137030020082085013703002009" + "208301370300200a208101370300200b20820137030020052087013703c8" + "0620052088013703c006200541c0096a20054180066a200541c0066a1030" + "2016200c2903003703002017200d2903003703002018200e290300370300" + "2019200f290300370300201a2010290300370300201b2011290300370300" + "200520052903c80937038806200520052903c009370380062021202d2903" + "003703002020202c290300370300201f202b290300370300201e202a2903" + "00370300201d2029290300370300201c2028290300370300200520022903" + "00370380072005204e2903003703880720054180076a2002200410302005" + "41c0096a20054180076a20031030201c200c290300370300201d200d2903" + "00370300201e200e290300370300201f200f290300370300202020102903" + "0037030020212011290300370300200b204d290300370300200a204c2903" + "003703002009204b2903003703002008204a290300370300200720492903" + "0037030020062048290300370300200520052903c8093703880720052005" + "2903c0093703800720052005290380053703c00620052005290388053703" + "c806200541c0066a20054180056a20054180076a102f2014200a29030037" + "03002015200b290300370300200520052903c8063703c80b200520052903" + "c0063703c00b200541c00b6a20052903c00520052903c805202229030020" + "2329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201220062903003703002013" + "200729030037030020052008290300370388082005200929030037038008" + "20054180086a202429030020252903002026290300202729030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d2010201429030022810137030020112015290300" + "228201370300200f200529038008228301370300200d2013290300228401" + "370300200e200529038808228501370300200c2012290300228601370300" + "200520052903c80b2287013703c809200520052903c00b2288013703c009" + "200620860137030020072084013703002008208501370300200920830137" + "0300200a208101370300200b20820137030020052087013703c806200520" + "88013703c006200541b8086a207a290300370300200541b0086a20792903" + "00370300200541a8086a2078290300370300200541a0086a207729030037" + "030020122076290300370300201320752903003703002005200529030837" + "0388082005200529030037038008200541c8086a20052903483703002005" + "41d0086a207b290300370300200541d8086a207c290300370300200541e0" + "086a207d290300370300200541e8086a207e290300370300200541f0086a" + "207f290300370300200541f8086a20800129030037030020052005290340" + "3703c008200541b8096a2034290300370300200541b0096a203629030037" + "0300200541a8096a2038290300370300200541a0096a203a290300370300" + "20054198096a203c29030037030020054190096a203e2903003703002005" + "4188096a200529038801370300200520052903800137038009200c203329" + "0300370300200d2032290300370300200e2031290300370300200f203029" + "03003703002010202f2903003703002011202e2903003703002005200529" + "03c8013703c809200520052903c0013703c009200541880a6a2005290388" + "06370300200541900a6a201b290300370300200541980a6a201a29030037" + "0300200541a00a6a2019290300370300200541a80a6a2018290300370300" + "200541b00a6a2017290300370300200541b80a6a20162903003703002005" + "2005290380063703800a200541f80a6a2006290300370300200541f00a6a" + "2007290300370300200541e80a6a2008290300370300200541e00a6a2009" + "290300370300200541d80a6a200a290300370300200541d00a6a200b2903" + "00370300200541c80a6a20052903c806370300200520052903c0063703c0" + "0a200020054180086a41c001104c41c0016a200541c0096a41c001104c1a" + "200541e00b6a24000ba21d02297f0d7e23004180066b2203240020034180" + "046a20014180016a22162002102f20034198036a2204200141186a220c29" + "030037030020034190036a2205200141106a220d29030037030020032001" + "41086a220f29030037038803200320012903003703800320034180036a20" + "032903800420032903880420032903900420034198046a220929030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200341d8036a2206200141386a2210290300" + "370300200341d0036a2207200141306a2211290300370300200320014128" + "6a22122903003703c8032003200141206a22172903003703c003200341c0" + "036a20032903a004200341a8046a220a29030020032903b004200341b804" + "6a220b29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200341186a220e200429" + "0300370300200341106a22082005290300370300200341206a2213200329" + "03c003370300200341286a221420032903c803370300200341306a221520" + "07290300370300200341386a221820062903003703002003200329038803" + "370308200320032903800337030020034180046a2016200241406b221f10" + "2f2004200141d8006a22202903003703002005200141d0006a2221290300" + "3703002003200141c8006a22222903003703880320032001290340370380" + "0320034180036a2003290380042003290388042003290390042009290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2006200141f8006a2223290300370300" + "2007200141f0006a22242903003703002003200141e8006a222529030037" + "03c8032003200141e0006a22262903003703c003200341c0036a20032903" + "a004200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200341d8006a22192004290300370300200341d0006a221a20052903" + "00370300200341e0006a221b20032903c003370300200341e8006a221c20" + "032903c803370300200341f0006a221d2007290300370300200341f8006a" + "221e20062903003703002003200329038803370348200320032903800337" + "0340200341f8046a2018290300370300200341f0046a2015290300370300" + "200341e8046a2014290300370300200341e0046a20132903003703002003" + "41d8046a200e290300370300200341d0046a200829030037030020032003" + "2903083703c804200320032903003703c004200341c0046a20032003102f" + "200341b8056a201e290300370300200341b0056a201d2903003703002003" + "41a8056a201c290300370300200341a0056a201b29030037030020034198" + "056a201929030037030020034190056a201a290300370300200320032903" + "4837038805200320032903403703800520034180056a200341406b200341" + "406b102f20034180016a2003200341c0046a102f200341c0016a20012003" + "41c0046a102f20034180046a201620034180056a102f200341c0036a2003" + "4180046a20034180016a103020034180046a200341c0016a200341c0016a" + "1030200341d8026a220e2006290300370300200341d0026a220820072903" + "00370300200320032903c8033703c802200320032903c0033703c0022003" + "41c0026a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2004200341f8036a2213290300370300200520" + "0341f0036a22142903003703002003200341e8036a221529030037038803" + "200320032903e0033703800320034180036a20032903a004200a29030020" + "032903b004200b29030042c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20034198026a" + "2218200e29030037030020034190026a22272008290300370300200341a8" + "026a2228200329038803370300200341b0026a2229200529030037030020" + "0341b8026a222a2004290300370300200320032903c80237038802200320" + "032903c0023703800220032003290380033703a00220034180046a200320" + "034180026a102f2010200b2903003703002011200341b0046a2210290300" + "3703002012200a2903003703002017200341a0046a222b29030037030020" + "0c2009290300370300200d20034190046a2211290300370300200f200329" + "03880437030020012003290380043703002004200341d8016a2903003703" + "002005200341d0016a290300370300200320032903c80137038803200320" + "032903c0013703800320034180036a200329038002200329038802202729" + "0300201829030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2006200341f8016a29" + "03003703002007200341f0016a2903003703002003200341e8016a290300" + "3703c803200320032903e0013703c003200341c0036a20032903a0022028" + "2903002029290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200920" + "0429030037030020112005290300370300200a20032903c8033703002010" + "2007290300370300200b2006290300370300200320032903880337038804" + "200320032903800337038004200320032903c0033703a004200341c0036a" + "200341406b20034180046a102f20034180046a20034180016a200141406b" + "102f200341f8056a220c2006290300370300200341f0056a220d20072903" + "00370300200320032903c8033703e805200320032903c0033703e0052003" + "41e0056a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d200e2013290300370300200820142903003703" + "00200320152903003703c802200320032903e0033703c002200341c0026a" + "20032903a004200a29030020032903b004200b29030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2004200c2903003703002005200d290300370300200341a0" + "036a221720032903c002370300200341a8036a220f20032903c802370300" + "200341b0036a22122008290300370300200341b8036a2208200e29030037" + "0300200320032903e80537038803200320032903e0053703800320232008" + "290300370300202420122903003703002025200f29030037030020262017" + "290300370300202020042903003703002021200529030037030020222003" + "29038803370300200120032903800337034020034180046a201620034180" + "016a102f200141b8016a200b290300370300200141b0016a201029030037" + "0300200141a8016a200a290300370300200141a0016a202b290300370300" + "20014198016a200929030037030020014190016a20112903003703002001" + "4188016a2003290388043703002001200329038004370380012003420037" + "03f802200342003703f002200342003703e802200342013703e002200342" + "003703d802200342003703d002200342003703c802200342093703c00220" + "0341c0036a200341406b2002102f20034180046a2003201f102f200341d8" + "056a22012006290300370300200341d0056a220620072903003703002003" + "20032903c8033703c805200320032903c0033703c005200341c0056a2003" + "29038004200329038804200329039004200929030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200c2013290300370300200d20142903003703002003201529" + "03003703e805200320032903e0033703e005200341e0056a20032903a004" + "200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2004200129030037030020052006290300370300200f20032903e8053703" + "002012200d2903003703002008200c290300370300200320032903c80537" + "038803200320032903c00537038003200320032903e0053703a003200341" + "80046a200341c0026a20034180036a102f201e2903002136201d29030021" + "34201c290300212d201b2903002135201a29030022302003290340223184" + "201929030022382003290348223284844200520440427f4200427f420020" + "3142788342c7faf3c3ed82a3903c561b222e202e203254ad7d202e20327d" + "222e42f3eab8bce9ada5bfe8007d2237202e54ad7c42017c223320307d22" + "2f42a4cffaf397c9eed7c7007d222e202f54ad2030203356ad7d427f511b" + "20387d42a9c0c689aece93b2307c213342c7faf3c3ed82a3903c20317d21" + "2f0b4200213042002131420021322034203584202d203684844200520440" + "427f4200427f4200203542788342c7faf3c3ed82a3903c561b222c202c20" + "2d54ad7d202c202d7d222d42f3eab8bce9ada5bfe8007d2230202d54ad7c" + "42017c222d20347d222c42a4cffaf397c9eed7c7007d2231202c54ad202d" + "203454ad7d427f511b20367d42a9c0c689aece93b2307c213242c7faf3c3" + "ed82a3903c20357d212c0b20002003290380043703002000200329030037" + "0340200041086a200329038804370300200041c8006a2003290308370300" + "200041386a200341b8046a290300370300200041306a200341b0046a2903" + "00370300200041286a200341a8046a290300370300200041206a200341a0" + "046a290300370300200041186a20034198046a290300370300200041106a" + "20034190046a290300370300200041d0006a200341106a29030037030020" + "0041d8006a200341186a290300370300200041e0006a200341206a290300" + "370300200041e8006a200341286a290300370300200041f0006a20034130" + "6a290300370300200041f8006a200341386a290300370300200020323703" + "b801200020313703b001200020303703a8012000202c3703a00120002033" + "370398012000202e3703900120002037370388012000202f370380012003" + "4180066a24000b4201047f412021020240034020002d0000220320012d00" + "002204460440200041016a2100200141016a2101200241016b22020d010c" + "020b0b200320046b21050b20050b8a0301047f0240200141104904402000" + "21020c010b02402000410020006b41037122046a220320004d0d00200021" + "0220040440200421050340200241003a0000200241016a2102200541016b" + "22050d000b0b200441016b4107490d000340200241003a0000200241076a" + "41003a0000200241066a41003a0000200241056a41003a0000200241046a" + "41003a0000200241036a41003a0000200241026a41003a0000200241016a" + "41003a0000200241086a22022003470d000b0b2003200120046b2201417c" + "716a220220034b0440034020034100360200200341046a22032002490d00" + "0b0b200141037121010b02402002200120026a22054f0d00200141016b21" + "042001410771220304400340200241003a0000200241016a210220034101" + "6b22030d000b0b20044107490d000340200241003a0000200241076a4100" + "3a0000200241066a41003a0000200241056a41003a0000200241046a4100" + "3a0000200241036a41003a0000200241026a41003a0000200241016a4100" + "3a0000200241086a22022005470d000b0b20000b940501087f0240200241" + "10490440200021030c010b02402000410020006b41037122066a22052000" + "4d0d00200641016b21082000210320012104200604402006210703402003" + "20042d00003a0000200441016a2104200341016a2103200741016b22070d" + "000b0b20084107490d000340200320042d00003a0000200341016a200441" + "016a2d00003a0000200341026a200441026a2d00003a0000200341036a20" + "0441036a2d00003a0000200341046a200441046a2d00003a000020034105" + "6a200441056a2d00003a0000200341066a200441066a2d00003a00002003" + "41076a200441076a2d00003a0000200441086a2104200341086a22032005" + "470d000b0b2005200220066b2207417c7122086a21030240200120066a22" + "04410371450440200320054d0d0120042101034020052001280200360200" + "200141046a2101200541046a22052003490d000b0c010b200320054d0d00" + "2004410374220241187121062004417c71220941046a2101410020026b41" + "1871210a2009280200210203402005200220067620012802002202200a74" + "72360200200141046a2101200541046a22052003490d000b0b2007410371" + "2102200420086a21010b02402003200220036a22054f0d00200241016b21" + "072002410771220404400340200320012d00003a0000200141016a210120" + "0341016a2103200441016b22040d000b0b20074107490d00034020032001" + "2d00003a0000200341016a200141016a2d00003a0000200341026a200141" + "026a2d00003a0000200341036a200141036a2d00003a0000200341046a20" + "0141046a2d00003a0000200341056a200141056a2d00003a000020034106" + "6a200141066a2d00003a0000200341076a200141076a2d00003a00002001" + "41086a2101200341086a22032005470d000b0b20000b6201047e20002002" + "42ffffffff0f832203200142ffffffff0f8322047e220520024220882202" + "20047e22042003200142208822017e7c22034220867c2206370300200020" + "05200656ad200120027e2003200454ad4220862003422088847c7c370308" + "0b5601017e0240200341c000714504402003450d012002410020036b413f" + "71ad8620012003413f71ad220488842101200220048821020c010b200220" + "03413f71ad882101420021020b20002001370300200020023703080b5a01" + "027e420121020240200141c000714504402001450d0142002001413f71ad" + "2202864201410020016b413f71ad88842103420120028621020c010b4201" + "2001413f71ad862103420021020b20002002370300200020033703080b0b" + "e1250100418080c0000bd725307830306165613865396338336337336437" + "343033363932336465316234613636643138353437643538656565346561" + "6366656537303233356564323931393534636361706163697479206f7665" + "72666c6f77004200100011000000010000000000000063616c6c65642060" + "4f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e656020" + "76616c7565696e646578206f7574206f6620626f756e64733a2074686520" + "6c656e20697320206275742074686520696e646578206973200000008f00" + "100020000000af001000120000003a2000000100000000000000d4001000" + "020000003030303130323033303430353036303730383039313031313132" + "313331343135313631373138313932303231323232333234323532363237" + "323832393330333133323333333433353336333733383339343034313432" + "343334343435343634373438343935303531353235333534353535363537" + "353835393630363136323633363436353636363736383639373037313732" + "373337343735373637373738373938303831383238333834383538363837" + "38383839393039313932393339343935393639373938393972616e676520" + "737461727420696e64657820206f7574206f662072616e676520666f7220" + "736c696365206f66206c656e67746820b001100012000000c20110002200" + "000072616e676520656e6420696e64657820f401100010000000c2011000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e6473206174200014021000160000002a0210000d00000054726965" + "6420746f20736872696e6b20746f2061206c617267657220636170616369" + "74794802100024000000f40a10004c000000b3020000090000002f686f6d" + "652f6f706964736b6f706e79692f2e636172676f2f72656769737472792f" + "7372632f696e6465782e6372617465732e696f2d31393439636638633662" + "3562353537662f6e756d2d626967696e742d302e342e362f7372632f6269" + "6775696e742e72732f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f6e756d2d626967696e742d" + "302e342e362f7372632f62696775696e742f6164646974696f6e2e727300" + "0000ea0210006f000000890000001b000000a80c10006f00000057000000" + "09000000a80c10006f000000a3000000090000008402100066000000ad00" + "000013000000a80c10006f000000c40000001f000000a80c10006f000000" + "150100000e000000a80c10006f000000160100000e000000a80c10006f00" + "00001a0100000f000000a80c10006f000000510100000c000000a80c1000" + "6f0000002001000021000000a80c10006f0000002101000018000000a80c" + "10006f000000420100003c000000040c10006e0000006d0200000d000000" + "040c10006e00000066020000110000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f6e756d" + "2d626967696e742d302e342e362f7372632f62696775696e742f73686966" + "742e72733c0410006c0000001e0000001c0000003c0410006c0000002e00" + "0000120000003c0410006c00000028000000190000002f72757374632f34" + "656231363132353065333430633866343866363665326239323965663461" + "3562656437633138312f6c6962726172792f636f72652f7372632f736c69" + "63652f697465722e72732f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f6865782d302e342e33" + "2f7372632f6c69622e7273000000260510005b000000c700000025000000" + "260510005b000000c7000000410000004e6f744d656d626572496e76616c" + "6964536c6963654c656e677468496e76616c696455353132456e636f6469" + "6e6700000000000067e6096a85ae67bb72f36e3c3af54fa57f520e518c68" + "059babd9831f19cde05bd80410004e000000f605000015000000496e7661" + "6c696420636f6d7072657373656420706f696e7420666c61670000000806" + "10001d0000002f686f6d652f6f706964736b6f706e79692f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d" + "313934396366386336623562353537662f7370312d76657269666965722d" + "342e312e332f7372632f636f6e7374616e74732e72730000300610006a00" + "00001f000000120000002f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f7370312d7665726966" + "6965722d342e312e332f7372632f636f6e7665727465722e727300000000" + "00000100000001000000060000004661696c656420746f20636f6e766572" + "74207820627974657320746f20467100ac0610006a0000001f0000003700" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7370312d76657269666965722d342e312e" + "332f7372632f67726f746831362f636f6e7665727465722e727300005807" + "100072000000290000003e00000058071000720000002a0000003d000000" + "58071000720000002b0000003e00000058071000720000002c0000003e00" + "000058071000720000002e0000002500000058071000720000002e000000" + "3200000058071000720000002e0000003f00000058071000720000002e00" + "00004c0000005807100072000000320000003f0000005807100072000000" + "330000000b0000002f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f7370312d76657269666965" + "722d342e312e332f7372632f67726f746831362f7665726966792e727300" + "6c0810006f0000002d000000160000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737031" + "2d76657269666965722d342e312e332f7372632f67726f746831362f6d6f" + "642e7273ec0810006c0000006d00000044000000ad4d9aa7e302d9df4174" + "9d5507949d05dbea33fbb16c643b22f599a2be6df2e2e1a1575c2e494d36" + "13e95e43b622318d9225c820e46acd08e8c987b44051195bc967032fcbf7" + "76d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c0e187847" + "ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab998e" + "9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2" + "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992" + "f6edc980d3486a83b99e6c876acec4d309746e28cd96fa8e01864daa8459" + "9384f354a62eabe81511aa8e3034cbd75d42e708aa4ed80303fb0e4fb90c" + "d0ff6e9092132b65c9ae2605f3ef5540d3a64503c84fe5e1d9ec6eb1bd3a" + "906bbc80830e8e5400000003ced6e0c13f353262ae2dbbe49ce6a0b67576" + "d38aaf5958564be7648356830ef7db611b8f696f28ffb6250c7ffac66efb" + "d638d97f0d6c843c23691c3af532c9e3a974086bde6c91267b201137cfe6" + "ee8cd50ff0a3da861e808503e7df4da87b8d00000000000000002f727573" + "74632f346562313631323530653334306338663438663636653262393239" + "656634613562656437633138312f6c6962726172792f616c6c6f632f7372" + "632f7261775f7665632e7273f40a10004c00000028020000110000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f7665726865616400500b1000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "500b100029000000ae0400000d0000000000000004000000000000002f68" + "6f6d652f6f706964736b6f706e79692f2e636172676f2f72656769737472" + "792f7372632f696e6465782e6372617465732e696f2d3139343963663863" + "36623562353537662f6e756d2d626967696e742d302e342e362f7372632f" + "62696775696e742f636f6e766572742e72730000040c10006e000000f001" + "000016000000617474656d707420746f20646976696465206279207a6572" + "6f000000840c1000190000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f6e756d2d626967" + "696e742d302e342e362f7372632f62696775696e742f6469766973696f6e" + "2e727300a80c10006f00000070000000090000004f6e63652070616e6963" + "6b65642f686f6d652f6f706964736b6f706e79692f2e636172676f2f7265" + "6769737472792f7372632f696e6465782e6372617465732e696f2d313934" + "396366386336623562353537662f7370696e2d302e392e382f7372632f6f" + "6e63652e72730000350d10005d000000e60000002a0000004f6e63652070" + "726576696f75736c7920706f69736f6e656420627920612070616e69636b" + "65640000350d10005d0000004e010000250000002f72757374632f346562" + "313631323530653334306338663438663636653262393239656634613562" + "656437633138312f6c6962726172792f616c6c6f632f7372632f736c6963" + "652e72730000dc0d10004a000000a10000001900000063616c6c65642060" + "526573756c743a3a756e77726170282960206f6e20616e20604572726020" + "76616c75652f686f6d652f6f706964736b6f706e79692f2e636172676f2f" + "72656769737472792f7372632f696e6465782e6372617465732e696f2d31" + "3934396366386336623562353537662f7375627374726174652d626e2d73" + "756363696e63742d302e362e302d76342d72632e382f7372632f6669656c" + "64732f66702e72730000630e10007b000000e9020000230000004661696c" + "656420746f20636f6d707574652074686520696e7665727365206f662074" + "68652064697669736f722f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f737562737472617465" + "2d626e2d73756363696e63742d302e362e302d76342d72632e382f737263" + "2f6669656c64732f6671322e72731c0f10007c000000430100000e000000" + "000000000100000001000000070000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737562" + "7374726174652d626e2d73756363696e63742d302e362e302d76342d7263" + "2e382f7372632f67726f7570732f6d6f642e7273b80f10007c000000b100" + "00002c000000556e61626c6520746f20636f6e7665727420473120746f20" + "416666696e654731b80f10007c0000000001000012000000b80f10007c00" + "00002001000012000000b80f10007c000000400100000d000000b80f1000" + "7c0000006b01000029000000010001000000030003000000030001000300" + "000300000000000100000300010000030000000003000100000003000300" + "00010000000300000300010001000000b80f10007c000000150300002600" + "0000b80f10007c0000001003000026000000b80f10007c00000008030000" + "2e000000b80f10007c000000020300002a000000b80f10007c0000009b03" + "000010000000b80f10007c0000009c03000010000000b80f10007c000000" + "8f03000014000000b80f10007c0000009203000018000000b80f10007c00" + "000095030000180000006d696c6c6572206c6f6f702063616e6e6f742070" + "726f64756365207a65726f00b80f10007c000000221100000a000000b80f" + "10007c000000191100002a000000b80f10007c0000001911000017000000" + "b80f10007c0000001a1100002e000000b80f10007c0000001a1100001b00" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7375627374726174652d626e2d73756363" + "696e63742d302e362e302d76342d72632e382f7372632f6c69622e727300" + "0000e4111000750000003b0300000c000000e4111000750000003c030000" + "0c0000004e6f744f6e43757276654e6f74496e53756267726f7570496e76" + "616c6964496e7075744c656e677468000000120000001300000009000000" + "ad051000bf051000a40510000a0000000d000000120000007c1210008612" + "1000931210004d0970726f64756365727302086c616e6775616765010452" + "757374000c70726f6365737365642d6279010572757374631d312e38352e" + "31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" + "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" + "756c746976616c7565"; + +extern std::string const xrplStdExampleHex = + "0061736d0100000001240560037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" + "7f7f7e017f6000017f0295010608686f73745f6c69620c6765745f74785f6669656c640000" + "08686f73745f6c6962057472616365000108686f73745f6c69620e6163636f756e745f6b65" + "796c6574000208686f73745f6c69621063616368655f6c65646765725f6f626a000008686f" + "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000208686f73745f6c69" + "620974726163655f6e756d00030302010405030100110619037f01418080c0000b7f004190" + "80c0000b7f00419080c0000b072e04066d656d6f727902000666696e69736800060a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020aa203019f0302047f017e238080" + "80800041e0006b2200248080808000200041c0006a41106a22014100360200200041c0006a" + "41086a220242003703002000420037034002400240024041818020200041c0006a41141080" + "808080004101480d00200041086a41106a2001280200360200200041086a41086a20022903" + "0037030020002000290340370308418080c08000410a200041086a41144101108180808000" + "1a200041c0006a41186a220342003703002001420037030020024200370300200042003703" + "400240200041086a4114200041c0006a41201082808080004101480d00200041206a41186a" + "2003290300370300200041206a41106a200041c0006a41106a290300370300200041206a41" + "086a200041c0006a41086a29030037030020002000290340370320200041206a4120410010" + "8380808000220241014e0d020b417b21010c020b417f21010c010b20004200370340417b21" + "01200241828018200041c0006a41081084808080004108470d00418a80c080004106200029" + "034022041085808080001a417741012004501b21010b200041e0006a24808080800020010b" + "0b190100418080c0000b1020204163636f756e743a20204665653a008903046e616d650016" + "157872706c5f7374645f6578616d706c652e7761736d01c9020700335f5a4e387872706c5f" + "73746434686f737431326765745f74785f6669656c64313768646531643438363634626333" + "6138346145012b5f5a4e387872706c5f73746434686f737435747261636531376831626534" + "3662336564373737306363624502355f5a4e387872706c5f73746434686f73743134616363" + "6f756e745f6b65796c6574313768333736666637613833306562626537624503375f5a4e38" + "7872706c5f73746434686f7374313663616368655f6c65646765725f6f626a313768646361" + "6435366531366262633331653345043b5f5a4e387872706c5f73746434686f737432306765" + "745f6c65646765725f6f626a5f6669656c6431376863623833653465366431326162306332" + "45052f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376832363139" + "36306163653839633831313845060666696e697368071201000f5f5f737461636b5f706f69" + "6e746572090a0100072e726f64617461004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d312e38372e302028" + "31373036376539616320323032352d30352d3039290094010f7461726765745f6665617475" + "726573082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663" + "616c6c2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75" + "7461626c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72" + "65666572656e63652d74797065732b087369676e2d657874"; + std::string const ledgerSqnHex = "0061736d010000000105016000017f02190108686f73745f6c69620c6765" "744c656467657253716e00000302010005030100100611027f00418080c0" @@ -34,821 +10809,74 @@ std::string const ledgerSqnHex = "732b0a6d756c746976616c7565"; std::string const allHostFunctionsHex = - "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" - "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" - "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" - "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" - "686f73745f6c69621a67657443757272656e744c6564676572456e747279" - "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" - "794669656c64000408686f73745f6c696213676574506172656e744c6564" - "67657254696d65000503363501010101090a000302010101010506020207" - "020201040001010100010400010101020701080101030800010103020202" - "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" - "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" - "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" - "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" - "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" - "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" - "0000450440200128021c41d480c0004104200128022028020c1100002100" - "0c010b41012100200128021c220341d880c0004104200128022022062802" - "0c22051100000d00200441016a2104024020012d00144104714504402003" - "418d83c000410120051100000d022004200110050d02200128021c210320" - "0128022028020c21050c010b2003418e83c000410220051100000d012002" - "41013a0017200241206a200141086a290200370300200241286a20014110" - "6a290200370300200241306a200141186a2802003602002002200636020c" - "20022003360208200241e482c00036023820022001290200370318200220" - "0241176a3602102002200241086a3602342004200241186a10050d012002" - "280234418883c0004102200228023828020c1100000d010b2003419891c0" - "004101200511000021000b200241406b240020000bff0201037f23004180" - "016b22032400027f0240200128021422024110714504402002412071450d" - "0120002d0000210241810121000340200020036a41026b2002410f712204" - "413072200441376a2004410a491b3a000020022204410476210220004101" - "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" - "41810120006b10090c020b20002d0000210241810121000340200020036a" - "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" - "22044104762102200041016b21002004410f4b0d000b20014101419183c0" - "004102200020036a41016b41810120006b10090c010b0240024002402000" - "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" - "0171410174419383c0006a2f00003b0001410021000c010b410221002002" - "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" - "410174419383c0006a2f00003b00010b2001410141014100200020036a20" - "0041037310090b20034180016a24000b4701017f230041106b2202240020" - "022000280200220041046a36020c200141a080c000410941a980c000410b" - "2000410141b480c00041092002410c6a41021008200241106a24000bff01" - "01037f23004180016b22042400027f024020012802142202411071450440" - "20024120710d01200028020041012001100a0c020b200028020021004181" - "0121020340200220046a41026b2000410f712203413072200341d7006a20" - "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" - "20014101419183c0004102200220046a41016b41810120026b10090c010b" - "2000280200210041810121020340200220046a41026b2000410f71220341" - "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" - "41047621000d000b20014101419183c0004102200220046a41016b418101" - "20026b10090b20044180016a24000bc50101017f230041106b220b240020" - "0028021c20012002200028022028020c1100002101200b41003a000d200b" - "20013a000c200b2000360208200b41086a20032004200520061020200720" - "082009200a10202101200b2d000d2202200b2d000c220372210002402003" - "4101712002410147720d00200128020022002d0014410471450440200028" - "021c418b83c0004102200028022028020c11000021000c010b200028021c" - "418a83c0004101200028022028020c11000021000b200b41106a24002000" - "4101710bef0401077f027f200145044020002802142106412d2109200541" - "016a0c010b412b418080c4002000280214220641017122011b2109200120" - "056a0b210702402006410471450440410021020c010b024020034504400c" - "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" - "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" - "280200450440200028021c22012000280220220020092002200310190440" - "41010f0b200120042005200028020c1100000f0b02400240024020072000" - "28020422084f0440200028021c2201200028022022002009200220031019" - "450d0141010f0b2006410871450d012000280210210b2000413036021020" - "002d0018210c41012101200041013a0018200028021c2206200028022022" - "0a20092002200310190d02200820076b41016a210102400340200141016b" - "2201450d0120064130200a280210110100450d000b41010f0b2006200420" - "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" - "000f0b200120042005200028020c11000021010c010b200820076b210602" - "4002400240410120002d0018220120014103461b220141016b0e02000102" - "0b20062101410021060c010b20064101762101200641016a41017621060b" - "200141016a21012000280210210820002802202107200028021c21000240" - "0340200141016b2201450d01200020082007280210110100450d000b4101" - "0f0b410121012000200720092002200310190d0020002004200520072802" - "0c1100000d004100210103402001200646044041000f0b200141016a2101" - "200020082007280210110100450d000b200141016b2006490f0b20010bbd" - "0201067f230041106b22042400410a2103024020004190ce004904402000" - "21050c010b0340200441066a20036a220641046b20004190ce006e220541" - "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" - "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" - "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" - "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" - "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" - "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" - "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" - "2203200441066a6a20004130723a00000b2002200141014100200441066a" - "20036a410a20036b1009200441106a24000b1701017f2000280200220104" - "4020002802042001100c0b0bce0601047f0240200041046b280200220422" - "02417871220341044108200241037122021b20016a4f0440200241002003" - "200141276a4b1b0d01200041086b22012004220341787122006a21020240" - "024020034101710d002003410271450d012001280200220320006a210020" - "0120036b22014190a0c00028020046044020022802044103714103470d01" - "4188a0c000200036020020022002280204417e7136020420012000410172" - "360204200220003602000c020b2001200310330b02400240024002400240" - "2002280204220341027145044020024194a0c000280200460d0220024190" - "a0c000280200460d0320022003417871220210332001200020026a220041" - "0172360204200020016a200036020020014190a0c000280200470d014188" - "a0c00020003602000c060b20022003417e71360204200120004101723602" - "04200020016a20003602000b2000418002490d0220012000103241002101" - "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" - "280200220004400340200141016a2101200028020822000d000b0b41a8a0" - "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" - "418ca0c000418ca0c00028020020006a2200360200200120004101723602" - "044190a0c00028020020014604404188a0c00041003602004190a0c00041" - "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" - "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" - "402002200128020022054f04402002200520012802046a490d040b200128" - "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" - "020020006a220036020020012000410172360204200020016a2000360200" - "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" - "012000410376742200714504404180a0c000200020037236020020020c01" - "0b20022802080b2100200220013602082000200136020c2001200236020c" - "200120003602080c010b41f09dc000280200220104400340200041016a21" - "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" - "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" - "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" - "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" - "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" - "087f230041406a2202240020002802082105200028020421034101210620" - "0128021c41cc81c0004101200128022028020c1100002100200504400340" - "20072108410121072000410171210441012100024020040d00024020012d" - "00144104714504402008410171450d01200128021c418383c00041022001" - "28022028020c110000450d010c020b20012802202104200128021c210920" - "08410171450440200941d59ac0004101200428020c1100000d020b200241" - "013a0017200241206a200141086a290200370300200241286a200141106a" - "290200370300200241306a200141186a2802003602002002200436020c20" - "022009360208200241e482c0003602382002200129020037031820022002" - "41176a3602102002200241086a3602342003200241186a10054504402002" - "280234418883c0004102200228023828020c11000021000c020b0c010b20" - "032001100521000b200341016a2103200541016b22050d000b0b20004504" - "40200128021c419083c0004101200128022028020c11000021060b200241" - "406b240020060bdb0101047f230041106b220224002002200036020c2300" - "41106b22002400200128021c41f899c000410d200128022028020c110000" - "2103200041003a000d200020033a000c20002001360208200041086a4185" - "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" - "722101024020054101712004410147720d00200328020022012d00144104" - "71450440200128021c418b83c0004102200128022028020c11000021010c" - "010b200128021c418a83c0004101200128022028020c11000021010b2000" - "41106a24002001410171200241106a24000b3300200128021c2000280200" - "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" - "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" - "c0002d00001a024002400240024002404107101222000440200041036a41" - "879bc000280000360000200041849bc000280000360000200341286a2000" - "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" - "200041036a41879bc000280000360000200041849bc00028000036000020" - "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" - "122200450d05200041076a41929bc0002800003600002000418b9bc00029" - "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" - "00001a200328024821012003280244210b410710122204450d0541002100" - "200441036a41b79bc000280000360000200441b49bc00028000036000020" - "0341d8006a41e100200b20012004410710021013200328025c2105024002" - "400240200328026022020e020700010b41012100200522012d0000412b6b" - "0e03060106010b20052d0000412b460440200241016b2100200541016a21" - "0120024112490d010c030b200521012002220041114f0d020b034020012d" - "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" - "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" - "186a2010103820012d000041306b220941094b0d02410221002003290320" - "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" - "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" - "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" - "8b06360000200341cc006a200041041001101320004104100c027f024020" - "03280254220541004e047f2003280250210c20054504404101210141000c" - "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" - "1014000b20050b21092001200c2005103721002005450d01200541076b22" - "014100200120054d1b2106200041036a417c7120006b2108410021010340" - "024002400240200020016a2d00002202c0220741004e0440200820016b41" - "03710d01200120064f0d020340200020016a220228020420022802007241" - "8081828478710d03200141086a22012006490d000b0c020b428080808080" - "20210e428080808010210f024002400240027e0240024002400240024002" - "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" - "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" - "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" - "220420054f0d06200020046a2c0000210402400240200241e00147044020" - "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" - "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" - "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" - "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" - "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" - "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" - "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" - "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" - "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" - "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" - "00210f0b2001ad200e200f8484210e200941808080807846044020002109" - "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" - "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" - "010b200120054f0d000340200020016a2c00004100480d01200520014101" - "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" - "0021050b410021000240024002400240024002400240200ea722020e0206" - "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" - "2b460440200241016b2100200541016a210120024112490d010c020b2005" - "21012002220041114f0d010b4200210e034020012d000041306b22024109" - "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" - "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" - "2d000041306b220441094b0d024102210020032903104200520d03200141" - "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" - "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" - "024002400240410b101222080440200841076a419d9bc000280000360000" - "200841969bc000290000370000200341d8006a2008410b10011013200328" - "025c2104024002400240200328026022020e020a00010b4101210720042d" - "00002201412b6b0e03090109010b20042d000021010b0240024002400240" - "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" - "20024109490d02200121020c080b200241016b2106200441016a21002002" - "4109490d044100210103402006450d0b20002d000041306b220241094b0d" - "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" - "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" - "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" - "0c0b4100210141012107034020002d000041306b220641094b0d06200041" - "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" - "010b410021010c040b4100210141012107034020002d000041306b220241" - "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" - "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" - "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" - "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" - "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" - "c0001015000b20032802582200044020042000100c0b2008410b100c4100" - "210020032802302202200328023c460440200328022c2104200328023821" - "0741002106024020022200450d00034020042d0000220220072d00002208" - "460440200441016a2104200741016a2107200041016b22000d010c020b0b" - "200220086b21060b20064521000b2009044020052009100c0b200328024c" - "22020440200c2002100c0b200328024022020440200b2002100c0b200328" - "02342202044020032802382002100c0b200328022822020440200328022c" - "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" - "0121000b200320003a0058200341d8006a419080c00041f880c000101500" - "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" - "15000b410141e899c0001014000bee2202087f017e024002400240024002" - "40024002400240200041f4014d04404180a0c00028020022024110200041" - "0b6a41f803712000410b491b220541037622007622014103710d01200541" - "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" - "00410b6a220141787121054184a0c0002802002208450d06411f21074100" - "20056b2103200041f4ffff074d04402005410620014108766722006b7641" - "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" - "45044041002100410021010c040b410021002005411920074101766b4100" - "2007411f471b742104410021010340024020022802044178712206200549" - "0d00200620056b220620034f0d0020022101200622030d00410021032001" - "21000c060b200228021422062000200620022004411d764104716a41106a" - "2802002202471b200020061b21002004410174210420020d000b0c030b02" - "402001417f7341017120006a2206410374220041f89dc0006a2203200041" - "809ec0006a280200220128020822044704402004200336020c2003200436" - "02080c010b4180a0c0002002417e200677713602000b2001200041037236" - "0204200020016a220020002802044101723602040c060b02404102200074" - "2203410020036b72200120007471682206410374220041f89dc0006a2203" - "200041809ec0006a280200220128020822044704402004200336020c2003" - "20043602080c010b4180a0c0002002417e200677713602000b2001200541" - "0372360204200120056a2206200020056b2204410172360204200020016a" - "20043602004188a0c00028020022020440200241787141f89dc0006a2100" - "4190a0c0002802002103027f4180a0c00028020022054101200241037674" - "2202714504404180a0c000200220057236020020000c010b20002802080b" - "2102200020033602082002200336020c2003200036020c20032002360208" - "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" - "41e89cc0006a280200220128020441787120056b21032001210202400340" - "02400240200128021022000d00200128021422000d002002280218210702" - "4002402002200228020c2200460440200241144110200228021422001b6a" - "28020022010d01410021000c020b20022802082201200036020c20002001" - "3602080c010b200241146a200241106a20001b2104034020042106200122" - "0041146a200041106a200028021422011b210420004114411020011b6a28" - "020022010d000b200641003602000b2007450d032002200228021c410274" - "41e89cc0006a220128020047044020074110411420072802102002461b6a" - "20003602002000450d040c020b2001200036020020000d014184a0c00041" - "84a0c000280200417e200228021c77713602000c030b2000280204417871" - "20056b22012003200120034922011b21032000200220011b210220002101" - "0c010b0b2000200736021820022802102201044020002001360210200120" - "003602180b20022802142201450d0020002001360214200120003602180b" - "02400240200341104f044020022005410372360204200220056a22062003" - "410172360204200320066a20033602004188a0c0002802002204450d0120" - "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" - "0200220541012004410376742204714504404180a0c00020042005723602" - "0020000c010b20002802080b2104200020013602082004200136020c2001" - "200036020c200120043602080c010b2002200320056a2200410372360204" - "200020026a220020002802044101723602040c010b4190a0c00020063602" - "004188a0c00020033602000b200241086a0f0b2000200172450440410021" - "0141022007742200410020006b722008712200450d0320006841027441e8" - "9cc0006a28020021000b2000450d010b0340200020012000280204417871" - "220420056b220620034922071b2108200028021022024504402000280214" - "21020b20012008200420054922001b210120032006200320071b20001b21" - "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" - "0020056b4f710d0020012802182107024002402001200128020c22004604" - "40200141144110200128021422001b6a28020022020d01410021000c020b" - "20012802082202200036020c200020023602080c010b200141146a200141" - "106a20001b21040340200421062002220041146a200041106a2000280214" - "22021b210420004114411020021b6a28020022020d000b20064100360200" - "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" - "0047044020074110411420072802102001461b6a20003602002000450d02" - "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" - "0128021c77713602000c010b200020073602182001280210220204402000" - "2002360210200220003602180b20012802142202450d0020002002360214" - "200220003602180b0240200341104f044020012005410372360204200120" - "056a22022003410172360204200220036a200336020020034180024f0440" - "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" - "280200220441012003410376742203714504404180a0c000200320047236" - "020020000c010b20002802080b2103200020023602082003200236020c20" - "02200036020c200220033602080c010b2001200320056a22004103723602" - "04200020016a220020002802044101723602040b0c010b02400240024002" - "400240024020054188a0c00028020022014b04402005418ca0c000280200" - "22004f044041002100200541af80046a220141107640002202417f462203" - "0d0720024110742202450d074198a0c000410020014180807c7120031b22" - "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" - "200020002001491b360200024002404194a0c0002802002203044041e89d" - "c0002100034020002802002201200028020422066a2002460d0220002802" - "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" - "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" - "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" - "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" - "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" - "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" - "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" - "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" - "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" - "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" - "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" - "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" - "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" - "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" - "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" - "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" - "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" - "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" - "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" - "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" - "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" - "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" - "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" - "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" - "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" - "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" - "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" - "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" - "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" - "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" - "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" - "0441286b220036020020022000410172360204200020026a412836020441" - "a0a0c00041808080013602000c080b200220034d200120034b720d002000" - "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" - "360200200220046a210141e89dc000210002400240034020012000280200" - "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" - "c0002100034002402003200028020022014f04402003200120002802046a" - "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" - "c000200441286b220036020020022000410172360204200020026a412836" - "020441a0a0c00041808080013602002003200641206b41787141086b2200" - "2000200341106a491b2201411b36020441e89dc000290200210920014110" - "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" - "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" - "02002001411c6a2100034020004107360200200041046a22002006490d00" - "0b20012003460d0720012001280204417e713602042003200120036b2200" - "4101723602042001200036020020004180024f04402003200010320c080b" - "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" - "410376742200714504404180a0c000200020027236020020010c010b2001" - "2802080b2100200120033602082000200336020c2003200136020c200320" - "003602080c070b200020023602002000200028020420046a360204200220" - "054103723602042006410f6a41787141086b2201200220056a22046b2103" - "20014194a0c000280200460d0320014190a0c000280200460d0420012802" - "04220541037141014604402001200541787122001033200020016a220128" - "02042105200020036a21030b20012005417e713602042004200341017236" - "0204200320046a200336020020034180024f04402004200310320c060b20" - "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" - "0376742203714504404180a0c000200120037236020020000c010b200028" - "02080b2103200020043602082003200436020c2004200036020c20042003" - "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" - "00280200220020056a220236020020022001410172360204200020054103" - "72360204200041086a21000c060b4190a0c0002802002100024020012005" - "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" - "2001410372360204200020016a220120012802044101723602040c010b41" - "88a0c00020023602004190a0c000200020056a2203360200200320024101" - "72360204200020016a2002360200200020054103723602040b200041086a" - "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" - "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" - "03200020016b6a41086a220136020020022001410172360204200020036a" - "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" - "00418ca0c000418ca0c00028020020036a22003602002004200041017236" - "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" - "6a220036020020042000410172360204200020046a20003602000b200241" - "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" - "20056b22013602004194a0c0004194a0c000280200220020056a22023602" - "002002200141017236020420002005410372360204200041086a0f0b2000" - "0f0b200141086a0b2701017f200020012800042202360208200020012800" - "003602042000200236020020014108100c0b3b002000450440230041206b" - "22002400200041003602182000410136020c2000419c81c0003602082000" - "4204370210200041086a20011017000b000b7e01017f230041406a220324" - "002003412b36020c200341d098c000360208200320013602142003200036" - "02102003410236021c200341d482c0003602182003420237022420032003" - "41106aad4280808080e000843703382003200341086aad4280808080f000" - "843703302003200341306a360220200341186a20021017000b4101017f23" - "0041206b2202240020024100360210200241013602042002420437020820" - "02412e36021c200220003602182002200241186a36020020022001101700" - "0bf40102027f017e230041106b22022400200241013b010c200220013602" - "0820022000360204230041106b22012400200241046a2200290200210420" - "01200036020c20012004370204230041106b22002400200141046a220128" - "0200220228020c2103024002400240024020022802040e020001020b2003" - "0d0141012102410021030c020b20030d0020022802002202280204210320" - "0228020021020c010b20004180808080783602002000200136020c200128" - "020822012d0008210220012d00091a2000410e20021026000b2000200336" - "020420002002360200200128020822012d0008210220012d00091a200041" - "0f20021026000b0d00200028020041012001100a0b380002402002418080" - "c400460d00200020022001280210110100450d0041010f0b200345044041" - "000f0b200020032004200128020c1100000b900a010a7f02400240024020" - "0028020022052000280208220372044002402003410171450d0020012002" - "6a21060240200028020c2209450440200121040c010b2001210403402004" - "22032006460d02027f200341016a20032c0000220441004e0d001a200341" - "026a20044160490d001a200341036a20044170490d001a200341046a0b22" - "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" - "20042c00001a20072002027f02402007450d00200220074d044020022007" - "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" - "031b21022003200120031b21010b2005450d032000280204210b20024110" - "4f044020022001200141036a417c7122076b22086a220a41037121094100" - "210541002103200120074704402008417c4d044041002106034020032001" - "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" - "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" - "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" - "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" - "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" - "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" - "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" - "09410371210a2009410274210741002104200641044f04402008200741f0" - "07716a210c200821030340200420032802002204417f7341077620044106" - "76724181828408716a20032802042204417f734107762004410676724181" - "828408716a20032802082204417f73410776200441067672418182840871" - "6a200328020c2204417f734107762004410676724181828408716a210420" - "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" - "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" - "200a450d000b2008200941fc01714102746a22042802002203417f734107" - "762003410676724181828408712103200a4101460d022003200428020422" - "03417f734107762003410676724181828408716a2103200a4102460d0220" - "0320042802082203417f734107762003410676724181828408716a21030c" - "020b2002450440410021050c030b20024103712104024020024104490440" - "41002105410021080c010b41002105200121032002410c71220821070340" - "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" - "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" - "200741046b22070d000b0b2004450d02200120086a21030340200520032c" - "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" - "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" - "056a21050b02402005200b490440200b20056b210602400240024020002d" - "00182203410020034103471b220341016b0e020001020b20062103410021" - "060c010b20064101762103200641016a41017621060b200341016a210320" - "00280210210820002802202104200028021c21000340200341016b220345" - "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" - "02200428020c110000044041010f0b410021030340200320064604404100" - "0f0b200341016a2103200020082004280210110100450d000b200341016b" - "2006490f0b200028021c20012002200028022028020c1100000b14002000" - "2802002001200028020428020c1101000b10002001200028020020002802" - "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" - "6b220324002003200136022c20032000360228200341033a002420034220" - "37021c200341003602142003410036020c027f0240024002402002280210" - "220a450440200228020c2200450d012002280208220120004103746a2104" - "200041016b41ffffffff017141016a210720022802002100034020004104" - "6a28020022050440200328022820002802002005200328022c28020c1100" - "000d040b20012802002003410c6a200141046a2802001101000d03200041" - "086a2100200141086a22012004470d000b0c010b20022802142200450d00" - "2000410574210b200041016b41ffffff3f7141016a210720022802082105" - "200228020021000340200041046a28020022010440200328022820002802" - "002001200328022c28020c1100000d030b20032008200a6a220141106a28" - "020036021c20032001411c6a2d00003a00242003200141186a2802003602" - "202001410c6a28020021044100210941002106024002400240200141086a" - "28020041016b0e020002010b200441037420056a220c2802000d01200c28" - "020421040b410121060b200320043602102003200636020c200141046a28" - "02002104024002400240200128020041016b0e020002010b200441037420" - "056a22062802000d01200628020421040b410121090b2003200436021820" - "0320093602142005200141146a2802004103746a22012802002003410c6a" - "200141046a2802001101000d02200041086a2100200b200841206a220847" - "0d000b0b200720022802044f0d012003280228200228020020074103746a" - "22002802002000280204200328022c28020c110000450d010b41010c010b" - "41000b200341306a24000b1900200128021c41a481c000410e2001280220" - "28020c1100000b820302047f017e230041406a2206240041012107024020" - "002d00040d0020002d00052108200028020022052d001441047145044020" - "0528021c418383c000418083c000200841017122081b4102410320081b20" - "0528022028020c1100000d01200528021c20012002200528022028020c11" - "00000d01200528021c41f391c0004102200528022028020c1100000d0120" - "032005200411010021070c010b2008410171450440200528021c418583c0" - "004103200528022028020c1100000d010b200641013a0017200641206a20" - "0541086a290200370300200641286a200541106a29020037030020064130" - "6a200541186a2802003602002006200529021c3702082005290200210920" - "0641e482c000360238200620093703182006200641176a36021020062006" - "41086a220536023420052001200210210d00200541f391c000410210210d" - "002003200641186a20041101000d002006280234418883c0004102200628" - "023828020c11000021070b200041013a0005200020073a0004200641406b" - "240020000bab04010c7f200141016b210e2000280204210a200028020021" - "0b2000280208210c0240034020050d01027f024020022003490d00034020" - "0120036a2105024002400240200220036b220741074d044020022003470d" - "01200221030c050b0240200541036a417c71220620056b22040440410021" - "000340200020056a2d0000410a460d052004200041016a2200470d000b20" - "04200741086b22004d0d010c030b200741086b21000b0340418082840820" - "062802002209418a94a8d000736b2009724180828408200641046a280200" - "2209418a94a8d000736b2009727141808182847871418081828478470d02" - "200641086a2106200441086a220420004d0d000b0c010b41002100034020" - "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" - "030b20042007460440200221030c030b200420056a2106200220046b2003" - "6b21074100210002400340200020066a2d0000410a460d01200720004101" - "6a2200470d000b200221030c030b200020046a21000b200020036a220441" - "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" - "200322040c030b200220034f0d000b0b20022008460d0241012105200821" - "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" - "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" - "200020086b2100200120086a2107200c20063a000020042108200b200720" - "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" - "042102200028020021030240200028020822002d0000450d00200341fc82" - "c0004104200228020c110000450d0041010f0b20002001410a463a000020" - "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" - "200028020022002000411f7522027320026b2000417f73411f762001100a" - "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" - "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" - "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" - "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" - "0041003a00002002450d00000b000b250020002802002d00004504402001" - "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" - "02082204452001280200220520046b20034f724504402001410036020820" - "0141003a000c410021040b20032005490440200128020420046a20022003" - "10371a200041043a00002001200320046a3602080f0b2000420437020020" - "0141003a000c0bac0301017f230041406a22022400024002400240024002" - "40024020002d000041016b0e03010203000b2002200028020436020441b1" - "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" - "0000200041086a41a495c0002900003700002000419c95c0002900003700" - "00200241143602102002200036020c200241143602082002410336022c20" - "02419c91c000360228200242023702342002200241046aad4280808080b0" - "01843703202002200241086aad4280808080c00184370318200220024118" - "6a360230200128021c2001280220200241286a101e210020022802082201" - "450d03200228020c2001100c0c030b20002d000121002002410136022c20" - "0241c88ac000360228200242013702342002200241186aad4280808080f0" - "008437030820022000410274220041f095c0006a28020036021c20022000" - "419897c0006a2802003602182002200241086a360230200128021c200128" - "0220200241286a101e21000c020b20012000280204220028020020002802" - "04101a21000c010b20002802042200280200200120002802042802101101" - "0021000b200241406b240020000f0b000b10002001200028020420002802" - "08101a0b5501037f2000280204210120002d0000220041044d2000410347" - "7145044020012802002100200141046a2802002202280200220304402000" - "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" - "c709010a7f230041206b2208240002400240024002402001280210450440" - "2001417f36021020032003200241036a417c7120026b220a6b4107714100" - "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" - "016b200220036a220541016b22062d0000410a460d001a2006200220096a" - "2207460d01200441026b200541026b22062d0000410a460d001a20062007" - "460d01200441036b200541036b22062d0000410a460d001a20062007460d" - "01200441046b200541046b22062d0000410a460d001a20062007460d0120" - "0441056b200541056b22062d0000410a460d001a20062007460d01200441" - "066b200541066b22062d0000410a460d001a20062007460d01200441076b" - "200541076b22052d0000410a460d001a20052007460d0120044178720b20" - "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" - "0241046b210d2004417f7320026a21060340024020062105200a21042009" - "2207200c4d0d00200441086b210a200541086b2106418082840820022007" - "41086b22096a280200220b418a94a8d000736b200b724180828408200720" - "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" - "8478460d010b0b20032007490d0202400340200320046a450d0120044101" - "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" - "016a21040c040b02402001411c6a2802002204450440410021040c010b20" - "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" - "00202001411c6a41003602000b2003200128021420046b4f044020002001" - "41146a2002200310280c050b200128021820046a2002200310371a200041" - "043a00002001411c6a200320046a3602000c040b230041306b2200240020" - "00410136020c200041c481c0003602082000420137021420002000412f6a" - "ad4280808080a001843703202000200041206a360210200041086a41d091" - "c0001017000b230041306b22002400200020033602042000200936020020" - "00410236020c200041d887c000360208200042023702142000200041046a" - "ad428080808080018437032820002000ad42808080808001843703202000" - "200041206a360210200041086a418485c0001017000b230041306b220024" - "0020002003360204200020073602002000410236020c200041f887c00036" - "0208200042023702142000200041046aad42808080808001843703282000" - "2000ad42808080808001843703202000200041206a360210200041086a41" - "9485c0001017000b20032004490440200841003602182008410136020c20" - "0841888bc00036020820084204370210200841086a41908bc0001017000b" - "02402001411c6a2802002205450d0002400240200128021420056b20044d" - "0440200841086a200141146a20022004102820082d00084104470d012001" - "411c6a28020021050c020b200141186a28020020056a2002200410371a20" - "01411c6a200420056a22053602000c010b200020082903083702000c020b" - "2005450d00200141003a00202001411c6a41003602000b200220046a2105" - "200320046b220220012802144f04402000200141146a2005200210280c01" - "0b200141186a2802002005200210371a200041043a00002001411c6a2002" - "3602000b2001200128021041016a360210200841206a24000b9a0102047f" - "017e230041106b22032400200341086a200028020828020020012002102c" - "20032d000822054104470440200028020421012003290308210720002d00" - "00220241044d20024103477145044020012802002102200141046a280200" - "220428020022060440200220061103000b20042802042204044020022004" - "100c0b2001410c100c0b200020073702000b200341106a24002005410447" - "0be10202057f017e230041106b2202240020024100360204027f20014180" - "014f044020014180104f04402001418080044f044020022001413f714180" - "01723a00072002200141127641f001723a000420022001410676413f7141" - "8001723a000620022001410c76413f71418001723a000541040c030b2002" - "2001413f71418001723a000620022001410c7641e001723a000420022001" - "410676413f71418001723a000541030c020b20022001413f71418001723a" - "00052002200141067641c001723a000441020c010b200220013a00044101" - "0b2101200241086a2000280208280200200241046a2001102c20022d0008" - "22054104470440200028020421012002290308210720002d000022034104" - "4d20034103477145044020012802002103200141046a2802002204280200" - "22060440200320061103000b20042802042204044020032004100c0b2001" - "410c100c0b200020073702000b200241106a240020054104470b0d002000" - "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" - "36020c2001419892c00036020841c89cc0002d0000410347044002402300" - "41206b22022400024002400240024041c89cc0002d000041026b0e020301" - "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" - "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" - "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" - "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" - "41206a24000c020b000b200241003602182002410136020c200241e895c0" - "0036020820024204370210200241086a41b094c0001017000b0b02400240" - "024041d89cc000290300220650044041e09cc00029030021050340200542" - "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" - "5122021b370300200721052002450d000b41d89cc00020063703000b0240" - "024041a09cc000290300200652044041ac9cc0002d000021034101210241" - "ac9cc00041013a0000200120033a00182003450d01200142003702342001" - "4281808080c00037022c200141c893c000360228230041106b2202240020" - "02418888c00036020c2002200141186a360208230041f0006b2200240020" - "00418c88c00036020c2000200241086a3602082000418c88c00036021420" - "002002410c6a3602102000410236021c200041cd81c00036021802402001" - "41286a22012802004504402000410336025c2000418082c0003602582000" - "42033702642000200041106aad4280808080e00084370348200020004108" - "6aad4280808080e000843703400c010b200041306a200141106a29020037" - "0300200041286a200141086a290200370300200020012902003703202000" - "410436025c200041b482c000360258200042043702642000200041106aad" - "4280808080e000843703502000200041086aad4280808080e00084370348" - "2000200041206aad42808080809001843703400b2000200041186aad4280" - "808080f000843703382000200041386a360260200041d8006a41fc93c000" - "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" - "0041306b220024002000412636020c200041c094c0003602082000410136" - "0214200041c88ac0003602102000420137021c2000200041086aad428080" - "8080f000843703282000200041286a360218200041106a418c95c0001017" - "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" - "36021041042102200141043a00182001200141106a360220200141186a41" - "9c88c0002000101e210320012d0018210002402003450440420021054117" - "2000764101710d01200128021c22002802002102200041046a2802002203" - "28020022040440200220041103000b20032802042203044020022003100c" - "0b2000410c100c410421020c010b20004104460d02200129031822074280" - "7e8321052007a721020b20012802102200200028020841016b2203360208" - "2003450440200041003a000c200042003703000b200241ff01714104470d" - "02200141406b24000f0b230041206b220024002000410036021820004101" - "36020c200041b08ac00036020820004204370210200041086a41b88ac000" - "1017000b200141003602382001410136022c2001419093c0003602282001" - "4204370230200141286a419893c0001017000b200120052002ad42ff0183" - "843703102001410236022c200141f891c000360228200142023702342001" - "200141106aad4280808080d001843703202001200141086aad4280808080" - "f000843703182001200141186a360230200141286a418892c0001017000b" - "0c00200020012902003703000bba0201047f411f21022000420037021020" - "0141ffffff074d04402001410620014108766722036b7641017120034101" - "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" - "20027422034184a0c0002802007145044020042000360200200020043602" - "182000200036020c200020003602084184a0c0004184a0c0002802002003" - "723602000f0b024002402001200428020022032802044178714604402003" - "21020c010b2001411920024101766b41002002411f471b74210503402003" - "2005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c" - "20022000360208200041003602182000200236020c200020013602080f0b" - "20042000360200200020033602182000200036020c200020003602080bf1" - "0201047f200028020c21020240024020014180024f044020002802182103" - "0240024020002002460440200041144110200028021422021b6a28020022" - "010d01410021020c020b20002802082201200236020c200220013602080c" - "010b200041146a200041106a20021b21040340200421052001220241146a" - "200241106a200228021422011b210420024114411020011b6a2802002201" - "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" - "006a220128020047044020034110411420032802102000461b6a20023602" - "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" - "280200417e200028021c77713602000c020b200028020822002002470440" - "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" - "7e200141037677713602000f0b2002200336021820002802102201044020" - "022001360210200120023602180b20002802142200450d00200220003602" - "14200020023602180b0b8f0101027f230041306b22012400024020004100" - "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" - "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" - "14200141d89ac0003602102001420137021c2001411036022c2001200141" - "286a36021820012001410c6a360228200141106a1030200128020c200141" - "306a24000bcf0101067f23004180016b2204240020012802042107200128" - "020021062000280200210020012802142205210202402005410471450d00" - "2005410872210220060d0020014281808080a0013702000b200120024104" - "7236021441810121020340200220046a41026b2000410f71220341307220" - "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" - "762100450d000b20014101419183c0004102200220046a41016b41810120" - "026b10092001200536021420012007360204200120063602002004418001" - "6a24000b6301017f230041306b220224002002200036020c200241023602" - "14200241f49ac0003602102002420137021c2002411036022c2002200241" - "286a36021820022002410c6a360228200241106a10302001044020022802" - "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" - "21030c010b02402000410020006b41037122066a220520004d0d00200021" - "032001210420060440200621070340200320042d00003a0000200441016a" - "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" - "0340200320042d00003a0000200341016a200441016a2d00003a00002003" - "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" - "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" - "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" - "003a0000200441086a2104200341086a22032005470d000b0b2005200220" - "066b2207417c7122086a21030240200120066a2204410371450440200320" - "054d0d0120042101034020052001280200360200200141046a2101200541" - "046a22052003490d000b0c010b200320054d0d0020044103742202411871" - "21062004417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220067620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20074103712102200420086a21010b" - "02402003200220036a22064f0d002002410771220404400340200320012d" - "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" - "200241016b4107490d000340200320012d00003a0000200341016a200141" - "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" - "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" - "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" - "41076a200141076a2d00003a0000200141086a2101200341086a22032006" - "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" - "420022022001422088420a7e7c22014220867c2204370300200020032004" - "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" - "c0000ba40611000000140000000400000012000000000000000100000001" - "00000013000000557466384572726f7276616c69645f75705f746f657272" - "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" - "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" - "003d0000005c0010000a0000001600000037000000636170616369747920" - "6f766572666c6f770000008800100011000000426f72726f774d75744572" - "726f72616c726561647920626f72726f7765643a20b2001000120000005b" - "3d3d617373657274696f6e20606c6566742020726967687460206661696c" - "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" - "00100017000000f60010000900000020726967687460206661696c65643a" - "200a20206c6566743a20000000cf00100010000000180110001000000028" - "01100009000000f6001000090000000100000000000000f3081000020000" - "00000000000c000000040000001400000015000000160000002020202020" - "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230" - "323132323233323432353236323732383239333033313332333333343335" - "333633373338333934303431343234333434343534363437343834393530" - "353135323533353435353536353735383539363036313632363336343635" - "363636373638363937303731373237333734373537363737373837393830" - "383138323833383438353836383738383839393039313932393339343935" - "393639373938393966616c7365747275656c6962726172792f636f72652f" - "7372632f736c6963652f6d656d6368722e72736402100020000000850000" - "001e0000006402100020000000a100000009000000010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010100" - "41e686c0000b330202020202020202020202020202020202020202020202" - "020202020202020303030303030303030303030303030304040404040041" - "a487c0000b6172616e676520737461727420696e64657820206f7574206f" - "662072616e676520666f7220736c696365206f66206c656e67746820a403" - "100012000000b60310002200000072616e676520656e6420696e64657820" - "e803100010000000b60310002200419088c0000b8f140400000004000000" - "17000000180000000c00000004000000190000001a0000001b0000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" - "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" - "61746520756e69717565207468726561642049443a206269747370616365" - "20657868617573746564f904100037000000dc0410001d000000ae040000" - "0d00000001000000000000006c6962726172792f7374642f7372632f696f" - "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e00007d05100009000000500510002d000000160100002900" - "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" - "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" - "696f6e207265736574686f737420756e726561636861626c656e6574776f" - "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" - "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" - "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c7265616479206578" - "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" - "206469726563746f727969732061206469726563746f7279646972656374" - "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c657379737465" - "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" - "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" - "2066696c652068616e646c65696e76616c696420696e7075742070617261" - "6d65746572696e76616c6964206461746174696d6564206f757477726974" - "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" - "756e7365656b61626c652066696c6571756f746120657863656564656466" - "696c6520746f6f206c617267657265736f75726365206275737965786563" - "757461626c652066696c652062757379646561646c6f636b63726f73732d" - "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" - "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" - "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" - "70746564756e737570706f72746564756e657870656374656420656e6420" - "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" - "736f74686572206572726f72756e63617465676f72697a6564206572726f" - "7220286f73206572726f72202900000001000000000000008d0810000b00" - "000098081000010000006c6962726172792f7374642f7372632f696f2f73" - "7464696f2e727300b40810001b00000032030000140000006661696c6564" - "207072696e74696e6720746f203a20000000e008100013000000f3081000" - "02000000b40810001b00000063040000090000007374646f75746c696272" - "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" - "696e6720747261697420696d706c656d656e746174696f6e207265747572" - "6e656420616e206572726f72207768656e2074686520756e6465726c7969" - "6e672073747265616d20646964206e6f7400000037091000560000001e09" - "100019000000680700001500000063616e6e6f7420726563757273697665" - "6c792061637175697265206d75746578a8091000200000006c6962726172" - "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" - "72656164732e7273d00910002c00000013000000090000006c6962726172" - "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" - "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" - "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" - "7273660a100026000000220100002d0000006f7065726174696f6e207375" - "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" - "6e206d6179206e6f7420626520706572666f726d65642072656375727369" - "76656c79b00a100038000000100000001100000012000000100000001000" - "000013000000120000000d0000000e000000150000000c0000000b000000" - "15000000150000000f0000000e0000001300000026000000380000001900" - "0000170000000c000000090000000a00000010000000170000000e000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600" - "0000150000000b000000160000000d0000000b0000000b00000013000000" - "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" - "1000250610003306100048061000540610005f0610007406100089061000" - "98061000a6061000b9061000df0610001707100030071000470710005307" - "10005c07100066071000760710008d0710009b071000a9071000b6071000" - "ca071000d2071000ed071000fb0710000b08100021081000360810004108" - "100057081000640810006f0810007a081000000000000100000001000000" - "1300000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" - "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" - "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" - "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" - "6963652e72737b0c10006d000000a1000000190000005061727365496e74" - "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" - "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" - "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" - "100009000000550d1000010000006465616c6c6f636174652000680d1000" - "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" - "46696e6973684166746572000000090d1000320000008000000016000000" - "42616c616e636500090d1000320000009b00000016000000456d70747949" - "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" - "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" - "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" - "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" - "6e63652d74797065732b0a6d756c746976616c7565"; + "0061736d01000000012e0760037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" + "7f7f7e017f60027f7f017f6000017f60017f0002df010808686f73745f6c69620c6765745f" + "74785f6669656c64000008686f73745f6c6962057472616365000108686f73745f6c69621c" + "6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000008686f73745f6c" + "69620e6163636f756e745f6b65796c6574000208686f73745f6c69621063616368655f6c65" + "646765725f6f626a000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669" + "656c64000208686f73745f6c69620974726163655f6e756d000308686f73745f6c69621667" + "65745f706172656e745f6c65646765725f74696d6500040304030506000405017001010105" + "030100110619037f01418080c0000b7f00418481c0000b7f00419081c0000b072e04066d65" + "6d6f727902000666696e69736800080a5f5f646174615f656e6403010b5f5f686561705f62" + "61736503020af80803db0702047f027e23808080800041f0206b2200248080808000200041" + "d0006a41106a22014100360200200041d0006a41086a220242003703002000420037035002" + "4002400240024041818020200041d0006a41141080808080004101480d00200041086a4110" + "6a2001280200360200200041086a41086a2002290300370300200020002903503703084180" + "80c080004109200041086a411441011081808080001a200141003602002002420037030020" + "00420037035041818020200041d0006a411410828080800041004c0d01200041206a41106a" + "200041d0006a41106a2201280200360200200041206a41086a200041d0006a41086a220229" + "030037030020002000290350370320418980c080004108200041206a411441011081808080" + "001a2001410036020020024200370300200042003703500240024041838020200041d0006a" + "411410828080800041004c0d00200041386a41106a2001280200360200200041386a41086a" + "200229030037030020002000290350370338419180c080004107200041386a411441011081" + "808080001a200041d0006a41186a2203420037030020014200370300200242003703002000" + "42003703500240200041386a4114200041d0006a41201083808080004101480d00200041d0" + "206a41186a2003290300370300200041d0206a41106a200041d0006a41106a290300370300" + "200041d0206a41086a200041d0006a41086a290300370300200020002903503703d0202000" + "41d0206a41204100108480808000220241014e0d020b417c21010c050b417d21010c040b20" + "004200370350417c2101200241828018200041d0006a41081085808080004108470d034198" + "80c08000410f200029035022041086808080001a0240418020450d00200041d0006a410041" + "8020fc0b000b0240419b801c200041d0006a418020108280808000220241014e0d00417b21" + "010c040b41a780c08000410a2002ad1086808080001a0240200241084d0d00417a21010c04" + "0b41b180c080004107200041d0006a200241011081808080001a4100210142002105034020" + "05420886200041d0006a20016a3100008421052002200141016a2201470d000b41b880c080" + "00412120051086808080001a200041003602d0200240200041d0206a410410878080800041" + "004e0d00417921010c040b41d980c08000411520003402d0201086808080001a2000108980" + "80800020002802004101710d02417821010c030b417f21010c020b417e21010c010b41ee80" + "c08000411620002802042201ac1086808080001a200041086a200041206a4114108a808080" + "004520042005587120002802d02020014e7121010b200041f0206a24808080800020010b4e" + "01027f23808080800041106b22012480808080002001410036020c41a580082001410c6a41" + "0410828080800021022000200128020c3602042000200241004a360200200141106a248080" + "8080000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205" + "470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21" + "030b20030b0b8e010100418080c0000b8401202073656e6465723a20206f776e65723a2020" + "646573743a2020646573745f62616c616e63653a2020646174615f6c656e2020646174613a" + "20207468726573686f6c645f62616c616e63652c2075736520646174615b695d3a20207061" + "72656e745f6c65646765725f74696d653a2020657363726f775f66696e6973685f61667465" + "723a00d804046e616d650016157872706c5f7374645f6578616d706c652e7761736d019804" + "0b00335f5a4e387872706c5f73746434686f737431326765745f74785f6669656c64313768" + "6465316434383636346263336138346145012b5f5a4e387872706c5f73746434686f737435" + "7472616365313768316265343662336564373737306363624502435f5a4e387872706c5f73" + "746434686f737432386765745f63757272656e745f6c65646765725f6f626a5f6669656c64" + "313768343532633531353638653033353531384503355f5a4e387872706c5f73746434686f" + "737431346163636f756e745f6b65796c657431376833373666663761383330656262653762" + "4504375f5a4e387872706c5f73746434686f7374313663616368655f6c65646765725f6f62" + "6a3137686463616435366531366262633331653345053b5f5a4e387872706c5f7374643468" + "6f737432306765745f6c65646765725f6f626a5f6669656c64313768636238336534653664" + "3132616230633245062f5f5a4e387872706c5f73746434686f73743974726163655f6e756d" + "3137683236313936306163653839633831313845073d5f5a4e387872706c5f73746434686f" + "737432326765745f706172656e745f6c65646765725f74696d653137686234636264356664" + "336463326230383445080666696e69736809415f5a4e387872706c5f73746433316765745f" + "63757272656e745f657363726f775f66696e6973685f616674657231376863333562336366" + "356633353733363933450a066d656d636d70071201000f5f5f737461636b5f706f696e7465" + "72090a0100072e726f64617461004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e38372e302028313730" + "36376539616320323032352d30352d3039290094010f7461726765745f6665617475726573" + "082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c" + "2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72656665" + "72656e63652d74797065732b087369676e2d657874"; std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -1569,3 +11597,89 @@ std::string const deepRecursionHex = "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; + +extern std::string const hostFunctions2Hex = + "0061736d01000000012f0760047f7f7f7f017f60037f7f7f017f60027f7f" + "017f60057f7f7f7f7f017f60037f7f7e017f60017f017f6000017f028a02" + "0a08686f73745f6c6962057472616365000308686f73745f6c69620c6765" + "745f74785f6669656c64000108686f73745f6c69620974726163655f6e75" + "6d000408686f73745f6c69620e6163636f756e745f6b65796c6574000008" + "686f73745f6c69621063616368655f6c65646765725f6f626a000108686f" + "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000008" + "686f73745f6c6962136765745f74785f6e65737465645f6669656c640000" + "08686f73745f6c6962106765745f74785f61727261795f6c656e00050868" + "6f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" + "6e000208686f73745f6c69620b7570646174655f64617461000203020106" + "05030100110619037f01418080c0000b7f00419187c0000b7f0041a087c0" + "000b072e04066d656d6f727902000666696e697368000a0a5f5f64617461" + "5f656e6403010b5f5f686561705f6261736503020ae50701e20701057f23" + "0041e0006b2201240041b580c000411b41014100410110001a41f380c000" + "412841014100410110001a200141d0006a4100360200200141c8006a4200" + "370300200142003703400240024002400240024002400240418180202001" + "41406b22004114100122024114460440419b81c000410e20004114410110" + "001a2001420037032041888018200141206a41081001220041004c0d0141" + "a981c00041112000ad10021a2001410036020841848008200141086a4104" + "1001220041004c044041d081c00041252000ac10021a0c070b41ba81c000" + "41162000ad10021a41bf82c000412841014100410110001a200141306a22" + "034100360200200141286a22044200370300200142003703204181802020" + "0141206a22024114100122004100480d0220012000360238200141143602" + "3c20004114470d03200141106a2004290300370300200141186a20032802" + "0036020020012001290320370308200141d8006a4200370300200141d000" + "6a4200370300200141c8006a420037030020014200370340024002402001" + "41086a4114200141406b220341201003220041004a044041e782c000410f" + "20034120410110001a41f682c00041172000ad10021a2003200041001004" + "220041004c0d01418d83c00041162000ad10021a20014200370320200041" + "828018200241081005220041004a044041a383c00041152000ad10021a20" + "0041094f0d0841b883c000410e20022000410110001a0c030b41c683c000" + "412b2000ac10021a0c020b41ac84c000411d2000ac10021a417e21000c09" + "0b41f183c000413b2000ac10021a0b41c984c00041234101410041011000" + "1a200141d8006a4200370300200141d0006a4200370300200141c8006a42" + "0037030020014200370340024041ec84c0004102200141406b2202412010" + "06220041004e044041ee84c000411e2000ad10021a200041214f0d07418c" + "85c000411220022000410110001a0c010b419e85c00041292000ac10021a" + "0b02404183803c10072200410048044041c785c00041202000ac10021a0c" + "010b41e785c00041152000ad10021a0b024041ec84c00041021008220041" + "0048044041fc85c000411f2000ac10021a0c010b419b86c00041142000ad" + "10021a0b4101210041af86c000412241014100410110001a41d186c00041" + "0e10092202044041f786c000411a2002ac10021a417c21000c080b41df86" + "c000411841d186c000410e410110001a41d080c000412341014100410110" + "001a0c070b419582c000412a2002ac10021a0c050b41f581c00041202000" + "ac10021a0c040b418080c00041354100410041001000000b200141003602" + "40230041106b2400000b000b000b417f21000b200141e0006a240020000b" + "0b9b070100418080c0000b9107486f73742066756e6374696f6e20676574" + "5f63757272656e745f657363726f775f66696e6973685f6669656c642066" + "61696c6564213d3d3d20484f53542046554e4354494f4e53205445535420" + "3d3d3d535543434553533a20486f73742066756e6374696f6e2074657374" + "73207061737365642d2d2d205465737420313a205472616e73616374696f" + "6e204669656c6420416363657373202d2d2d4163636f756e74206669656c" + "643a466565206669656c64206c656e6774683a53657175656e6365206669" + "656c64206c656e6774683a4552524f523a206765745f74785f6669656c64" + "2853657175656e636529206661696c65643a4552524f523a206765745f74" + "785f6669656c642846656529206661696c65643a4552524f523a20676574" + "5f74785f6669656c64284163636f756e74292077726f6e67206c656e6774" + "683a2d2d2d205465737420323a204c6564676572204f626a656374204f70" + "65726174696f6e73202d2d2d4163636f756e74206b65796c65743a4b6579" + "6c65742062797465732067656e6572617465643a4f626a65637420636163" + "68656420696e20736c6f743a42616c616e6365206669656c64206c656e67" + "74683a42616c616e6365206669656c643a494e464f3a206765745f6c6564" + "6765725f6f626a5f6669656c642842616c616e636529206661696c65643a" + "494e464f3a2063616368655f6c65646765725f6f626a206661696c656420" + "28657870656374656420666f722074657374206669787475726573293a45" + "52524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d" + "2d205465737420333a204e6573746564204669656c642041636365737320" + "2d2d2d01024e6573746564206669656c6420616363657373207375636365" + "656465643a4e6573746564206669656c6420646174613a494e464f3a2067" + "65745f74785f6e65737465645f6669656c64206e6f74206170706c696361" + "626c653a494e464f3a204e6f207369676e657273206172726179206f7220" + "6572726f723a5369676e657273206172726179206c656e6774683a494e46" + "4f3a204e6f206e6573746564206172726179206f72206572726f723a4e65" + "73746564206172726179206c656e6774683a2d2d2d205465737420343a20" + "5374617465204d6f64696669636174696f6e202d2d2d746573745f737461" + "74655f31323353746174652075706461746564207769746820646174613a" + "4552524f523a207570646174655f64617461206661696c65643a00550970" + "726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38362e302d6e696768746c79" + "202862336233363861313820323032352d30312d30352900490f74617267" + "65745f6665617475726573042b0f6d757461626c652d676c6f62616c732b" + "087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index e7bada74a5f..acf2de906e0 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -28,3 +28,29 @@ extern std::string const ledgerSqnHex; extern std::string const allHostFunctionsHex; extern std::string const deepRecursionHex; + +extern std::string const tx_js; + +extern std::string const lo_js; + +extern std::string const lo_js2; + +extern std::string const fib32Hex; + +extern std::string const fib64Hex; + +extern std::string const b58Hex; + +extern std::string const sha512PureHex; + +extern std::string const checkJsonHex; + +extern std::string const compareJsonHex; + +extern std::string const zkProofHex; + +extern std::string const sp1_wasm; + +extern std::string const xrplStdExampleHex; + +extern std::string const hostFunctions2Hex; diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 3cc18fdea8d..fb1852bd00d 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -23,9 +23,12 @@ #include -namespace ripple { +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +// #define DEBUG_OUTPUT_WAMR 1 +#endif -////////////////////////////////////////////////////////////////////////////////////////// +namespace ripple { namespace { @@ -45,7 +48,7 @@ getLogLevel(beast::severities::Severity severity) case kError: return WASM_LOG_LEVEL_ERROR; default: - UNREACHABLE("invalid severity"); + UNREACHABLE("WAMR invalid severity"); [[fallthrough]]; case kFatal: case kNone: @@ -70,7 +73,7 @@ getLogLevel(uint32_t severity) case WASM_LOG_LEVEL_ERROR: return kError; default: - UNREACHABLE("invalid severity"); + UNREACHABLE("WAMR invalid reverse severity"); [[fallthrough]]; case WASM_LOG_LEVEL_FATAL: break; @@ -88,18 +91,18 @@ wamr_log_to_rippled( char const* fmt, ...) { - beast::Journal j = debugLog(); + beast::Journal j = WasmEngine::instance().getJournal(); // Format the variadic args char const* safeFile = file ? file : ""; std::ostringstream oss; - oss << "WAMR LOG (" << safeFile << ":" << line << "): "; + oss << "WAMR (" << safeFile << ":" << line << "): "; va_list args; va_start(args, fmt); - char formatted[1024]; + char formatted[4096]; vsnprintf(formatted, sizeof(formatted), fmt, args); formatted[sizeof(formatted) - 1] = '\0'; @@ -108,22 +111,47 @@ wamr_log_to_rippled( oss << formatted; j.stream(getLogLevel(logLevel)) << oss.str(); +#ifdef DEBUG_OUTPUT_WAMR + std::cerr << oss.str() << std::endl; +#endif + // } -static void -print_wasm_error(char const* message, wasm_trap_t* trap, beast::Journal j) +void +print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) { - j.debug() << "WAMR error: " << message; +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = jlog.error(); +#endif + + j << "WAMR Error: " << msg; if (trap) { wasm_byte_vec_t error_message; wasm_trap_message(trap, &error_message); + if (error_message.num_elems) + { + j << +#ifdef DEBUG_OUTPUT + "\nWAMR " +#else + "WAMR " +#endif + << error_message.data; + } + + if (error_message.size) + wasm_byte_vec_delete(&error_message); wasm_trap_delete(trap); - j.debug() << "WAMR trap: " << error_message.data; - wasm_byte_vec_delete(&error_message); } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif } } // namespace @@ -134,7 +162,8 @@ InstanceWrapper::init( wasm_module_t* m, int32_t maxPages, wasm_extern_vec_t* expt, - wasm_extern_vec_t const& imports) + wasm_extern_vec_t const& imports, + beast::Journal j) { wasm_trap_t* trap = nullptr; InstantiationArgs inst_args{ @@ -148,11 +177,8 @@ InstanceWrapper::init( if (!mi || trap) { - print_wasm_error( - "can't create instance", - trap, - beast::Journal(beast::Journal::getNullSink())); - throw std::runtime_error("WAMR: can't create instance"); + print_wasm_error("can't create instance", trap, j); + throw std::runtime_error("WAMR can't create instance"); } wasm_instance_exports(mi.get(), expt); return mi; @@ -171,6 +197,27 @@ InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) *this = std::move(o); } +InstanceWrapper::InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + int64_t gas, + wasm_extern_vec_t const& imports, + beast::Journal j) + : exports WASM_EMPTY_VEC + , mod_inst(init(s, m, maxPages, &exports, imports, j)) + , exec_env(wasm_instance_exec_env(mod_inst.get())) + , j_(j) +{ + wasm_runtime_set_instruction_count_limit(exec_env, gas); +} + +InstanceWrapper::~InstanceWrapper() +{ + if (exports.size) + wasm_extern_vec_delete(&exports); +} + InstanceWrapper& InstanceWrapper::operator=(InstanceWrapper&& o) { @@ -183,23 +230,12 @@ InstanceWrapper::operator=(InstanceWrapper&& o) o.exports = {0, nullptr, 0, 0, nullptr}; mod_inst = std::move(o.mod_inst); + exec_env = o.exec_env; + o.exec_env = nullptr; - return *this; -} + j_ = o.j_; -InstanceWrapper::InstanceWrapper( - wasm_store_t* s, - wasm_module_t* m, - int32_t maxPages, - wasm_extern_vec_t const& imports) - : exports WASM_EMPTY_VEC, mod_inst(init(s, m, maxPages, &exports, imports)) -{ -} - -InstanceWrapper::~InstanceWrapper() -{ - if (exports.size) - wasm_extern_vec_delete(&exports); + return *this; } InstanceWrapper::operator bool() const @@ -207,19 +243,23 @@ InstanceWrapper::operator bool() const return static_cast(mod_inst); } -wasm_func_t* +FuncInfo InstanceWrapper::getFunc( std::string_view funcName, wasm_exporttype_vec_t const& export_types) const { wasm_func_t* f = nullptr; + wasm_functype_t* ft = nullptr; + + if (!mod_inst) + throw std::runtime_error("WAMR no module instance"); - if (!export_types.size) - throw std::runtime_error("WAMR: no export"); - if (export_types.size != exports.size) - throw std::runtime_error("WAMR: invalid export"); + if (!export_types.num_elems) + throw std::runtime_error("WAMR no export"); + if (export_types.num_elems != exports.num_elems) + throw std::runtime_error("WAMR invalid export"); - for (unsigned i = 0; i < export_types.size; ++i) + for (unsigned i = 0; i < export_types.num_elems; ++i) { auto const* exp_type(export_types.data[i]); @@ -231,26 +271,31 @@ InstanceWrapper::getFunc( { auto* exn(exports.data[i]); if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) - throw std::runtime_error("WAMR: invalid export"); + throw std::runtime_error("WAMR invalid export"); + ft = wasm_externtype_as_functype( + const_cast(exn_type)); f = wasm_extern_as_func(exn); break; } } } - if (!f) + if (!f || !ft) throw std::runtime_error( - "WAMR: can't find function " + std::string(funcName)); + "WAMR can't find function <" + std::string(funcName) + ">"); - return f; + return {f, ft}; } wmem InstanceWrapper::getMem() const { + if (!mod_inst) + throw std::runtime_error("WAMR no module instance"); + wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports.size; ++i) + for (unsigned i = 0; i < exports.num_elems; ++i) { auto* e(exports.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) @@ -261,17 +306,23 @@ InstanceWrapper::getMem() const } if (!mem) - throw std::runtime_error("WAMR: no memory exported"); + throw std::runtime_error("WAMR no memory exported"); return { reinterpret_cast(wasm_memory_data(mem)), wasm_memory_data_size(mem)}; } +std::int64_t +InstanceWrapper::getGas() const +{ + return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ModulePtr -ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) +ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) { wasm_byte_vec_t const code{ wasmBin.size(), @@ -280,6 +331,11 @@ ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) sizeof(std::remove_reference_t::value_type), nullptr}; ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + if (!m) + { + print_wasm_error("can't create module", nullptr, j); + throw std::runtime_error("WAMR can't create module"); + } return m; } @@ -296,39 +352,23 @@ ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) *this = std::move(o); } -ModuleWrapper& -ModuleWrapper::operator=(ModuleWrapper&& o) -{ - if (this == &o) - return *this; - - module = std::move(o.module); - mod_inst = std::move(o.mod_inst); - if (export_types.size) - wasm_exporttype_vec_delete(&export_types); - export_types = o.export_types; - o.export_types = {0, nullptr, 0, 0, nullptr}; - exec_env = o.exec_env; - o.exec_env = nullptr; - return *this; -} - ModuleWrapper::ModuleWrapper( wasm_store_t* s, - wbytes const& wasmBin, + Bytes const& wasmBin, bool instantiate, int32_t maxPages, - std::vector const& imports) - : module(init(s, wasmBin)), export_types{0, nullptr, 0, 0, nullptr} + int64_t gas, + std::vector const& imports, + beast::Journal j) + : module(init(s, wasmBin, j)) + , export_types{0, nullptr, 0, 0, nullptr} + , j_(j) { - if (!module) - throw std::runtime_error("WAMR: can't create module"); - wasm_module_exports(module.get(), &export_types); if (instantiate) { auto wimports = buildImports(s, imports); - addInstance(s, maxPages, wimports); + addInstance(s, maxPages, gas, wimports); } } @@ -338,6 +378,23 @@ ModuleWrapper::~ModuleWrapper() wasm_exporttype_vec_delete(&export_types); } +ModuleWrapper& +ModuleWrapper::operator=(ModuleWrapper&& o) +{ + if (this == &o) + return *this; + + module = std::move(o.module); + mod_inst = std::move(o.mod_inst); + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); + export_types = o.export_types; + o.export_types = {0, nullptr, 0, 0, nullptr}; + j_ = o.j_; + + return *this; +} + ModuleWrapper::operator bool() const { return mod_inst; @@ -373,7 +430,7 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[i] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("Invalid import type"); + throw std::runtime_error("WAMR Invalid import type"); } } } @@ -400,7 +457,7 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[0] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("Invalid return type"); + throw std::runtime_error("WAMR Invalid return type"); } } else @@ -425,6 +482,7 @@ ModuleWrapper::buildImports( wasm_extern_vec_new(&wimports, importTypes.size, nullptr); wimports.num_elems = importTypes.num_elems; + unsigned impCnt = 0; for (unsigned i = 0; i < importTypes.num_elems; ++i) { wasm_importtype_t const* importtype = importTypes.data[i]; @@ -433,6 +491,7 @@ ModuleWrapper::buildImports( // create a placeholder wimports.data[i] = wasm_extern_new_empty( s, wasm_externtype_kind(wasm_importtype_type(importtype))); + ++impCnt; continue; } @@ -445,6 +504,7 @@ ModuleWrapper::buildImports( // if ((W_ENV != modName) && (W_HOST_LIB != modName)) // continue; + bool impSet = false; for (auto const& imp : imports) { if (imp.name != fieldName) @@ -466,14 +526,35 @@ ModuleWrapper::buildImports( nullptr); wimports.data[i] = wasm_func_as_extern(func); + ++impCnt; + impSet = true; + break; } + + if (!impSet) + { + print_wasm_error( + std::string("Import not found: ") + fieldName.data(), + nullptr, + j_); + } + } + + if (impCnt != importTypes.num_elems) + { + print_wasm_error( + std::string("Imports not finished: ") + + std::to_string(wimports.num_elems) + "/" + + std::to_string(importTypes.num_elems), + nullptr, + j_); } return wimports; } -wasm_func_t* +FuncInfo ModuleWrapper::getFunc(std::string_view funcName) const { return mod_inst.getFunc(funcName, export_types); @@ -485,15 +566,20 @@ ModuleWrapper::getMem() const return mod_inst.getMem(); } +InstanceWrapper const& +ModuleWrapper::getInstance(int) const +{ + return mod_inst; +} + int ModuleWrapper::addInstance( wasm_store_t* s, int32_t maxPages, + int64_t gas, wasm_extern_vec_t const& imports) { - mod_inst = {s, module.get(), maxPages, imports}; - exec_env = wasm_instance_exec_env(mod_inst.mod_inst.get()); - + mod_inst = {s, module.get(), maxPages, gas, imports, j_}; return 0; } @@ -507,21 +593,10 @@ ModuleWrapper::addInstance( // return i; // } -std::int64_t -ModuleWrapper::setGas(std::int64_t gas) -{ - if (exec_env) - { - wasm_runtime_set_instruction_count_limit(exec_env, gas); - return gas; - } - return 0; -} - std::int64_t ModuleWrapper::getGas() { - return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; + return mod_inst.getGas(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -545,26 +620,33 @@ WamrEngine::WamrEngine() int WamrEngine::addModule( - wbytes const& wasmCode, + Bytes const& wasmCode, bool instantiate, + int64_t gas, std::vector const& imports) { module.reset(); store.reset(); // to free the memory before creating new store store = {wasm_store_new(engine.get()), &wasm_store_delete}; module = std::make_unique( - store.get(), wasmCode, instantiate, defMaxPages, imports); - setGas(defGas); + store.get(), wasmCode, instantiate, defMaxPages, gas, imports, j_); + + if (!module) + { + print_wasm_error("can't create module wrapper", nullptr, j_); + throw std::runtime_error("WAMR can't create module wrapper"); + } + return module ? 0 : -1; } -int -WamrEngine::addInstance() -{ - return module->addInstance(store.get(), defMaxPages); -} +// int +// WamrEngine::addInstance() +// { +// return module->addInstance(store.get(), defMaxPages); +// } -wasm_func_t* +FuncInfo WamrEngine::getFunc(std::string_view funcName) { return module->getFunc(funcName); @@ -591,6 +673,16 @@ WamrEngine::convertParams(std::vector const& params) case WT_F64: v.push_back(WASM_F64_VAL(p.of.f64)); break; + case WT_U8V: { + auto const sz = p.of.u8v.sz; + auto const ptr = allocate(sz); + auto mem = getMem(); + memcpy(mem.p + ptr, p.of.u8v.d, sz); + + v.push_back(WASM_I32_VAL(ptr)); + v.push_back(WASM_I32_VAL(sz)); + } + break; default: break; } @@ -618,30 +710,37 @@ WamrEngine::add_param(std::vector& in, int64_t p) template WamrResult -WamrEngine::call(std::string_view func, Types... args) +WamrEngine::call(std::string_view func, Types&&... args) { // Lookup our export function - auto* f = getFunc(func); + auto f = getFunc(func); return call(f, std::forward(args)...); } template WamrResult -WamrEngine::call(wasm_func_t* func, Types... args) +WamrEngine::call(FuncInfo const& f, Types&&... args) { std::vector in; - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult -WamrEngine::call(wasm_func_t* func, std::vector& in) +WamrEngine::call(FuncInfo const& f, std::vector& in) { // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; WamrResult ret(NR); // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } + auto const* ftp = wasm_functype_params(f.second); + if (ftp->num_elems != in.size()) + { + print_wasm_error("invalid num of params to call func", nullptr, j_); + return ret; + } + wasm_val_vec_t const inv = in.empty() ? wasm_val_vec_t WASM_EMPTY_VEC : wasm_val_vec_t{ @@ -650,9 +749,12 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) in.size(), sizeof(std::remove_reference_t::value_type), nullptr}; - trap = wasm_func_call(func, &inv, &ret.r); + wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r); if (trap) + { + ret.f = true; print_wasm_error("failed to call func", trap, j_); + } // assert(results[0].kind == WASM_I32); // if (NR) printf("Result P5: %d\n", ret[0].of.i32); @@ -663,124 +765,136 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) template WamrResult WamrEngine::call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, std::int32_t p, - Types... args) + Types&&... args) { add_param(in, p); - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult WamrEngine::call( - wasm_func_t* func, - + FuncInfo const& f, std::vector& in, std::int64_t p, - Types... args) + Types&&... args) { add_param(in, p); - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult WamrEngine::call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, uint8_t const* d, std::size_t sz, - Types... args) + Types&&... args) { - auto res = call<1>(W_ALLOC, static_cast(sz)); - - if (trap || (res.r.data[0].kind != WASM_I32)) - return {}; - auto const ptr = res.r.data[0].of.i32; - if (!ptr) - throw std::runtime_error( - "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); - + auto const ptr = allocate(sz); auto mem = getMem(); memcpy(mem.p + ptr, d, sz); add_param(in, ptr); add_param(in, static_cast(sz)); - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult WamrEngine::call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, - wbytes const& p, - Types... args) + Bytes const& p, + Types&&... args) { - return call(func, in, p.data(), p.size(), std::forward(args)...); + return call(f, in, p.data(), p.size(), std::forward(args)...); } -Expected +Expected, TER> WamrEngine::run( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, - std::vector const& imports, std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas, beast::Journal j) { + j_ = j; + wasm_runtime_set_log_level( + std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); try { - wasm_runtime_set_log_level(getLogLevel(j.sink().threshold())); - j_ = j; - return runHlp(wasmCode, funcName, imports, params); + return runHlp(wasmCode, funcName, params, imports, hfs, gas); } - catch (std::exception const&) + catch (std::exception const& e) { + print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); } catch (...) { + print_wasm_error(std::string("unknown exception"), nullptr, j_); } return Unexpected(tecFAILED_PROCESSING); } -Expected +Expected, TER> WamrEngine::runHlp( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, + std::vector const& params, std::vector const& imports, - std::vector const& params) + HostFunctions* hfs, + int64_t gas) { + // #ifdef DEBUG_OUTPUT + // auto& j = std::cerr; + // #else + // auto j = j_.debug(); + // #endif + // Create and instantiate the module. if (!wasmCode.empty()) { - int const m = addModule(wasmCode, true, imports); - if (m < 0) - return Unexpected(tecFAILED_PROCESSING); + [[maybe_unused]] int const m = addModule(wasmCode, true, gas, imports); } - if (!module) + if (!module || !module->mod_inst) + { + print_wasm_error("no instance to run", nullptr, j_); return Unexpected(tecFAILED_PROCESSING); + } + + if (hfs) + hfs->setRT(&getRT()); // Call main - auto* f = getFunc(!funcName.empty() ? funcName : "_start"); + auto f = getFunc(!funcName.empty() ? funcName : "_start"); auto p = convertParams(params); auto res = call<1>(f, p); - if (!res.r.size || trap) + + if (res.f) + { return Unexpected(tecFAILED_PROCESSING); + } + else if (!res.r.num_elems) + { + print_wasm_error( + "<" + std::string(funcName) + "> return nothing", nullptr, j_); + return Unexpected(tecFAILED_PROCESSING); + } assert(res.r.data[0].kind == WASM_I32); - // printf("Result: %d\n", results[0].of.i32); - // return res.r.data[0].of.i32 != 0; - return res.r.data[0].of.i32; -} -std::int64_t -WamrEngine::initGas(std::int64_t def) -{ - defGas = def; - return def; + WasmResult const ret{res.r.data[0].of.i32, gas - module->getGas()}; + + // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; + return ret; } std::int32_t @@ -790,17 +904,6 @@ WamrEngine::initMaxPages(std::int32_t def) return def; } -std::int64_t -WamrEngine::setGas(std::int64_t gas) -{ - if (module) - { - module->setGas(gas); - return gas; - } - return 0; -} - std::int64_t WamrEngine::getGas() { @@ -813,17 +916,24 @@ WamrEngine::getMem() const return module ? module->getMem() : wmem(); } +InstanceWrapper const& +WamrEngine::getRT(int m, int i) +{ + if (!module) + throw std::runtime_error("WAMR no module"); + return module->getInstance(i); +} + int32_t WamrEngine::allocate(int32_t sz) { auto res = call<1>(W_ALLOC, static_cast(sz)); - if (trap || (res.r.data[0].kind != WASM_I32)) - return {}; - auto const ptr = res.r.data[0].of.i32; - if (!ptr) + + if (res.f || !res.r.num_elems || (res.r.data[0].kind != WASM_I32) || + !res.r.data[0].of.i32) throw std::runtime_error( - "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); - return ptr; + "WAMR can't allocate memory, " + std::to_string(sz) + " bytes"); + return res.r.data[0].of.i32; } wasm_trap_t* @@ -837,4 +947,10 @@ WamrEngine::newTrap(std::string_view txt) return wasm_trap_new(store.get(), &msg); } +beast::Journal +WamrEngine::getJournal() const +{ + return j_; +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index a5b8051cb10..635673fb9b7 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,37 +20,57 @@ #include -#include - #include #include namespace ripple { -// clang-format off - struct WamrResult { wasm_val_vec_t r; - WamrResult(unsigned N = 0):r{0, nullptr, 0, 0, nullptr} {if (N) wasm_val_vec_new_uninitialized(&r, N);} - ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } - WamrResult(WamrResult const &) = delete; - WamrResult& operator=(WamrResult const &) = delete; - - WamrResult(WamrResult &&o) {*this = std::move(o);} - WamrResult& operator=(WamrResult &&o){r = o.r; o.r = {0, nullptr, 0, 0, nullptr}; return *this;} - //operator wasm_val_vec_t &() {return r;} + bool f; + WamrResult(unsigned N = 0) : r{0, nullptr, 0, 0, nullptr}, f(false) + { + if (N) + wasm_val_vec_new_uninitialized(&r, N); + } + ~WamrResult() + { + if (r.size) + wasm_val_vec_delete(&r); + } + WamrResult(WamrResult const&) = delete; + WamrResult& + operator=(WamrResult const&) = delete; + + WamrResult(WamrResult&& o) + { + *this = std::move(o); + } + WamrResult& + operator=(WamrResult&& o) + { + r = o.r; + o.r = {0, nullptr, 0, 0, nullptr}; + f = o.f; + o.f = false; + return *this; + } + // operator wasm_val_vec_t &() {return r;} }; using ModulePtr = std::unique_ptr; -using InstancePtr = std::unique_ptr; +using InstancePtr = + std::unique_ptr; -// clang-format on +using FuncInfo = std::pair; struct InstanceWrapper { wasm_extern_vec_t exports; InstancePtr mod_inst; + wasm_exec_env_t exec_env = nullptr; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: static InstancePtr @@ -59,7 +79,8 @@ struct InstanceWrapper wasm_module_t* m, int32_t maxPages, wasm_extern_vec_t* expt, - wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + wasm_extern_vec_t const& imports, + beast::Journal j); public: InstanceWrapper(); @@ -73,31 +94,36 @@ struct InstanceWrapper wasm_store_t* s, wasm_module_t* m, int32_t maxPages, - wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + int64_t gas, + wasm_extern_vec_t const& imports, + beast::Journal j); ~InstanceWrapper(); operator bool() const; - wasm_func_t* + FuncInfo getFunc( std::string_view funcName, wasm_exporttype_vec_t const& export_types) const; wmem getMem() const; + + std::int64_t + getGas() const; }; struct ModuleWrapper { ModulePtr module; - wasm_exec_env_t exec_env = nullptr; InstanceWrapper mod_inst; wasm_exporttype_vec_t export_types; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: static ModulePtr - init(wasm_store_t* s, wbytes const& wasmBin); + init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j); public: ModuleWrapper(); @@ -106,28 +132,31 @@ struct ModuleWrapper operator=(ModuleWrapper&& o); ModuleWrapper( wasm_store_t* s, - wbytes const& wasmBin, + Bytes const& wasmBin, bool instantiate, int32_t maxPages, - std::vector const& imports = {}); + int64_t gas, + std::vector const& imports, + beast::Journal j); ~ModuleWrapper(); operator bool() const; - wasm_func_t* + FuncInfo getFunc(std::string_view funcName) const; wmem getMem() const; + InstanceWrapper const& + getInstance(int i = 0) const; + int addInstance( wasm_store_t* s, int32_t maxPages, + int64_t gas, wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); - std::int64_t - setGas(std::int64_t gas); - std::int64_t getGas(); @@ -145,8 +174,6 @@ class WamrEngine std::unique_ptr engine; std::unique_ptr store; std::unique_ptr module; - wasm_trap_t* trap = nullptr; - std::int64_t defGas = -1; std::int32_t defMaxPages = -1; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); @@ -154,19 +181,15 @@ class WamrEngine WamrEngine(); ~WamrEngine() = default; - Expected - run(wbytes const& wasmCode, + Expected, TER> + run(Bytes const& wasmCode, std::string_view funcName, - std::vector const& imports, std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas, beast::Journal j); - std::int64_t - initGas(std::int64_t def); - - std::int64_t - setGas(std::int64_t gas); - std::int32_t initMaxPages(std::int32_t def); @@ -174,41 +197,51 @@ class WamrEngine getGas(); // Host functions helper functionality + wasm_trap_t* + newTrap(std::string_view msg); + + beast::Journal + getJournal() const; + +private: + InstanceWrapper const& + getRT(int m = 0, int i = 0); + wmem getMem() const; int32_t allocate(int32_t size); - wasm_trap_t* - newTrap(std::string_view msg); - -private: - Expected + Expected, TER> runHlp( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, + std::vector const& params, std::vector const& imports, - std::vector const& params); + HostFunctions* hfs, + int64_t gas); int addModule( - wbytes const& wasmCode, + Bytes const& wasmCode, bool instantiate, + int64_t gas, std::vector const& imports); void clearModules(); - int - addInstance(); + + // int addInstance(); + int32_t runFunc(std::string_view const funcName, int32_t p); int32_t makeModule( - wbytes const& wasmCode, + Bytes const& wasmCode, wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); - wasm_func_t* + FuncInfo getFunc(std::string_view funcName); std::vector @@ -221,48 +254,48 @@ class WamrEngine template inline WamrResult - call(std::string_view func, Types... args); + call(std::string_view func, Types&&... args); template inline WamrResult - call(wasm_func_t* func, Types... args); + call(FuncInfo const& f, Types&&... args); template inline WamrResult - call(wasm_func_t* f, std::vector& in); + call(FuncInfo const& f, std::vector& in); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, std::int32_t p, - Types... args); + Types&&... args); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, std::int64_t p, - Types... args); + Types&&... args); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, uint8_t const* d, std::size_t sz, - Types... args); + Types&&... args); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, - wbytes const& p, - Types... args); + Bytes const& p, + Types&&... args); }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h new file mode 100644 index 00000000000..1d1f4d011be --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -0,0 +1,224 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +#include +#include +#include +#include +#include + +namespace ripple { + +int32_t const HF_ERR_INTERNAL = -1; +int32_t const HF_ERR_FIELD_NOT_FOUND = -2; +int32_t const HF_ERR_BUFFER_TOO_SMALL = -3; +int32_t const HF_ERR_NO_ARRAY = -4; +int32_t const HF_ERR_NOT_LEAF_FIELD = -5; +int32_t const HF_ERR_LOCATOR_MALFORMED = -6; +int32_t const HF_ERR_SLOT_OUT_RANGE = -7; +int32_t const HF_ERR_SLOTS_FULL = -8; +int32_t const HF_ERR_INVALID_SLOT = -9; +int32_t const HF_ERR_LEDGER_OBJ_NOT_FOUND = -10; +int32_t const HF_ERR_DECODING = -11; +int32_t const HF_ERR_DATA_FIELD_TOO_LARGE = -12; +int32_t const HF_ERR_OUT_OF_BOUNDS = -13; +int32_t const HF_ERR_NO_MEM_EXPORTED = -14; +int32_t const HF_ERR_INVALID_PARAMS = -15; +int32_t const HF_ERR_INVALID_ACCOUNT = -16; + +struct HostFunctions +{ + virtual void + setRT(void const*) + { + } + + virtual void const* + getRT() const + { + return nullptr; + } + + virtual beast::Journal + getJournal() + { + return beast::Journal{beast::Journal::getNullSink()}; + } + + virtual int32_t + getLedgerSqn() + { + return 1; + } + + virtual int32_t + getParentLedgerTime() + { + return 1; + } + + virtual Hash + getParentLedgerHash() + { + return {}; + } + + virtual int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) + { + return HF_ERR_INTERNAL; + } + + virtual Expected + getTxField(SField const& fname) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getCurrentLedgerObjField(SField const& fname) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getTxNestedField(Slice const& locator) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getCurrentLedgerObjNestedField(Slice const& locator) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual int32_t + getTxArrayLen(SField const& fname) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getCurrentLedgerObjArrayLen(SField const& fname) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getTxNestedArrayLen(Slice const& locator) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + updateData(Bytes const& data) + { + return HF_ERR_INTERNAL; + } + + virtual Hash + computeSha512HalfHash(Bytes const& data) + { + return Hash{}; + } + + virtual Expected + accountKeylet(AccountID const& account) + { + return Bytes{}; + } + + virtual Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + oracleKeylet(AccountID const& account, std::uint32_t docId) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getNFT(AccountID const& account, uint256 const& nftId) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + traceNum(std::string const& msg, int64_t data) + { + return HF_ERR_INTERNAL; + } + + virtual ~HostFunctions() = default; +}; + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 6450647809b..1da8c38a2d6 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -20,8 +20,14 @@ #include #include +#include #include +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +// #define DEBUG_OUTPUT_WAMR 1 +#endif + namespace ripple { int32_t @@ -36,198 +42,455 @@ WasmHostFunctionsImpl::getParentLedgerTime() return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try } -// TODO remove json code after deciding encoding scheme +Hash +WasmHostFunctionsImpl::getParentLedgerHash() +{ + return ctx.view().info().parentHash; +} -std::optional -WasmHostFunctionsImpl::getTxField(std::string const& fname) +int32_t +WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) { - auto js = ctx.tx.getJson(JsonOptions::none); - if (js.isMember(fname)) + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cacheIdx) { - auto s = js.get(fname, Json::Value::null).asString(); - return Bytes{s.begin(), s.end()}; + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; } else - return std::nullopt; + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return HF_ERR_SLOTS_FULL; + + cache[cacheIdx] = ctx.view().read(keylet); + return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; +} + +Bytes +getAnyFieldData(STBase const& obj) +{ + // auto const& fname = obj.getFName(); + if (STI_ACCOUNT == obj.getSType()) + { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + else if (STI_AMOUNT == obj.getSType()) + { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + else if (STI_VL == obj.getSType()) + { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + else if (STI_UINT256 == obj.getSType()) + { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + else if (STI_UINT32 == obj.getSType()) + { + auto const& super(static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); +} + +Expected +WasmHostFunctionsImpl::getTxField(SField const& fname) +{ + auto const* field = ctx.tx.peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return getAnyFieldData(*field); +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) +{ + auto const sle = ctx.view().read(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + + return getAnyFieldData(*field); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + return Unexpected(HF_ERR_INVALID_SLOT); + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + + return getAnyFieldData(*field); } -std::optional -WasmHostFunctionsImpl::getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) +static Expected +locateField(STObject const* obj, Slice const& loc) { - auto kl = [&]() -> std::optional { - if (type == ltACCOUNT_ROOT) + if (loc.size() % 4) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + for (int i = 0; i < sz; ++i) + { + int32_t const c = l[i]; + + if (!field) + { + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + auto const& fname(*it->second); + + field = obj->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } + else if (STI_ARRAY == field->getSType()) { - std::string s(kdata.begin(), kdata.end()); - auto const account = parseBase58(s); - if (account) - { - return keylet::account(account.value()); - } + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + field = &(arr->operator[](c)); } - return std::nullopt; - }(); + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); - if (!kl || !ctx.view().exists(kl.value())) - return std::nullopt; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + auto const& fname(*it->second); - auto js = ctx.view().read(kl.value())->getJson(JsonOptions::none); - if (js.isMember(fname)) - { - auto s = js.get(fname, Json::Value::null).asString(); - return Bytes{s.begin(), s.end()}; + field = o->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } } - else - return std::nullopt; + + if (!field || (STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + + return field; } -std::optional -WasmHostFunctionsImpl::getCurrentLedgerEntryField(std::string const& fname) +Expected +WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) { - if (!ctx.view().exists(leKey)) - return std::nullopt; + auto const r = locateField(&ctx.tx, locator); + if (!r.has_value()) + return Unexpected(r.error()); - auto js = ctx.view().read(leKey)->getJson(JsonOptions::none); - if (js.isMember(fname)) - { - auto s = js.get(fname, Json::Value::null).asString(); - return Bytes{s.begin(), s.end()}; - } - else - return std::nullopt; + auto const* field = r.value(); + return getAnyFieldData(*field); } -std::optional -WasmHostFunctionsImpl::getNFT( - std::string const& account, - std::string const& nftId) +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) - { - return std::nullopt; - } + auto const sle = ctx.view().read(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - uint256 nftHash; - if (!nftHash.parseHex(nftId)) - { - return std::nullopt; - } + auto const r = locateField(sle.get(), locator); + if (!r.has_value()) + return Unexpected(r.error()); - auto jv = nft::findToken(ctx.view(), accountId.value(), nftHash); - if (!jv) - { - return std::nullopt; - } + auto const* field = r.value(); + return getAnyFieldData(*field); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjNestedField( + int32_t cacheIdx, + Slice const& locator) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + return Unexpected(HF_ERR_INVALID_SLOT); + + auto const r = locateField(cache[cacheIdx].get(), locator); + if (!r.has_value()) + return Unexpected(r.error()); + + auto const* field = r.value(); + return getAnyFieldData(*field); +} + +int32_t +WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const* field = ctx.tx.peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); - Slice const s = (*jv)[sfURI]; - return Bytes{s.begin(), s.end()}; + return sz; } -bool +int32_t +WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const sle = ctx.view().read(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + + auto const* field = sle->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getLedgerObjArrayLen( + int32_t cacheIdx, + SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + return HF_ERR_INVALID_SLOT; + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) +{ + auto const r = locateField(&ctx.tx, locator); + if (!r.has_value()) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) +{ + auto const sle = ctx.view().read(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + auto const r = locateField(sle.get(), locator); + if (!r.has_value()) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( + int32_t cacheIdx, + Slice const& locator) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + return HF_ERR_INVALID_SLOT; + + auto const r = locateField(cache[cacheIdx].get(), locator); + if (!r.has_value()) + return r.error(); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t WasmHostFunctionsImpl::updateData(Bytes const& data) { - if (!ctx.view().exists(leKey)) - return false; auto sle = ctx.view().peek(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; sle->setFieldVL(sfData, data); ctx.view().update(sle); - return true; + return 0; } Hash WasmHostFunctionsImpl::computeSha512HalfHash(Bytes const& data) { auto const hash = sha512Half(data); - return uint256::fromVoid(hash.data()); + return hash; } -std::optional -WasmHostFunctionsImpl::accountKeylet(std::string const& account) +Expected +WasmHostFunctionsImpl::accountKeylet(AccountID const& account) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) - { - return std::nullopt; - } - - auto keylet = keylet::account(*accountId).key; - if (!keylet) - { - return std::nullopt; - } - - return Bytes{keylet.begin(), keylet.end()}; + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; } -std::optional +Expected WasmHostFunctionsImpl::credentialKeylet( - std::string const& subject, - std::string const& issuer, - std::string const& credentialType) + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) { - auto const subjectId = parseBase58(subject); - if (!subjectId || subjectId->isZero()) - { - return std::nullopt; - } + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HF_ERR_INVALID_PARAMS); - auto const issuerId = parseBase58(issuer); - if (!issuerId || issuerId->isZero()) - { - return std::nullopt; - } + auto const keylet = + keylet::credential(subject, issuer, makeSlice(credentialType)); - auto keylet = - keylet::credential(*subjectId, *issuerId, makeSlice(credentialType)) - .key; - if (!keylet) - { - return std::nullopt; - } + return Bytes{keylet.key.begin(), keylet.key.end()}; +} - return Bytes{keylet.begin(), keylet.end()}; +Expected +WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; } -std::optional -WasmHostFunctionsImpl::escrowKeylet( - std::string const& account, - std::uint32_t const& seq) +Expected +WasmHostFunctionsImpl::oracleKeylet( + AccountID const& account, + std::uint32_t documentId) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) - { - return std::nullopt; - } + if (!account || account.isZero()) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} - auto keylet = keylet::escrow(*accountId, seq).key; - if (!keylet) - { - return std::nullopt; - } +Expected +WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) +{ + if (!account || !nftId) + return Unexpected(HF_ERR_INVALID_PARAMS); - return Bytes{keylet.begin(), keylet.end()}; + auto obj = nft::findToken(ctx.view(), account, nftId); + if (!obj) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + Slice const s = obj->at(sfURI); + return Bytes(s.begin(), s.end()); } -std::optional -WasmHostFunctionsImpl::oracleKeylet( - std::string const& account, - std::uint32_t const& documentId) +int32_t +WasmHostFunctionsImpl::trace( + std::string const& msg, + Bytes const& data, + bool asHex) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) +#ifdef DEBUG_OUTPUT + auto j = ctx.journal.error(); +#else + auto j = ctx.journal.trace(); +#endif + j << msg; + if (!asHex) + j << std::string_view( + reinterpret_cast(data.data()), data.size()); + else { - return std::nullopt; + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << hex; } - auto keylet = keylet::oracle(*accountId, documentId).key; - if (!keylet) - { - return std::nullopt; - } + return msg.size() + data.size() * (asHex ? 2 : 1); +} + +int32_t +WasmHostFunctionsImpl::traceNum(std::string const& msg, int64_t data) +{ +#ifdef DEBUG_OUTPUT + auto j = ctx.journal.error(); +#else + auto j = ctx.journal.trace(); +#endif - return Bytes{keylet.begin(), keylet.end()}; + j << msg << data; + + return msg.size() + sizeof(data); } + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index b87c23a4a85..091ca249345 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -19,22 +19,38 @@ #pragma once -#include +#include #include -#include -#include -#include - namespace ripple { class WasmHostFunctionsImpl : public HostFunctions { + ApplyContext& ctx; + Keylet leKey; + + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + + void const* rt_ = nullptr; + public: - WasmHostFunctionsImpl(ApplyContext& ctx, Keylet leKey) + WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) : ctx(ctx), leKey(leKey) { } + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + beast::Journal getJournal() override { @@ -47,46 +63,77 @@ class WasmHostFunctionsImpl : public HostFunctions int32_t getParentLedgerTime() override; - std::optional - getTxField(std::string const& fname) override; + Hash + getParentLedgerHash() override; + + int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override; - std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) override; + Expected + getTxField(SField const& fname) override; - std::optional - getCurrentLedgerEntryField(std::string const& fname) override; + Expected + getCurrentLedgerObjField(SField const& fname) override; - std::optional - getNFT(std::string const& account, std::string const& nftId) override; + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override; - bool + Expected + getTxNestedField(Slice const& locator) override; + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override; + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override; + + int32_t + getTxArrayLen(SField const& fname) override; + + int32_t + getCurrentLedgerObjArrayLen(SField const& fname) override; + + int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override; + + int32_t + getTxNestedArrayLen(Slice const& locator) override; + + int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override; + + int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override; + + int32_t updateData(Bytes const& data) override; Hash computeSha512HalfHash(Bytes const& data) override; - std::optional - accountKeylet(std::string const& account) override; + Expected + accountKeylet(AccountID const& account) override; - std::optional + Expected credentialKeylet( - std::string const& subject, - std::string const& issuer, - std::string const& credentialType) override; + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) override; - std::optional - escrowKeylet(std::string const& account, std::uint32_t const& seq) override; + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override; - std::optional - oracleKeylet(std::string const& account, std::uint32_t const& documentId) - override; + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override; -private: - ApplyContext& ctx; - Keylet leKey; + Expected + getNFT(AccountID const& account, uint256 const& nftId) override; + + int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) override; + + int32_t + traceNum(std::string const& msg, int64_t data) override; }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 543350a7c12..e4196263d65 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -17,6 +17,8 @@ */ //============================================================================== +#include +#include #include #include @@ -24,6 +26,83 @@ namespace ripple { +static int32_t +setData( + InstanceWrapper const* rt, + int32_t dst, + int32_t dsz, + uint8_t const* src, + int32_t ssz) +{ + auto mem = rt ? rt->getMem() : wmem(); + + if (!mem.s) + return HF_ERR_NO_MEM_EXPORTED; + if (dst + dsz > mem.s) + return HF_ERR_OUT_OF_BOUNDS; + if (ssz > dsz) + return HF_ERR_BUFFER_TOO_SMALL; + + memcpy(mem.p + dst, src, ssz); + + return ssz; +} + +static Expected +getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) +{ + auto mem = rt ? rt->getMem() : wmem(); + if (!mem.s) + return Unexpected(HF_ERR_NO_MEM_EXPORTED); + + if (src + ssz > mem.s) + return Unexpected(HF_ERR_OUT_OF_BOUNDS); + + Bytes data(mem.p + src, mem.p + src + ssz); + return data; +} + +static Expected +getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) +{ + auto const r = getData(rt, ptr, sz); + if (r->size() < AccountID::bytes) + return Unexpected(HF_ERR_INVALID_PARAMS); + + return AccountID::fromVoid(r->data()); +} + +static Expected +getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) +{ + auto mem = rt ? rt->getMem() : wmem(); + if (!mem.s) + return Unexpected(HF_ERR_NO_MEM_EXPORTED); + + if (src + ssz > mem.s) + return Unexpected(HF_ERR_OUT_OF_BOUNDS); + + std::string data(mem.p + src, mem.p + src + ssz); + return data; +} + +#define RET(x) \ + results->data[0] = WASM_I32_VAL(x); \ + results->num_elems = 1; \ + return nullptr; + +wasm_trap_t* +getLedgerSqnOld_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + // auto const* rt = reinterpret_cast(hf->getRT()); + int32_t const sqn = hf->getLedgerSqn(); + RET(sqn); +} + wasm_trap_t* getLedgerSqn_wrap( void* env, @@ -31,10 +110,15 @@ getLedgerSqn_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); int32_t const sqn = hf->getLedgerSqn(); - results->data[0] = WASM_I32_VAL(sqn); - return nullptr; + RET(setData( + rt, + params->data[0].of.i32, + params->data[1].of.i32, + reinterpret_cast(&sqn), + static_cast(sizeof(sqn)))); } wasm_trap_t* @@ -44,349 +128,622 @@ getParentLedgerTime_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); int32_t const ltime = hf->getParentLedgerTime(); - results->data[0] = WASM_I32_VAL(ltime); - return nullptr; + RET(setData( + rt, + params->data[0].of.i32, + params->data[1].of.i32, + reinterpret_cast(<ime), + static_cast(sizeof(ltime)))); } -static Expected -getParameterData(wasm_val_vec_t const* params, size_t index) +wasm_trap_t* +getParentLedgerHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); - auto fnameOffset = params->data[index].of.i32; - auto fnameLen = params->data[index + 1].of.i32; - auto mem = vm.getMem(); - if (!mem.s) - return Unexpected("No memory exported"); - - if (mem.s <= fnameOffset + fnameLen) - return Unexpected("Memory access failed"); - Bytes fname(mem.p + fnameOffset, mem.p + fnameOffset + fnameLen); - return fname; + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + Hash const hash = hf->getParentLedgerHash(); + RET(setData( + rt, + params->data[0].of.i32, + params->data[1].of.i32, + hash.data(), + static_cast(hash.size()))); } -static Expected -getFieldName(wasm_val_vec_t const* params, size_t index) +wasm_trap_t* +cacheLedgerObj_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto const dataRes = getParameterData(params, index); - if (dataRes) + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) { - return std::string(dataRes->begin(), dataRes->end()); + RET(r.error()); } - else + + if (r->size() < uint256::bytes) { - auto& vm = WasmEngine::instance(); - return Unexpected( - reinterpret_cast(vm.newTrap(dataRes.error()))); + RET(HF_ERR_INVALID_PARAMS); } + + uint256 const key(uint256::fromVoid(r->data())); + int32_t const idx = + hf->cacheLedgerObj(keylet::unchecked(key), params->data[2].of.i32); + RET(idx); } -static Expected -setData(Bytes const& data) +wasm_trap_t* +getTxField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); - auto mem = vm.getMem(); - if (!mem.s) - return Unexpected("No memory exported"); - - int32_t const dataLen = static_cast(data.size()); - int32_t const dataPtr = vm.allocate(dataLen); - if (!dataPtr) - return Unexpected("Allocation error"); - memcpy(mem.p + dataPtr, data.data(), dataLen); - - auto retPtr = vm.allocate(8); - if (!retPtr) - return Unexpected("Allocation error"); - int32_t* retData = reinterpret_cast(mem.p + retPtr); - retData[0] = dataPtr; - retData[1] = dataLen; - - return retPtr; + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); + + auto fieldData = hf->getTxField(fname); + if (!fieldData) + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[1].of.i32, + params->data[2].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getTxField_wrap( +getCurrentLedgerObjField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getFieldName(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - auto fieldData = hf->getTxField(fname.value()); + auto fieldData = hf->getCurrentLedgerObjField(fname); if (!fieldData) - return reinterpret_cast(vm.newTrap("Field not found")); + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[1].of.i32, + params->data[2].of.i32, + fieldData->data(), + fieldData->size())); +} - auto pointer = setData(fieldData.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getLedgerObjField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return nullptr; + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[1].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); + + auto fieldData = hf->getLedgerObjField(params->data[0].of.i32, fname); + if (!fieldData) + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getLedgerEntryField_wrap( +getTxNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } + + auto fieldData = hf->getTxNestedField(makeSlice(r.value())); + if (!fieldData) + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); +} - int32_t const type = params->data[0].of.i32; - auto lkData = getParameterData(params, 1); - if (!lkData) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getCurrentLedgerObjNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getFieldName(params, 3); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto fieldData = - hf->getLedgerEntryField(type, lkData.value(), fname.value()); + auto fieldData = hf->getCurrentLedgerObjNestedField(makeSlice(r.value())); if (!fieldData) - return reinterpret_cast(vm.newTrap()); - auto pointer = setData(fieldData.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + { + RET(fieldData.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return nullptr; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getCurrentLedgerEntryField_wrap( +getLedgerObjNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getFieldName(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); + if (!r) + { + RET(r.error()); + } - auto fieldData = hf->getCurrentLedgerEntryField(fname.value()); + auto fieldData = hf->getLedgerObjNestedField( + params->data[0].of.i32, makeSlice(r.value())); if (!fieldData) - return reinterpret_cast(vm.newTrap()); + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + fieldData->data(), + fieldData->size())); +} - auto pointer = setData(fieldData.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getTxArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + // auto const* rt = reinterpret_cast(hf->getRT()); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return nullptr; + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); + + int32_t sz = hf->getTxArrayLen(fname); + RET(sz); } wasm_trap_t* -getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +getCurrentLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + // auto const* rt = reinterpret_cast(hf->getRT()); + + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - auto nftId = getFieldName(params, 2); - if (!nftId) - return reinterpret_cast(vm.newTrap()); + int32_t sz = hf->getCurrentLedgerObjArrayLen(fname); + RET(sz); +} - auto nftURI = hf->getNFT(account.value(), nftId.value()); - if (!nftURI) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + // auto const* rt = reinterpret_cast(hf->getRT()); - auto pointer = setData(nftURI.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[1].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + int32_t sz = hf->getLedgerObjArrayLen(params->data[0].of.i32, fname); + RET(sz); } wasm_trap_t* -accountKeylet_wrap( +getTxNestedArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + int32_t sz = hf->getTxNestedArrayLen(makeSlice(r.value())); + RET(sz); +} - auto keylet = hf->accountKeylet(account.value()); - if (!keylet) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getCurrentLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + int32_t sz = hf->getCurrentLedgerObjNestedArrayLen(makeSlice(r.value())); + RET(sz); } wasm_trap_t* -credentialKeylet_wrap( +getLedgerObjNestedArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto subject = getFieldName(params, 0); - if (!subject) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); + if (!r) + { + RET(r.error()); + } - auto issuer = getFieldName(params, 2); - if (!issuer) - return reinterpret_cast(vm.newTrap()); + int32_t sz = hf->getLedgerObjNestedArrayLen( + params->data[0].of.i32, makeSlice(r.value())); + RET(sz); +} - auto credentialType = getFieldName(params, 4); - if (!credentialType) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +updateData_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto keylet = hf->credentialKeylet( - subject.value(), issuer.value(), credentialType.value()); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE) + } - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + RET(hf->updateData(r.value())); } wasm_trap_t* -escrowKeylet_wrap( +computeSha512HalfHash_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + auto const hash = hf->computeSha512HalfHash(r.value()); + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + hash.data(), + hash.size())); +} - int32_t const sequence = params->data[2].of.i32; +wasm_trap_t* +accountKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto keylet = hf->escrowKeylet(account.value(), sequence); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const k = hf->accountKeylet(acc.value()); + if (!k) + { + RET(k.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + k->data(), + k->size())); } wasm_trap_t* -oracleKeylet_wrap( +credentialKeylet_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + auto const subject = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!subject) + { + RET(subject.error()); + } - auto documentId = params->data[2].of.i32; + auto const issuer = + getDataAccount(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!issuer) + { + RET(issuer.error()); + } - auto keylet = hf->escrowKeylet(account.value(), documentId); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + auto const credType = + getData(rt, params->data[4].of.i32, params->data[5].of.i32); + if (!credType) + { + RET(credType.error()); + } - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const k = + hf->credentialKeylet(subject.value(), issuer.value(), credType.value()); + if (!k) + { + RET(k.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + RET(setData( + rt, + params->data[6].of.i32, + params->data[7].of.i32, + k->data(), + k->size())); } wasm_trap_t* -updateData_wrap( +escrowKeylet_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getParameterData(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } - if (!hf->updateData(fname.value())) - return reinterpret_cast(vm.newTrap()); + auto const k = hf->escrowKeylet(acc.value(), params->data[2].of.i32); + if (!k) + { + RET(k.error()); + } - return nullptr; + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + k->data(), + k->size())); } wasm_trap_t* -computeSha512HalfHash_wrap( +oracleKeylet_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getParameterData(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } - auto hres = hf->computeSha512HalfHash(fname.value()); - Bytes digest{hres.begin(), hres.end()}; - auto pointer = setData(digest); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const k = hf->oracleKeylet(acc.value(), params->data[2].of.i32); + if (!k) + { + RET(k.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32(32); - return nullptr; + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + k->data(), + k->size())); } wasm_trap_t* -print_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); - // auto* hf = reinterpret_cast(env); - - auto f = getParameterData(params, 0); - if (!f) - return reinterpret_cast(vm.newTrap()); - std::string s(f->begin(), f->end()); - if (s.size() < 4096) - std::cout << s << std::endl; - return nullptr; + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } + + auto const nftRaw = + getData(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!nftRaw) + { + RET(nftRaw.error()); + } + + if (nftRaw->size() < uint256::bytes * 2) + { + RET(HF_ERR_INVALID_PARAMS); + } + + uint256 const ntfId(uint256::fromVoid(nftRaw->data())); + auto const nftURI = hf->getNFT(acc.value(), ntfId); + if (!nftURI) + { + RET(nftURI.error()); + } + + RET(setData( + rt, + params->data[4].of.i32, + params->data[5].of.i32, + nftURI->data(), + nftURI->size())); +} + +wasm_trap_t* +trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const msg = + getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!msg) + { + RET(msg.error()); + } + + auto const data = + getData(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!data) + { + RET(data.error()); + } + + auto const e = hf->trace(msg.value(), data.value(), params->data[4].of.i32); + RET(e); +} + +wasm_trap_t* +traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const msg = + getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!msg) + { + RET(msg.error()); + } + + auto const e = hf->traceNum(msg.value(), params->data[2].of.i64); + RET(e); } } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index d63db3d5057..ac0cb88e497 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -23,91 +23,200 @@ namespace ripple { -using getLedgerSqn_proto = int32_t(); +using getLedgerSqnOld_proto = int32_t(); +wasm_trap_t* +getLedgerSqnOld_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getLedgerSqn_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getParentLedgerTime_proto = int32_t(); +using getParentLedgerTime_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getParentLedgerTime_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getTxField_proto = uint32_t*(char const*, int32_t); +using getParentLedgerHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getParentLedgerHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using cacheLedgerObj_proto = int32_t(uint8_t const*, int32_t, int32_t); +wasm_trap_t* +cacheLedgerObj_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxField_proto = int32_t(int32_t, uint8_t*, int32_t); wasm_trap_t* getTxField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getLedgerEntryField_proto = - uint32_t*(int32_t, uint8_t const*, int32_t, char const*, int32_t); +using getCurrentLedgerObjField_proto = int32_t(int32_t, uint8_t*, int32_t); wasm_trap_t* -getLedgerEntryField_wrap( +getCurrentLedgerObjField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getCurrentLedgerEntryField_proto = uint32_t*(char const*, int32_t); +using getLedgerObjField_proto = int32_t(int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* -getCurrentLedgerEntryField_wrap( +getLedgerObjField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getNFT_proto = uint32_t*(char const*, int32_t, char const*, int32_t); +using getTxNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +getTxNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); -using accountKeylet_proto = uint32_t*(char const*, int32_t); +using getCurrentLedgerObjNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -accountKeylet_wrap( +getCurrentLedgerObjNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using credentialKeylet_proto = - uint32_t*(char const*, int32_t, char const*, int32_t, char const*, int32_t); +using getLedgerObjNestedField_proto = + int32_t(int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -credentialKeylet_wrap( +getLedgerObjNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using escrowKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +using getTxArrayLen_proto = int32_t(int32_t); wasm_trap_t* -escrowKeylet_wrap( +getTxArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using oracleKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +using getCurrentLedgerObjArrayLen_proto = int32_t(int32_t); wasm_trap_t* -oracleKeylet_wrap( +getCurrentLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerObjArrayLen_proto = int32_t(int32_t, int32_t); +wasm_trap_t* +getLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxNestedArrayLen_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getTxNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getCurrentLedgerObjNestedArrayLen_proto = + int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getCurrentLedgerObjNestedArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using updateData_proto = void(uint8_t const*, int32_t); +using getLedgerObjNestedArrayLen_proto = + int32_t(int32_t, uint8_t const*, int32_t); +wasm_trap_t* +getLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using updateData_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* updateData_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using computeSha512HalfHash_proto = uint32_t*(uint8_t const*, int32_t); +using computeSha512HalfHash_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* computeSha512HalfHash_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using print_proto = void(char const*, int32_t); +using accountKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +accountKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using credentialKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +credentialKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using escrowKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +escrowKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using oracleKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +oracleKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFT_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using trace_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +wasm_trap_t* +trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* -print_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); } // namespace ripple diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/misc/WasmParamsHelper.h new file mode 100644 index 00000000000..af2db08ebc1 --- /dev/null +++ b/src/xrpld/app/misc/WasmParamsHelper.h @@ -0,0 +1,269 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace bft = boost::function_types; + +namespace ripple { + +using Bytes = std::vector; +using Hash = ripple::uint256; + +struct wmem +{ + std::uint8_t* p = nullptr; + std::size_t s = 0; +}; + +template +struct WasmResult +{ + T result; + int64_t cost; +}; +typedef WasmResult EscrowResult; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64, WT_U8V }; + +struct WasmImportFunc +{ + std::string name; + std::optional result; + std::vector params; + void* udata = nullptr; + // wasm_func_callback_with_env_t + void* wrap = nullptr; +}; + +#define WASM_IMPORT_FUNC(v, f, ...) \ + WasmImpFunc( \ + v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) + +#define WASM_IMPORT_FUNC2(v, f, n, ...) \ + WasmImpFunc( \ + v, n, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) + +template +void +WasmImpArgs(WasmImportFunc& e) +{ + if constexpr (N < C) + { + using at = typename boost::mpl::at_c::type; + if constexpr (std::is_pointer_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I64); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F64); + else + static_assert(std::is_pointer_v, "Unsupported argument type"); + + return WasmImpArgs(e); + } + return; +} + +template +void +WasmImpRet(WasmImportFunc& e) +{ + if constexpr (std::is_pointer_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I64; + else if constexpr (std::is_same_v) + e.result = WT_F32; + else if constexpr (std::is_same_v) + e.result = WT_F64; + else if constexpr (std::is_void_v) + e.result.reset(); +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ + ((defined(__clang_major__)) && (__clang_major__ >= 18)) + else + static_assert(false, "Unsupported return type"); +#endif +} + +template +void +WasmImpFuncHelper(WasmImportFunc& e) +{ + using rt = typename bft::result_type::type; + using pt = typename bft::parameter_types::type; + // typename boost::mpl::at_c::type + + WasmImpRet(e); + WasmImpArgs<0, bft::function_arity::value, pt>(e); + // WasmImpWrap(e, std::forward(f)); +} + +template +void +WasmImpFunc( + std::vector& v, + std::string_view imp_name, + void* f_wrap, + void* data = nullptr) +{ + WasmImportFunc e; + e.name = imp_name; + e.udata = data; + e.wrap = f_wrap; + WasmImpFuncHelper(e); + v.push_back(std::move(e)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct WasmParamVec +{ + std::uint8_t const* d = nullptr; + std::int32_t sz = 0; +}; + +struct WasmParam +{ + WasmTypes type = WT_I32; + union + { + std::int32_t i32; + std::int64_t i64 = 0; + float f32; + double f64; + WasmParamVec u8v; + } of; +}; + +template +inline void +wasmParamsHlp(std::vector& v, std::int32_t p, Types&&... args) +{ + v.push_back({.type = WT_I32, .of = {.i32 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) +{ + v.push_back({.type = WT_I64, .of = {.i64 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, float p, Types&&... args) +{ + v.push_back({.type = WT_F32, .of = {.f32 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, double p, Types&&... args) +{ + v.push_back({.type = WT_F64, .of = {.f64 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp( + std::vector& v, + std::uint8_t const* dt, + std::int32_t sz, + Types&&... args) +{ + v.push_back({.type = WT_U8V, .of = {.u8v = {.d = dt, .sz = sz}}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) +{ + wasmParamsHlp( + v, + p.data(), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp( + std::vector& v, + std::string_view const& p, + Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.data()), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.c_str()), + static_cast(p.size()), + std::forward(args)...); +} + +inline void +wasmParamsHlp(std::vector& v) +{ + return; +} + +template +inline std::vector +wasmParams(Types&&... args) +{ + std::vector v; + v.reserve(sizeof...(args)); + wasmParamsHlp(v, std::forward(args)...); + return v; +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 8e77bc027b9..dbfcfe549c0 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -18,8 +18,10 @@ //============================================================================== #include +#include #include +#include #include #include @@ -31,32 +33,88 @@ Expected runEscrowWasm( Bytes const& wasmCode, std::string_view funcName, + std::vector const& params, HostFunctions* hfs, - uint64_t gasLimit) + int64_t gasLimit, + beast::Journal j) { // create VM and set cost limit auto& vm = WasmEngine::instance(); - vm.initGas(gasLimit); vm.initMaxPages(MAX_PAGES); std::vector imports; - WASM_IMPORT_FUNC(imports, getLedgerSqn, hfs) - WASM_IMPORT_FUNC(imports, getParentLedgerTime, hfs) - WASM_IMPORT_FUNC(imports, getTxField, hfs) - WASM_IMPORT_FUNC(imports, getLedgerEntryField, hfs) - WASM_IMPORT_FUNC(imports, getCurrentLedgerEntryField, hfs) - WASM_IMPORT_FUNC(imports, getNFT, hfs) - WASM_IMPORT_FUNC(imports, accountKeylet, hfs) - WASM_IMPORT_FUNC(imports, credentialKeylet, hfs) - WASM_IMPORT_FUNC(imports, escrowKeylet, hfs) - WASM_IMPORT_FUNC(imports, oracleKeylet, hfs) - WASM_IMPORT_FUNC(imports, updateData, hfs) - WASM_IMPORT_FUNC(imports, computeSha512HalfHash, hfs) - WASM_IMPORT_FUNC(imports, print, hfs) - - std::int64_t const sgas = gasLimit; // vm.getGas(); - auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); + if (hfs) + { + // TODO: remove after escrow_test wasm module will be updated + WASM_IMPORT_FUNC2(imports, getLedgerSqnOld, "getLedgerSqn", hfs); + + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", hfs); + WASM_IMPORT_FUNC2( + imports, getParentLedgerTime, "get_parent_ledger_time", hfs); + WASM_IMPORT_FUNC2( + imports, getParentLedgerHash, "get_parent_ledger_hash", hfs); + WASM_IMPORT_FUNC2(imports, cacheLedgerObj, "cache_ledger_obj", hfs); + WASM_IMPORT_FUNC2(imports, getTxField, "get_tx_field", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjField, + "get_current_ledger_obj_field", + hfs); + WASM_IMPORT_FUNC2( + imports, getLedgerObjField, "get_ledger_obj_field", hfs); + WASM_IMPORT_FUNC2( + imports, getTxNestedField, "get_tx_nested_field", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjNestedField, + "get_current_ledger_obj_nested_field", + hfs); + WASM_IMPORT_FUNC2( + imports, + getLedgerObjNestedField, + "get_ledger_obj_nested_field", + hfs); + WASM_IMPORT_FUNC2(imports, getTxArrayLen, "get_tx_array_len", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjArrayLen, + "get_current_ledger_obj_array_len", + hfs); + WASM_IMPORT_FUNC2( + imports, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs); + WASM_IMPORT_FUNC2( + imports, getTxNestedArrayLen, "get_tx_nested_array_len", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjNestedArrayLen, + "get_current_ledger_obj_nested_array_len", + hfs); + WASM_IMPORT_FUNC2( + imports, + getLedgerObjNestedArrayLen, + "get_ledger_obj_nested_array_len", + hfs); + WASM_IMPORT_FUNC2(imports, updateData, "update_data", hfs); + WASM_IMPORT_FUNC2( + imports, computeSha512HalfHash, "compute_sha512_half", hfs); + WASM_IMPORT_FUNC2(imports, accountKeylet, "account_keylet", hfs); + WASM_IMPORT_FUNC2(imports, credentialKeylet, "credential_keylet", hfs); + WASM_IMPORT_FUNC2(imports, escrowKeylet, "escrow_keylet", hfs); + WASM_IMPORT_FUNC2(imports, oracleKeylet, "oracle_keylet", hfs); + WASM_IMPORT_FUNC2(imports, getNFT, "get_NFT", hfs); + WASM_IMPORT_FUNC(imports, trace, hfs); + WASM_IMPORT_FUNC2(imports, traceNum, "trace_num", hfs); + } + + auto ret = vm.run( + wasmCode, + funcName, + params, + imports, + hfs, + gasLimit, + hfs ? hfs->getJournal() : j); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -66,12 +124,10 @@ runEscrowWasm( // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } - std::int64_t const egas = vm.getGas(); - std::uint64_t const spent = static_cast(sgas - egas); - // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost // << std::endl; - return EscrowResult{static_cast(ret.value()), spent}; + return EscrowResult{ret->result > 0, ret->cost}; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -87,21 +143,17 @@ WasmEngine::instance() return e; } -Expected +Expected, TER> WasmEngine::run( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, - std::vector const& imports, std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gasLimit, beast::Journal j) { - return impl->run(wasmCode, funcName, imports, params, j); -} - -std::int64_t -WasmEngine::initGas(std::int64_t def) -{ - return impl->initGas(def); + return impl->run(wasmCode, funcName, params, imports, hfs, gasLimit, j); } std::int32_t @@ -110,35 +162,16 @@ WasmEngine::initMaxPages(std::int32_t def) return impl->initMaxPages(def); } -// gas = 1'000'000'000LL -std::int64_t -WasmEngine::setGas(std::int64_t gas) -{ - return impl->setGas(gas); -} - -std::int64_t -WasmEngine::getGas() -{ - return impl->getGas(); -} - -wmem -WasmEngine::getMem() const -{ - return impl->getMem(); -} - -int32_t -WasmEngine::allocate(int32_t size) -{ - return impl->allocate(size); -} - void* WasmEngine::newTrap(std::string_view msg) { return impl->newTrap(msg); } +beast::Journal +WasmEngine::getJournal() const +{ + return impl->getJournal(); +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 74e700883df..b12d7ecc7ef 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -18,22 +18,10 @@ //============================================================================== #pragma once -#include -#include -#include -#include - -#include -#include -#include -#include - -// #include +#include #include -namespace bft = boost::function_types; - namespace ripple { static std::string_view const W_ENV = "env"; @@ -46,273 +34,8 @@ static std::string_view const W_ALLOC = "allocate"; static std::string_view const W_DEALLOC = "deallocate"; static std::string_view const W_PROC_EXIT = "proc_exit"; -using wbytes = std::vector; -struct wmem -{ - std::uint8_t* p = nullptr; - std::size_t s = 0; -}; - uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 -typedef std::vector Bytes; -typedef ripple::uint256 Hash; - -template -struct WasmResult -{ - T result; - uint64_t cost; -}; -typedef WasmResult EscrowResult; - -struct HostFunctions -{ - virtual beast::Journal - getJournal() - { - return beast::Journal{beast::Journal::getNullSink()}; - } - - virtual int32_t - getLedgerSqn() - { - return 1; - } - - virtual int32_t - getParentLedgerTime() - { - return 1; - } - - virtual std::optional - getTxField(std::string const& fname) - { - return Bytes{}; - } - - virtual std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) - { - return Bytes{}; - } - - virtual std::optional - getCurrentLedgerEntryField(std::string const& fname) - { - return Bytes{}; - } - - virtual std::optional - getNFT(std::string const& account, std::string const& nftId) - { - return Bytes{}; - } - - virtual bool - updateData(Bytes const& data) - { - return true; - } - - virtual Hash - computeSha512HalfHash(Bytes const& data) - { - return Hash{}; - } - - virtual std::optional - accountKeylet(std::string const& account) - { - return Bytes{}; - } - - virtual std::optional - credentialKeylet( - std::string const& subject, - std::string const& issuer, - std::string const& credentialType) - { - return Bytes{}; - } - - virtual std::optional - escrowKeylet(std::string const& account, std::uint32_t const& seq) - { - return Bytes{}; - } - - virtual std::optional - oracleKeylet(std::string const& account, std::uint32_t const& docId) - { - return Bytes{}; - } - - virtual ~HostFunctions() = default; -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64 }; - -struct WasmImportFunc -{ - std::string name; - std::optional result; - std::vector params; - void* udata = nullptr; - // wasm_func_callback_with_env_t - void* wrap = nullptr; -}; - -#define WASM_IMPORT_FUNC(v, f, ...) \ - WasmImpFunc( \ - v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__); - -template -void -WasmImpArgs(WasmImportFunc& e) -{ - if constexpr (N < C) - { - using at = typename boost::mpl::at_c::type; - if constexpr (std::is_pointer_v) - e.params.push_back(WT_I32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_I32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_I64); - else if constexpr (std::is_same_v) - e.params.push_back(WT_F32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_F64); - else - static_assert(std::is_pointer_v, "Unsupported argument type"); - - return WasmImpArgs(e); - } - return; -} - -template -void -WasmImpRet(WasmImportFunc& e) -{ - if constexpr (std::is_pointer_v) - e.result = WT_I32; - else if constexpr (std::is_same_v) - e.result = WT_I32; - else if constexpr (std::is_same_v) - e.result = WT_I64; - else if constexpr (std::is_same_v) - e.result = WT_F32; - else if constexpr (std::is_same_v) - e.result = WT_F64; - else if constexpr (std::is_void_v) - e.result.reset(); -#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ - ((defined(__clang_major__)) && (__clang_major__ >= 18)) - else - static_assert(false, "Unsupported return type"); -#endif -} - -template -void -WasmImpFuncHelper(WasmImportFunc& e) -{ - using rt = typename bft::result_type::type; - using pt = typename bft::parameter_types::type; - // typename boost::mpl::at_c::type - - WasmImpRet(e); - WasmImpArgs<0, bft::function_arity::value, pt>(e); - // WasmImpWrap(e, std::forward(f)); -} - -template -void -WasmImpFunc( - std::vector& v, - std::string_view imp_name, - void* f_wrap, - void* data = nullptr) -{ - WasmImportFunc e; - e.name = imp_name; - e.udata = data; - e.wrap = f_wrap; - WasmImpFuncHelper(e); - v.push_back(std::move(e)); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -struct WasmParam -{ - WasmTypes type = WT_I32; - union - { - std::int32_t i32; - std::int64_t i64 = 0; - float f32; - double f64; - } of; -}; - -template -inline std::vector -wasmParams(Types... args) -{ - std::vector v; - v.reserve(sizeof...(args)); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, std::int32_t p, Types... args) -{ - v.push_back({.type = WT_I32, .of = {.i32 = p}}); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, std::int64_t p, Types... args) -{ - v.push_back({.type = WT_I64, .of = {.i64 = p}}); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, float p, Types... args) -{ - v.push_back({.type = WT_F32, .of = {.f32 = p}}); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, double p, Types... args) -{ - v.push_back({.type = WT_F64, .of = {.f64 = p}}); - return wasmParams(v, std::forward(args)...); -} - -inline std::vector -wasmParams(std::vector& v) -{ - return v; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - class WamrEngine; class WasmEngine { @@ -333,34 +56,24 @@ class WasmEngine static WasmEngine& instance(); - Expected - run(wbytes const& wasmCode, + Expected, TER> + run(Bytes const& wasmCode, std::string_view funcName = {}, - std::vector const& imports = {}, std::vector const& params = {}, + std::vector const& imports = {}, + HostFunctions* hfs = nullptr, + int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); - std::int64_t - initGas(std::int64_t def = 1'000'000'000'000LL); - std::int32_t initMaxPages(std::int32_t def); - std::int64_t - setGas(std::int64_t gas); - - std::int64_t - getGas(); - - // for host functions usage - wmem - getMem() const; - - int32_t - allocate(int32_t size); - + // Host functions helper functionality void* newTrap(std::string_view msg = {}); + + beast::Journal + getJournal() const; }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -369,7 +82,9 @@ Expected runEscrowWasm( Bytes const& wasmCode, std::string_view funcName, - HostFunctions* hfs, - uint64_t gasLimit); + std::vector const& params = {}, + HostFunctions* hfs = nullptr, + int64_t gasLimit = -1, + beast::Journal j = beast::Journal(beast::Journal::getNullSink())); } // namespace ripple diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 42e67621e77..75bc54c2bc9 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -629,7 +629,8 @@ EscrowFinish::doApply() return tecINTERNAL; } std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, allowance); + auto re = + runEscrowWasm(wasm, funcName, {}, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From 383b225690cf7e12ff2f29f8fd9ecc4615f12510 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:32:11 -0400 Subject: [PATCH 20/73] Fix processing nonexistent field (#5467) --- src/test/app/Escrow_test.cpp | 27 +++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 26 +++++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 75 ++++++++++++++----------- 4 files changed, 98 insertions(+), 32 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 52abf61fc6c..49d7fb216df 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1888,6 +1888,33 @@ struct Escrow_test : public beast::unit_test::suite ter(temBAD_LIMIT)); } + { + uint32_t const allowance = 10'000; + Env env(*this); + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + XRPAmount const createFee = env.current()->fees().base + 1000; + + // Escrow with FinishFunction + Condition + auto escrowCreate = escrow(alice, carol, XRP(1000)); + env(escrowCreate, + finish_function(reqNonexistentField), + condition(cb1), + cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + env.close(); + + // Rejected as wasm code request nonexistent memo field + XRPAmount const txnFees = env.current()->fees().base * 34 + 1000; + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb1), + comp_allowance(allowance), + fee(txnFees), + ter(tecWASM_REJECTED)); + } + Env env(*this); // Run past the flag ledger so that a Fee change vote occurs and diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 7dbc4fdc2ff..10330f93bf7 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11683,3 +11683,29 @@ extern std::string const hostFunctions2Hex = "65745f6665617475726573042b0f6d757461626c652d676c6f62616c732b" "087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" "6c746976616c7565"; + +extern std::string const reqNonexistentField = + "0061736d0100000001120360027f7f0060047f7f7f7f017f6000017f02200108686f73745f" + "6c6962136765745f74785f6e65737465645f6669656c640001030403020000050301001006" + "19037f01418080c0000b7f00418080c0000b7f00418080c0000b072e04066d656d6f727902" + "000666696e69736800010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0abc04035f01037f230041d0206b220124002001410c6a220241802010032001418c206a22" + "0041c400100320004189803c10022000410010022000418a803810022000418d801c100220" + "0020012802cc2020024180201000200141d0206a240041004a0b6101027f230041106b2103" + "024020002802402202413d6b41bf7f490d002003200136020c4100210103402002413f4b0d" + "01200020026a2003410c6a20016a2d00003a00002000200028024041016a22023602402001" + "41016a22014104470d000b0b0bf70201037f200141104f044002402000410020006b410371" + "22036a220220004d0d0020030440200321040340200041003a0000200041016a2100200441" + "016b22040d000b0b200341016b4107490d000340200041003a0000200041076a41003a0000" + "200041066a41003a0000200041056a41003a0000200041046a41003a0000200041036a4100" + "3a0000200041026a41003a0000200041016a41003a0000200041086a22002002470d000b0b" + "2002200120036b2201417c716a220020024b0440034020024100360200200241046a220220" + "00490d000b0b200141037121010b02402000200020016a22034f0d00200141077122020440" + "0340200041003a0000200041016a2100200241016b22020d000b0b200141016b4107490d00" + "0340200041003a0000200041076a41003a0000200041066a41003a0000200041056a41003a" + "0000200041046a41003a0000200041036a41003a0000200041026a41003a0000200041016a" + "41003a0000200041086a22002003470d000b0b0b004d0970726f64756365727302086c616e" + "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461726765745f6665" + "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index acf2de906e0..308c2668bd7 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -54,3 +54,5 @@ extern std::string const sp1_wasm; extern std::string const xrplStdExampleHex; extern std::string const hostFunctions2Hex; + +extern std::string const reqNonexistentField; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 1da8c38a2d6..9e2ec00d184 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -74,39 +74,50 @@ Bytes getAnyFieldData(STBase const& obj) { // auto const& fname = obj.getFName(); - if (STI_ACCOUNT == obj.getSType()) + auto const stype = obj.getSType(); + switch (stype) { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - else if (STI_AMOUNT == obj.getSType()) - { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; - } - else if (STI_VL == obj.getSType()) - { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - else if (STI_UINT256 == obj.getSType()) - { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - else if (STI_UINT32 == obj.getSType()) - { - auto const& super(static_cast const&>(obj)); - std::uint32_t const data = super.value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; } Serializer msg; From 8a33702f265dd917a945937ef70d05676317b630 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Jun 2025 12:11:09 -0400 Subject: [PATCH 21/73] fix merge issues --- src/test/app/Escrow_test.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 3f89f430edf..d052415f9f4 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1904,21 +1904,21 @@ struct Escrow_test : public beast::unit_test::suite XRPAmount const createFee = env.current()->fees().base + 1000; // Escrow with FinishFunction + Condition - auto escrowCreate = escrow(alice, carol, XRP(1000)); + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); env(escrowCreate, - finish_function(reqNonexistentField), - condition(cb1), - cancel_time(env.now() + 100s), + escrow::finish_function(reqNonexistentField), + escrow::condition(escrow::cb1), + escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); env.close(); // Rejected as wasm code request nonexistent memo field XRPAmount const txnFees = env.current()->fees().base * 34 + 1000; - env(finish(alice, alice, seq), - condition(cb1), - fulfillment(fb1), - comp_allowance(allowance), + env(escrow::finish(alice, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb1), + escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); } From 6e8a5f0f4e18b80e6ecc67ec8803934806c14faa Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Jun 2025 14:24:13 -0400 Subject: [PATCH 22/73] fix: make host function traces easier to use, fix `get_NFT` bug (#5466) Co-authored-by: Olek <115580134+oleks-rip@users.noreply.github.com> --- src/xrpld/app/misc/WamrVM.cpp | 20 ++++++++++++-------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 16 +++++++++++----- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 5 ++++- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index fb1852bd00d..8f7c9b1c361 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -93,11 +93,17 @@ wamr_log_to_rippled( { beast::Journal j = WasmEngine::instance().getJournal(); - // Format the variadic args - char const* safeFile = file ? file : ""; - std::ostringstream oss; - oss << "WAMR (" << safeFile << ":" << line << "): "; + + // Format the variadic args + if (file) + { + oss << "WAMR (" << file << ":" << line << "): "; + } + else + { + oss << "WAMR: "; + } va_list args; va_start(args, fmt); @@ -114,7 +120,6 @@ wamr_log_to_rippled( #ifdef DEBUG_OUTPUT_WAMR std::cerr << oss.str() << std::endl; #endif - // } void @@ -544,9 +549,8 @@ ModuleWrapper::buildImports( if (impCnt != importTypes.num_elems) { print_wasm_error( - std::string("Imports not finished: ") + - std::to_string(wimports.num_elems) + "/" + - std::to_string(importTypes.num_elems), + std::string("Imports not finished: ") + std::to_string(impCnt) + + "/" + std::to_string(importTypes.num_elems), nullptr, j_); } diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 9e2ec00d184..6c19db6dc42 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -455,11 +455,17 @@ Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; return Unexpected(HF_ERR_INVALID_PARAMS); + } auto obj = nft::findToken(ctx.view(), account, nftId); if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + } Slice const s = obj->at(sfURI); return Bytes(s.begin(), s.end()); @@ -476,15 +482,15 @@ WasmHostFunctionsImpl::trace( #else auto j = ctx.journal.trace(); #endif - j << msg; if (!asHex) - j << std::string_view( - reinterpret_cast(data.data()), data.size()); + j << "WAMR TRACE (" << leKey.key << "): " << msg << " - " + << std::string_view( + reinterpret_cast(data.data()), data.size()); else { auto const hex = boost::algorithm::hex(std::string(data.begin(), data.end())); - j << hex; + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); @@ -499,7 +505,7 @@ WasmHostFunctionsImpl::traceNum(std::string const& msg, int64_t data) auto j = ctx.journal.trace(); #endif - j << msg << data; + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << data; return msg.size() + sizeof(data); } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index e4196263d65..b654c16aa54 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -685,8 +685,11 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) RET(nftRaw.error()); } - if (nftRaw->size() < uint256::bytes * 2) + if (nftRaw->size() != uint256::bytes) { + hf->getJournal().trace() + << "WAMR getNFT: Invalid NFT data size: " << nftRaw->size() + << ", expected " << (uint256::bytes); RET(HF_ERR_INVALID_PARAMS); } From 51a9c0ff59c8fcd891e83631d737832b7626d602 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:54:49 -0400 Subject: [PATCH 23/73] Host function gas cost (#5488) * Update Wamr to 2.3.1 * Add gas cost per host-function * Fix windows build * Fix wasm test * Add no import test --- .github/actions/dependencies/action.yml | 2 +- .github/workflows/nix.yml | 2 +- conanfile.py | 2 +- external/wamr/conandata.yml | 2 +- external/wamr/conanfile.py | 5 +- external/wamr/patches/ripp_metering.patch | 484 ++++++++++++---------- src/test/app/Wasm_test.cpp | 365 +++++++++------- src/xrpld/app/misc/WamrVM.cpp | 16 +- src/xrpld/app/misc/WamrVM.h | 4 +- src/xrpld/app/misc/WasmParamsHelper.h | 5 +- 10 files changed, 500 insertions(+), 387 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index c251daa9369..4f7e2383335 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -17,7 +17,7 @@ runs: conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ - conan export -k external/wamr wamr/2.2.0@ + conan export external/wamr wamr/2.3.1@ - name: add Ripple Conan remote shell: bash run: | diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 76597a68e01..3b95fbe1d8d 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -408,7 +408,7 @@ jobs: conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default conan export external/snappy snappy/1.1.10@ conan export external/soci soci/4.0.3@ - conan export -k external/wamr wamr/2.2.0@ + conan export external/wamr wamr/2.3.1@ - name: build dependencies run: | diff --git a/conanfile.py b/conanfile.py index cc9ce866ecc..01c7ccfc9ba 100644 --- a/conanfile.py +++ b/conanfile.py @@ -31,7 +31,7 @@ class Xrpl(ConanFile): 'openssl/1.1.1v', 'soci/4.0.3', 'zlib/1.3.1', - 'wamr/2.2.0', + 'wamr/2.3.1', ] tool_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml index 6c49946ecab..b1459816305 100644 --- a/external/wamr/conandata.yml +++ b/external/wamr/conandata.yml @@ -1,5 +1,5 @@ patches: - 2.2.0: + 2.3.1: - patch_description: add metering to iwasm interpreter patch_file: patches/ripp_metering.patch patch_type: conan diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index ae83e8c13c1..1fa3281c1e5 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -13,7 +13,7 @@ class WamrConan(ConanFile): name = "wamr" - version = "2.2.0" + version = "2.3.1" license = "Apache License v2.0" url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" description = "Webassembly micro runtime" @@ -42,7 +42,7 @@ def source(self): git = tools.Git() git.clone( "https://github.com/bytecodealliance/wasm-micro-runtime.git", - "c883fafead005e87ad3122b05409886f507c1cb0", + "2a303861cc916dc182b7fecaa0aacc1b797e7ac6", shallow=True, ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -89,3 +89,4 @@ def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" + diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index a2abf37a57c..e9ca69338f6 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 551991f8..5f48a0b8 100644 +index 88a1642b..aeb29912 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ @@ -11,97 +11,127 @@ index 551991f8..5f48a0b8 100644 option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) -diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake -index 1cb50235..bd103022 100644 ---- a/build-scripts/config_common.cmake -+++ b/build-scripts/config_common.cmake -@@ -669,6 +669,10 @@ if (WAMR_BUILD_AOT_VALIDATOR EQUAL 1) - message (" AOT validator enabled") - add_definitions (-DWASM_ENABLE_AOT_VALIDATOR=1) - endif () -+if (WAMR_BUILD_INSTRUCTION_METERING EQUAL 1) -+ message (" Instruction metering enabled") -+ add_definitions (-DWASM_ENABLE_INSTRUCTION_METERING=1) -+endif () - - ######################################## - # Show Phase4 Wasm proposals status. -diff --git a/core/config.h b/core/config.h -index cb1189c9..a4e1499e 100644 ---- a/core/config.h -+++ b/core/config.h -@@ -716,4 +716,8 @@ unless used elsewhere */ - #define WASM_ENABLE_AOT_VALIDATOR 0 - #endif - -+#ifndef WASM_ENABLE_INSTRUCTION_METERING -+#define WASM_ENABLE_INSTRUCTION_METERING 0 -+#endif -+ - #endif /* end of _CONFIG_H_ */ diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c -index 269ec577..bc6fd01b 100644 +index 269ec577..34eb7c34 100644 --- a/core/iwasm/common/wasm_c_api.c +++ b/core/iwasm/common/wasm_c_api.c -@@ -5389,3 +5389,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, +@@ -3242,10 +3242,20 @@ wasm_func_copy(const wasm_func_t *func) + + cloned->func_idx_rt = func->func_idx_rt; + cloned->inst_comm_rt = func->inst_comm_rt; ++ cloned->gas = func->gas; + + RETURN_OBJ(cloned, wasm_func_delete) + } + ++uint32_t ++wasm_func_set_gas(wasm_func_t *func, uint32_t gas) ++{ ++ if(!func) return 0; ++ ++ func->gas = gas; ++ return gas; ++} ++ + own wasm_functype_t * + wasm_func_type(const wasm_func_t *func) + { +@@ -4998,11 +5008,11 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, + goto failed; + } + ++ WASMModuleInstance *wasm_module_inst = NULL; + /* create the c-api func import list */ + #if WASM_ENABLE_INTERP != 0 + if (instance->inst_comm_rt->module_type == Wasm_Module_Bytecode) { +- WASMModuleInstance *wasm_module_inst = +- (WASMModuleInstance *)instance->inst_comm_rt; ++ wasm_module_inst = (WASMModuleInstance *)instance->inst_comm_rt; + p_func_imports = &(wasm_module_inst->c_api_func_imports); + import_func_count = MODULE_INTERP(module)->import_function_count; + } +@@ -5052,6 +5062,13 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, + } + bh_assert(func_import->func_ptr_linked); + ++ // fill gas ++ if(wasm_module_inst) { ++ WASMFunctionInstance *fi = wasm_module_inst->e->functions + func_host->func_idx_rt; ++ if(fi) fi->gas = func_host->gas; ++ } ++ ++ + func_import++; + } + +@@ -5389,3 +5406,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, return -1.0; #endif } + -+wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*instance) ++wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t *instance) +{ + return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); +} +diff --git a/core/iwasm/common/wasm_c_api_internal.h b/core/iwasm/common/wasm_c_api_internal.h +index 49a17a96..19a85980 100644 +--- a/core/iwasm/common/wasm_c_api_internal.h ++++ b/core/iwasm/common/wasm_c_api_internal.h +@@ -142,6 +142,10 @@ struct wasm_func_t { + void (*finalizer)(void *); + } cb_env; + } u; ++ ++ // gas cost for import func ++ uint32 gas; ++ + /* + * an index in both functions runtime instance lists + * of interpreter mode and aot mode diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c -index e33fd9f3..d1ff9c41 100644 +index 47752950..d5821c4f 100644 --- a/core/iwasm/common/wasm_exec_env.c +++ b/core/iwasm/common/wasm_exec_env.c -@@ -85,6 +85,12 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, - wasm_runtime_dump_exec_env_mem_consumption(exec_env); +@@ -86,7 +86,9 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, #endif -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ exec_env->instructions_to_execute = -1; + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- exec_env->instructions_to_execute = -1; ++ exec_env->instructions_to_execute = INT64_MAX; + for(int i = 0; i < 256; ++i) + exec_env->instructions_schedule[i] = 1; -+#endif -+ - return exec_env; + #endif - #ifdef OS_ENABLE_HW_BOUND_CHECK + return exec_env; diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h -index ce0c1fa7..2713a092 100644 +index 5d80312f..2713a092 100644 --- a/core/iwasm/common/wasm_exec_env.h +++ b/core/iwasm/common/wasm_exec_env.h -@@ -87,6 +87,12 @@ typedef struct WASMExecEnv { - uint8 *bottom; - } wasm_stack; +@@ -89,7 +89,8 @@ typedef struct WASMExecEnv { -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ /* instructions to execute */ + #if WASM_ENABLE_INSTRUCTION_METERING != 0 + /* instructions to execute */ +- int instructions_to_execute; + int64 instructions_to_execute; + int64 instructions_schedule[256]; -+#endif -+ + #endif + #if WASM_ENABLE_FAST_JIT != 0 - /** - * Cache for diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index d33c0272..21bfdf29 100644 +index dcee0aea..2559be21 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() - } - #endif - -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ -+void -+wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +@@ -2288,10 +2288,26 @@ wasm_runtime_access_exce_check_guard_page() + #if WASM_ENABLE_INSTRUCTION_METERING != 0 + void + wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +- int instructions_to_execute) + int64 instructions_to_execute) -+{ -+ exec_env->instructions_to_execute = instructions_to_execute; -+} + { ++ if(instructions_to_execute == -1) ++ instructions_to_execute = INT64_MAX; + exec_env->instructions_to_execute = instructions_to_execute; + } + +int64 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) @@ -116,13 +146,10 @@ index d33c0272..21bfdf29 100644 + for(int i = 0; i < 256; ++i) + exec_env->instructions_schedule[i] = instructions_schedule[i]; +} -+ -+#endif -+ + #endif + WASMFuncType * - wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, - uint32 module_type) -@@ -7792,13 +7817,14 @@ wasm_runtime_get_module_name(wasm_module_t module) +@@ -7805,13 +7821,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) { @@ -138,7 +165,7 @@ index d33c0272..21bfdf29 100644 uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; -@@ -7808,6 +7834,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7821,6 +7838,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; } @@ -146,7 +173,7 @@ index d33c0272..21bfdf29 100644 return true; } -@@ -7830,7 +7857,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, +@@ -7843,7 +7861,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; if ((uint8 *)&boundary < boundary) { wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), @@ -156,19 +183,14 @@ index d33c0272..21bfdf29 100644 } return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 8ac032bf..5ca5d489 100644 +index 64a6cd79..f4c55e2f 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h -@@ -791,9 +791,25 @@ WASM_RUNTIME_API_EXTERN void - wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, - uint8 *native_stack_boundary); - --#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ +@@ -795,7 +795,14 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, + wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +- int instructions_to_execute); + int64 instructions_to_execute); +WASM_RUNTIME_API_EXTERN int64 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); @@ -177,17 +199,11 @@ index 8ac032bf..5ca5d489 100644 +wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, + int64 const *instructions_schedule); + -+#endif -+ -+#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -+/* See wasm_export.h for description */ -+WASM_RUNTIME_API_EXTERN -+void - wasm_runtime_set_bounds_checks(WASMModuleInstanceCommon *module_inst, - bool enable); + #endif + #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h -index 241a0eec..9eb0dde1 100644 +index 241a0eec..1141744c 100644 --- a/core/iwasm/include/wasm_c_api.h +++ b/core/iwasm/include/wasm_c_api.h @@ -19,8 +19,10 @@ @@ -202,7 +218,16 @@ index 241a0eec..9eb0dde1 100644 #endif #else #define WASM_API_EXTERN -@@ -701,6 +703,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); +@@ -592,6 +594,8 @@ WASM_API_EXTERN size_t wasm_func_result_arity(const wasm_func_t*); + WASM_API_EXTERN own wasm_trap_t* wasm_func_call( + const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results); + ++WASM_API_EXTERN own uint32_t wasm_func_set_gas(wasm_func_t*, uint32_t); ++ + + // Global Instances + +@@ -701,6 +705,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); // func_name. If the function is not found, return 0. WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); @@ -215,7 +240,7 @@ index 241a0eec..9eb0dde1 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b73a0364..3fd0949f 100644 +index b4ab34be..3fd0949f 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -20,8 +20,10 @@ @@ -230,22 +255,11 @@ index b73a0364..3fd0949f 100644 #endif #elif defined(__GNUC__) || defined(__clang__) #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) -@@ -1821,6 +1823,27 @@ WASM_RUNTIME_API_EXTERN void - wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, - uint8_t *native_stack_boundary); - -+/** -+ * Set the instruction count limit to the execution environment. -+ * By default the instruction count limit is -1, which means no limit. -+ * However, if the instruction count limit is set to a positive value, -+ * the execution will be terminated when the instruction count reaches -+ * the limit. -+ * -+ * @param exec_env the execution environment -+ * @param instruction_count the instruction count limit -+ */ -+WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, +@@ -1833,7 +1835,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, + */ + WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, +- int instruction_count); + int64_t instruction_count); + +WASM_RUNTIME_API_EXTERN int64_t @@ -254,132 +268,122 @@ index b73a0364..3fd0949f 100644 +WASM_RUNTIME_API_EXTERN void +wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, + int64_t const *instructions_schedule); -+ + /** * Dump runtime memory consumption, including: - * Exec env memory consumption diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 41ac4c72..bd8f714a 100644 +index 1e98b0fa..ae24ff8b 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c -@@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, - } \ - os_mutex_unlock(&exec_env->wait_lock); \ - } \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *handle_table[*frame_ip++]; \ - } while (0) - #else --#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() -+#define HANDLE_OP_END() \ -+ CHECK_INSTRUCTION_LIMIT(); \ -+ FETCH_OPCODE_AND_DISPATCH() - #endif +@@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + } - #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1542,9 +1545,12 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, - } \ - os_mutex_unlock(&exec_env->wait_lock); \ - } \ -+ CHECK_INSTRUCTION_LIMIT(); \ - continue; + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +-#define CHECK_INSTRUCTION_LIMIT() \ +- if (instructions_left == 0) { \ +- wasm_set_exception(module, "instruction limit exceeded"); \ +- goto got_exception; \ +- } \ +- else if (instructions_left > 0) \ +- instructions_left--; ++#define CHECK_INSTRUCTION_LIMIT() \ ++ do { \ ++ instructions_left -= instructions_schedule[opcode]; \ ++ if (instructions_left < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } while (0) #else --#define HANDLE_OP_END() continue -+#define HANDLE_OP_END() \ -+ CHECK_INSTRUCTION_LIMIT(); \ -+ continue; - #endif - - #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1562,6 +1568,20 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif - } - -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) \ -+ { \ -+ instructions_to_execute -= instructions_schedule[opcode];\ -+ if (instructions_to_execute < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ } -+#else -+#define CHECK_INSTRUCTION_LIMIT() (void)0 -+#endif -+ - static void - wasm_interp_call_func_bytecode(WASMModuleInstance *module, - WASMExecEnv *exec_env, -@@ -1605,6 +1625,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - uint32 local_idx, local_offset, global_idx; - uint8 local_type, *global_addr; +@@ -1625,9 +1626,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 cache_index, type_index, param_cell_num, cell_num; -+ -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ int64 instructions_to_execute = -1; + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- int instructions_left = -1; ++ int64 instructions_left = INT64_MAX; + int64 const *instructions_schedule = NULL; -+ if(exec_env) -+ { -+ instructions_to_execute = exec_env->instructions_to_execute; + if (exec_env) { + instructions_left = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; -+ } -+#endif -+ - #if WASM_ENABLE_EXCE_HANDLING != 0 - int32_t exception_tag_index; + } #endif -@@ -6859,6 +6890,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + +@@ -6885,6 +6888,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if(exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif + if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6899,6 +6935,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6925,6 +6933,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); + +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if(exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif + return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index f33ad60e..9cbf2010 100644 +index 4e5edf41..04c39e1f 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -105,6 +105,19 @@ typedef float64 CellType_F64; - goto unaligned_atomic; \ +@@ -106,14 +106,14 @@ typedef float64 CellType_F64; } while (0) -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +-#define CHECK_INSTRUCTION_LIMIT() \ +- if (instructions_left == 0) { \ +- wasm_set_exception(module, "instruction limit exceeded"); \ +- goto got_exception; \ +- } \ +- else if (instructions_left > 0) \ +- instructions_left--; +- +#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) { \ -+ instructions_to_execute -= instructions_schedule[opcode]; \ -+ if (instructions_to_execute < 0) { \ ++ do { \ ++ instructions_left -= instructions_schedule[opcode]; \ ++ if (instructions_left < 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ + } \ -+ } -+#else -+#define CHECK_INSTRUCTION_LIMIT() (void)0 -+#endif -+ - static inline uint32 - rotl32(uint32 n, uint32 c) - { -@@ -1466,12 +1479,14 @@ wasm_interp_dump_op_count() ++ } while (0) + #else + #define CHECK_INSTRUCTION_LIMIT() (void)0 + #endif +@@ -1454,7 +1454,6 @@ wasm_interp_dump_op_count() + do { \ + const void *p_label_addr = *(void **)frame_ip; \ + frame_ip += sizeof(void *); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1466,7 +1465,6 @@ wasm_interp_dump_op_count() + /* int32 relative offset was emitted in 64-bit target */ \ + p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1477,17 +1475,18 @@ wasm_interp_dump_op_count() + /* uint32 label address was emitted in 32-bit target */ \ + p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ } while (0) #endif #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ @@ -396,46 +400,91 @@ index f33ad60e..9cbf2010 100644 #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1538,6 +1553,16 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - uint8 *maddr = NULL; - uint32 local_idx, local_offset, global_idx; - uint8 opcode = 0, local_type, *global_addr; +@@ -1508,6 +1507,25 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #endif + } + ++static int64 const def_instructions_schedule[256] = { ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ++}; + -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ int64 instructions_to_execute = -1; -+ int64 const *instructions_schedule = NULL; -+ if (exec_env) { -+ instructions_to_execute = exec_env->instructions_to_execute; + static void + wasm_interp_call_func_bytecode(WASMModuleInstance *module, + WASMExecEnv *exec_env, +@@ -1556,9 +1574,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint8 opcode = 0, local_type, *global_addr; + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- int instructions_left = -1; ++ int64 instructions_left = INT64_MAX; ++ int64 const *instructions_schedule = def_instructions_schedule; + if (exec_env) { + instructions_left = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; -+ } -+#endif -+ + } + #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ - || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 - #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -@@ -7761,6 +7786,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7694,6 +7714,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + { + wasm_interp_call_func_native(module, exec_env, cur_func, + prev_frame); ++ instructions_left -= cur_func->gas; + } + + #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 +@@ -7806,6 +7827,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if (exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif + if (!prev_frame->ip) /* Called from native. */ return; -@@ -7789,6 +7819,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7834,6 +7860,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if (exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h +index 8d38c883..a687ab89 100644 +--- a/core/iwasm/interpreter/wasm_runtime.h ++++ b/core/iwasm/interpreter/wasm_runtime.h +@@ -228,6 +228,10 @@ struct WASMFunctionInstance { + WASMFunctionImport *func_import; + WASMFunction *func; + } u; ++ ++ // gas cost for import func ++ uint32 gas; ++ + #if WASM_ENABLE_MULTI_MODULE != 0 + WASMModuleInstance *import_module_inst; + WASMFunctionInstance *import_func_inst; diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h index ac1a95ea..e23b500e 100644 --- a/core/shared/platform/include/platform_wasi_types.h @@ -451,20 +500,5 @@ index ac1a95ea..e23b500e 100644 + #define assert_wasi_layout(expr, message) static_assert(expr, message) + #endif #endif - - assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); -diff --git a/doc/build_wamr.md b/doc/build_wamr.md -index 6425450b..94dd9628 100644 ---- a/doc/build_wamr.md -+++ b/doc/build_wamr.md -@@ -327,6 +327,10 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared - - **WAMR_BUILD_SHRUNK_MEMORY**=1/0, default to enable if not set - > Note: When enabled, this feature will reduce memory usage by decreasing the size of the linear memory, particularly when the `memory.grow` opcode is not used and memory usage is somewhat predictable. - -+## **Instruction metering** -+- **WAMR_BUILD_INSTRUCTION_METERING**=1/0, default to disable if not set -+> Note: Enabling this feature allows limiting the number of instructions a wasm module instance can execute. Use the `wasm_runtime_set_instruction_count_limit(...)` API before calling `wasm_runtime_call_*(...)` APIs to enforce this limit. -+ - ## **Combination of configurations:** - We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: + assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 3156a98a864..c5bd2278df7 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #ifdef _DEBUG // #define DEBUG_OUTPUT 1 @@ -71,97 +71,6 @@ getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) return nullptr; } -struct TestHostFunctionsOld : public HostFunctions -{ - test::jtx::Env* env_; - Bytes accountID_; - Bytes data_; - int clock_drift_ = 0; - test::StreamSink sink_; - beast::Journal jlog_; - void const* rt_ = nullptr; - -public: - explicit TestHostFunctionsOld(test::jtx::Env* env, int cd = 0) - : env_(env) - , clock_drift_(cd) - , sink_(beast::severities::kDebug) - , jlog_(sink_) - { - std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID_ = Bytes{s.begin(), s.end()}; - std::string t = "10000"; - data_ = Bytes{t.begin(), t.end()}; - } - - virtual void - setRT(void const* rt) override - { - rt_ = rt; - } - - virtual void const* - getRT() const override - { - return rt_; - } - - test::StreamSink& - getSink() - { - return sink_; - } - - beast::Journal - getJournal() override - { - return jlog_; - } - - int32_t - getLedgerSqn() override - { - return (int32_t)env_->current()->seq(); - } - - int32_t - getParentLedgerTime() override - { - return env_->current()->parentCloseTime().time_since_epoch().count() + - clock_drift_; - } - - Expected - getTxField(SField const& fname) override - { - return accountID_; - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - return data_; - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - if (fname.getName() == "Destination" || fname.getName() == "Account") - return accountID_; - else if (fname.getName() == "Data") - return data_; - else if (fname.getName() == "FinishAfter") - { - auto t = - env_->current()->parentCloseTime().time_since_epoch().count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } - - return Unexpected(-1); - } -}; - struct TestHostFunctions : public HostFunctions { test::jtx::Env& env_; @@ -171,7 +80,7 @@ struct TestHostFunctions : public HostFunctions void const* rt_ = nullptr; public: - explicit TestHostFunctions(test::jtx::Env& env, int cd = 0) + TestHostFunctions(test::jtx::Env& env, int cd = 0) : env_(env), clock_drift_(cd) { auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); @@ -212,6 +121,12 @@ struct TestHostFunctions : public HostFunctions clock_drift_; } + Hash + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + virtual int32_t cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override { @@ -239,13 +154,22 @@ struct TestHostFunctions : public HostFunctions } Expected - getTxNestedField(Slice const& locator) override + getCurrentLedgerObjField(SField const& fname) override { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(-1); } Expected @@ -262,22 +186,33 @@ struct TestHostFunctions : public HostFunctions } Expected - getCurrentLedgerObjField(SField const& fname) override + getTxNestedField(Slice const& locator) override { - auto const& sn = fname.getName(); - if (sn == "Destination" || sn == "Account") - return Bytes(accountID_.begin(), accountID_.end()); - else if (sn == "Data") - return data_; - else if (sn == "FinishAfter") - { - auto t = - env_.current()->parentCloseTime().time_since_epoch().count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } - return Unexpected(-1); + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); } int32_t @@ -286,18 +221,48 @@ struct TestHostFunctions : public HostFunctions return 32; } + int32_t + getCurrentLedgerObjArrayLen(SField const& fname) override + { + return 32; + } + + int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + return 32; + } + int32_t getTxNestedArrayLen(Slice const& locator) override { return 32; } + int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + return 32; + } + + int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + return 32; + } + int32_t updateData(Bytes const& data) override { return 0; } + Hash + computeSha512HalfHash(Bytes const& data) override + { + return env_.current()->info().parentHash; + } + Expected accountKeylet(AccountID const& account) override { @@ -307,6 +272,49 @@ struct TestHostFunctions : public HostFunctions return Bytes{keylet.key.begin(), keylet.key.end()}; } + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) override + { + if (!subject || !issuer || credentialType.empty()) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = + keylet::credential(subject, issuer, makeSlice(credentialType)); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + return Unexpected(HF_ERR_INVALID_PARAMS); + } + + std::string s = "https://ripple.com"; + return Bytes(s.begin(), s.end()); + } + int32_t trace(std::string const& msg, Bytes const& data, bool asHex) override { @@ -350,6 +358,33 @@ struct TestHostFunctions : public HostFunctions } }; +struct TestHostFunctionsSink : public TestHostFunctions +{ + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) + : TestHostFunctions(env, cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } +}; + struct Wasm_test : public beast::unit_test::suite { void @@ -361,9 +396,9 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = engine.run(wasm, "fib", wasmParams(10)); + auto const re = engine.run(wasm, "fib", wasmParams(10)); - BEAST_EXPECT(r.has_value() && (r->result == 55)); + BEAST_EXPECT(re.has_value() && (re->result == 55) && (re->cost == 755)); } void @@ -375,10 +410,11 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = + auto const re = engine.run(wasm, "sha512_process", wasmParams(sha512PureHex)); - BEAST_EXPECT(r.has_value() && (r->result == 34432)); + BEAST_EXPECT( + re.has_value() && (re->result == 34432) && (re->cost == 157'452)); } void @@ -396,9 +432,9 @@ struct Wasm_test : public beast::unit_test::suite static_cast(512), static_cast(b58Hex.size())); auto const s = std::string_view(b58Hex.c_str(), minsz); - auto const r = engine.run(wasm, "b58enco", wasmParams(outb, s)); + auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); - BEAST_EXPECT(r.has_value() && r->result); + BEAST_EXPECT(re.has_value() && re->result && (re->cost == 3'066'129)); } void @@ -409,9 +445,10 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = engine.run(wasm, "sp1_groth16_verifier"); + auto const re = engine.run(wasm, "sp1_groth16_verifier"); - BEAST_EXPECT(r.has_value() && r->result); + BEAST_EXPECT( + re.has_value() && re->result && (re->cost == 4'191'711'969ll)); } void @@ -422,9 +459,9 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = engine.run(wasm, "bellman_groth16_test"); + auto const re = engine.run(wasm, "bellman_groth16_test"); - BEAST_EXPECT(r.has_value() && r->result); + BEAST_EXPECT(re.has_value() && re->result && (re->cost == 332'205'984)); } void @@ -442,24 +479,29 @@ struct Wasm_test : public beast::unit_test::suite std::string const funcName("finish"); std::vector imports; - WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider); + WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider, 33); auto& engine = WasmEngine::instance(); - auto r = engine.run( + auto re = engine.run( wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); - if (BEAST_EXPECT(r.has_value())) - BEAST_EXPECT(!r->result); + + // code takes 4 gas + 1 getLedgerSqn call + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re->result && (re->cost == 37)); + env.close(); env.close(); env.close(); env.close(); - // empty module - run the same module - r = engine.run( + // empty module - run the same instance + re = engine.run( {}, funcName, {}, imports, nullptr, 1'000'000, env.journal); - if (BEAST_EXPECT(r.has_value())) - BEAST_EXPECT(r->result); + + // code takes 8 gas + 2 getLedgerSqn calls + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re->result && (re->cost == 74)); } void @@ -479,7 +521,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm( wasm, funcName, wasmParams(data), nullptr, -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result); + BEAST_EXPECT(re.value().result && (re->cost == 838)); } { std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; @@ -487,7 +529,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm( wasm, funcName, wasmParams(data), nullptr, -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result); + BEAST_EXPECT(!re.value().result && (re->cost == 822)); } } @@ -513,7 +555,7 @@ struct Wasm_test : public beast::unit_test::suite -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result); + BEAST_EXPECT(re.value().result && (re->cost == 42'212)); std::vector const lo_data2(lo_js2.begin(), lo_js2.end()); re = runEscrowWasm( @@ -524,7 +566,7 @@ struct Wasm_test : public beast::unit_test::suite -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result); + BEAST_EXPECT(!re.value().result && (re->cost == 41'496)); } void @@ -566,11 +608,11 @@ struct Wasm_test : public beast::unit_test::suite WasmImpFunc( imports, "func-add", reinterpret_cast(&Add)); - auto res = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); + auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); // if (res) printf("invokeAdd get the result: %d\n", res.value()); - BEAST_EXPECT(res.has_value() && res->result == 6912); + BEAST_EXPECT(re.has_value() && re->result == 6912 && (re->cost == 2)); } void @@ -587,7 +629,7 @@ struct Wasm_test : public beast::unit_test::suite std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); - BEAST_EXPECT(re.error()); + BEAST_EXPECT(!re && re.error()); } void @@ -616,10 +658,10 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions nfs(env, 0); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re.value().result); + BEAST_EXPECT(!re->result && (re->cost == 487)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -636,7 +678,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re.value().result); + BEAST_EXPECT(!re->result && (re->cost == 487)); // std::cout << "bad case (current time < escrow_finish_after " // "time) result " // << re.value().result << " cost: " << @@ -654,13 +696,13 @@ struct Wasm_test : public beast::unit_test::suite Expected getTxField(SField const& fname) override { - return Unexpected(-1); + return Unexpected(HF_ERR_FIELD_NOT_FOUND); } }; BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.error()); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; } @@ -680,7 +722,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(!re); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; } @@ -690,10 +732,10 @@ struct Wasm_test : public beast::unit_test::suite auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctionsOld nfs(&env); + TestHostFunctionsSink nfs(env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1000'000'000); - BEAST_EXPECT(re.error()); + BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -712,13 +754,32 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT( countSubstr( - sink.messages().str(), "WAMR error: failed to call func") == + sink.messages().str(), "WAMR Error: failed to call func") == 1); BEAST_EXPECT( countSubstr( sink.messages().str(), "WAMR Exception: wasm operand stack overflow") == 1); } + + { + auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestLedgerDataProvider ledgerDataProvider(&env); + + std::vector imports; + WASM_IMPORT_FUNC2( + imports, getLedgerSqn, "get_ledger_sqn2", &ledgerDataProvider); + + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + + // expected import not provided + BEAST_EXPECT(!re); + } } void @@ -741,7 +802,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result); + BEAST_EXPECT(re->result && (re->cost == 80)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -763,7 +824,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result); + BEAST_EXPECT(re->result && (re->cost == 138)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -787,10 +848,10 @@ struct Wasm_test : public beast::unit_test::suite // runing too long // testWasmSP1Verifier(); - // testWasmBG16Verifier(); + testWasmBG16Verifier(); - // TODO: needs fix for new host functions interface - // testEscrowWasmDN1(); + // TODO: fix result + testEscrowWasmDN1(); testEscrowWasmDN2(); } }; diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 8f7c9b1c361..b44c4bac2ec 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -529,6 +529,15 @@ ModuleWrapper::buildImports( reinterpret_cast(imp.wrap), imp.udata, nullptr); + if (!func) + throw std::runtime_error( + "can't create import function " + + imp.name); // LCOV_EXCL_LINE + + if (imp.gas && !wasm_func_set_gas(func, imp.gas)) + throw std::runtime_error( + "can't set gas for import function " + + imp.name); // LCOV_EXCL_LINE wimports.data[i] = wasm_func_as_extern(func); ++impCnt; @@ -862,6 +871,10 @@ WamrEngine::runHlp( // auto j = j_.debug(); // #endif + // currently only 1 module support, possible parallel UT run + static std::mutex m; + std::lock_guard lg(m); + // Create and instantiate the module. if (!wasmCode.empty()) { @@ -894,7 +907,8 @@ WamrEngine::runHlp( } assert(res.r.data[0].kind == WASM_I32); - + if (gas == -1) + gas = std::numeric_limits::max(); WasmResult const ret{res.r.data[0].of.i32, gas - module->getGas()}; // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 635673fb9b7..57c65504e16 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,8 +20,8 @@ #include -#include -#include +#include +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/misc/WasmParamsHelper.h index af2db08ebc1..224d7431d30 100644 --- a/src/xrpld/app/misc/WasmParamsHelper.h +++ b/src/xrpld/app/misc/WasmParamsHelper.h @@ -62,6 +62,7 @@ struct WasmImportFunc void* udata = nullptr; // wasm_func_callback_with_env_t void* wrap = nullptr; + uint32_t gas = 0; }; #define WASM_IMPORT_FUNC(v, f, ...) \ @@ -139,12 +140,14 @@ WasmImpFunc( std::vector& v, std::string_view imp_name, void* f_wrap, - void* data = nullptr) + void* data = nullptr, + uint32_t gas = 0) { WasmImportFunc e; e.name = imp_name; e.udata = data; e.wrap = f_wrap; + e.gas = gas; WasmImpFuncHelper(e); v.push_back(std::move(e)); } From add55c4f33afd2c7afe85216af0e4a87e9abe5d6 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 25 Jun 2025 10:04:04 -0400 Subject: [PATCH 24/73] Host functions gas cost for wasm_runtime interface (#5500) --- external/wamr/patches/ripp_metering.patch | 222 +++++++++++++++++++++- 1 file changed, 221 insertions(+), 1 deletion(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index e9ca69338f6..5a41b125b7d 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -11,6 +11,19 @@ index 88a1642b..aeb29912 100644 option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) +diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c +index b2c9ed62..87947a18 100644 +--- a/core/iwasm/aot/aot_runtime.c ++++ b/core/iwasm/aot/aot_runtime.c +@@ -5484,7 +5484,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) + import_func->func_ptr_linked = wasm_native_resolve_symbol( + import_func->module_name, import_func->func_name, + import_func->func_type, &import_func->signature, +- &import_func->attachment, &import_func->call_conv_raw); ++ &import_func->attachment, NULL, &import_func->call_conv_raw); + #if WASM_ENABLE_MULTI_MODULE != 0 + if (!import_func->func_ptr_linked) { + if (!wasm_runtime_is_built_in_module(import_func->module_name)) { diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c index 269ec577..34eb7c34 100644 --- a/core/iwasm/common/wasm_c_api.c @@ -117,8 +130,91 @@ index 5d80312f..2713a092 100644 #endif #if WASM_ENABLE_FAST_JIT != 0 +diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c +index 060bb2c3..9221c36a 100644 +--- a/core/iwasm/common/wasm_native.c ++++ b/core/iwasm/common/wasm_native.c +@@ -180,9 +180,9 @@ native_symbol_cmp(const void *native_symbol1, const void *native_symbol2) + ((const NativeSymbol *)native_symbol2)->symbol); + } + +-static void * ++static NativeSymbol * + lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, +- const char *symbol, const char **p_signature, void **p_attachment) ++ const char *symbol) + { + NativeSymbol *native_symbol, key = { 0 }; + +@@ -190,9 +190,7 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, + + if ((native_symbol = bsearch(&key, native_symbols, n_native_symbols, + sizeof(NativeSymbol), native_symbol_cmp))) { +- *p_signature = native_symbol->signature; +- *p_attachment = native_symbol->attachment; +- return native_symbol->func_ptr; ++ return native_symbol; + } + + return NULL; +@@ -205,25 +203,36 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, + void * + wasm_native_resolve_symbol(const char *module_name, const char *field_name, + const WASMFuncType *func_type, +- const char **p_signature, void **p_attachment, ++ const char **p_signature, void **p_attachment, uint32_t *gas, + bool *p_call_conv_raw) + { + NativeSymbolsNode *node, *node_next; + const char *signature = NULL; + void *func_ptr = NULL, *attachment = NULL; ++ NativeSymbol *native_symbol = NULL; + + node = g_native_symbols_list; + while (node) { + node_next = node->next; + if (!strcmp(node->module_name, module_name)) { +- if ((func_ptr = ++ if ((native_symbol = + lookup_symbol(node->native_symbols, node->n_native_symbols, +- field_name, &signature, &attachment)) ++ field_name)) + || (field_name[0] == '_' +- && (func_ptr = lookup_symbol( ++ && (native_symbol = lookup_symbol( + node->native_symbols, node->n_native_symbols, +- field_name + 1, &signature, &attachment)))) +- break; ++ field_name + 1)))) ++ { ++ func_ptr = native_symbol->func_ptr; ++ if(func_ptr) ++ { ++ if(gas) ++ *gas = native_symbol->gas; ++ signature = native_symbol->signature; ++ attachment = native_symbol->attachment; ++ break; ++ } ++ } + } + node = node_next; + } +diff --git a/core/iwasm/common/wasm_native.h b/core/iwasm/common/wasm_native.h +index 9a6afee1..0fe4739f 100644 +--- a/core/iwasm/common/wasm_native.h ++++ b/core/iwasm/common/wasm_native.h +@@ -52,7 +52,7 @@ wasm_native_lookup_libc_builtin_global(const char *module_name, + void * + wasm_native_resolve_symbol(const char *module_name, const char *field_name, + const WASMFuncType *func_type, +- const char **p_signature, void **p_attachment, ++ const char **p_signature, void **p_attachment, uint32_t *gas, + bool *p_call_conv_raw); + + bool diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index dcee0aea..2559be21 100644 +index dcee0aea..10c516d6 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -2288,10 +2288,26 @@ wasm_runtime_access_exce_check_guard_page() @@ -149,6 +245,15 @@ index dcee0aea..2559be21 100644 #endif WASMFuncType * +@@ -7348,7 +7364,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, + const char *func_name) + { + return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, +- NULL); ++ NULL, NULL); + } + + bool @@ -7805,13 +7821,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) @@ -202,6 +307,19 @@ index 64a6cd79..f4c55e2f 100644 #endif #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 +diff --git a/core/iwasm/include/lib_export.h b/core/iwasm/include/lib_export.h +index 0ca668f5..93bcf807 100644 +--- a/core/iwasm/include/lib_export.h ++++ b/core/iwasm/include/lib_export.h +@@ -24,6 +24,8 @@ typedef struct NativeSymbol { + /* attachment which can be retrieved in native API by + calling wasm_runtime_get_function_attachment(exec_env) */ + void *attachment; ++ // gas cost for import func ++ uint32_t gas; + } NativeSymbol; + + /* clang-format off */ diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h index 241a0eec..1141744c 100644 --- a/core/iwasm/include/wasm_c_api.h @@ -271,6 +389,20 @@ index b4ab34be..3fd0949f 100644 /** * Dump runtime memory consumption, including: +diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h +index ddc0b15b..3a707878 100644 +--- a/core/iwasm/interpreter/wasm.h ++++ b/core/iwasm/interpreter/wasm.h +@@ -579,6 +579,9 @@ typedef struct WASMFunctionImport { + WASMModule *import_module; + WASMFunction *import_func_linked; + #endif ++ // gas cost for import func ++ uint32 gas; ++ + } WASMFunctionImport; + + #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index 1e98b0fa..ae24ff8b 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c @@ -470,6 +602,56 @@ index 4e5edf41..04c39e1f 100644 return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c +index e66c08ba..d52e677e 100644 +--- a/core/iwasm/interpreter/wasm_mini_loader.c ++++ b/core/iwasm/interpreter/wasm_mini_loader.c +@@ -636,6 +636,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + const char *linked_signature = NULL; + void *linked_attachment = NULL; + bool linked_call_conv_raw = false; ++ uint32_t gas = 0; + + read_leb_uint32(p, p_end, declare_type_index); + *p_buf = p; +@@ -647,7 +648,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + /* check built-in modules */ + linked_func = wasm_native_resolve_symbol( + sub_module_name, function_name, declare_func_type, &linked_signature, +- &linked_attachment, &linked_call_conv_raw); ++ &linked_attachment, &gas, &linked_call_conv_raw); + + function->module_name = (char *)sub_module_name; + function->field_name = (char *)function_name; +@@ -656,6 +657,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + function->signature = linked_signature; + function->attachment = linked_attachment; + function->call_conv_raw = linked_call_conv_raw; ++ function->gas = gas; + return true; + } + +diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c +index 3cc2afe0..55859d35 100644 +--- a/core/iwasm/interpreter/wasm_runtime.c ++++ b/core/iwasm/interpreter/wasm_runtime.c +@@ -168,7 +168,7 @@ wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) + #endif + function->func_ptr_linked = wasm_native_resolve_symbol( + function->module_name, function->field_name, function->func_type, +- &function->signature, &function->attachment, &function->call_conv_raw); ++ &function->signature, &function->attachment, &function->gas, &function->call_conv_raw); + + if (function->func_ptr_linked) { + return true; +@@ -820,6 +820,7 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst, + function->param_count = + (uint16)function->u.func_import->func_type->param_count; + function->param_types = function->u.func_import->func_type->types; ++ function->gas = import->u.function.gas; + function->local_cell_num = 0; + function->local_count = 0; + function->local_types = NULL; diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h index 8d38c883..a687ab89 100644 --- a/core/iwasm/interpreter/wasm_runtime.h @@ -485,6 +667,44 @@ index 8d38c883..a687ab89 100644 #if WASM_ENABLE_MULTI_MODULE != 0 WASMModuleInstance *import_module_inst; WASMFunctionInstance *import_func_inst; +diff --git a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c +index a68c0749..cafb6915 100644 +--- a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c ++++ b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c +@@ -1038,16 +1038,16 @@ print_f64_wrapper(wasm_exec_env_t exec_env, double f64) + + /* clang-format off */ + #define REG_NATIVE_FUNC(func_name, signature) \ +- { #func_name, func_name##_wrapper, signature, NULL } ++ { #func_name, func_name##_wrapper, signature, NULL, 0 } + /* clang-format on */ + + static NativeSymbol native_symbols_libc_builtin[] = { + REG_NATIVE_FUNC(printf, "($*)i"), + REG_NATIVE_FUNC(sprintf, "($$*)i"), + REG_NATIVE_FUNC(snprintf, "(*~$*)i"), +- { "vprintf", printf_wrapper, "($*)i", NULL }, +- { "vsprintf", sprintf_wrapper, "($$*)i", NULL }, +- { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL }, ++ { "vprintf", printf_wrapper, "($*)i", NULL, 0 }, ++ { "vsprintf", sprintf_wrapper, "($$*)i", NULL, 0 }, ++ { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL, 0 }, + REG_NATIVE_FUNC(puts, "($)i"), + REG_NATIVE_FUNC(putchar, "(i)i"), + REG_NATIVE_FUNC(memcmp, "(**~)i"), +diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +index 6d057a6a..25879f33 100644 +--- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c ++++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +@@ -2257,7 +2257,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) + + /* clang-format off */ + #define REG_NATIVE_FUNC(func_name, signature) \ +- { #func_name, wasi_##func_name, signature, NULL } ++ { #func_name, wasi_##func_name, signature, NULL, 0 } + /* clang-format on */ + + static NativeSymbol native_symbols_libc_wasi[] = { diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h index ac1a95ea..e23b500e 100644 --- a/core/shared/platform/include/platform_wasi_types.h From 1cd16fab8779c26b304418a3f7f1e9ed6c99bc76 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:59:28 -0400 Subject: [PATCH 25/73] Host-functions perf test fixes (#5514) --- src/test/app/Escrow_test.cpp | 1 - src/test/app/Wasm_test.cpp | 666 +++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 47 ++ src/test/app/wasm_fixtures/fixtures.h | 4 + src/xrpld/app/misc/WamrVM.cpp | 26 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 98 +-- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 11 +- 7 files changed, 813 insertions(+), 40 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index d052415f9f4..197fab8aaad 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -30,7 +30,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c5bd2278df7..19b7946f5bf 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -22,6 +22,8 @@ #include #include +#include +#include #include @@ -385,6 +387,571 @@ struct TestHostFunctionsSink : public TestHostFunctions } }; +struct PerfHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + + Keylet leKey; + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + std::shared_ptr tx_; + + void const* rt_ = nullptr; + +public: + PerfHostFunctions( + test::jtx::Env& env, + Keylet const& k, + std::shared_ptr&& tx) + : env_(env), leKey(k), tx_(std::move(tx)) + { + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + int32_t + getLedgerSqn() override + { + return static_cast(env_.current()->seq()); + } + + int32_t + getParentLedgerTime() override + { + return env_.current()->parentCloseTime().time_since_epoch().count(); + } + + Hash + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + + virtual int32_t + cacheLedgerObj(Keylet const&, int32_t cacheIdx) override + { + static int32_t intIdx = 0; + + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cacheIdx) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + if (cacheIdx >= MAX_CACHE) + cacheIdx = intIdx++ % MAX_CACHE; + } + else + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return HF_ERR_SLOTS_FULL; + + cache[cacheIdx] = env_.le(leKey); + return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; + } + + static Bytes + getAnyFieldData(STBase const& obj) + { + // auto const& fname = obj.getFName(); + auto const stype = obj.getSType(); + switch (stype) + { + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); + } + + Expected + getTxField(SField const& fname) override + { + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + static Expected + locateField(STObject const& obj, Slice const& loc) + { + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + { + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } + + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + field = &(arr->operator[](c)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + } + + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } + + return field; + } + + Expected + getTxNestedField(Slice const& locator) override + { + // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << + // std::endl; + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + int32_t + getTxArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const* field = tx_->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getCurrentLedgerObjArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const sle = env_.le(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + + auto const* field = sle->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getTxNestedArrayLen(Slice const& locator) override + { + auto const r = locateField(*tx_, locator); + if (!r) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + auto const r = locateField(*sle, locator); + if (!r) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return r.error(); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + updateData(Bytes const& data) override + { + ripple::detail::ApplyViewBase v( + env_.app().openLedger().current().get(), tapNONE); + + auto sle = v.peek(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + + sle->setFieldVL(sfData, data); + v.update(sle); + + return data.size(); + } + + Hash + computeSha512HalfHash(Bytes const& data) override + { + auto const hash = sha512Half(data); + return hash; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) override + { + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HF_ERR_INVALID_PARAMS); + + auto const keylet = + keylet::credential(subject, issuer, makeSlice(credentialType)); + + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + return Unexpected(HF_ERR_INVALID_PARAMS); + } + + auto obj = nft::findToken(*env_.current(), account, nftId); + if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + } + + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); + return Bytes(s.begin(), s.end()); + } + + int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().error(); +#endif + if (!asHex) + j << msg + << std::string_view( + reinterpret_cast(data.data()), data.size()); + else + { + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << msg << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + int32_t + traceNum(std::string const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().error(); +#endif + j << msg << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } +}; + struct Wasm_test : public beast::unit_test::suite { void @@ -831,6 +1398,103 @@ struct Wasm_test : public beast::unit_test::suite } } + void + perfTest() + { + testcase("Perf test host functions"); + + using namespace jtx; + using namespace std::chrono; + + std::string const funcName("finish"); + // std::string const funcName("test"); + auto const& wasmHex = hfPerfTest; + // auto const& wasmHex = opcCallPerfTest; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + std::string const credType = "abcde"; + std::string const credType2 = "fghijk"; + std::string const credType3 = "0123456"; + // char const uri[] = "uri"; + + Account const alan{"alan"}; + Account const bob{"bob"}; + Account const issuer{"issuer"}; + + { + Env env(*this); + // Env env(*this, envconfig(), {}, nullptr, + // beast::severities::kTrace); + env.fund(XRP(5000), alan, bob, issuer); + env.close(); + + // // create escrow + // auto const seq = env.seq(alan); + // auto const k = keylet::escrow(alan, seq); + // // auto const allowance = 3'600; + // auto escrowCreate = escrow::create(alan, bob, XRP(1000)); + // XRPAmount txnFees = env.current()->fees().base + 1000; + // env(escrowCreate, + // escrow::finish_function(wasmHex), + // escrow::finish_time(env.now() + 11s), + // escrow::cancel_time(env.now() + 100s), + // escrow::data("1000000000"), // 1000 XRP in drops + // memodata("memo1234567"), + // memodata("2memo1234567"), + // fee(txnFees)); + + // // create depositPreauth + // auto const k = keylet::depositPreauth( + // bob, + // {{issuer.id(), makeSlice(credType)}, + // {issuer.id(), makeSlice(credType2)}, + // {issuer.id(), makeSlice(credType3)}}); + // env(deposit::authCredentials( + // bob, + // {{issuer, credType}, + // {issuer, credType2}, + // {issuer, credType3}})); + + // cREATE nft + [[maybe_unused]] uint256 const nft0{ + token::getNextID(env, alan, 0u)}; + env(token::mint(alan, 0u)); + auto const k = keylet::nftoffer(alan, 0); + [[maybe_unused]] uint256 const nft1{ + token::getNextID(env, alan, 0u)}; + + env(token::mint(alan, 0u), + token::uri( + "https://github.com/XRPLF/XRPL-Standards/discussions/" + "279?id=github.com/XRPLF/XRPL-Standards/discussions/" + "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" + "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" + "279&aot=github.com/XRPLF/XRPL-Standards/disc")); + [[maybe_unused]] uint256 const nft2{ + token::getNextID(env, alan, 0u)}; + env(token::mint(alan, 0u)); + env.close(); + + PerfHostFunctions nfs(env, k, env.tx()); + + auto re = runEscrowWasm(wasm, funcName, {}, &nfs); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + std::cout << "Res: " << re->result << " cost: " << re->cost + << std::endl; + } + + // env(escrow::finish(alan, alan, seq), + // escrow::comp_allowance(allowance), + // fee(txnFees), + // ter(tesSUCCESS)); + + env.close(); + } + } + void run() override { @@ -853,6 +1517,8 @@ struct Wasm_test : public beast::unit_test::suite // TODO: fix result testEscrowWasmDN1(); testEscrowWasmDN2(); + + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 10330f93bf7..146c4338a03 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11709,3 +11709,50 @@ extern std::string const reqNonexistentField = "2e31202834656231363132353020323032352d30332d31352900490f7461726765745f6665" "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" "65666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const hfPerfTest = + "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" + "6000017f021d0203656e760974726163655f6e756d000003656e76057472" + "616365000103030202030503010002068601167f0041a0090b7f0041a011" + "0b7f0041e0080b7f0041a0080b7f0041c0080b7f004180080b7f00418408" + "0b7f004188080b7f00418c080b7f004190080b7f004194080b7f00419808" + "0b7f004180090b7f004180080b7f0041e0110b7f0041e0110b7f0041e091" + "040b7f004180080b7f0041e091040b7f00418080080b7f0041000b7f0041" + "010b07c50219066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300020666696e6973680003036275660300076c6f635f6275660301" + "036d73670302086572725f686561640303096572725f646174613103040a" + "53465f4163636f756e7403050e53465f44657374696e6174696f6e030608" + "53465f4d656d6f7303070753465f4d656d6f03080b53465f4d656d6f4461" + "746103090753465f44617461030a1753465f417574686f72697a65437265" + "64656e7469616c73030b066163635f6964030c0c5f5f64736f5f68616e64" + "6c65030d0a5f5f646174615f656e64030e0b5f5f737461636b5f6c6f7703" + "0f0c5f5f737461636b5f6869676803100d5f5f676c6f62616c5f62617365" + "03110b5f5f686561705f6261736503120a5f5f686561705f656e6403130d" + "5f5f6d656d6f72795f6261736503140c5f5f7461626c655f626173650315" + "0aa2010202000b9c0102017f017e41807821000340200041a0116a420037" + "0300200041086a22000d000b41d811420037030041d011420037030041c8" + "11420037030041c011420037030041b811420037030041b0114200370300" + "41a811428d801c37030041a011429a803c3703000240034041e008411020" + "0110004118460440200142017c220142c0843d520d010c020b0b41a00841" + "1441c0084113410010011a0b41010b0b840104004180080b340100080003" + "00080009000f000a000e000d0007001b0007001a000f0000000000676574" + "5f6c65646765725f73716e206572726f720041c0080b13696e76616c6964" + "2072657475726e2073697a650041e0080b104e6577206163636f756e7420" + "69643a20004180090b14fc4f9afac9f1a8db807fda7dc9247bb557569d58" + "007f0970726f647563657273010c70726f6365737365642d62790105636c" + "616e675f31392e312e352d776173692d73646b202868747470733a2f2f67" + "69746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162" + "346235613264623538323935386166316565333038613739306366646234" + "32626432343732302900490f7461726765745f6665617475726573042b0f" + "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" + "6572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const opcCallPerfTest = + "0061736d010000000112046000017e60027f7f017f6000017f6000000304" + "0303020104050170010101050401008002061c047f0141b08880040b7f00" + "41ac080b7f0041b08880040b7f01410a0b073305066d656d6f7279020004" + "6d61696e0002047465737400010a5f5f646174615f656e6403010b5f5f68" + "6561705f6261736503020a4e030400010f0b3b04017f017c017f027e4180" + "84afdf0021004494b768e11b6c9b42210141d1e3c6012102024003401000" + "200041016b220041004a0d000b0b41010f0b0b01017f1001210220020f0b" + "0b0e01004180080b07623a2025660a00"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 308c2668bd7..d1c689a0162 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -56,3 +56,7 @@ extern std::string const xrplStdExampleHex; extern std::string const hostFunctions2Hex; extern std::string const reqNonexistentField; + +extern std::string const hfPerfTest; + +extern std::string const opcCallPerfTest; diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index b44c4bac2ec..cefee723f58 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -28,6 +28,8 @@ // #define DEBUG_OUTPUT_WAMR 1 #endif +// #define SHOW_CALL_TIME 1 + namespace ripple { namespace { @@ -738,6 +740,18 @@ WamrEngine::call(FuncInfo const& f, Types&&... args) return call(f, in, std::forward(args)...); } +#ifdef SHOW_CALL_TIME +static inline uint64_t +usecs() +{ + uint64_t x = + std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count(); + return x; +} +#endif + template WamrResult WamrEngine::call(FuncInfo const& f, std::vector& in) @@ -762,7 +776,19 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) in.size(), sizeof(std::remove_reference_t::value_type), nullptr}; + +#ifdef SHOW_CALL_TIME + auto const start = usecs(); +#endif + wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r); + +#ifdef SHOW_CALL_TIME + auto const finish = usecs(); + auto const delta_ms = (finish - start) / 1000; + std::cout << "wasm_func_call: " << delta_ms << "ms" << std::endl; +#endif + if (trap) { ret.f = true; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 6c19db6dc42..71236034afc 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -39,7 +39,7 @@ WasmHostFunctionsImpl::getLedgerSqn() int32_t WasmHostFunctionsImpl::getParentLedgerTime() { - return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try + return ctx.view().parentCloseTime().time_since_epoch().count(); } Hash @@ -70,7 +70,7 @@ WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; } -Bytes +static Bytes getAnyFieldData(STBase const& obj) { // auto const& fname = obj.getFName(); @@ -132,6 +132,9 @@ WasmHostFunctionsImpl::getTxField(SField const& fname) auto const* field = ctx.tx.peekAtPField(fname); if (!field) return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -145,6 +148,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) auto const* field = sle->peekAtPField(fname); if (!field) return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); return getAnyFieldData(*field); } @@ -162,14 +167,16 @@ WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) auto const* field = cache[cacheIdx]->peekAtPField(fname); if (!field) return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); return getAnyFieldData(*field); } static Expected -locateField(STObject const* obj, Slice const& loc) +locateField(STObject const& obj, Slice const& loc) { - if (loc.size() % 4) + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 return Unexpected(HF_ERR_LOCATOR_MALFORMED); int32_t const* l = reinterpret_cast(loc.data()); @@ -177,22 +184,23 @@ locateField(STObject const* obj, Slice const& loc) STBase const* field = nullptr; auto const& m = SField::getKnownCodeToField(); - for (int i = 0; i < sz; ++i) { - int32_t const c = l[i]; + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } - if (!field) - { - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - auto const& fname(*it->second); + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; - field = obj->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - } - else if (STI_ARRAY == field->getSType()) + if (STI_ARRAY == field->getSType()) { auto const* arr = static_cast(field); if (c >= arr->size()) @@ -205,18 +213,19 @@ locateField(STObject const* obj, Slice const& loc) auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HF_ERR_LOCATOR_MALFORMED); auto const& fname(*it->second); field = o->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); } - } + else // simple field must be the last one + { + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + } - if (!field || (STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } return field; } @@ -224,11 +233,14 @@ locateField(STObject const* obj, Slice const& loc) Expected WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) { - auto const r = locateField(&ctx.tx, locator); - if (!r.has_value()) + auto const r = locateField(ctx.tx, locator); + if (!r) return Unexpected(r.error()); auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -239,11 +251,14 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) if (!sle) return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - auto const r = locateField(sle.get(), locator); - if (!r.has_value()) + auto const r = locateField(*sle, locator); + if (!r) return Unexpected(r.error()); auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -259,11 +274,14 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( if (!cache[cacheIdx]) return Unexpected(HF_ERR_INVALID_SLOT); - auto const r = locateField(cache[cacheIdx].get(), locator); - if (!r.has_value()) + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) return Unexpected(r.error()); auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -333,8 +351,8 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( int32_t WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) { - auto const r = locateField(&ctx.tx, locator); - if (!r.has_value()) + auto const r = locateField(ctx.tx, locator); + if (!r) return r.error(); auto const* field = r.value(); @@ -351,8 +369,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) auto const sle = ctx.view().read(leKey); if (!sle) return HF_ERR_LEDGER_OBJ_NOT_FOUND; - auto const r = locateField(sle.get(), locator); - if (!r.has_value()) + auto const r = locateField(*sle, locator); + if (!r) return r.error(); auto const* field = r.value(); @@ -375,8 +393,8 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( if (!cache[cacheIdx]) return HF_ERR_INVALID_SLOT; - auto const r = locateField(cache[cacheIdx].get(), locator); - if (!r.has_value()) + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) return r.error(); auto const* field = r.value(); @@ -445,7 +463,7 @@ WasmHostFunctionsImpl::oracleKeylet( AccountID const& account, std::uint32_t documentId) { - if (!account || account.isZero()) + if (!account) return Unexpected(HF_ERR_INVALID_ACCOUNT); auto const keylet = keylet::oracle(account, documentId); return Bytes{keylet.key.begin(), keylet.key.end()}; @@ -467,7 +485,11 @@ WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); } - Slice const s = obj->at(sfURI); + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index b654c16aa54..9b5968c31d1 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -34,6 +34,9 @@ setData( uint8_t const* src, int32_t ssz) { + if (!ssz) + return 0; + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) @@ -51,6 +54,9 @@ setData( static Expected getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) { + if (!ssz) + return Unexpected(HF_ERR_INVALID_PARAMS); + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) return Unexpected(HF_ERR_NO_MEM_EXPORTED); @@ -66,7 +72,7 @@ static Expected getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) { auto const r = getData(rt, ptr, sz); - if (r->size() < AccountID::bytes) + if (!r || (r->size() < AccountID::bytes)) return Unexpected(HF_ERR_INVALID_PARAMS); return AccountID::fromVoid(r->data()); @@ -75,6 +81,9 @@ getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) static Expected getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) { + if (!ssz) + return Unexpected(HF_ERR_INVALID_PARAMS); + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) return Unexpected(HF_ERR_NO_MEM_EXPORTED); From 463acf51b5418bd6087ae125f56f48f455274e2d Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 30 Jun 2025 09:34:38 -0400 Subject: [PATCH 26/73] preflight checks for wasm (#5517) --- include/xrpl/protocol/TER.h | 2 + src/libxrpl/protocol/TER.cpp | 1 + src/test/app/Escrow_test.cpp | 23 ++ src/test/app/Wasm_test.cpp | 63 ++++-- src/xrpld/app/misc/WamrVM.cpp | 325 +++++++++++++++++------------ src/xrpld/app/misc/WamrVM.h | 52 +++-- src/xrpld/app/misc/WasmVM.cpp | 67 ++++-- src/xrpld/app/misc/WasmVM.h | 16 ++ src/xrpld/app/tx/detail/Escrow.cpp | 9 +- 9 files changed, 385 insertions(+), 173 deletions(-) diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index aa838a736e7..9fd73520d5f 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -141,6 +141,8 @@ enum TEMcodes : TERUnderlyingType { temARRAY_TOO_LARGE, temBAD_TRANSFER_FEE, temINVALID_INNER_BATCH, + + temBAD_WASM, }; //------------------------------------------------------------------------------ diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 85b0d702595..35cf23d50e0 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -223,6 +223,7 @@ transResults() MAKE_ERROR(temARRAY_TOO_LARGE, "Malformed: Array is too large."), MAKE_ERROR(temBAD_TRANSFER_FEE, "Malformed: Transfer fee is outside valid range."), MAKE_ERROR(temINVALID_INNER_BATCH, "Malformed: Invalid inner batch transaction."), + MAKE_ERROR(temBAD_WASM, "Malformed: Provided WASM code is invalid."), MAKE_ERROR(terRETRY, "Retry transaction."), MAKE_ERROR(terFUNDS_SPENT, "DEPRECATED."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 197fab8aaad..23b2c29c787 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1843,6 +1843,29 @@ struct Escrow_test : public beast::unit_test::suite ter(temMALFORMED)); env.close(); } + + { + // FinishFunction nonexistent host function + // pub fn finish() -> bool { + // unsafe { host_lib::bad() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02100108686f73745f6c696203626164" + "00000302010005030100100611027f00418080c0000b7f00418080c0000b07" + "2e04066d656d6f727902000666696e69736800010a5f5f646174615f656e64" + "03000b5f5f686561705f6261736503010a09010700100041044a0b004d0970" + "726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235" + "3020323032352d30332d31352900490f7461726765745f6665617475726573" + "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + env(escrowCreate, + escrow::finish_function(badWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temBAD_WASM)); + env.close(); + } } void diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 19b7946f5bf..52d30835612 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1188,15 +1188,55 @@ struct Wasm_test : public beast::unit_test::suite testcase("bad wasm test"); using namespace test::jtx; - Env env{*this}; + Env env{*this}; HostFunctions hfs; - auto wasmHex = "00000000"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); - BEAST_EXPECT(!re && re.error()); + + { + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); + BEAST_EXPECT(!re); + } + + { + auto wasmHex = "00112233445566778899AA"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + + { + // FinishFunction wrong function name + // pub fn bad() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" + "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" + "100041044a0b004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("finish"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } } void @@ -1319,14 +1359,11 @@ struct Wasm_test : public beast::unit_test::suite return occurrences; }; + auto const s = sink.messages().str(); BEAST_EXPECT( - countSubstr( - sink.messages().str(), "WAMR Error: failed to call func") == - 1); + countSubstr(s, "WAMR Error: failed to call func") == 1); BEAST_EXPECT( - countSubstr( - sink.messages().str(), - "WAMR Exception: wasm operand stack overflow") == 1); + countSubstr(s, "Exception: wasm operand stack overflow") > 0); } { diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index cefee723f58..9ad697b1c10 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -133,28 +133,22 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) auto j = jlog.error(); #endif - j << "WAMR Error: " << msg; + wasm_byte_vec_t error_message WASM_EMPTY_VEC; if (trap) - { - wasm_byte_vec_t error_message; - wasm_trap_message(trap, &error_message); - if (error_message.num_elems) - { - j << -#ifdef DEBUG_OUTPUT - "\nWAMR " -#else - "WAMR " -#endif - << error_message.data; - } - if (error_message.size) - wasm_byte_vec_delete(&error_message); - wasm_trap_delete(trap); + if (error_message.num_elems) + { + error_message.data[error_message.num_elems - 1] = 0; // just in case + j << "WAMR Error: " << msg << ", " << error_message.data; } + else + j << "WAMR Error: " << msg; + + if (error_message.size) + wasm_byte_vec_delete(&error_message); + wasm_trap_delete(trap); #ifdef DEBUG_OUTPUT j << std::endl; @@ -185,21 +179,21 @@ InstanceWrapper::init( if (!mi || trap) { print_wasm_error("can't create instance", trap, j); - throw std::runtime_error("WAMR can't create instance"); + throw std::runtime_error("can't create instance"); } wasm_instance_exports(mi.get(), expt); return mi; } InstanceWrapper::InstanceWrapper() - : exports{0, nullptr, 0, 0, nullptr} - , mod_inst(nullptr, &wasm_instance_delete) + : exports_{0, nullptr, 0, 0, nullptr} + , instance_(nullptr, &wasm_instance_delete) { } InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) - : exports{0, nullptr, 0, 0, nullptr} - , mod_inst(nullptr, &wasm_instance_delete) + : exports_{0, nullptr, 0, 0, nullptr} + , instance_(nullptr, &wasm_instance_delete) { *this = std::move(o); } @@ -211,18 +205,18 @@ InstanceWrapper::InstanceWrapper( int64_t gas, wasm_extern_vec_t const& imports, beast::Journal j) - : exports WASM_EMPTY_VEC - , mod_inst(init(s, m, maxPages, &exports, imports, j)) - , exec_env(wasm_instance_exec_env(mod_inst.get())) + : exports_ WASM_EMPTY_VEC + , instance_(init(s, m, maxPages, &exports_, imports, j)) + , execEnv_(wasm_instance_exec_env(instance_.get())) , j_(j) { - wasm_runtime_set_instruction_count_limit(exec_env, gas); + wasm_runtime_set_instruction_count_limit(execEnv_, gas); } InstanceWrapper::~InstanceWrapper() { - if (exports.size) - wasm_extern_vec_delete(&exports); + if (exports_.size) + wasm_extern_vec_delete(&exports_); } InstanceWrapper& @@ -231,14 +225,14 @@ InstanceWrapper::operator=(InstanceWrapper&& o) if (this == &o) return *this; - if (exports.size) - wasm_extern_vec_delete(&exports); - exports = o.exports; - o.exports = {0, nullptr, 0, 0, nullptr}; + if (exports_.size) + wasm_extern_vec_delete(&exports_); + exports_ = o.exports_; + o.exports_ = {0, nullptr, 0, 0, nullptr}; - mod_inst = std::move(o.mod_inst); - exec_env = o.exec_env; - o.exec_env = nullptr; + instance_ = std::move(o.instance_); + execEnv_ = o.execEnv_; + o.execEnv_ = nullptr; j_ = o.j_; @@ -247,7 +241,7 @@ InstanceWrapper::operator=(InstanceWrapper&& o) InstanceWrapper::operator bool() const { - return static_cast(mod_inst); + return static_cast(instance_); } FuncInfo @@ -258,13 +252,13 @@ InstanceWrapper::getFunc( wasm_func_t* f = nullptr; wasm_functype_t* ft = nullptr; - if (!mod_inst) - throw std::runtime_error("WAMR no module instance"); + if (!instance_) + throw std::runtime_error("no instance"); if (!export_types.num_elems) - throw std::runtime_error("WAMR no export"); - if (export_types.num_elems != exports.num_elems) - throw std::runtime_error("WAMR invalid export"); + throw std::runtime_error("no export"); + if (export_types.num_elems != exports_.num_elems) + throw std::runtime_error("invalid export"); for (unsigned i = 0; i < export_types.num_elems; ++i) { @@ -276,9 +270,9 @@ InstanceWrapper::getFunc( { if (funcName == std::string_view(name->data, name->size - 1)) { - auto* exn(exports.data[i]); + auto* exn(exports_.data[i]); if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) - throw std::runtime_error("WAMR invalid export"); + throw std::runtime_error("invalid export"); ft = wasm_externtype_as_functype( const_cast(exn_type)); @@ -290,7 +284,7 @@ InstanceWrapper::getFunc( if (!f || !ft) throw std::runtime_error( - "WAMR can't find function <" + std::string(funcName) + ">"); + "can't find function <" + std::string(funcName) + ">"); return {f, ft}; } @@ -298,13 +292,13 @@ InstanceWrapper::getFunc( wmem InstanceWrapper::getMem() const { - if (!mod_inst) - throw std::runtime_error("WAMR no module instance"); + if (!instance_) + throw std::runtime_error("no instance"); wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports.num_elems; ++i) + for (unsigned i = 0; i < exports_.num_elems; ++i) { - auto* e(exports.data[i]); + auto* e(exports_.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) { mem = wasm_extern_as_memory(e); @@ -313,7 +307,7 @@ InstanceWrapper::getMem() const } if (!mem) - throw std::runtime_error("WAMR no memory exported"); + throw std::runtime_error("no memory exported"); return { reinterpret_cast(wasm_memory_data(mem)), @@ -323,7 +317,7 @@ InstanceWrapper::getMem() const std::int64_t InstanceWrapper::getGas() const { - return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; + return execEnv_ ? wasm_runtime_get_instruction_count_limit(execEnv_) : 0; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -339,22 +333,20 @@ ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) nullptr}; ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); if (!m) - { - print_wasm_error("can't create module", nullptr, j); - throw std::runtime_error("WAMR can't create module"); - } + throw std::runtime_error("can't create module"); + return m; } ModuleWrapper::ModuleWrapper() - : module(nullptr, &wasm_module_delete) - , export_types{0, nullptr, 0, 0, nullptr} + : module_(nullptr, &wasm_module_delete) + , exportTypes_{0, nullptr, 0, 0, nullptr} { } ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) - : module(nullptr, &wasm_module_delete) - , export_types{0, nullptr, 0, 0, nullptr} + : module_(nullptr, &wasm_module_delete) + , exportTypes_{0, nullptr, 0, 0, nullptr} { *this = std::move(o); } @@ -367,11 +359,11 @@ ModuleWrapper::ModuleWrapper( int64_t gas, std::vector const& imports, beast::Journal j) - : module(init(s, wasmBin, j)) - , export_types{0, nullptr, 0, 0, nullptr} + : module_(init(s, wasmBin, j)) + , exportTypes_{0, nullptr, 0, 0, nullptr} , j_(j) { - wasm_module_exports(module.get(), &export_types); + wasm_module_exports(module_.get(), &exportTypes_); if (instantiate) { auto wimports = buildImports(s, imports); @@ -381,8 +373,8 @@ ModuleWrapper::ModuleWrapper( ModuleWrapper::~ModuleWrapper() { - if (export_types.size) - wasm_exporttype_vec_delete(&export_types); + if (exportTypes_.size) + wasm_exporttype_vec_delete(&exportTypes_); } ModuleWrapper& @@ -391,12 +383,12 @@ ModuleWrapper::operator=(ModuleWrapper&& o) if (this == &o) return *this; - module = std::move(o.module); - mod_inst = std::move(o.mod_inst); - if (export_types.size) - wasm_exporttype_vec_delete(&export_types); - export_types = o.export_types; - o.export_types = {0, nullptr, 0, 0, nullptr}; + module_ = std::move(o.module_); + instanceWrap_ = std::move(o.instanceWrap_); + if (exportTypes_.size) + wasm_exporttype_vec_delete(&exportTypes_); + exportTypes_ = o.exportTypes_; + o.exportTypes_ = {0, nullptr, 0, 0, nullptr}; j_ = o.j_; return *this; @@ -404,7 +396,7 @@ ModuleWrapper::operator=(ModuleWrapper&& o) ModuleWrapper::operator bool() const { - return mod_inst; + return instanceWrap_; } void @@ -437,7 +429,7 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[i] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("WAMR Invalid import type"); + throw std::runtime_error("invalid import type"); } } } @@ -464,7 +456,7 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[0] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("WAMR Invalid return type"); + throw std::runtime_error("invalid return type"); } } else @@ -477,7 +469,7 @@ ModuleWrapper::buildImports( std::vector const& imports) { wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; - wasm_module_imports(module.get(), &importTypes); + wasm_module_imports(module_.get(), &importTypes); std:: unique_ptr itDeleter(&importTypes, &wasm_importtype_vec_delete); @@ -572,19 +564,19 @@ ModuleWrapper::buildImports( FuncInfo ModuleWrapper::getFunc(std::string_view funcName) const { - return mod_inst.getFunc(funcName, export_types); + return instanceWrap_.getFunc(funcName, exportTypes_); } wmem ModuleWrapper::getMem() const { - return mod_inst.getMem(); + return instanceWrap_.getMem(); } InstanceWrapper const& ModuleWrapper::getInstance(int) const { - return mod_inst; + return instanceWrap_; } int @@ -594,7 +586,7 @@ ModuleWrapper::addInstance( int64_t gas, wasm_extern_vec_t const& imports) { - mod_inst = {s, module.get(), maxPages, gas, imports, j_}; + instanceWrap_ = {s, module_.get(), maxPages, gas, imports, j_}; return 0; } @@ -611,7 +603,7 @@ ModuleWrapper::addInstance( std::int64_t ModuleWrapper::getGas() { - return mod_inst.getGas(); + return instanceWrap_.getGas(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -625,8 +617,8 @@ ModuleWrapper::getGas() // } WamrEngine::WamrEngine() - : engine(wasm_engine_new(), &wasm_engine_delete) - , store(nullptr, &wasm_store_delete) + : engine_(wasm_engine_new(), &wasm_engine_delete) + , store_(nullptr, &wasm_store_delete) { wasm_runtime_set_default_running_mode(Mode_Interp); wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); @@ -640,19 +632,16 @@ WamrEngine::addModule( int64_t gas, std::vector const& imports) { - module.reset(); - store.reset(); // to free the memory before creating new store - store = {wasm_store_new(engine.get()), &wasm_store_delete}; - module = std::make_unique( - store.get(), wasmCode, instantiate, defMaxPages, gas, imports, j_); + moduleWrap_.reset(); + store_.reset(); // to free the memory before creating new store + store_ = {wasm_store_new(engine_.get()), &wasm_store_delete}; + moduleWrap_ = std::make_unique( + store_.get(), wasmCode, instantiate, defMaxPages_, gas, imports, j_); - if (!module) - { - print_wasm_error("can't create module wrapper", nullptr, j_); - throw std::runtime_error("WAMR can't create module wrapper"); - } + if (!moduleWrap_) + throw std::runtime_error("can't create module wrapper"); - return module ? 0 : -1; + return moduleWrap_ ? 0 : -1; } // int @@ -664,7 +653,7 @@ WamrEngine::addModule( FuncInfo WamrEngine::getFunc(std::string_view funcName) { - return module->getFunc(funcName); + return moduleWrap_->getFunc(funcName); } std::vector @@ -699,6 +688,8 @@ WamrEngine::convertParams(std::vector const& params) } break; default: + throw std::runtime_error( + "unknown parameter type: " + std::to_string(p.type)); break; } } @@ -706,6 +697,25 @@ WamrEngine::convertParams(std::vector const& params) return v; } +int +WamrEngine::compareParamTypes( + wasm_valtype_vec_t const* ftp, + std::vector const& p) +{ + if (ftp->num_elems != p.size()) + return std::min(ftp->num_elems, p.size()); + + for (unsigned i = 0; i < ftp->num_elems; ++i) + { + auto const t1 = wasm_valtype_kind(ftp->data[i]); + auto const t2 = p[i].kind; + if (t1 != t2) + return i; + } + + return -1; +} + void WamrEngine::add_param(std::vector& in, int32_t p) { @@ -761,13 +771,6 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } - auto const* ftp = wasm_functype_params(f.second); - if (ftp->num_elems != in.size()) - { - print_wasm_error("invalid num of params to call func", nullptr, j_); - return ret; - } - wasm_val_vec_t const inv = in.empty() ? wasm_val_vec_t WASM_EMPTY_VEC : wasm_val_vec_t{ @@ -877,7 +880,7 @@ WamrEngine::run( } catch (...) { - print_wasm_error(std::string("unknown exception"), nullptr, j_); + print_wasm_error(std::string("exception: unknown"), nullptr, j_); } return Unexpected(tecFAILED_PROCESSING); } @@ -891,15 +894,8 @@ WamrEngine::runHlp( HostFunctions* hfs, int64_t gas) { - // #ifdef DEBUG_OUTPUT - // auto& j = std::cerr; - // #else - // auto j = j_.debug(); - // #endif - // currently only 1 module support, possible parallel UT run - static std::mutex m; - std::lock_guard lg(m); + std::lock_guard lg(m_); // Create and instantiate the module. if (!wasmCode.empty()) @@ -907,65 +903,130 @@ WamrEngine::runHlp( [[maybe_unused]] int const m = addModule(wasmCode, true, gas, imports); } - if (!module || !module->mod_inst) - { - print_wasm_error("no instance to run", nullptr, j_); - return Unexpected(tecFAILED_PROCESSING); - } + if (!moduleWrap_ || !moduleWrap_->instanceWrap_) + throw std::runtime_error("no instance"); if (hfs) hfs->setRT(&getRT()); // Call main - auto f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f.second); + + // not const because passed directly to wamr function (which accept non + // const) auto p = convertParams(params); - auto res = call<1>(f, p); + + if (int const comp = compareParamTypes(ftp, p); comp >= 0) + throw std::runtime_error( + "invalid parameter type #" + std::to_string(comp)); + + auto const res = call<1>(f, p); if (res.f) - { - return Unexpected(tecFAILED_PROCESSING); - } + throw std::runtime_error("<" + std::string(funcName) + "> failed"); else if (!res.r.num_elems) - { - print_wasm_error( - "<" + std::string(funcName) + "> return nothing", nullptr, j_); - return Unexpected(tecFAILED_PROCESSING); - } + throw std::runtime_error( + "<" + std::string(funcName) + "> return nothing"); assert(res.r.data[0].kind == WASM_I32); if (gas == -1) gas = std::numeric_limits::max(); - WasmResult const ret{res.r.data[0].of.i32, gas - module->getGas()}; + WasmResult const ret{ + res.r.data[0].of.i32, gas - moduleWrap_->getGas()}; + // #ifdef DEBUG_OUTPUT + // auto& j = std::cerr; + // #else + // auto j = j_.debug(); + // #endif // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; + return ret; } +NotTEC +WamrEngine::check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j) +{ + j_ = j; + wasm_runtime_set_log_level( + std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); + try + { + return checkHlp(wasmCode, funcName, params, imports); + } + catch (std::exception const& e) + { + print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); + } + catch (...) + { + print_wasm_error(std::string("exception: unknown"), nullptr, j_); + } + + return temBAD_WASM; +} + +NotTEC +WamrEngine::checkHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports) +{ + // currently only 1 module support, possible parallel UT run + std::lock_guard lg(m_); + + // Create and instantiate the module. + if (wasmCode.empty()) + throw std::runtime_error("empty nodule"); + + int const m = addModule(wasmCode, true, -1, imports); + if ((m < 0) || !moduleWrap_ || !moduleWrap_->instanceWrap_) + throw std::runtime_error("no instance"); + + // Looking for a func and compare parameter types + auto const f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f.second); + auto const p = convertParams(params); + + if (int const comp = compareParamTypes(ftp, p); comp >= 0) + throw std::runtime_error( + "invalid parameter type #" + std::to_string(comp)); + + return tesSUCCESS; +} + std::int32_t WamrEngine::initMaxPages(std::int32_t def) { - defMaxPages = def; + defMaxPages_ = def; return def; } std::int64_t WamrEngine::getGas() { - return module ? module->getGas() : 0; + return moduleWrap_ ? moduleWrap_->getGas() : 0; } wmem WamrEngine::getMem() const { - return module ? module->getMem() : wmem(); + return moduleWrap_ ? moduleWrap_->getMem() : wmem(); } InstanceWrapper const& WamrEngine::getRT(int m, int i) { - if (!module) - throw std::runtime_error("WAMR no module"); - return module->getInstance(i); + if (!moduleWrap_) + throw std::runtime_error("no module"); + return moduleWrap_->getInstance(i); } int32_t @@ -976,7 +1037,7 @@ WamrEngine::allocate(int32_t sz) if (res.f || !res.r.num_elems || (res.r.data[0].kind != WASM_I32) || !res.r.data[0].of.i32) throw std::runtime_error( - "WAMR can't allocate memory, " + std::to_string(sz) + " bytes"); + "can't allocate memory, " + std::to_string(sz) + " bytes"); return res.r.data[0].of.i32; } @@ -988,7 +1049,7 @@ WamrEngine::newTrap(std::string_view txt) if (!txt.empty()) wasm_name_new(&msg, txt.size(), txt.data()); - return wasm_trap_new(store.get(), &msg); + return wasm_trap_new(store_.get(), &msg); } beast::Journal diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 57c65504e16..3be35c673ee 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -28,17 +28,20 @@ namespace ripple { struct WamrResult { wasm_val_vec_t r; - bool f; + bool f; // failure flag + WamrResult(unsigned N = 0) : r{0, nullptr, 0, 0, nullptr}, f(false) { if (N) wasm_val_vec_new_uninitialized(&r, N); } + ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } + WamrResult(WamrResult const&) = delete; WamrResult& operator=(WamrResult const&) = delete; @@ -47,6 +50,7 @@ struct WamrResult { *this = std::move(o); } + WamrResult& operator=(WamrResult&& o) { @@ -67,9 +71,9 @@ using FuncInfo = std::pair; struct InstanceWrapper { - wasm_extern_vec_t exports; - InstancePtr mod_inst; - wasm_exec_env_t exec_env = nullptr; + wasm_extern_vec_t exports_; + InstancePtr instance_; + wasm_exec_env_t execEnv_ = nullptr; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: @@ -116,9 +120,9 @@ struct InstanceWrapper struct ModuleWrapper { - ModulePtr module; - InstanceWrapper mod_inst; - wasm_exporttype_vec_t export_types; + ModulePtr module_; + InstanceWrapper instanceWrap_; + wasm_exporttype_vec_t exportTypes_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: @@ -171,12 +175,14 @@ struct ModuleWrapper class WamrEngine { - std::unique_ptr engine; - std::unique_ptr store; - std::unique_ptr module; - std::int32_t defMaxPages = -1; + std::unique_ptr engine_; + std::unique_ptr store_; + std::unique_ptr moduleWrap_; + std::int32_t defMaxPages_ = -1; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); + std::mutex m_; // 1 instance mutex + public: WamrEngine(); ~WamrEngine() = default; @@ -190,6 +196,14 @@ class WamrEngine int64_t gas, beast::Journal j); + NotTEC + check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j); + std::int32_t initMaxPages(std::int32_t def); @@ -222,6 +236,13 @@ class WamrEngine HostFunctions* hfs, int64_t gas); + NotTEC + checkHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports); + int addModule( Bytes const& wasmCode, @@ -247,9 +268,14 @@ class WamrEngine std::vector convertParams(std::vector const& params); - void + static int + compareParamTypes( + wasm_valtype_vec_t const* ftp, + std::vector const& p); + + static void add_param(std::vector& in, int32_t p); - void + static void add_param(std::vector& in, int64_t p); template diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index dbfcfe549c0..b21007b9d8d 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -29,19 +29,9 @@ namespace ripple { -Expected -runEscrowWasm( - Bytes const& wasmCode, - std::string_view funcName, - std::vector const& params, - HostFunctions* hfs, - int64_t gasLimit, - beast::Journal j) +static std::vector +createImports(HostFunctions* hfs) { - // create VM and set cost limit - auto& vm = WasmEngine::instance(); - vm.initMaxPages(MAX_PAGES); - std::vector imports; if (hfs) @@ -107,11 +97,27 @@ runEscrowWasm( WASM_IMPORT_FUNC2(imports, traceNum, "trace_num", hfs); } - auto ret = vm.run( + return imports; +} + +Expected +runEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + HostFunctions* hfs, + int64_t gasLimit, + beast::Journal j) +{ + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initMaxPages(MAX_PAGES); + + auto const ret = vm.run( wasmCode, funcName, params, - imports, + createImports(hfs), hfs, gasLimit, hfs ? hfs->getJournal() : j); @@ -130,6 +136,28 @@ runEscrowWasm( return EscrowResult{ret->result > 0, ret->cost}; } +NotTEC +preflightEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + HostFunctions* hfs, + beast::Journal j) +{ + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initMaxPages(MAX_PAGES); + + auto const ret = vm.check( + wasmCode, + funcName, + params, + createImports(hfs), + hfs ? hfs->getJournal() : j); + + return ret; +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WasmEngine::WasmEngine() : impl(std::make_unique()) @@ -156,6 +184,17 @@ WasmEngine::run( return impl->run(wasmCode, funcName, params, imports, hfs, gasLimit, j); } +NotTEC +WasmEngine::check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j) +{ + return impl->check(wasmCode, funcName, params, imports, j); +} + std::int32_t WasmEngine::initMaxPages(std::int32_t def) { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b12d7ecc7ef..7c68a186966 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -65,6 +65,14 @@ class WasmEngine int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + NotTEC + check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params = {}, + std::vector const& imports = {}, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + std::int32_t initMaxPages(std::int32_t def); @@ -87,4 +95,12 @@ runEscrowWasm( int64_t gasLimit = -1, beast::Journal j = beast::Journal(beast::Journal::getNullSink())); +NotTEC +preflightEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params = {}, + HostFunctions* hfs = nullptr, + beast::Journal j = beast::Journal(beast::Journal::getNullSink())); + } // namespace ripple diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 6f52d1a4f28..7639b4efa03 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -231,7 +231,14 @@ EscrowCreate::preflight(PreflightContext const& ctx) << "EscrowCreate.FinishFunction bad size " << code.size(); return temMALFORMED; } - // TODO: add check to ensure this is valid WASM code + + HostFunctions mock; + auto const re = preflightEscrowWasm(code, "finish", {}, &mock); + if (!isTesSuccess(re)) + { + JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; + return re; + } } return preflight2(ctx); From a0d275feec923ad5be43eee4292c6b1b80d39cf2 Mon Sep 17 00:00:00 2001 From: "Elliot." Date: Wed, 2 Jul 2025 10:39:57 -0700 Subject: [PATCH 27/73] chore: Clear CODEOWNERS (#5528) --- .github/CODEOWNERS | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bc4fe2febde..24620f8d7ca 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,8 +1,2 @@ # Allow anyone to review any change by default. * - -# Require the rpc-reviewers team to review changes to the rpc code. -include/xrpl/protocol/ @xrplf/rpc-reviewers -src/libxrpl/protocol/ @xrplf/rpc-reviewers -src/xrpld/rpc/ @xrplf/rpc-reviewers -src/xrpld/app/misc/ @xrplf/rpc-reviewers From 65b0b976d98e54226136fad8e733d17b7fbb511e Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:33:39 -0400 Subject: [PATCH 28/73] Sync error codes (#5527) * Sync error codes --- src/xrpld/app/misc/WasmHostFunc.h | 36 ++--- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 148 +++++++++------------ src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 29 ++-- 3 files changed, 100 insertions(+), 113 deletions(-) diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 1d1f4d011be..86eb174451d 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -29,22 +29,26 @@ namespace ripple { -int32_t const HF_ERR_INTERNAL = -1; -int32_t const HF_ERR_FIELD_NOT_FOUND = -2; -int32_t const HF_ERR_BUFFER_TOO_SMALL = -3; -int32_t const HF_ERR_NO_ARRAY = -4; -int32_t const HF_ERR_NOT_LEAF_FIELD = -5; -int32_t const HF_ERR_LOCATOR_MALFORMED = -6; -int32_t const HF_ERR_SLOT_OUT_RANGE = -7; -int32_t const HF_ERR_SLOTS_FULL = -8; -int32_t const HF_ERR_INVALID_SLOT = -9; -int32_t const HF_ERR_LEDGER_OBJ_NOT_FOUND = -10; -int32_t const HF_ERR_DECODING = -11; -int32_t const HF_ERR_DATA_FIELD_TOO_LARGE = -12; -int32_t const HF_ERR_OUT_OF_BOUNDS = -13; -int32_t const HF_ERR_NO_MEM_EXPORTED = -14; -int32_t const HF_ERR_INVALID_PARAMS = -15; -int32_t const HF_ERR_INVALID_ACCOUNT = -16; +enum HostFunctionErrors : int32_t { + HF_ERR_INTERNAL = -1, + HF_ERR_FIELD_NOT_FOUND = -2, + HF_ERR_BUFFER_TOO_SMALL = -3, + HF_ERR_NO_ARRAY = -4, + HF_ERR_NOT_LEAF_FIELD = -5, + HF_ERR_LOCATOR_MALFORMED = -6, + HF_ERR_SLOT_OUT_RANGE = -7, + HF_ERR_SLOTS_FULL = -8, + HF_ERR_EMPTY_SLOT = -9, + HF_ERR_LEDGER_OBJ_NOT_FOUND = -10, + HF_ERR_DECODING = -11, + HF_ERR_DATA_FIELD_TOO_LARGE = -12, + HF_ERR_POINTER_OUT_OF_BOUNDS = -13, + HF_ERR_NO_MEM_EXPORTED = -14, + HF_ERR_INVALID_PARAMS = -15, + HF_ERR_INVALID_ACCOUNT = -16, + HF_ERR_INVALID_FIELD = -17, + HF_ERR_INDEX_OUT_OF_BOUNDS = -18, +}; struct HostFunctions { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 71236034afc..7c804f376d9 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -70,50 +70,57 @@ WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; } -static Bytes -getAnyFieldData(STBase const& obj) +static Expected +getAnyFieldData(STBase const* obj) { // auto const& fname = obj.getFName(); - auto const stype = obj.getSType(); + if (!obj) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + + auto const stype = obj->getSType(); switch (stype) { case STI_UNKNOWN: case STI_NOTPRESENT: - return {}; + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + break; + case STI_OBJECT: + case STI_ARRAY: + return Unexpected(HF_ERR_NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const& super(static_cast(obj)); + auto const& data = super->value(); + return Bytes{data.begin(), data.end()}; } break; case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); + auto const& super(static_cast(obj)); + int64_t const data = super->xrp().drops(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + return Bytes{b, e}; } break; case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const& super(static_cast(obj)); + auto const& data = super->value(); + return Bytes{data.begin(), data.end()}; } break; case STI_UINT256: { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const& super(static_cast const*>(obj)); + auto const& data = super->value(); + return Bytes{data.begin(), data.end()}; } break; case STI_UINT32: { auto const& super( - static_cast const&>(obj)); - std::uint32_t const data = super.value(); + static_cast const*>(obj)); + std::uint32_t const data = super->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + return Bytes{b, e}; } break; default: @@ -121,7 +128,7 @@ getAnyFieldData(STBase const& obj) } Serializer msg; - obj.add(msg); + obj->add(msg); return msg.getData(); } @@ -129,13 +136,7 @@ getAnyFieldData(STBase const& obj) Expected WasmHostFunctionsImpl::getTxField(SField const& fname) { - auto const* field = ctx.tx.peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(ctx.tx.peekAtPField(fname)); } Expected @@ -144,14 +145,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) auto const sle = ctx.view().read(leKey); if (!sle) return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - - auto const* field = sle->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(sle->peekAtPField(fname)); } Expected @@ -160,17 +154,16 @@ WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) return Unexpected(HF_ERR_SLOT_OUT_RANGE); - if (!cache[cacheIdx]) - return Unexpected(HF_ERR_INVALID_SLOT); - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return Unexpected(HF_ERR_EMPTY_SLOT); + return getAnyFieldData(cache[cacheIdx]->peekAtPField(fname)); +} - return getAnyFieldData(*field); +static inline bool +noField(STBase const* field) +{ + return !field || (STI_NOTPRESENT == field->getSType()) || + (STI_UNKNOWN == field->getSType()); } static Expected @@ -188,11 +181,11 @@ locateField(STObject const& obj, Slice const& loc) int32_t const c = l[0]; auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); + return Unexpected(HF_ERR_INVALID_FIELD); + auto const& fname(*it->second); field = obj.peekAtPField(fname); - if (!field || (STI_NOTPRESENT == field->getSType())) + if (noField(field)) return Unexpected(HF_ERR_FIELD_NOT_FOUND); } @@ -204,7 +197,7 @@ locateField(STObject const& obj, Slice const& loc) { auto const* arr = static_cast(field); if (c >= arr->size()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + return Unexpected(HF_ERR_INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](c)); } else if (STI_OBJECT == field->getSType()) @@ -213,9 +206,9 @@ locateField(STObject const& obj, Slice const& loc) auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); + return Unexpected(HF_ERR_INVALID_FIELD); + auto const& fname(*it->second); field = o->peekAtPField(fname); } else // simple field must be the last one @@ -223,7 +216,7 @@ locateField(STObject const& obj, Slice const& loc) return Unexpected(HF_ERR_LOCATOR_MALFORMED); } - if (!field || (STI_NOTPRESENT == field->getSType())) + if (noField(field)) return Unexpected(HF_ERR_FIELD_NOT_FOUND); } @@ -237,11 +230,7 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(r.value()); } Expected @@ -255,11 +244,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(r.value()); } Expected @@ -272,17 +257,13 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( return Unexpected(HF_ERR_SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return Unexpected(HF_ERR_INVALID_SLOT); + return Unexpected(HF_ERR_EMPTY_SLOT); auto const r = locateField(*cache[cacheIdx], locator); if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(r.value()); } int32_t @@ -292,7 +273,7 @@ WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) return HF_ERR_NO_ARRAY; auto const* field = ctx.tx.peekAtPField(fname); - if (!field) + if (noField(field)) return HF_ERR_FIELD_NOT_FOUND; if (field->getSType() != STI_ARRAY) @@ -313,7 +294,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) return HF_ERR_LEDGER_OBJ_NOT_FOUND; auto const* field = sle->peekAtPField(fname); - if (!field) + if (noField(field)) return HF_ERR_FIELD_NOT_FOUND; if (field->getSType() != STI_ARRAY) @@ -335,10 +316,10 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( return HF_ERR_SLOT_OUT_RANGE; if (!cache[cacheIdx]) - return HF_ERR_INVALID_SLOT; + return HF_ERR_EMPTY_SLOT; auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) + if (noField(field)) return HF_ERR_FIELD_NOT_FOUND; if (field->getSType() != STI_ARRAY) @@ -354,8 +335,8 @@ WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) auto const r = locateField(ctx.tx, locator); if (!r) return r.error(); - auto const* field = r.value(); + auto const* field = r.value(); if (field->getSType() != STI_ARRAY) return HF_ERR_NO_ARRAY; int32_t const sz = static_cast(field)->size(); @@ -372,8 +353,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) auto const r = locateField(*sle, locator); if (!r) return r.error(); - auto const* field = r.value(); + auto const* field = r.value(); if (field->getSType() != STI_ARRAY) return HF_ERR_NO_ARRAY; int32_t const sz = static_cast(field)->size(); @@ -391,14 +372,13 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( return HF_ERR_SLOT_OUT_RANGE; if (!cache[cacheIdx]) - return HF_ERR_INVALID_SLOT; + return HF_ERR_EMPTY_SLOT; auto const r = locateField(*cache[cacheIdx], locator); if (!r) return r.error(); auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) return HF_ERR_NO_ARRAY; int32_t const sz = static_cast(field)->size(); @@ -439,7 +419,10 @@ WasmHostFunctionsImpl::credentialKeylet( AccountID const& issuer, Bytes const& credentialType) { - if (!subject || !issuer || credentialType.empty() || + if (!subject || !issuer) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + + if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) return Unexpected(HF_ERR_INVALID_PARAMS); @@ -472,22 +455,19 @@ WasmHostFunctionsImpl::oracleKeylet( Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { - if (!account || !nftId) - { - getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + + if (!nftId) return Unexpected(HF_ERR_INVALID_PARAMS); - } auto obj = nft::findToken(ctx.view(), account, nftId); if (!obj) - { - getJournal().trace() << "WAMR getNFT: NFT not found"; return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - } auto ouri = obj->at(~sfURI); if (!ouri) - return Bytes(); + return Unexpected(HF_ERR_FIELD_NOT_FOUND); Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 9b5968c31d1..0e1f8862592 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -37,12 +37,15 @@ setData( if (!ssz) return 0; + if (dst < 0 || dsz < 0 || !src || ssz < 0) + return HF_ERR_INVALID_PARAMS; + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) return HF_ERR_NO_MEM_EXPORTED; if (dst + dsz > mem.s) - return HF_ERR_OUT_OF_BOUNDS; + return HF_ERR_POINTER_OUT_OF_BOUNDS; if (ssz > dsz) return HF_ERR_BUFFER_TOO_SMALL; @@ -54,7 +57,7 @@ setData( static Expected getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) { - if (!ssz) + if (src < 0 || ssz <= 0) return Unexpected(HF_ERR_INVALID_PARAMS); auto mem = rt ? rt->getMem() : wmem(); @@ -62,7 +65,7 @@ getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) return Unexpected(HF_ERR_NO_MEM_EXPORTED); if (src + ssz > mem.s) - return Unexpected(HF_ERR_OUT_OF_BOUNDS); + return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); Bytes data(mem.p + src, mem.p + src + ssz); return data; @@ -72,7 +75,7 @@ static Expected getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) { auto const r = getData(rt, ptr, sz); - if (!r || (r->size() < AccountID::bytes)) + if (!r || (r->size() != AccountID::bytes)) return Unexpected(HF_ERR_INVALID_PARAMS); return AccountID::fromVoid(r->data()); @@ -81,7 +84,7 @@ getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) static Expected getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) { - if (!ssz) + if (src < 0 || ssz <= 0) return Unexpected(HF_ERR_INVALID_PARAMS); auto mem = rt ? rt->getMem() : wmem(); @@ -89,7 +92,7 @@ getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) return Unexpected(HF_ERR_NO_MEM_EXPORTED); if (src + ssz > mem.s) - return Unexpected(HF_ERR_OUT_OF_BOUNDS); + return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); std::string data(mem.p + src, mem.p + src + ssz); return data; @@ -179,7 +182,7 @@ cacheLedgerObj_wrap( RET(r.error()); } - if (r->size() < uint256::bytes) + if (r->size() != uint256::bytes) { RET(HF_ERR_INVALID_PARAMS); } @@ -203,7 +206,7 @@ getTxField_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -234,7 +237,7 @@ getCurrentLedgerObjField_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -265,7 +268,7 @@ getLedgerObjField_wrap( auto const it = m.find(params->data[1].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -384,7 +387,7 @@ getTxArrayLen_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -405,7 +408,7 @@ getCurrentLedgerObjArrayLen_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -426,7 +429,7 @@ getLedgerObjArrayLen_wrap( auto const it = m.find(params->data[1].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); From 7bdf5fa8b8caa2b1efb3e6c8d06c89d9fc179c54 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:18:03 -0400 Subject: [PATCH 29/73] Fix build.md wamr version (#5535) --- BUILD.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BUILD.md b/BUILD.md index d4824fe1a0a..50aea4c7dcd 100644 --- a/BUILD.md +++ b/BUILD.md @@ -210,9 +210,9 @@ It add metering and expose some internal structures. ``` # Conan 1.x - conan export external/wamr wamr/2.2.0@ + conan export external/wamr wamr/2.3.1@ # Conan 2.x - conan export --version 2.2.0 external/wamr + conan export --version 2.3.1 external/wamr ``` ### Build and Test From 4fa0ae521e5b65840d60a4d87baa1b0f6ddeee82 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 9 Jul 2025 00:34:17 +0530 Subject: [PATCH 30/73] disallow a computation allowance of 0 (#5541) --- src/test/app/Escrow_test.cpp | 7 +++++++ src/xrpld/app/tx/detail/Escrow.cpp | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 23b2c29c787..00a53029131 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1970,6 +1970,13 @@ struct Escrow_test : public beast::unit_test::suite ter(tefWASM_FIELD_NOT_INCLUDED)); } + { + // ComputationAllowance value of 0 + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(0), + ter(temBAD_LIMIT)); + } + { // not enough fees // This function takes 4 gas diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 7639b4efa03..e9a7c78c7f6 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -743,6 +743,10 @@ EscrowFinish::preflight(PreflightContext const& ctx) if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) { + if (*allowance == 0) + { + return temBAD_LIMIT; + } if (*allowance > ctx.app.config().FEES.extension_compute_limit) { JLOG(ctx.j.debug()) From bc445ec6a2167e944a4b5af7b849e9f2500ed11e Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:08:36 -0400 Subject: [PATCH 31/73] Add hostfunctions schedule table Remove opcode schedule table from wamr --- external/wamr/patches/ripp_metering.patch | 105 ++++++-------------- include/xrpl/protocol/Protocol.h | 3 + src/test/app/Escrow_test.cpp | 15 ++- src/test/app/Wasm_test.cpp | 79 +++++++++++++-- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 15 +++ src/xrpld/app/misc/WasmVM.cpp | 108 ++++++++------------- src/xrpld/app/misc/WasmVM.h | 3 + 7 files changed, 174 insertions(+), 154 deletions(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 5a41b125b7d..5e09eec8df8 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -102,31 +102,28 @@ index 49a17a96..19a85980 100644 * an index in both functions runtime instance lists * of interpreter mode and aot mode diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c -index 47752950..d5821c4f 100644 +index 47752950..5f26d886 100644 --- a/core/iwasm/common/wasm_exec_env.c +++ b/core/iwasm/common/wasm_exec_env.c -@@ -86,7 +86,9 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, +@@ -86,7 +86,7 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, #endif #if WASM_ENABLE_INSTRUCTION_METERING != 0 - exec_env->instructions_to_execute = -1; + exec_env->instructions_to_execute = INT64_MAX; -+ for(int i = 0; i < 256; ++i) -+ exec_env->instructions_schedule[i] = 1; #endif return exec_env; diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h -index 5d80312f..2713a092 100644 +index 5d80312f..b2ecce2e 100644 --- a/core/iwasm/common/wasm_exec_env.h +++ b/core/iwasm/common/wasm_exec_env.h -@@ -89,7 +89,8 @@ typedef struct WASMExecEnv { +@@ -89,7 +89,7 @@ typedef struct WASMExecEnv { #if WASM_ENABLE_INSTRUCTION_METERING != 0 /* instructions to execute */ - int instructions_to_execute; + int64 instructions_to_execute; -+ int64 instructions_schedule[256]; #endif #if WASM_ENABLE_FAST_JIT != 0 @@ -214,10 +211,10 @@ index 9a6afee1..0fe4739f 100644 bool diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index dcee0aea..10c516d6 100644 +index dcee0aea..a1f7866e 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2288,10 +2288,26 @@ wasm_runtime_access_exce_check_guard_page() +@@ -2288,10 +2288,18 @@ wasm_runtime_access_exce_check_guard_page() #if WASM_ENABLE_INSTRUCTION_METERING != 0 void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -233,19 +230,11 @@ index dcee0aea..10c516d6 100644 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) +{ + return exec_env->instructions_to_execute; -+} -+ -+void -+wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, -+ int64 const *instructions_schedule) -+{ -+ for(int i = 0; i < 256; ++i) -+ exec_env->instructions_schedule[i] = instructions_schedule[i]; +} #endif WASMFuncType * -@@ -7348,7 +7364,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, +@@ -7348,7 +7356,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, const char *func_name) { return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, @@ -254,7 +243,7 @@ index dcee0aea..10c516d6 100644 } bool -@@ -7805,13 +7821,14 @@ wasm_runtime_get_module_name(wasm_module_t module) +@@ -7805,13 +7813,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) { @@ -270,7 +259,7 @@ index dcee0aea..10c516d6 100644 uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; -@@ -7821,6 +7838,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7821,6 +7830,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; } @@ -278,7 +267,7 @@ index dcee0aea..10c516d6 100644 return true; } -@@ -7843,7 +7861,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, +@@ -7843,7 +7853,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; if ((uint8 *)&boundary < boundary) { wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), @@ -288,10 +277,10 @@ index dcee0aea..10c516d6 100644 } return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 64a6cd79..f4c55e2f 100644 +index 64a6cd79..cb674edc 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h -@@ -795,7 +795,14 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, +@@ -795,7 +795,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -299,10 +288,6 @@ index 64a6cd79..f4c55e2f 100644 + int64 instructions_to_execute); +WASM_RUNTIME_API_EXTERN int64 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); -+ -+WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, -+ int64 const *instructions_schedule); + #endif @@ -404,7 +389,7 @@ index ddc0b15b..3a707878 100644 #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 1e98b0fa..ae24ff8b 100644 +index 1e98b0fa..db6278c5 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) @@ -420,8 +405,8 @@ index 1e98b0fa..ae24ff8b 100644 - instructions_left--; +#define CHECK_INSTRUCTION_LIMIT() \ + do { \ -+ instructions_left -= instructions_schedule[opcode]; \ -+ if (instructions_left < 0) { \ ++ --instructions_left; \ ++ if (instructions_left <= 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ + } \ @@ -429,20 +414,20 @@ index 1e98b0fa..ae24ff8b 100644 #else #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -1625,9 +1626,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1625,10 +1626,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 cache_index, type_index, param_cell_num, cell_num; #if WASM_ENABLE_INSTRUCTION_METERING != 0 - int instructions_left = -1; +- if (exec_env) { + int64 instructions_left = INT64_MAX; -+ int64 const *instructions_schedule = NULL; - if (exec_env) { ++ if (exec_env) instructions_left = exec_env->instructions_to_execute; -+ instructions_schedule = exec_env->instructions_schedule; - } +- } #endif -@@ -6885,6 +6888,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + #if WASM_ENABLE_EXCE_HANDLING != 0 +@@ -6885,6 +6885,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -454,7 +439,7 @@ index 1e98b0fa..ae24ff8b 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6925,6 +6933,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6925,6 +6930,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -468,7 +453,7 @@ index 1e98b0fa..ae24ff8b 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 4e5edf41..04c39e1f 100644 +index 4e5edf41..37b36c17 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -106,14 +106,14 @@ typedef float64 CellType_F64; @@ -485,7 +470,7 @@ index 4e5edf41..04c39e1f 100644 - +#define CHECK_INSTRUCTION_LIMIT() \ + do { \ -+ instructions_left -= instructions_schedule[opcode]; \ ++ --instructions_left; \ + if (instructions_left < 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ @@ -532,46 +517,20 @@ index 4e5edf41..04c39e1f 100644 #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1508,6 +1507,25 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) - #endif - } - -+static int64 const def_instructions_schedule[256] = { -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 -+}; -+ - static void - wasm_interp_call_func_bytecode(WASMModuleInstance *module, - WASMExecEnv *exec_env, -@@ -1556,9 +1574,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1556,10 +1555,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 opcode = 0, local_type, *global_addr; #if WASM_ENABLE_INSTRUCTION_METERING != 0 - int instructions_left = -1; +- if (exec_env) { + int64 instructions_left = INT64_MAX; -+ int64 const *instructions_schedule = def_instructions_schedule; - if (exec_env) { ++ if (exec_env) instructions_left = exec_env->instructions_to_execute; -+ instructions_schedule = exec_env->instructions_schedule; - } +- } #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ -@@ -7694,6 +7714,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 +@@ -7694,6 +7692,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, { wasm_interp_call_func_native(module, exec_env, cur_func, prev_frame); @@ -579,7 +538,7 @@ index 4e5edf41..04c39e1f 100644 } #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7806,6 +7827,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7806,6 +7805,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); @@ -591,7 +550,7 @@ index 4e5edf41..04c39e1f 100644 if (!prev_frame->ip) /* Called from native. */ return; -@@ -7834,6 +7860,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7834,6 +7838,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index ab95017db12..e4592d48896 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -130,6 +130,9 @@ std::uint8_t constexpr maxAssetCheckDepth = 5; * Wasm code */ std::size_t constexpr maxWasmDataLength = 4 * 1024; +/** The maximum length of a parameters passed from Wasm code*/ +std::size_t constexpr maxWasmParamLength = 1024; + /** A ledger index. */ using LedgerIndex = std::uint32_t; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 00a53029131..1ade21eb59b 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2032,8 +2032,8 @@ struct Escrow_test : public beast::unit_test::suite // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = ledgerSqnHex; - std::uint32_t constexpr allowance = 4; + auto const& wasmHex = ledgerSqnHex; + std::uint32_t const allowance = 64; { // basic FinishFunction situation @@ -2179,19 +2179,19 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(4), + escrow::comp_allowance(allowance), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(4), + escrow::comp_allowance(allowance), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(4), + escrow::comp_allowance(allowance), fee(txnFees + 1), ter(tesSUCCESS)); @@ -2300,8 +2300,7 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); - // TODO: figure out why this can't be 2412 - auto const allowance = 3'600; + auto const allowance = 20'000; // FinishAfter time hasn't passed env(escrow::finish(carol, alice, seq), @@ -2343,7 +2342,7 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 487); + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 10817); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 52d30835612..e5d0a9f29f6 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1268,7 +1268,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re->result && (re->cost == 487)); + BEAST_EXPECT(!re->result && (re->cost == 10817)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -1285,7 +1285,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re->result && (re->cost == 487)); + BEAST_EXPECT(!re->result && (re->cost == 10817)); // std::cout << "bad case (current time < escrow_finish_after " // "time) result " // << re.value().result << " cost: " << @@ -1309,7 +1309,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; } @@ -1329,7 +1329,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; } @@ -1406,7 +1406,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 80)); + BEAST_EXPECT(re->result && (re->cost == 6570)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -1428,13 +1428,78 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 138)); + BEAST_EXPECT(re->result && (re->cost == 16558)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } } } + void + testHFCost() + { + testcase("wasm test host functions cost"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = hostFunctions2Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + std::vector imp = createWasmImport(&hfs); + for (auto& i : imp) + i.gas = 0; + + auto re = engine.run( + wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + // std::cout << ", ret: " << re->result + // << ", gas spent: " << re->cost << std::endl; + BEAST_EXPECT(re->result && (re->cost == 138)); + } + + env.close(); + } + + env.close(); + env.close(); + env.close(); + env.close(); + env.close(); + + { + std::string const wasmHex = hostFunctions2Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + std::vector const imp = createWasmImport(&hfs); + + auto re = engine.run( + wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + // std::cout << ", ret: " << re->result + // << ", gas spent: " << re->cost << std::endl; + BEAST_EXPECT(re->result && (re->cost == 16558)); + } + + env.close(); + } + } + void perfTest() { @@ -1551,6 +1616,8 @@ struct Wasm_test : public beast::unit_test::suite // testWasmSP1Verifier(); testWasmBG16Verifier(); + testHFCost(); + // TODO: fix result testEscrowWasmDN1(); testEscrowWasmDN2(); diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 0e1f8862592..0c502733620 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -527,6 +527,11 @@ computeSha512HalfHash_wrap( auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE); + } + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); if (!r) { @@ -726,6 +731,11 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE); + } + auto const msg = getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); if (!msg) @@ -750,6 +760,11 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE); + } + auto const msg = getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); if (!msg) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index b21007b9d8d..3f7d61c349d 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -29,75 +29,49 @@ namespace ripple { -static std::vector -createImports(HostFunctions* hfs) +std::vector +createWasmImport(HostFunctions* hfs) { - std::vector imports; + std::vector i; if (hfs) { + // clang-format off + // TODO: remove after escrow_test wasm module will be updated - WASM_IMPORT_FUNC2(imports, getLedgerSqnOld, "getLedgerSqn", hfs); - - WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", hfs); - WASM_IMPORT_FUNC2( - imports, getParentLedgerTime, "get_parent_ledger_time", hfs); - WASM_IMPORT_FUNC2( - imports, getParentLedgerHash, "get_parent_ledger_hash", hfs); - WASM_IMPORT_FUNC2(imports, cacheLedgerObj, "cache_ledger_obj", hfs); - WASM_IMPORT_FUNC2(imports, getTxField, "get_tx_field", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjField, - "get_current_ledger_obj_field", - hfs); - WASM_IMPORT_FUNC2( - imports, getLedgerObjField, "get_ledger_obj_field", hfs); - WASM_IMPORT_FUNC2( - imports, getTxNestedField, "get_tx_nested_field", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjNestedField, - "get_current_ledger_obj_nested_field", - hfs); - WASM_IMPORT_FUNC2( - imports, - getLedgerObjNestedField, - "get_ledger_obj_nested_field", - hfs); - WASM_IMPORT_FUNC2(imports, getTxArrayLen, "get_tx_array_len", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjArrayLen, - "get_current_ledger_obj_array_len", - hfs); - WASM_IMPORT_FUNC2( - imports, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs); - WASM_IMPORT_FUNC2( - imports, getTxNestedArrayLen, "get_tx_nested_array_len", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjNestedArrayLen, - "get_current_ledger_obj_nested_array_len", - hfs); - WASM_IMPORT_FUNC2( - imports, - getLedgerObjNestedArrayLen, - "get_ledger_obj_nested_array_len", - hfs); - WASM_IMPORT_FUNC2(imports, updateData, "update_data", hfs); - WASM_IMPORT_FUNC2( - imports, computeSha512HalfHash, "compute_sha512_half", hfs); - WASM_IMPORT_FUNC2(imports, accountKeylet, "account_keylet", hfs); - WASM_IMPORT_FUNC2(imports, credentialKeylet, "credential_keylet", hfs); - WASM_IMPORT_FUNC2(imports, escrowKeylet, "escrow_keylet", hfs); - WASM_IMPORT_FUNC2(imports, oracleKeylet, "oracle_keylet", hfs); - WASM_IMPORT_FUNC2(imports, getNFT, "get_NFT", hfs); - WASM_IMPORT_FUNC(imports, trace, hfs); - WASM_IMPORT_FUNC2(imports, traceNum, "trace_num", hfs); + WASM_IMPORT_FUNC2(i, getLedgerSqnOld, "getLedgerSqn", hfs, 60); + + + WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); + WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_NFT", hfs, 1000); + WASM_IMPORT_FUNC (i, trace, hfs, 500); + WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + + // clang-format on } - return imports; + return i; } Expected @@ -117,7 +91,7 @@ runEscrowWasm( wasmCode, funcName, params, - createImports(hfs), + createWasmImport(hfs), hfs, gasLimit, hfs ? hfs->getJournal() : j); @@ -125,14 +99,14 @@ runEscrowWasm( // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; - if (!ret.has_value()) + if (!ret) { // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } - // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost - // << std::endl; + // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << + // std::endl; return EscrowResult{ret->result > 0, ret->cost}; } @@ -152,7 +126,7 @@ preflightEscrowWasm( wasmCode, funcName, params, - createImports(hfs), + createWasmImport(hfs), hfs ? hfs->getJournal() : j); return ret; diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 7c68a186966..c4db2fedd5d 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -86,6 +86,9 @@ class WasmEngine //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::vector +createWasmImport(HostFunctions* hfs); + Expected runEscrowWasm( Bytes const& wasmCode, From 9007097d247eec1cf9b3442390c7209418ea805b Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 15 Jul 2025 04:28:59 +0530 Subject: [PATCH 32/73] Simplify host function boilerplate (#5534) * enum for HF errors * switch getData functions to be templates * getData working * Slice -> Bytes in host functions * RET -> helper function instead of macro * get template function working * more organization/cleanup * fix failures * more cleanup * Bytes -> Slice * SFieldParam macro -> type alias * fix return type * fix bugs * replace std::make_index_sequence * remove `failed` from output * remove complex function * more uniformity * respond to comments * enum class HostFunctionError * rename variable * respond to comments * remove templating * [WIP] basic getData tests * weird linker error * fix issue --- src/test/app/AMM_test.cpp | 2 +- src/test/app/TestHostFunctions.h | 797 ++++++++++++++++++ src/test/app/Vault_test.cpp | 2 +- src/test/app/Wasm_test.cpp | 905 +-------------------- src/xrpld/app/misc/WamrVM.cpp | 4 +- src/xrpld/app/misc/WasmHostFunc.h | 150 ++-- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 206 ++--- src/xrpld/app/misc/WasmHostFuncImpl.h | 62 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 819 +++++++++++-------- 9 files changed, 1525 insertions(+), 1422 deletions(-) create mode 100644 src/test/app/TestHostFunctions.h diff --git a/src/test/app/AMM_test.cpp b/src/test/app/AMM_test.cpp index 2ee9e5f1f37..93bb57a0816 100644 --- a/src/test/app/AMM_test.cpp +++ b/src/test/app/AMM_test.cpp @@ -7480,7 +7480,7 @@ struct AMM_test : public jtx::AMMTest using namespace test::jtx; auto const testCase = [&](std::string suffix, FeatureBitset features) { - testcase("Failed pseudo-account allocation " + suffix); + testcase("Pseudo-account allocation failure " + suffix); std::string logs; Env env{*this, features, std::make_unique(&logs)}; env.fund(XRP(30'000), gw, alice); diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h new file mode 100644 index 00000000000..680ec03896c --- /dev/null +++ b/src/test/app/TestHostFunctions.h @@ -0,0 +1,797 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include +#include +#include +#include + +#include + +namespace ripple { +namespace test { + +struct TestHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + AccountID accountID_; + Bytes data_; + int clock_drift_ = 0; + void const* rt_ = nullptr; + +public: + TestHostFunctions(test::jtx::Env& env, int cd = 0) + : env_(env), clock_drift_(cd) + { + auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); + if (opt) + accountID_ = *opt; + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + Expected + getLedgerSqn() override + { + return static_cast(env_.current()->seq()); + } + + Expected + getParentLedgerTime() override + { + return env_.current()->parentCloseTime().time_since_epoch().count() + + clock_drift_; + } + + Expected + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + + virtual Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override + { + return 1; + } + + Expected + getTxField(SField const& fname) override + { + if (fname == sfAccount) + return Bytes(accountID_.begin(), accountID_.end()); + else if (fname == sfFee) + { + int64_t x = 235; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + else if (fname == sfSequence) + { + auto const x = getLedgerSqn(); + if (!x) + return Unexpected(x.error()); + std::uint32_t const data = x.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + return Bytes(); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(HostFunctionError::INTERNAL); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + // auto const& sn = fname.getName(); + if (fname == sfBalance) + { + int64_t x = 10'000; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + return data_; + } + + Expected + getTxNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getTxArrayLen(SField const& fname) override + { + return 32; + } + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override + { + return 32; + } + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + return 32; + } + + Expected + getTxNestedArrayLen(Slice const& locator) override + { + return 32; + } + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + return 32; + } + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + return 32; + } + + Expected + updateData(Slice const& data) override + { + return 0; + } + + Expected + computeSha512HalfHash(Slice const& data) override + { + return env_.current()->info().parentHash; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) override + { + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::credential(subject, issuer, credentialType); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + std::string s = "https://ripple.com"; + return Bytes(s.begin(), s.end()); + } + + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << "WASM TRACE: " << msg; + if (!asHex) + j << std::string_view( + reinterpret_cast(data.data()), data.size()); + else + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex(data.begin(), data.end(), hex.begin()); + j << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + Expected + traceNum(std::string_view const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << "WASM TRACE NUM: " << msg << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } +}; + +struct TestHostFunctionsSink : public TestHostFunctions +{ + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) + : TestHostFunctions(env, cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } +}; + +struct PerfHostFunctions : public TestHostFunctions +{ + Keylet leKey; + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + std::shared_ptr tx_; + + void const* rt_ = nullptr; + +public: + PerfHostFunctions( + test::jtx::Env& env, + Keylet const& k, + std::shared_ptr&& tx) + : TestHostFunctions(env), leKey(k), tx_(std::move(tx)) + { + } + + virtual Expected + cacheLedgerObj(uint256 const&, int32_t cacheIdx) override + { + static int32_t intIdx = 0; + + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cacheIdx) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + if (cacheIdx >= MAX_CACHE) + cacheIdx = intIdx++ % MAX_CACHE; + } + else + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOTS_FULL); + + cache[cacheIdx] = env_.le(leKey); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; + } + + static Bytes + getAnyFieldData(STBase const& obj) + { + // auto const& fname = obj.getFName(); + auto const stype = obj.getSType(); + switch (stype) + { + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); + } + + Expected + getTxField(SField const& fname) override + { + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + static Expected + locateField(STObject const& obj, Slice const& loc) + { + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + { + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + field = &(arr->operator[](c)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + } + + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + return field; + } + + Expected + getTxNestedField(Slice const& locator) override + { + // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << + // std::endl; + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getTxArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getTxNestedArrayLen(Slice const& locator) override + { + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + updateData(Slice const& data) override + { + ripple::detail::ApplyViewBase v( + env_.app().openLedger().current().get(), tapNONE); + + auto sle = v.peek(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + sle->setFieldVL(sfData, data); + v.update(sle); + + return data.size(); + } + + Expected + computeSha512HalfHash(Slice const& data) override + { + auto const hash = sha512Half(data); + return hash; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + auto obj = nft::findToken(*env_.current(), account, nftId); + if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); + return Bytes(s.begin(), s.end()); + } +}; + +} // namespace test +} // namespace ripple diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index ccac0e2819a..24a951c83c4 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -2638,7 +2638,7 @@ class Vault_test : public beast::unit_test::suite { using namespace test::jtx; - testcase("failed pseudo-account allocation"); + testcase("Pseudo-account allocation failure"); Env env{*this, supported_amendments() | featureSingleAssetVault}; Account const owner{"owner"}; Vault vault{env}; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index e5d0a9f29f6..6c77706b8b5 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -34,6 +35,9 @@ namespace ripple { namespace test { +bool +testGetDataIncrement(); + using Add_proto = int32_t(int32_t, int32_t); static wasm_trap_t* Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) @@ -54,7 +58,7 @@ struct TestLedgerDataProvider { } - int32_t + Expected get_ledger_sqn() { return (int32_t)env->current()->seq(); @@ -67,893 +71,21 @@ getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) { auto sqn = reinterpret_cast(env)->get_ledger_sqn(); - results->data[0] = WASM_I32_VAL(sqn); + results->data[0] = WASM_I32_VAL(sqn.value()); results->num_elems = 1; return nullptr; } -struct TestHostFunctions : public HostFunctions -{ - test::jtx::Env& env_; - AccountID accountID_; - Bytes data_; - int clock_drift_ = 0; - void const* rt_ = nullptr; - -public: - TestHostFunctions(test::jtx::Env& env, int cd = 0) - : env_(env), clock_drift_(cd) - { - auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); - if (opt) - accountID_ = *opt; - std::string t = "10000"; - data_ = Bytes{t.begin(), t.end()}; - } - - virtual void - setRT(void const* rt) override - { - rt_ = rt; - } - - virtual void const* - getRT() const override - { - return rt_; - } - - beast::Journal - getJournal() override - { - return env_.journal; - } - - int32_t - getLedgerSqn() override - { - return static_cast(env_.current()->seq()); - } - - int32_t - getParentLedgerTime() override - { - return env_.current()->parentCloseTime().time_since_epoch().count() + - clock_drift_; - } - - Hash - getParentLedgerHash() override - { - return env_.current()->info().parentHash; - } - - virtual int32_t - cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override - { - return 1; - } - - Expected - getTxField(SField const& fname) override - { - if (fname == sfAccount) - return Bytes(accountID_.begin(), accountID_.end()); - else if (fname == sfFee) - { - int64_t x = 235; - uint8_t const* p = reinterpret_cast(&x); - return Bytes{p, p + sizeof(x)}; - } - else if (fname == sfSequence) - { - int32_t x = getLedgerSqn(); - uint8_t const* p = reinterpret_cast(&x); - return Bytes{p, p + sizeof(x)}; - } - return Bytes(); - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - auto const& sn = fname.getName(); - if (sn == "Destination" || sn == "Account") - return Bytes(accountID_.begin(), accountID_.end()); - else if (sn == "Data") - return data_; - else if (sn == "FinishAfter") - { - auto t = - env_.current()->parentCloseTime().time_since_epoch().count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } - - return Unexpected(-1); - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - // auto const& sn = fname.getName(); - if (fname == sfBalance) - { - int64_t x = 10'000; - uint8_t const* p = reinterpret_cast(&x); - return Bytes{p, p + sizeof(x)}; - } - return data_; - } - - Expected - getTxNestedField(Slice const& locator) override - { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); - } - - Expected - getCurrentLedgerObjNestedField(Slice const& locator) override - { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); - } - - Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override - { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); - } - - int32_t - getTxArrayLen(SField const& fname) override - { - return 32; - } - - int32_t - getCurrentLedgerObjArrayLen(SField const& fname) override - { - return 32; - } - - int32_t - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override - { - return 32; - } - - int32_t - getTxNestedArrayLen(Slice const& locator) override - { - return 32; - } - - int32_t - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override - { - return 32; - } - - int32_t - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override - { - return 32; - } - - int32_t - updateData(Bytes const& data) override - { - return 0; - } - - Hash - computeSha512HalfHash(Bytes const& data) override - { - return env_.current()->info().parentHash; - } - - Expected - accountKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::account(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Bytes const& credentialType) override - { - if (!subject || !issuer || credentialType.empty()) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = - keylet::credential(subject, issuer, makeSlice(credentialType)); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::escrow(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::oracle(account, documentId); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - getNFT(AccountID const& account, uint256 const& nftId) override - { - if (!account || !nftId) - { - return Unexpected(HF_ERR_INVALID_PARAMS); - } - - std::string s = "https://ripple.com"; - return Bytes(s.begin(), s.end()); - } - - int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) override - { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().trace(); -#endif - j << msg; - if (!asHex) - j << std::string_view( - reinterpret_cast(data.data()), data.size()); - else - { - auto const hex = - boost::algorithm::hex(std::string(data.begin(), data.end())); - j << hex; - } - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return msg.size() + data.size() * (asHex ? 2 : 1); - } - - int32_t - traceNum(std::string const& msg, int64_t data) override - { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().trace(); -#endif - j << msg << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - return msg.size() + sizeof(data); - } -}; - -struct TestHostFunctionsSink : public TestHostFunctions -{ - test::StreamSink sink_; - beast::Journal jlog_; - void const* rt_ = nullptr; - -public: - explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) - : TestHostFunctions(env, cd) - , sink_(beast::severities::kDebug) - , jlog_(sink_) - { - } - - test::StreamSink& - getSink() - { - return sink_; - } - - beast::Journal - getJournal() override - { - return jlog_; - } -}; - -struct PerfHostFunctions : public HostFunctions +struct Wasm_test : public beast::unit_test::suite { - test::jtx::Env& env_; - - Keylet leKey; - static int constexpr MAX_CACHE = 256; - std::array, MAX_CACHE> cache; - std::shared_ptr tx_; - - void const* rt_ = nullptr; - -public: - PerfHostFunctions( - test::jtx::Env& env, - Keylet const& k, - std::shared_ptr&& tx) - : env_(env), leKey(k), tx_(std::move(tx)) - { - } - - virtual void - setRT(void const* rt) override - { - rt_ = rt; - } - - virtual void const* - getRT() const override - { - return rt_; - } - - beast::Journal - getJournal() override - { - return env_.journal; - } - - int32_t - getLedgerSqn() override - { - return static_cast(env_.current()->seq()); - } - - int32_t - getParentLedgerTime() override - { - return env_.current()->parentCloseTime().time_since_epoch().count(); - } - - Hash - getParentLedgerHash() override - { - return env_.current()->info().parentHash; - } - - virtual int32_t - cacheLedgerObj(Keylet const&, int32_t cacheIdx) override - { - static int32_t intIdx = 0; - - if (cacheIdx < 0 || cacheIdx > MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; - - if (!cacheIdx) - { - for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) - if (!cache[cacheIdx]) - break; - if (cacheIdx >= MAX_CACHE) - cacheIdx = intIdx++ % MAX_CACHE; - } - else - --cacheIdx; - - if (cacheIdx >= MAX_CACHE) - return HF_ERR_SLOTS_FULL; - - cache[cacheIdx] = env_.le(leKey); - return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; - } - - static Bytes - getAnyFieldData(STBase const& obj) - { - // auto const& fname = obj.getFName(); - auto const stype = obj.getSType(); - switch (stype) - { - case STI_UNKNOWN: - case STI_NOTPRESENT: - return {}; - break; - case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - break; - case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; - } - break; - case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - break; - case STI_UINT256: { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - break; - case STI_UINT32: { - auto const& super( - static_cast const&>(obj)); - std::uint32_t const data = super.value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; - } - break; - default: - break; - } - - Serializer msg; - obj.add(msg); - - return msg.getData(); - } - - Expected - getTxField(SField const& fname) override - { - auto const* field = tx_->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - auto const sle = env_.le(leKey); - if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - - auto const* field = sle->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - static Expected - locateField(STObject const& obj, Slice const& loc) - { - if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - - int32_t const* l = reinterpret_cast(loc.data()); - int32_t const sz = loc.size() / 4; - STBase const* field = nullptr; - auto const& m = SField::getKnownCodeToField(); - - { - int32_t const c = l[0]; - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); - - field = obj.peekAtPField(fname); - if (!field || (STI_NOTPRESENT == field->getSType())) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - } - - for (int i = 1; i < sz; ++i) - { - int32_t const c = l[i]; - - if (STI_ARRAY == field->getSType()) - { - auto const* arr = static_cast(field); - if (c >= arr->size()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - field = &(arr->operator[](c)); - } - else if (STI_OBJECT == field->getSType()) - { - auto const* o = static_cast(field); - - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); - - field = o->peekAtPField(fname); - } - else // simple field must be the last one - { - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - } - - if (!field || (STI_NOTPRESENT == field->getSType())) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - } - - return field; - } - - Expected - getTxNestedField(Slice const& locator) override - { - // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << - // std::endl; - auto const r = locateField(*tx_, locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getCurrentLedgerObjNestedField(Slice const& locator) override - { - auto const sle = env_.le(leKey); - if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - - auto const r = locateField(*sle, locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const r = locateField(*cache[cacheIdx], locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - int32_t - getTxArrayLen(SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; - - auto const* field = tx_->peekAtPField(fname); - if (!field) - return HF_ERR_FIELD_NOT_FOUND; - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getCurrentLedgerObjArrayLen(SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; - - auto const sle = env_.le(leKey); - if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; - - auto const* field = sle->peekAtPField(fname); - if (!field) - return HF_ERR_FIELD_NOT_FOUND; - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; - - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return HF_ERR_FIELD_NOT_FOUND; - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getTxNestedArrayLen(Slice const& locator) override - { - auto const r = locateField(*tx_, locator); - if (!r) - return r.error(); - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override - { - auto const sle = env_.le(leKey); - if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; - auto const r = locateField(*sle, locator); - if (!r) - return r.error(); - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const r = locateField(*cache[cacheIdx], locator); - if (!r) - return r.error(); - - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - updateData(Bytes const& data) override - { - ripple::detail::ApplyViewBase v( - env_.app().openLedger().current().get(), tapNONE); - - auto sle = v.peek(leKey); - if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; - - sle->setFieldVL(sfData, data); - v.update(sle); - - return data.size(); - } - - Hash - computeSha512HalfHash(Bytes const& data) override - { - auto const hash = sha512Half(data); - return hash; - } - - Expected - accountKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::account(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Bytes const& credentialType) override - { - if (!subject || !issuer || credentialType.empty() || - credentialType.size() > maxCredentialTypeLength) - return Unexpected(HF_ERR_INVALID_PARAMS); - - auto const keylet = - keylet::credential(subject, issuer, makeSlice(credentialType)); - - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::escrow(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::oracle(account, documentId); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - getNFT(AccountID const& account, uint256 const& nftId) override - { - if (!account || !nftId) - { - getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; - return Unexpected(HF_ERR_INVALID_PARAMS); - } - - auto obj = nft::findToken(*env_.current(), account, nftId); - if (!obj) - { - getJournal().trace() << "WAMR getNFT: NFT not found"; - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - } - - auto ouri = obj->at(~sfURI); - if (!ouri) - return Bytes(); - - Slice const s = ouri->value(); - return Bytes(s.begin(), s.end()); - } - - int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) override - { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().error(); -#endif - if (!asHex) - j << msg - << std::string_view( - reinterpret_cast(data.data()), data.size()); - else - { - auto const hex = - boost::algorithm::hex(std::string(data.begin(), data.end())); - j << msg << hex; - } - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return msg.size() + data.size() * (asHex ? 2 : 1); - } - - int32_t - traceNum(std::string const& msg, int64_t data) override + void + testGetDataHelperFunctions() { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().error(); -#endif - j << msg << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - return msg.size() + sizeof(data); + testcase("getData helper functions"); + BEAST_EXPECT(testGetDataIncrement()); } -}; -struct Wasm_test : public beast::unit_test::suite -{ void testWasmFib() { @@ -1300,10 +432,10 @@ struct Wasm_test : public beast::unit_test::suite explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - Expected + Expected getTxField(SField const& fname) override { - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } }; BadTestHostFunctions nfs(env); @@ -1320,7 +452,7 @@ struct Wasm_test : public beast::unit_test::suite explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - Expected + Expected getTxField(SField const& fname) override { return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); @@ -1361,7 +493,7 @@ struct Wasm_test : public beast::unit_test::suite auto const s = sink.messages().str(); BEAST_EXPECT( - countSubstr(s, "WAMR Error: failed to call func") == 1); + countSubstr(s, "WAMR Error: failure to call func") == 1); BEAST_EXPECT( countSubstr(s, "Exception: wasm operand stack overflow") > 0); } @@ -1387,7 +519,7 @@ struct Wasm_test : public beast::unit_test::suite } void - testEscrowWasmDN2() + testEscrowWasmDN3() { testcase("wasm devnet 3 test"); @@ -1602,6 +734,7 @@ struct Wasm_test : public beast::unit_test::suite { using namespace test::jtx; + testGetDataHelperFunctions(); testWasmLib(); testBadWasm(); testWasmCheckJson(); @@ -1620,7 +753,7 @@ struct Wasm_test : public beast::unit_test::suite // TODO: fix result testEscrowWasmDN1(); - testEscrowWasmDN2(); + testEscrowWasmDN3(); // perfTest(); } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 9ad697b1c10..64759ff8d07 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -795,7 +795,7 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) if (trap) { ret.f = true; - print_wasm_error("failed to call func", trap, j_); + print_wasm_error("failure to call func", trap, j_); } // assert(results[0].kind == WASM_I32); @@ -924,7 +924,7 @@ WamrEngine::runHlp( auto const res = call<1>(f, p); if (res.f) - throw std::runtime_error("<" + std::string(funcName) + "> failed"); + throw std::runtime_error("<" + std::string(funcName) + "> failure"); else if (!res.r.num_elems) throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 86eb174451d..b507d6fe696 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -29,25 +29,25 @@ namespace ripple { -enum HostFunctionErrors : int32_t { - HF_ERR_INTERNAL = -1, - HF_ERR_FIELD_NOT_FOUND = -2, - HF_ERR_BUFFER_TOO_SMALL = -3, - HF_ERR_NO_ARRAY = -4, - HF_ERR_NOT_LEAF_FIELD = -5, - HF_ERR_LOCATOR_MALFORMED = -6, - HF_ERR_SLOT_OUT_RANGE = -7, - HF_ERR_SLOTS_FULL = -8, - HF_ERR_EMPTY_SLOT = -9, - HF_ERR_LEDGER_OBJ_NOT_FOUND = -10, - HF_ERR_DECODING = -11, - HF_ERR_DATA_FIELD_TOO_LARGE = -12, - HF_ERR_POINTER_OUT_OF_BOUNDS = -13, - HF_ERR_NO_MEM_EXPORTED = -14, - HF_ERR_INVALID_PARAMS = -15, - HF_ERR_INVALID_ACCOUNT = -16, - HF_ERR_INVALID_FIELD = -17, - HF_ERR_INDEX_OUT_OF_BOUNDS = -18, +enum class HostFunctionError : int32_t { + INTERNAL = -1, + FIELD_NOT_FOUND = -2, + BUFFER_TOO_SMALL = -3, + NO_ARRAY = -4, + NOT_LEAF_FIELD = -5, + LOCATOR_MALFORMED = -6, + SLOT_OUT_RANGE = -7, + SLOTS_FULL = -8, + EMPTY_SLOT = -9, + LEDGER_OBJ_NOT_FOUND = -10, + DECODING = -11, + DATA_FIELD_TOO_LARGE = -12, + POINTER_OUT_OF_BOUNDS = -13, + NO_MEM_EXPORTED = -14, + INVALID_PARAMS = -15, + INVALID_ACCOUNT = -16, + INVALID_FIELD = -17, + INDEX_OUT_OF_BOUNDS = -18, }; struct HostFunctions @@ -69,157 +69,157 @@ struct HostFunctions return beast::Journal{beast::Journal::getNullSink()}; } - virtual int32_t + virtual Expected getLedgerSqn() { - return 1; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getParentLedgerTime() { - return 1; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Hash + virtual Expected getParentLedgerHash() { - return {}; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) + virtual Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getTxField(SField const& fname) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getCurrentLedgerObjField(SField const& fname) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getTxNestedField(Slice const& locator) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getCurrentLedgerObjNestedField(Slice const& locator) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getTxArrayLen(SField const& fname) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getCurrentLedgerObjArrayLen(SField const& fname) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getTxNestedArrayLen(Slice const& locator) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getCurrentLedgerObjNestedArrayLen(Slice const& locator) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - updateData(Bytes const& data) + virtual Expected + updateData(Slice const& data) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Hash - computeSha512HalfHash(Bytes const& data) + virtual Expected + computeSha512HalfHash(Slice const& data) { - return Hash{}; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected accountKeylet(AccountID const& account) { - return Bytes{}; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected credentialKeylet( AccountID const& subject, AccountID const& issuer, - Bytes const& credentialType) + Slice const& credentialType) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected escrowKeylet(AccountID const& account, std::uint32_t seq) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected oracleKeylet(AccountID const& account, std::uint32_t docId) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getNFT(AccountID const& account, uint256 const& nftId) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) + virtual Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - traceNum(std::string const& msg, int64_t data) + virtual Expected + traceNum(std::string_view const& msg, int64_t data) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } virtual ~HostFunctions() = default; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 7c804f376d9..6c7ae43d91e 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -30,29 +30,30 @@ namespace ripple { -int32_t +Expected WasmHostFunctionsImpl::getLedgerSqn() { return ctx.view().seq(); } -int32_t +Expected WasmHostFunctionsImpl::getParentLedgerTime() { return ctx.view().parentCloseTime().time_since_epoch().count(); } -Hash +Expected WasmHostFunctionsImpl::getParentLedgerHash() { return ctx.view().info().parentHash; } -int32_t -WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) +Expected +WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { + auto const& keylet = keylet::unchecked(objId); if (cacheIdx < 0 || cacheIdx > MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cacheIdx) { @@ -64,60 +65,61 @@ WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) --cacheIdx; if (cacheIdx >= MAX_CACHE) - return HF_ERR_SLOTS_FULL; + return Unexpected(HostFunctionError::SLOTS_FULL); cache[cacheIdx] = ctx.view().read(keylet); - return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; } -static Expected +static Expected getAnyFieldData(STBase const* obj) { // auto const& fname = obj.getFName(); if (!obj) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); auto const stype = obj->getSType(); switch (stype) { case STI_UNKNOWN: case STI_NOTPRESENT: - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); break; case STI_OBJECT: case STI_ARRAY: - return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super->value(); + auto const& account(static_cast(obj)); + auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } break; case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super->xrp().drops(); + auto const& amount(static_cast(obj)); + int64_t const data = amount->xrp().drops(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); return Bytes{b, e}; } break; case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super->value(); + auto const& vl(static_cast(obj)); + auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT256: { - auto const& super(static_cast const*>(obj)); - auto const& data = super->value(); + auto const& num(static_cast const*>(obj)); + auto const& data = num->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT32: { - auto const& super( - static_cast const*>(obj)); - std::uint32_t const data = super->value(); + auto const& num(static_cast const*>(obj)); + std::uint32_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); return Bytes{b, e}; @@ -133,29 +135,29 @@ getAnyFieldData(STBase const* obj) return msg.getData(); } -Expected +Expected WasmHostFunctionsImpl::getTxField(SField const& fname) { return getAnyFieldData(ctx.tx.peekAtPField(fname)); } -Expected +Expected WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) { auto const sle = ctx.view().read(leKey); if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); return getAnyFieldData(sle->peekAtPField(fname)); } -Expected +Expected WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return Unexpected(HF_ERR_EMPTY_SLOT); + return Unexpected(HostFunctionError::EMPTY_SLOT); return getAnyFieldData(cache[cacheIdx]->peekAtPField(fname)); } @@ -166,11 +168,11 @@ noField(STBase const* field) (STI_UNKNOWN == field->getSType()); } -static Expected +static Expected locateField(STObject const& obj, Slice const& loc) { if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); int32_t const* l = reinterpret_cast(loc.data()); int32_t const sz = loc.size() / 4; @@ -181,12 +183,12 @@ locateField(STObject const& obj, Slice const& loc) int32_t const c = l[0]; auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_INVALID_FIELD); + return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); field = obj.peekAtPField(fname); if (noField(field)) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } for (int i = 1; i < sz; ++i) @@ -197,7 +199,7 @@ locateField(STObject const& obj, Slice const& loc) { auto const* arr = static_cast(field); if (c >= arr->size()) - return Unexpected(HF_ERR_INDEX_OUT_OF_BOUNDS); + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](c)); } else if (STI_OBJECT == field->getSType()) @@ -206,24 +208,24 @@ locateField(STObject const& obj, Slice const& loc) auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_INVALID_FIELD); + return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); field = o->peekAtPField(fname); } else // simple field must be the last one { - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); } if (noField(field)) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } return field; } -Expected +Expected WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) { auto const r = locateField(ctx.tx, locator); @@ -233,12 +235,12 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) return getAnyFieldData(r.value()); } -Expected +Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) { auto const sle = ctx.view().read(leKey); if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto const r = locateField(*sle, locator); if (!r) @@ -247,17 +249,17 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) return getAnyFieldData(r.value()); } -Expected +Expected WasmHostFunctionsImpl::getLedgerObjNestedField( int32_t cacheIdx, Slice const& locator) { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return Unexpected(HF_ERR_EMPTY_SLOT); + return Unexpected(HostFunctionError::EMPTY_SLOT); auto const r = locateField(*cache[cacheIdx], locator); if (!r) @@ -266,217 +268,220 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( return getAnyFieldData(r.value()); } -int32_t +Expected WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) { if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); auto const* field = ctx.tx.peekAtPField(fname); if (noField(field)) - return HF_ERR_FIELD_NOT_FOUND; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) { if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); auto const sle = ctx.view().read(leKey); if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto const* field = sle->peekAtPField(fname); if (noField(field)) - return HF_ERR_FIELD_NOT_FOUND; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getLedgerObjArrayLen( int32_t cacheIdx, SField const& fname) { if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return HF_ERR_EMPTY_SLOT; + return Unexpected(HostFunctionError::EMPTY_SLOT); auto const* field = cache[cacheIdx]->peekAtPField(fname); if (noField(field)) - return HF_ERR_FIELD_NOT_FOUND; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) { auto const r = locateField(ctx.tx, locator); if (!r) - return r.error(); + return Unexpected(r.error()); auto const* field = r.value(); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) { auto const sle = ctx.view().read(leKey); if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto const r = locateField(*sle, locator); if (!r) - return r.error(); + return Unexpected(r.error()); auto const* field = r.value(); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( int32_t cacheIdx, Slice const& locator) { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return HF_ERR_EMPTY_SLOT; + return Unexpected(HostFunctionError::EMPTY_SLOT); auto const r = locateField(*cache[cacheIdx], locator); if (!r) - return r.error(); + return Unexpected(r.error()); auto const* field = r.value(); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t -WasmHostFunctionsImpl::updateData(Bytes const& data) +Expected +WasmHostFunctionsImpl::updateData(Slice const& data) { + if (data.size() > maxWasmDataLength) + { + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + } auto sle = ctx.view().peek(leKey); if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); sle->setFieldVL(sfData, data); ctx.view().update(sle); return 0; } -Hash -WasmHostFunctionsImpl::computeSha512HalfHash(Bytes const& data) +Expected +WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) { auto const hash = sha512Half(data); return hash; } -Expected +Expected WasmHostFunctionsImpl::accountKeylet(AccountID const& account) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::account(account); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::credentialKeylet( AccountID const& subject, AccountID const& issuer, - Bytes const& credentialType) + Slice const& credentialType) { if (!subject || !issuer) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = - keylet::credential(subject, issuer, makeSlice(credentialType)); + auto const keylet = keylet::credential(subject, issuer, credentialType); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::escrow(account, seq); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::oracleKeylet( AccountID const& account, std::uint32_t documentId) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::oracle(account, documentId); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); if (!nftId) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); auto obj = nft::findToken(ctx.view(), account, nftId); if (!obj) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto ouri = obj->at(~sfURI); if (!ouri) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); } -int32_t +Expected WasmHostFunctionsImpl::trace( - std::string const& msg, - Bytes const& data, + std::string_view const& msg, + Slice const& data, bool asHex) { #ifdef DEBUG_OUTPUT @@ -485,21 +490,24 @@ WasmHostFunctionsImpl::trace( auto j = ctx.journal.trace(); #endif if (!asHex) + { j << "WAMR TRACE (" << leKey.key << "): " << msg << " - " << std::string_view( reinterpret_cast(data.data()), data.size()); + } else { - auto const hex = - boost::algorithm::hex(std::string(data.begin(), data.end())); + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex(data.begin(), data.end(), hex.begin()); j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); } -int32_t -WasmHostFunctionsImpl::traceNum(std::string const& msg, int64_t data) +Expected +WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { #ifdef DEBUG_OUTPUT auto j = ctx.journal.error(); diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index 091ca249345..58bf4c194a8 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -57,83 +57,83 @@ class WasmHostFunctionsImpl : public HostFunctions return ctx.journal; } - int32_t + Expected getLedgerSqn() override; - int32_t + Expected getParentLedgerTime() override; - Hash + Expected getParentLedgerHash() override; - int32_t - cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override; + Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override; - Expected + Expected getTxField(SField const& fname) override; - Expected + Expected getCurrentLedgerObjField(SField const& fname) override; - Expected + Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) override; - Expected + Expected getTxNestedField(Slice const& locator) override; - Expected + Expected getCurrentLedgerObjNestedField(Slice const& locator) override; - Expected + Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override; - int32_t + Expected getTxArrayLen(SField const& fname) override; - int32_t + Expected getCurrentLedgerObjArrayLen(SField const& fname) override; - int32_t + Expected getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override; - int32_t + Expected getTxNestedArrayLen(Slice const& locator) override; - int32_t + Expected getCurrentLedgerObjNestedArrayLen(Slice const& locator) override; - int32_t + Expected getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override; - int32_t - updateData(Bytes const& data) override; + Expected + updateData(Slice const& data) override; - Hash - computeSha512HalfHash(Bytes const& data) override; + Expected + computeSha512HalfHash(Slice const& data) override; - Expected + Expected accountKeylet(AccountID const& account) override; - Expected + Expected credentialKeylet( AccountID const& subject, AccountID const& issuer, - Bytes const& credentialType) override; + Slice const& credentialType) override; - Expected + Expected escrowKeylet(AccountID const& account, std::uint32_t seq) override; - Expected + Expected oracleKeylet(AccountID const& account, std::uint32_t documentId) override; - Expected + Expected getNFT(AccountID const& account, uint256 const& nftId) override; - int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) override; + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override; - int32_t - traceNum(std::string const& msg, int64_t data) override; + Expected + traceNum(std::string_view const& msg, int64_t data) override; }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 0c502733620..f1de9b22355 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -26,6 +26,8 @@ namespace ripple { +using SFieldCRef = std::reference_wrapper; + static int32_t setData( InstanceWrapper const* rt, @@ -38,70 +40,199 @@ setData( return 0; if (dst < 0 || dsz < 0 || !src || ssz < 0) - return HF_ERR_INVALID_PARAMS; + return static_cast>( + HostFunctionError::INVALID_PARAMS); auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) - return HF_ERR_NO_MEM_EXPORTED; + return static_cast>( + HostFunctionError::NO_MEM_EXPORTED); if (dst + dsz > mem.s) - return HF_ERR_POINTER_OUT_OF_BOUNDS; + return static_cast>( + HostFunctionError::POINTER_OUT_OF_BOUNDS); if (ssz > dsz) - return HF_ERR_BUFFER_TOO_SMALL; + return static_cast>( + HostFunctionError::BUFFER_TOO_SMALL); memcpy(mem.p + dst, src, ssz); return ssz; } -static Expected -getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) +template +Expected +getDataInt32(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const result = params->data[i].of.i32; + i++; + return result; +} + +template +Expected +getDataInt64(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const result = params->data[i].of.i64; + i++; + return result; +} + +template +Expected +getDataSField(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[i].of.i32); + if (it == m.end()) + { + return Unexpected(HostFunctionError::INVALID_FIELD); + } + i++; + return *it->second; +} + +template +Expected +getDataSlice(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { + auto const src = params->data[i].of.i32; + auto const ssz = params->data[i + 1].of.i32; if (src < 0 || ssz <= 0) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); + + if (ssz > maxWasmDataLength) + { + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + } auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) - return Unexpected(HF_ERR_NO_MEM_EXPORTED); + return Unexpected(HostFunctionError::NO_MEM_EXPORTED); if (src + ssz > mem.s) - return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); + return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); - Bytes data(mem.p + src, mem.p + src + ssz); + Slice data(mem.p + src, ssz); + i += 2; return data; } -static Expected -getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) +template +Expected +getDataUInt256(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getData(rt, ptr, sz); - if (!r || (r->size() != AccountID::bytes)) - return Unexpected(HF_ERR_INVALID_PARAMS); + auto const r = getDataSlice(rt, params, i); + if (!r) + { + return Unexpected(r.error()); + } - return AccountID::fromVoid(r->data()); + if (r->size() != uint256::bytes) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + return uint256::fromVoid(r->data()); } -static Expected -getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) +template +Expected +getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { - if (src < 0 || ssz <= 0) - return Unexpected(HF_ERR_INVALID_PARAMS); + auto const r = getDataSlice(rt, params, i); + if (!r || (r->size() != AccountID::bytes)) + return Unexpected(HostFunctionError::INVALID_PARAMS); - auto mem = rt ? rt->getMem() : wmem(); - if (!mem.s) - return Unexpected(HF_ERR_NO_MEM_EXPORTED); + return AccountID::fromVoid(r->data()); +} - if (src + ssz > mem.s) - return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); +template +Expected +getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(rt, params, i); + if (!r) + return Unexpected(r.error()); + return std::string_view( + reinterpret_cast(r->data()), r->size()); +} - std::string data(mem.p + src, mem.p + src + ssz); - return data; +std::nullptr_t +hfResult(wasm_val_vec_t* results, int32_t value) +{ + results->data[0] = WASM_I32_VAL(value); + results->num_elems = 1; + return nullptr; } -#define RET(x) \ - results->data[0] = WASM_I32_VAL(x); \ - results->num_elems = 1; \ +std::nullptr_t +hfResult(wasm_val_vec_t* results, HostFunctionError value) +{ + results->data[0] = WASM_I32_VAL( + static_cast>(value)); + results->num_elems = 1; return nullptr; +} + +template +std::nullptr_t +returnResult( + InstanceWrapper const* rt, + wasm_val_vec_t const* params, + wasm_val_vec_t* results, + Expected const& res, + int32_t index) +{ + if (!res) + { + return hfResult(results, res.error()); + } + if constexpr (std::is_same_v, Bytes>) + { + return hfResult( + results, + setData( + rt, + params->data[index].of.i32, + params->data[index + 1].of.i32, + res->data(), + res->size())); + } + else if constexpr (std::is_same_v, Hash>) + { + return hfResult( + results, + setData( + rt, + params->data[index].of.i32, + params->data[index + 1].of.i32, + res->data(), + res->size())); + } + else if constexpr (std::is_same_v, int32_t>) + { + return hfResult(results, res.value()); + } + else if constexpr (std::is_same_v< + std::decay_t, + std::uint32_t>) + { + auto const resultValue = res.value(); + return hfResult( + results, + setData( + rt, + params->data[index].of.i32, + params->data[index + 1].of.i32, + reinterpret_cast(&resultValue), + static_cast(sizeof(resultValue)))); + } + else + { + static_assert( + [] { return false; }(), "Unhandled return type in returnResult"); + } +} wasm_trap_t* getLedgerSqnOld_wrap( @@ -111,8 +242,12 @@ getLedgerSqnOld_wrap( { auto* hf = reinterpret_cast(env); // auto const* rt = reinterpret_cast(hf->getRT()); - int32_t const sqn = hf->getLedgerSqn(); - RET(sqn); + auto const sqn = hf->getLedgerSqn(); + if (!sqn) + { + return hfResult(results, sqn.error()); + } + return hfResult(results, static_cast(sqn.value())); } wasm_trap_t* @@ -123,14 +258,9 @@ getLedgerSqn_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - int32_t const sqn = hf->getLedgerSqn(); + int index = 0; - RET(setData( - rt, - params->data[0].of.i32, - params->data[1].of.i32, - reinterpret_cast(&sqn), - static_cast(sizeof(sqn)))); + return returnResult(rt, params, results, hf->getLedgerSqn(), index); } wasm_trap_t* @@ -141,13 +271,9 @@ getParentLedgerTime_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - int32_t const ltime = hf->getParentLedgerTime(); - RET(setData( - rt, - params->data[0].of.i32, - params->data[1].of.i32, - reinterpret_cast(<ime), - static_cast(sizeof(ltime)))); + int index = 0; + + return returnResult(rt, params, results, hf->getParentLedgerTime(), index); } wasm_trap_t* @@ -158,13 +284,9 @@ getParentLedgerHash_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - Hash const hash = hf->getParentLedgerHash(); - RET(setData( - rt, - params->data[0].of.i32, - params->data[1].of.i32, - hash.data(), - static_cast(hash.size()))); + int index = 0; + + return returnResult(rt, params, results, hf->getParentLedgerHash(), index); } wasm_trap_t* @@ -175,22 +297,22 @@ cacheLedgerObj_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const id = getDataUInt256(rt, params, index); + if (!id) { - RET(r.error()); + return hfResult(results, id.error()); } - if (r->size() != uint256::bytes) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(HF_ERR_INVALID_PARAMS); + return hfResult(results, cache.error()); } - uint256 const key(uint256::fromVoid(r->data())); - int32_t const idx = - hf->cacheLedgerObj(keylet::unchecked(key), params->data[2].of.i32); - RET(idx); + return returnResult( + rt, params, results, hf->cacheLedgerObj(*id, *cache), index); } wasm_trap_t* @@ -201,27 +323,14 @@ getTxField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) - { - RET(HF_ERR_INVALID_FIELD); - } - auto const& fname(*it->second); - - auto fieldData = hf->getTxField(fname); - if (!fieldData) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(fieldData.error()); + return hfResult(results, fname.error()); } - - RET(setData( - rt, - params->data[1].of.i32, - params->data[2].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult(rt, params, results, hf->getTxField(*fname), index); } wasm_trap_t* @@ -232,27 +341,16 @@ getCurrentLedgerObjField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - auto fieldData = hf->getCurrentLedgerObjField(fname); - if (!fieldData) - { - RET(fieldData.error()); - } - - RET(setData( - rt, - params->data[1].of.i32, - params->data[2].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getCurrentLedgerObjField(*fname), index); } wasm_trap_t* @@ -263,27 +361,22 @@ getLedgerObjField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[1].of.i32); - if (it == m.end()) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, cache.error()); } - auto const& fname(*it->second); - auto fieldData = hf->getLedgerObjField(params->data[0].of.i32, fname); - if (!fieldData) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(fieldData.error()); + return hfResult(results, fname.error()); } - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getLedgerObjField(*cache, *fname), index); } wasm_trap_t* @@ -294,25 +387,16 @@ getTxNestedField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - auto fieldData = hf->getTxNestedField(makeSlice(r.value())); - if (!fieldData) - { - RET(fieldData.error()); - } - - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getTxNestedField(*bytes), index); } wasm_trap_t* @@ -323,25 +407,15 @@ getCurrentLedgerObjNestedField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - - auto fieldData = hf->getCurrentLedgerObjNestedField(makeSlice(r.value())); - if (!fieldData) - { - RET(fieldData.error()); - } - - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getCurrentLedgerObjNestedField(*bytes), index); } wasm_trap_t* @@ -352,26 +426,26 @@ getLedgerObjNestedField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); - if (!r) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(r.error()); + return hfResult(results, cache.error()); } - auto fieldData = hf->getLedgerObjNestedField( - params->data[0].of.i32, makeSlice(r.value())); - if (!fieldData) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(fieldData.error()); + return hfResult(results, bytes.error()); } - RET(setData( + return returnResult( rt, - params->data[3].of.i32, - params->data[4].of.i32, - fieldData->data(), - fieldData->size())); + params, + results, + hf->getLedgerObjNestedField(*cache, *bytes), + index); } wasm_trap_t* @@ -381,18 +455,16 @@ getTxArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getTxArrayLen(fname); - RET(sz); + return returnResult(rt, params, results, hf->getTxArrayLen(*fname), index); } wasm_trap_t* @@ -402,18 +474,17 @@ getCurrentLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getCurrentLedgerObjArrayLen(fname); - RET(sz); + return returnResult( + rt, params, results, hf->getCurrentLedgerObjArrayLen(*fname), index); } wasm_trap_t* @@ -423,18 +494,23 @@ getLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[1].of.i32); - if (it == m.end()) + auto const cache = getDataInt32(rt, params, index); + if (!cache) + { + return hfResult(results, cache.error()); + } + + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getLedgerObjArrayLen(params->data[0].of.i32, fname); - RET(sz); + return returnResult( + rt, params, results, hf->getLedgerObjArrayLen(*cache, *fname), index); } wasm_trap_t* @@ -445,15 +521,16 @@ getTxNestedArrayLen_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - int32_t sz = hf->getTxNestedArrayLen(makeSlice(r.value())); - RET(sz); + return returnResult( + rt, params, results, hf->getTxNestedArrayLen(*bytes), index); } wasm_trap_t* @@ -464,17 +541,21 @@ getCurrentLedgerObjNestedArrayLen_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - int32_t sz = hf->getCurrentLedgerObjNestedArrayLen(makeSlice(r.value())); - RET(sz); + return returnResult( + rt, + params, + results, + hf->getCurrentLedgerObjNestedArrayLen(*bytes), + index); } - wasm_trap_t* getLedgerObjNestedArrayLen_wrap( void* env, @@ -483,16 +564,25 @@ getLedgerObjNestedArrayLen_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); - if (!r) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(r.error()); + return hfResult(results, cache.error()); } - int32_t sz = hf->getLedgerObjNestedArrayLen( - params->data[0].of.i32, makeSlice(r.value())); - RET(sz); + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + return returnResult( + rt, + params, + results, + hf->getLedgerObjNestedArrayLen(*cache, *bytes), + index); } wasm_trap_t* @@ -503,19 +593,15 @@ updateData_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) - { - RET(HF_ERR_DATA_FIELD_TOO_LARGE) - } - - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - RET(hf->updateData(r.value())); + return returnResult(rt, params, results, hf->updateData(*bytes), index); } wasm_trap_t* @@ -526,25 +612,15 @@ computeSha512HalfHash_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) - { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); - } - - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - - auto const hash = hf->computeSha512HalfHash(r.value()); - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - hash.data(), - hash.size())); + return returnResult( + rt, params, results, hf->computeSha512HalfHash(*bytes), index); } wasm_trap_t* @@ -555,26 +631,15 @@ accountKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); - } - - auto const k = hf->accountKeylet(acc.value()); - if (!k) - { - RET(k.error()); + return hfResult(results, acc.error()); } - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - k->data(), - k->size())); + return returnResult(rt, params, results, hf->accountKeylet(*acc), index); } wasm_trap_t* @@ -585,41 +650,32 @@ credentialKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const subject = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!subject) + auto const subj = getDataAccountID(rt, params, index); + if (!subj) { - RET(subject.error()); + return hfResult(results, subj.error()); } - auto const issuer = - getDataAccount(rt, params->data[2].of.i32, params->data[3].of.i32); - if (!issuer) + auto const iss = getDataAccountID(rt, params, index); + if (!iss) { - RET(issuer.error()); + return hfResult(results, iss.error()); } - auto const credType = - getData(rt, params->data[4].of.i32, params->data[5].of.i32); + auto const credType = getDataSlice(rt, params, index); if (!credType) { - RET(credType.error()); + return hfResult(results, credType.error()); } - auto const k = - hf->credentialKeylet(subject.value(), issuer.value(), credType.value()); - if (!k) - { - RET(k.error()); - } - - RET(setData( + return returnResult( rt, - params->data[6].of.i32, - params->data[7].of.i32, - k->data(), - k->size())); + params, + results, + hf->credentialKeylet(*subj, *iss, *credType), + index); } wasm_trap_t* @@ -630,26 +686,22 @@ escrowKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); + return hfResult(results, acc.error()); } - auto const k = hf->escrowKeylet(acc.value(), params->data[2].of.i32); - if (!k) + auto const seq = getDataInt32(rt, params, index); + if (!seq) { - RET(k.error()); + return hfResult(results, seq.error()); } - RET(setData( - rt, - params->data[3].of.i32, - params->data[4].of.i32, - k->data(), - k->size())); + return returnResult( + rt, params, results, hf->escrowKeylet(*acc, *seq), index); } wasm_trap_t* @@ -660,26 +712,21 @@ oracleKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); + return hfResult(results, acc.error()); } - auto const k = hf->oracleKeylet(acc.value(), params->data[2].of.i32); - if (!k) + auto const seq = getDataInt32(rt, params, index); + if (!seq) { - RET(k.error()); + return hfResult(results, seq.error()); } - - RET(setData( - rt, - params->data[3].of.i32, - params->data[4].of.i32, - k->data(), - k->size())); + return returnResult( + rt, params, results, hf->oracleKeylet(*acc, *seq), index); } wasm_trap_t* @@ -687,42 +734,21 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); + return hfResult(results, acc.error()); } - auto const nftRaw = - getData(rt, params->data[2].of.i32, params->data[3].of.i32); - if (!nftRaw) + auto const nftId = getDataUInt256(rt, params, index); + if (!nftId) { - RET(nftRaw.error()); + return hfResult(results, nftId.error()); } - if (nftRaw->size() != uint256::bytes) - { - hf->getJournal().trace() - << "WAMR getNFT: Invalid NFT data size: " << nftRaw->size() - << ", expected " << (uint256::bytes); - RET(HF_ERR_INVALID_PARAMS); - } - - uint256 const ntfId(uint256::fromVoid(nftRaw->data())); - auto const nftURI = hf->getNFT(acc.value(), ntfId); - if (!nftURI) - { - RET(nftURI.error()); - } - - RET(setData( - rt, - params->data[4].of.i32, - params->data[5].of.i32, - nftURI->data(), - nftURI->size())); + return returnResult(rt, params, results, hf->getNFT(*acc, *nftId), index); } wasm_trap_t* @@ -730,28 +756,33 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = - getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const msg = getDataString(rt, params, index); if (!msg) { - RET(msg.error()); + return hfResult(results, msg.error()); } - auto const data = - getData(rt, params->data[2].of.i32, params->data[3].of.i32); + auto const data = getDataSlice(rt, params, index); if (!data) { - RET(data.error()); + return hfResult(results, data.error()); + } + + auto const asHex = getDataInt32(rt, params, index); + if (!asHex) + { + return hfResult(results, asHex.error()); } - auto const e = hf->trace(msg.value(), data.value(), params->data[4].of.i32); - RET(e); + return returnResult( + rt, params, results, hf->trace(*msg, *data, *asHex), index); } wasm_trap_t* @@ -759,21 +790,155 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - + int index = 0; if (params->data[1].of.i32 > maxWasmDataLength) { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = - getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const msg = getDataString(rt, params, index); if (!msg) { - RET(msg.error()); + return hfResult(results, msg.error()); + } + + auto const number = getDataInt64(rt, params, index); + if (!number) + { + return hfResult(results, number.error()); + } + + return returnResult( + rt, params, results, hf->traceNum(*msg, *number), index); +} + +class MockInstanceWrapper +{ + wmem mem_; + +public: + MockInstanceWrapper(wmem mem) : mem_(mem) + { + } + + // Mock methods to simulate the behavior of InstanceWrapper + wmem + getMem() const + { + return mem_; + } +}; + +namespace test { +bool +testGetDataIncrement() +{ + wasm_val_t values[4]; + + std::array buffer = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + MockInstanceWrapper rt(wmem{buffer.data(), buffer.size()}); + + { + // test int32_t + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(42); + + int index = 0; + auto const result = getDataInt32(&rt, ¶ms, index); + if (!result || result.value() != 42 || index != 1) + return false; + } + + { + // test int64_t + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I64_VAL(1234); + + int index = 0; + auto const result = getDataInt64(&rt, ¶ms, index); + if (!result || result.value() != 1234 || index != 1) + return false; + } + + { + // test SFieldCRef + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(sfAccount.fieldCode); + + int index = 0; + auto const result = getDataSField(&rt, ¶ms, index); + if (!result || result.value().get() != sfAccount || index != 1) + return false; + } + + { + // test Slice + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(3); + + int index = 0; + auto const result = getDataSlice(&rt, ¶ms, index); + if (!result || result.value() != Slice(buffer.data(), 3)) + return false; + } + + { + // test string + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(5); + + int index = 0; + auto const result = getDataString(&rt, ¶ms, index); + if (!result || + result.value() != + std::string_view( + reinterpret_cast(buffer.data()), 5)) + return false; + } + + { + // test account + AccountID const id(calcAccountID( + generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); + + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(id.bytes); + memcpy(&buffer[0], id.data(), id.bytes); + + int index = 0; + auto const result = getDataAccountID(&rt, ¶ms, index); + if (!result || result.value() != id) + return false; + } + + { + // test uint256 + + Hash h1 = sha512Half(Slice(buffer.data(), 8)); + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(h1.bytes); + memcpy(&buffer[0], h1.data(), h1.bytes); + + int index = 0; + auto const result = getDataUInt256(&rt, ¶ms, index); + if (!result || result.value() != h1) + return false; } - auto const e = hf->traceNum(msg.value(), params->data[2].of.i64); - RET(e); + return true; } +} // namespace test } // namespace ripple From 24b7a03224f1cfc9e5d9275a33167df902379684 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 17 Jul 2025 12:37:41 -0400 Subject: [PATCH 33/73] feat: add more keylet host functions (#5522) --- src/test/app/Escrow_test.cpp | 88 ++++++- src/test/app/wasm_fixtures/fixtures.cpp | 241 +++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/test/unit_test/SuiteJournal.h | 2 + src/xrpld/app/misc/WasmHostFunc.h | 67 +++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 115 ++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 40 ++- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 290 ++++++++++++++++++++- src/xrpld/app/misc/WasmHostFuncWrapper.h | 101 +++++++ src/xrpld/app/misc/WasmVM.cpp | 12 +- src/xrpld/app/tx/detail/Escrow.cpp | 2 +- 11 files changed, 944 insertions(+), 16 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 1ade21eb59b..b3409ed14fd 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2263,23 +2263,11 @@ struct Escrow_test : public beast::unit_test::suite // TODO: create wasm module for all host functions static auto wasmHex = allHostFunctionsHex; - // let sender = get_tx_account_id(); - // let owner = get_current_escrow_account_id(); - // let dest = get_current_escrow_destination(); - // let dest_balance = get_account_balance(dest); - // let escrow_data = get_current_escrow_data(); - // let ed_str = String::from_utf8(escrow_data).unwrap(); - // let threshold_balance = ed_str.parse::().unwrap(); - // let pl_time = host_lib::getParentLedgerTime(); - // let e_time = get_current_escrow_finish_after(); - // sender == owner && dest_balance <= threshold_balance && - // pl_time >= e_time Account const alice{"alice"}; Account const carol{"carol"}; { - // basic FinishFunction situation Env env(*this); // create escrow env.fund(XRP(5000), alice, carol); @@ -2350,6 +2338,81 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testKeyletHostFunctions() + { + testcase("Test all keylet host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: create wasm module for all host functions + static auto wasmHex = keyletHostFunctions; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + Env env(*this); + env.fund(XRP(5000), alice, carol); + } + + { + Env env{*this}; + env.fund(XRP(5000), alice, carol); + + BEAST_EXPECT(env.seq(alice) == 4); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + + // base objects that need to be created first + auto const tokenId = + token::getNextID(env, alice, 0, tfTransferable); + env(token::mint(alice, 0u), txflags(tfTransferable)); + env(trust(alice, carol["USD"](1'000'000))); + env.close(); + BEAST_EXPECT(env.seq(alice) == 6); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2); + + // set up a bunch of objects to check their keylets + env(check::create(alice, carol, XRP(100))); + env(credentials::create(alice, alice, "termsandconditions")); + env(delegate::set(alice, carol, {"TrustSet"})); + env(deposit::auth(alice, carol)); + env(did::set(alice), did::data("alice_did")); + env(escrow::create(alice, carol, XRP(100)), + escrow::finish_time(env.now() + 100s)); + env(token::createOffer(carol, tokenId, XRP(100)), + token::owner(alice)); + env(create(alice, carol, XRP(1000), 100s, alice.pk())); + env(signers(alice, 1, {{carol, 1}})); + env(ticket::create(alice, 1)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 11); + if (BEAST_EXPECTS( + env.seq(alice) == 16, std::to_string(env.seq(alice)))) + { + auto const seq = env.seq(alice); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrow::create(alice, carol, XRP(1000)), + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + auto const allowance = 1'000'000; + + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(txnFees)); + env.close(); + } + } + } + void testWithFeats(FeatureBitset features) { @@ -2371,6 +2434,7 @@ struct Escrow_test : public beast::unit_test::suite // TODO: Update module with new host functions testAllHostFunctions(); + testKeyletHostFunctions(); } public: diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 146c4338a03..c2dab9252a3 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11756,3 +11756,244 @@ extern std::string const opcCallPerfTest = "84afdf0021004494b768e11b6c9b42210141d1e3c6012102024003401000" "200041016b220041004a0d000b0b41010f0b0b01017f1001210220020f0b" "0b0e01004180080b07623a2025660a00"; + +extern std::string const keyletHostFunctions = + "0061736d01000000015b0c60057f7f7f7f7f017f60037f7f7f017f60037f7f7e017f60047f" + "7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f60000060037f7f7f0060027f7f0002c6031108686f73745f" + "6c6962057472616365000008686f73745f6c69621063616368655f6c65646765725f6f626a" + "000108686f73745f6c69620974726163655f6e756d000208686f73745f6c6962146765745f" + "6c65646765725f6f626a5f6669656c64000308686f73745f6c69621c6765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c64000108686f73745f6c69620e6163636f756e" + "745f6b65796c6574000308686f73745f6c69620b6c696e655f6b65796c6574000408686f73" + "745f6c69620c636865636b5f6b65796c6574000008686f73745f6c69621163726564656e74" + "69616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c6574" + "000508686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000508" + "686f73745f6c69620a6469645f6b65796c6574000308686f73745f6c69620d657363726f77" + "5f6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c65740000" + "08686f73745f6c69620e7061796368616e5f6b65796c6574000608686f73745f6c69620e73" + "69676e6572735f6b65796c6574000308686f73745f6c69620d7469636b65745f6b65796c65" + "740000030d0c0708090a0a0a0b0b0b0a0b0b05030100110619037f01418080c0000b7f0041" + "f989c0000b7f0041808ac0000b073e05066d656d6f727902000d6f626a6563745f65786973" + "747300110666696e69736800120a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020a94270c9a0603017f037e037f23808080800041f0006b2205248080808000024002" + "40024020012d00000d00200541186a200141196a290000370300200541106a200141116a29" + "0000370300200541086a200141096a29000037030020052001290001370300200220032005" + "412041011080808080001a20054120410010818080800022014101480d0102400240024002" + "4020040d00418b80c08000410f428580141082808080001a200541d0006a41186a42003703" + "00200541d0006a41106a4200370300200541d0006a41086a42003703002005420037035020" + "0141858014200541d0006a412010838080800022014120470d01200541206a41086a200541" + "d0006a410f6a22012900002206370300200541206a41106a200541e7006a22042900002207" + "370300200541206a41186a200541ef006a22032d000022023a000020052005290057220837" + "032020052f015021092005280152210a20052d0056210b2001200637000020042007370000" + "200320023a00002005200b3a00562005200a360152200520093b015020052008370057419a" + "80c08000410c200541d0006a412041011080808080001a0c030b418b80c08000410f2004ac" + "1082808080001a200541e0006a4100360200200541d8006a42003703002005420037035020" + "012004200541d0006a411410838080800022014114460d0141a680c0800041152001417f20" + "01417f481b2201ac1082808080001a200041013a0000200020013602040c050b41a680c080" + "0041152001417f2001417f481b2201ac1082808080001a200041013a000020002001360204" + "0c040b200541226a20052d00523a0000200520052900573703402005200541d0006a410c6a" + "290000370045200541206a410c6a2005290045370000200520052f01503b01202005200528" + "005336002320052005290340370027419a80c08000410c200541206a411441011080808080" + "001a0b20004180023b01000c020b41c280c08000411620012802042201ac1082808080001a" + "200041013a0000200020013602040c010b41bb80c0800041072001ac1082808080001a2000" + "41013a0000200041783602040b200541f0006a2480808080000bd21201067f238080808000" + "4190046b220024808080800041d880c0800041234100410041001080808080001a20004180" + "046a22014100360200200041f8036a22024200370300200042003703f00302400240024002" + "4041818020200041f0036a411410848080800022034114470d00200041046a41026a20002d" + "00f2033a0000200020002900f7033703502000200041f0036a410c6a220329000037005520" + "0041046a410c6a2000290055370000200020002f01f0033b0104200020002800f303360007" + "2000200029035037000b41fb80c08000410a200041046a411441011080808080001a200141" + "0036020020024200370300200042003703f00341838020200041f0036a4114108480808000" + "22014114470d01200041186a41026a20002d00f2033a0000200020002900f7033703502000" + "2003290000370055200041186a410c6a2000290055370000200020002f01f0033b01182000" + "20002800f30336001b2000200029035037001f418581c08000410e200041186a4114410110" + "80808080001a20004188046a2202420037030020004180046a22034200370300200041f803" + "6a22044200370300200042003703f003200041046a4114200041f0036a4120108580808000" + "22014120460d02024002402001417f4a0d00200020013602300c010b2000417f3602300b41" + "0121010c030b418080c08000410b2003417f2003417f481bac1082808080001a1093808080" + "00000b418080c08000410b2001417f2001417f481bac1082808080001a109380808000000b" + "200041c5006a20022903003700002000413d6a2003290300370000200041356a2004290300" + "370000200020002903f00337002d410021010b200020013a002c200041f0036a2000412c6a" + "419381c080004107418180201091808080000240024020002d00f0030d00024020002d00f1" + "030d00419a81c0800041364100410041001080808080001a0c010b4100210141d081c08000" + "41354100410041001080808080001a200041de006a41c4003a0000200041d0006a41086a41" + "00360200200041e3006a41003a0000200041d5a6013b015c20004200370350200041003600" + "5f20004188046a2203420037030020004180046a22044200370300200041f0036a41086a22" + "054200370300200042003703f00302400240200041046a4114200041186a4114200041d000" + "6a4114200041f0036a412010868080800022024120460d00024002402002417f4a0d002000" + "20023602680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000" + "200041f5006a2004290300370000200041ed006a2005290300370000200020002903f00337" + "00650b200020013a0064200041f0036a200041e4006a418582c08000410941001091808080" + "0020002d00f0030d00024020002d00f1030d00418e82c08000413a41004100410010808080" + "80001a0c010b4100210141c882c0800041394100410041001080808080001a20004188046a" + "2203420037030020004180046a22044200370300200041f8036a2205420037030020004200" + "3703f00302400240200041046a41144106200041f0036a412010878080800022024120460d" + "00024002402002417f4a0d002000200236028c010c010b2000417f36028c010b410121010c" + "010b200041a1016a200329030037000020004199016a200429030037000020004191016a20" + "05290300370000200020002903f003370089010b200020013a008801200041f0036a200041" + "88016a418183c0800041054181802010918080800020002d00f0030d00024020002d00f103" + "0d00419a81c0800041364100410041001080808080001a0c010b41d081c080004135410041" + "0041001080808080001a200041ac016a200041046a200041046a109480808000200041f003" + "6a200041ac016a419883c08000410a4198802010918080800020002d00f0030d0002402000" + "2d00f1030d0041a283c08000413b4100410041001080808080001a0c010b41dd83c0800041" + "3a4100410041001080808080001a200041d0016a200041046a200041186a10958080800020" + "0041f0036a200041d0016a419784c0800041084181802010918080800020002d00f0030d00" + "024020002d00f1030d00419f84c0800041394100410041001080808080001a0c010b41d884" + "c0800041384100410041001080808080001a200041f4016a200041046a200041186a109680" + "808000200041f0036a200041f4016a419784c0800041084181802010918080800020002d00" + "f0030d00024020002d00f1030d00419f84c0800041394100410041001080808080001a0c01" + "0b41d884c0800041384100410041001080808080001a20004198026a200041046a10978080" + "8000200041f0036a20004198026a419381c0800041074181802010918080800020002d00f0" + "030d00024020002d00f1030d00419a81c0800041364100410041001080808080001a0c010b" + "41d081c0800041354100410041001080808080001a200041bc026a200041046a1098808080" + "00200041f0036a200041bc026a419085c0800041064181802010918080800020002d00f003" + "0d00024020002d00f1030d00419685c0800041374100410041001080808080001a0c010b41" + "cd85c0800041364100410041001080808080001a200041e0026a200041186a109980808000" + "200041f0036a200041e0026a418386c08000410c4182802010918080800020002d00f0030d" + "00024020002d00f1030d00418f86c08000413d4100410041001080808080001a0c010b41cc" + "86c08000413c4100410041001080808080001a20004184036a200041046a200041186a109a" + "80808000200041f0036a20004184036a418887c08000410a4181802010918080800020002d" + "00f0030d00024020002d00f1030d00419287c08000413b4100410041001080808080001a0c" + "010b41cd87c08000413a4100410041001080808080001a200041a8036a200041046a109b80" + "808000200041f0036a200041a8036a418788c08000410a410010918080800020002d00f003" + "0d00024020002d00f1030d00419188c08000413b4100410041001080808080001a0c010b41" + "cc88c08000413a4100410041001080808080001a200041cc036a200041046a109c80808000" + "200041f0036a200041cc036a418689c0800041064181802010918080800020002d00f0030d" + "00024020002d00f1030d00418c89c0800041374100410041001080808080001a0c010b41c3" + "89c0800041364100410041001080808080001a410121010c010b410021010b20004190046a" + "24808080800020010b0300000bd10101047f23808080800041206b22032480808080002003" + "41186a22044200370300200341106a22054200370300200341086a22064200370300200342" + "00370300024002402001411420024114418683c08000411220034120108880808000220241" + "20460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b41012102" + "0c010b20002003290300370001200041196a2004290300370000200041116a200529030037" + "0000200041096a2006290300370000410021020b200020023a0000200341206a2480808080" + "000bc90101047f23808080800041206b2203248080808000200341186a2204420037030020" + "0341106a22054200370300200341086a220642003703002003420037030002400240200141" + "14200241142003412010898080800022024120460d00024002402002417f4a0d0020002002" + "3602040c010b2000417f3602040b410121020c010b20002003290300370001200041196a20" + "04290300370000200041116a2005290300370000200041096a200629030037000041002102" + "0b200020023a0000200341206a2480808080000bc90101047f23808080800041206b220324" + "8080808000200341186a22044200370300200341106a22054200370300200341086a220642" + "003703002003420037030002400240200141142002411420034120108a8080800022024120" + "460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b410121020c" + "010b20002003290300370001200041196a2004290300370000200041116a20052903003700" + "00200041096a2006290300370000410021020b200020023a0000200341206a248080808000" + "0bc50101047f23808080800041206b2202248080808000200241186a220342003703002002" + "41106a22044200370300200241086a22054200370300200242003703000240024020014114" + "20024120108b8080800022014120460d00024002402001417f4a0d00200020013602040c01" + "0b2000417f3602040b410121010c010b20002002290300370001200041196a200329030037" + "0000200041116a2004290300370000200041096a2005290300370000410021010b20002001" + "3a0000200241206a2480808080000bc70101047f23808080800041206b2202248080808000" + "200241186a22034200370300200241106a22044200370300200241086a2205420037030020" + "0242003703000240024020014114410b20024120108c8080800022014120460d0002400240" + "2001417f4a0d00200020013602040c010b2000417f3602040b410121010c010b2000200229" + "0300370001200041196a2003290300370000200041116a2004290300370000200041096a20" + "05290300370000410021010b200020013a0000200241206a2480808080000bc70101047f23" + "808080800041206b2202248080808000200241186a22034200370300200241106a22044200" + "370300200241086a2205420037030020024200370300024002402001411441042002412010" + "8d8080800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f" + "3602040b410121010c010b20002002290300370001200041196a2003290300370000200041" + "116a2004290300370000200041096a2005290300370000410021010b200020013a00002002" + "41206a2480808080000bcb0101047f23808080800041206b2203248080808000200341186a" + "22044200370300200341106a22054200370300200341086a22064200370300200342003703" + "00024002402001411420024114410c20034120108e8080800022024120460d000240024020" + "02417f4a0d00200020023602040c010b2000417f3602040b410121020c010b200020032903" + "00370001200041196a2004290300370000200041116a2005290300370000200041096a2006" + "290300370000410021020b200020023a0000200341206a2480808080000bc50101047f2380" + "8080800041206b2202248080808000200241186a22034200370300200241106a2204420037" + "0300200241086a2205420037030020024200370300024002402001411420024120108f8080" + "800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f360204" + "0b410121010c010b20002002290300370001200041196a2003290300370000200041116a20" + "04290300370000200041096a2005290300370000410021010b200020013a0000200241206a" + "2480808080000bc70101047f23808080800041206b2202248080808000200241186a220342" + "00370300200241106a22044200370300200241086a22054200370300200242003703000240" + "024020014114410f2002412010908080800022014120460d00024002402001417f4a0d0020" + "0020013602040c010b2000417f3602040b410121010c010b20002002290300370001200041" + "196a2003290300370000200041116a2004290300370000200041096a200529030037000041" + "0021010b200020013a0000200241206a2480808080000b0b830a0100418080c0000bf90965" + "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" + "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" + "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" + "5554494f4e20242424242420204163636f756e743a202044657374696e6174696f6e3a4163" + "636f756e742020436865636b206f626a65637420646f6573206e6f742065786973742c2061" + "626f7274696e6720657363726f772066696e6973682e2020436865636b206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e54727573746c696e65202054727573746c696e65206f626a65637420646f6573206e6f74" + "2065786973742c2061626f7274696e6720657363726f772066696e6973682e202054727573" + "746c696e65206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e436865636b7465726d73616e64636f6e646974696f6e73" + "43726564656e7469616c202043726564656e7469616c206f626a65637420646f6573206e6f" + "742065786973742c2061626f7274696e6720657363726f772066696e6973682e2020437265" + "64656e7469616c206f626a656374206578697374732c2070726f63656564696e6720776974" + "6820657363726f772066696e6973682e44656c6567617465202044656c6567617465206f62" + "6a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f7720" + "66696e6973682e202044656c6567617465206f626a656374206578697374732c2070726f63" + "656564696e67207769746820657363726f772066696e6973682e457363726f772020457363" + "726f77206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065" + "7363726f772066696e6973682e2020457363726f77206f626a656374206578697374732c20" + "70726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e" + "4f6666657220204e46546f6b656e4f66666572206f626a65637420646f6573206e6f742065" + "786973742c2061626f7274696e6720657363726f772066696e6973682e20204e46546f6b65" + "6e4f66666572206f626a656374206578697374732c2070726f63656564696e672077697468" + "20657363726f772066696e6973682e5061794368616e6e656c20205061794368616e6e656c" + "206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065736372" + "6f772066696e6973682e20205061794368616e6e656c206f626a656374206578697374732c" + "2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e6572" + "4c69737420205369676e65724c697374206f626a65637420646f6573206e6f742065786973" + "742c2061626f7274696e6720657363726f772066696e6973682e20205369676e65724c6973" + "74206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" + "6f772066696e6973682e5469636b657420205469636b6574206f626a65637420646f657320" + "6e6f742065786973742c2061626f7274696e6720657363726f772066696e6973682e202054" + "69636b6574206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e00ad0d046e616d650014136b65796c65745f6578616d70" + "6c652e7761736d01ef0c1d002b5f5a4e387872706c5f73746434686f737435747261636531" + "3768356563663766653133666438643166354501375f5a4e387872706c5f73746434686f73" + "74313663616368655f6c65646765725f6f626a313768373838623636346237363634616165" + "3145022f5f5a4e387872706c5f73746434686f73743974726163655f6e756d313768653639" + "3463616436386330376633386345033b5f5a4e387872706c5f73746434686f737432306765" + "745f6c65646765725f6f626a5f6669656c6431376838373939646530383866396236356339" + "4504435f5a4e387872706c5f73746434686f737432386765745f63757272656e745f6c6564" + "6765725f6f626a5f6669656c64313768346239313763353864363137613961394505355f5a" + "4e387872706c5f73746434686f737431346163636f756e745f6b65796c6574313768616233" + "363663616435383039376261304506325f5a4e387872706c5f73746434686f737431316c69" + "6e655f6b65796c6574313768653466386161383862646663633464664507335f5a4e387872" + "706c5f73746434686f73743132636865636b5f6b65796c6574313768333165356538343139" + "326131633631654508385f5a4e387872706c5f73746434686f7374313763726564656e7469" + "616c5f6b65796c6574313768643731653739346561383463373839644509365f5a4e387872" + "706c5f73746434686f7374313564656c65676174655f6b65796c6574313768323639663430" + "63643739663834373237450a3d5f5a4e387872706c5f73746434686f737432326465706f73" + "69745f707265617574685f6b65796c65743137686161306631646338616233346634623745" + "0b315f5a4e387872706c5f73746434686f737431306469645f6b65796c6574313768313866" + "61393935616436326331313139450c345f5a4e387872706c5f73746434686f737431336573" + "63726f775f6b65796c657431376838373464316235373266376333326437450d375f5a4e38" + "7872706c5f73746434686f737431366e66745f6f666665725f6b65796c6574313768663931" + "35393838643961386466633863450e355f5a4e387872706c5f73746434686f737431347061" + "796368616e5f6b65796c657431376862373435373234653534336539333565450f355f5a4e" + "387872706c5f73746434686f737431347369676e6572735f6b65796c657431376866646335" + "3536343961633961626465304510345f5a4e387872706c5f73746434686f73743133746963" + "6b65745f6b65796c65743137683164393432633034663234386362666545110d6f626a6563" + "745f657869737473120666696e69736813305f5a4e34636f72653970616e69636b696e6739" + "70616e69635f666d74313768623931626164616365366565383238374514465f5a4e387872" + "706c5f73746434636f7265357479706573376b65796c657473313763726564656e7469616c" + "5f6b65796c6574313768353839343033303564323939613236354515445f5a4e387872706c" + "5f73746434636f7265357479706573376b65796c657473313564656c65676174655f6b6579" + "6c65743137686665363134666163326238656437626445164b5f5a4e387872706c5f737464" + "34636f7265357479706573376b65796c65747332326465706f7369745f707265617574685f" + "6b65796c65743137683634303539316533346337323839363645173f5f5a4e387872706c5f" + "73746434636f7265357479706573376b65796c65747331306469645f6b65796c6574313768" + "326538323337313938626638373463634518425f5a4e387872706c5f73746434636f726535" + "7479706573376b65796c6574733133657363726f775f6b65796c6574313768363462336265" + "663061333138383233634519455f5a4e387872706c5f73746434636f726535747970657337" + "6b65796c65747331366e66745f6f666665725f6b65796c6574313768633833353933386361" + "63306465646263451a435f5a4e387872706c5f73746434636f7265357479706573376b6579" + "6c65747331347061796368616e5f6b65796c65743137683332396231633338396165343162" + "3638451b435f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331" + "347369676e6572735f6b65796c657431376839633832313566396330386134636565451c42" + "5f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331337469636b" + "65745f6b65796c65743137683366303138626436663561373338326645071201000f5f5f73" + "7461636b5f706f696e746572090a0100072e726f64617461004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d" + "312e38352e31202834656231363132353020323032352d30332d31352900490f7461726765" + "745f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62" + "616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index d1c689a0162..aa560580ffa 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -60,3 +60,5 @@ extern std::string const reqNonexistentField; extern std::string const hfPerfTest; extern std::string const opcCallPerfTest; + +extern std::string const keyletHostFunctions; diff --git a/src/test/unit_test/SuiteJournal.h b/src/test/unit_test/SuiteJournal.h index b5c59f3d29e..d56c297b0a2 100644 --- a/src/test/unit_test/SuiteJournal.h +++ b/src/test/unit_test/SuiteJournal.h @@ -94,6 +94,8 @@ SuiteJournalSink::writeAlways( return "FTL:"; }(); + static std::mutex log_mutex; + std::lock_guard lock(log_mutex); suite_.log << s << partition_ << text << std::endl; } diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index b507d6fe696..00f89a4ac73 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -26,6 +26,7 @@ #include #include #include +#include namespace ripple { @@ -183,6 +184,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + checkKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected credentialKeylet( AccountID const& subject, @@ -192,18 +199,78 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + didKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected escrowKeylet(AccountID const& account, std::uint32_t seq) { return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + offerKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected oracleKeylet(AccountID const& account, std::uint32_t docId) { return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + signersKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected getNFT(AccountID const& account, uint256 const& nftId) { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 6c7ae43d91e..e35af622d46 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -419,6 +419,15 @@ WasmHostFunctionsImpl::accountKeylet(AccountID const& account) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::check(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::credentialKeylet( AccountID const& subject, @@ -437,6 +446,41 @@ WasmHostFunctionsImpl::credentialKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::didKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::did(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::delegateKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::delegate(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::depositPreauthKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::depositPreauth(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) { @@ -446,6 +490,43 @@ WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) +{ + if (!account1 || !account2) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account1 == account2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (currency.isZero()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::line(account1, account2, currency); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::nftOfferKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::nftoffer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::offer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::oracleKeylet( AccountID const& account, @@ -457,6 +538,40 @@ WasmHostFunctionsImpl::oracleKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) +{ + if (!account || !destination) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == destination) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (seq == 0) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::payChan(account, destination, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::signersKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::signers(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::ticket(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index 58bf4c194a8..a22097ed6be 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -114,17 +114,55 @@ class WasmHostFunctionsImpl : public HostFunctions Expected accountKeylet(AccountID const& account) override; + Expected + checkKeylet(AccountID const& account, std::uint32_t seq) override; + Expected credentialKeylet( AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override; + Expected + didKeylet(AccountID const& account) override; + + Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + override; + + Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + override; + Expected escrowKeylet(AccountID const& account, std::uint32_t seq) override; Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override; + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) override; + + Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + offerKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + oracleKeylet(AccountID const& account, std::uint32_t docId) override; + + Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) override; + + Expected + signersKeylet(AccountID const& account) override; + + Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) override; Expected getNFT(AccountID const& account, uint256 const& nftId) override; diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index f1de9b22355..c2b321e85ac 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -146,6 +146,17 @@ getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) return AccountID::fromVoid(r->data()); } +template +static Expected +getDataCurrency(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(rt, params, i); + if (!r || (r->size() != Currency::bytes)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Currency::fromVoid(r->data()); +} + template Expected getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) @@ -642,6 +653,32 @@ accountKeylet_wrap( return returnResult(rt, params, results, hf->accountKeylet(*acc), index); } +wasm_trap_t* +checkKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, params, results, hf->checkKeylet(acc.value(), *seq), index); +} + wasm_trap_t* credentialKeylet_wrap( void* env, @@ -678,6 +715,82 @@ credentialKeylet_wrap( index); } +wasm_trap_t* +delegateKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const authorize = getDataAccountID(rt, params, index); + if (!authorize) + { + return hfResult(results, authorize.error()); + } + + return returnResult( + rt, + params, + results, + hf->delegateKeylet(acc.value(), authorize.value()), + index); +} + +wasm_trap_t* +depositPreauthKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const authorize = getDataAccountID(rt, params, index); + if (!authorize) + { + return hfResult(results, authorize.error()); + } + + return returnResult( + rt, + params, + results, + hf->depositPreauthKeylet(acc.value(), authorize.value()), + index); +} + +wasm_trap_t* +didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult(rt, params, results, hf->didKeylet(acc.value()), index); +} + wasm_trap_t* escrowKeylet_wrap( void* env, @@ -704,6 +817,98 @@ escrowKeylet_wrap( rt, params, results, hf->escrowKeylet(*acc, *seq), index); } +wasm_trap_t* +lineKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc1 = getDataAccountID(rt, params, index); + if (!acc1) + { + return hfResult(results, acc1.error()); + } + + auto const acc2 = getDataAccountID(rt, params, index); + if (!acc2) + { + return hfResult(results, acc2.error()); + } + + auto const currency = getDataCurrency(rt, params, index); + if (!currency) + { + return hfResult(results, currency.error()); + } + + return returnResult( + rt, + params, + results, + hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), + index); +} + +wasm_trap_t* +nftOfferKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, + params, + results, + hf->nftOfferKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +offerKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, params, results, hf->offerKeylet(acc.value(), seq.value()), index); +} + wasm_trap_t* oracleKeylet_wrap( void* env, @@ -720,13 +925,96 @@ oracleKeylet_wrap( return hfResult(results, acc.error()); } + auto const documentId = getDataInt32(rt, params, index); + if (!documentId) + { + return hfResult(results, documentId.error()); + } + return returnResult( + rt, params, results, hf->oracleKeylet(*acc, *documentId), index); +} + +wasm_trap_t* +paychanKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const dest = getDataAccountID(rt, params, index); + if (!dest) + { + return hfResult(results, dest.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, + params, + results, + hf->paychanKeylet(acc.value(), dest.value(), seq.value()), + index); +} + +wasm_trap_t* +signersKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult( + rt, params, results, hf->signersKeylet(acc.value()), index); +} + +wasm_trap_t* +ticketKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + auto const seq = getDataInt32(rt, params, index); if (!seq) { return hfResult(results, seq.error()); } + return returnResult( - rt, params, results, hf->oracleKeylet(*acc, *seq), index); + rt, params, results, hf->ticketKeylet(acc.value(), seq.value()), index); + ; } wasm_trap_t* diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index ac0cb88e497..93b681009de 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -169,6 +169,14 @@ accountKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using checkKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +checkKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using credentialKeylet_proto = int32_t( uint8_t const*, int32_t, @@ -184,6 +192,39 @@ credentialKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using delegateKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +delegateKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using depositPreauthKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +depositPreauthKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using didKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +didKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using escrowKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -192,6 +233,37 @@ escrowKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using lineKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +lineKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using nftOfferKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +nftOfferKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using offerKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +offerKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using oracleKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -200,6 +272,35 @@ oracleKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using paychanKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +paychanKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +signersKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using ticketKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +ticketKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using getNFT_proto = int32_t( uint8_t const*, int32_t, diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 3f7d61c349d..c9badfe460b 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -61,10 +61,20 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, getNFT, "get_NFT", hfs, 1000); + WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index e9a7c78c7f6..a82aa399997 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -233,7 +233,7 @@ EscrowCreate::preflight(PreflightContext const& ctx) } HostFunctions mock; - auto const re = preflightEscrowWasm(code, "finish", {}, &mock); + auto const re = preflightEscrowWasm(code, "finish", {}, &mock, ctx.j); if (!isTesSuccess(re)) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; From 9eca1a3a0c33eb3053ebe8c44d0977f7030d8f9a Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:43:21 -0400 Subject: [PATCH 34/73] MPT and IOU support for amount and issue (#5573) * MPT and IOU support for ammount and issue * Fix tests Update wasm code to the latest version Remove deprecated tests Remove deprecated wasm --- src/test/app/Escrow_test.cpp | 42 +- src/test/app/TestHostFunctions.h | 46 +- src/test/app/Wasm_test.cpp | 185 ++------ src/test/app/wasm_fixtures/fixtures.cpp | 496 ++++++++++++--------- src/test/app/wasm_fixtures/fixtures.h | 4 - src/xrpld/app/misc/WasmHostFuncImpl.cpp | 50 ++- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 48 +- src/xrpld/app/misc/WasmHostFuncWrapper.h | 7 - src/xrpld/app/misc/WasmVM.cpp | 18 +- 9 files changed, 433 insertions(+), 463 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index b3409ed14fd..a92fac57eb1 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1707,10 +1707,7 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; // Tests whether the ledger index is >= 5 - // #[no_mangle] - // pub fn finish() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5} - // } + // getLedgerSqn() >= 5} static auto wasmHex = ledgerSqnHex; { @@ -1880,10 +1877,7 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; // Tests whether the ledger index is >= 5 - // #[no_mangle] - // pub fn finish() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5} - // } + // getLedgerSqn() >= 5} static auto wasmHex = ledgerSqnHex; { @@ -2028,12 +2022,9 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; // Tests whether the ledger index is >= 5 - // #[no_mangle] - // pub fn finish() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5} - // } + // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnHex; - std::uint32_t const allowance = 64; + std::uint32_t const allowance = 71; { // basic FinishFunction situation @@ -2288,7 +2279,7 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); - auto const allowance = 20'000; + auto const allowance = 1'000'000; // FinishAfter time hasn't passed env(escrow::finish(carol, alice, seq), @@ -2296,31 +2287,12 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecNO_PERMISSION)); env.close(); - - // tx sender not escrow creator (alice) - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); env.close(); - - // destination balance is too high - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); - env.close(); // reduce the destination balance env(pay(carol, alice, XRP(4500))); env.close(); - - // tx sender not escrow creator (alice) - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); env.close(); env(escrow::finish(alice, alice, seq), @@ -2329,8 +2301,8 @@ struct Escrow_test : public beast::unit_test::suite ter(tesSUCCESS)); auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 10817); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 39'596); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 680ec03896c..6a177380492 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -25,11 +25,38 @@ #include #include -#include - namespace ripple { namespace test { +struct TestLedgerDataProvider : public HostFunctions +{ + jtx::Env* env_; + void const* rt_ = nullptr; + +public: + TestLedgerDataProvider(jtx::Env* env) : env_(env) + { + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + Expected + getLedgerSqn() override + { + return static_cast(env_->current()->seq()); + } +}; + struct TestHostFunctions : public HostFunctions { test::jtx::Env& env_; @@ -286,16 +313,19 @@ struct TestHostFunctions : public HostFunctions #else auto j = getJournal().trace(); #endif - j << "WASM TRACE: " << msg; if (!asHex) - j << std::string_view( - reinterpret_cast(data.data()), data.size()); + { + j << "WAMR TRACE: " << msg << " " + << std::string_view( + reinterpret_cast(data.data()), data.size()); + } else { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex(data.begin(), data.end(), hex.begin()); - j << hex; + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "WAMR DEV TRACE: " << msg << " " << hex; } #ifdef DEBUG_OUTPUT @@ -313,7 +343,7 @@ struct TestHostFunctions : public HostFunctions #else auto j = getJournal().trace(); #endif - j << "WASM TRACE NUM: " << msg << data; + j << "WAMR TRACE NUM: " << msg << " " << data; #ifdef DEBUG_OUTPUT j << std::endl; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 6c77706b8b5..d03135ae65c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -17,21 +17,15 @@ */ //============================================================================== -#include -#include -#include - -#include -#include -#include -#include - -#include - #ifdef _DEBUG // #define DEBUG_OUTPUT 1 #endif +#include + +#include +#include + namespace ripple { namespace test { @@ -49,34 +43,6 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } -struct TestLedgerDataProvider -{ - jtx::Env* env; - -public: - TestLedgerDataProvider(jtx::Env* env_) : env(env_) - { - } - - Expected - get_ledger_sqn() - { - return (int32_t)env->current()->seq(); - } -}; - -using getLedgerSqn_proto = std::int32_t(); -static wasm_trap_t* -getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) -{ - auto sqn = reinterpret_cast(env)->get_ledger_sqn(); - - results->data[0] = WASM_I32_VAL(sqn.value()); - results->num_elems = 1; - - return nullptr; -} - struct Wasm_test : public beast::unit_test::suite { void @@ -174,20 +140,19 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - TestLedgerDataProvider ledgerDataProvider(&env); + TestLedgerDataProvider hf(&env); std::string const funcName("finish"); std::vector imports; - WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider, 33); - + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + wasm, funcName, {}, imports, &hf, 1'000'000, env.journal); - // code takes 4 gas + 1 getLedgerSqn call + // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re->result && (re->cost == 37)); + BEAST_EXPECT(!re->result && (re->cost == 44)); env.close(); env.close(); @@ -195,12 +160,11 @@ struct Wasm_test : public beast::unit_test::suite env.close(); // empty module - run the same instance - re = engine.run( - {}, funcName, {}, imports, nullptr, 1'000'000, env.journal); + re = engine.run({}, funcName, {}, imports, &hf, 1'000'000, env.journal); - // code takes 8 gas + 2 getLedgerSqn calls + // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re->result && (re->cost == 74)); + BEAST_EXPECT(re->result && (re->cost == 88)); } void @@ -372,26 +336,14 @@ struct Wasm_test : public beast::unit_test::suite } void - testEscrowWasmDN1() + testEscrowWasmDN() { - testcase("escrow wasm devnet 1 test"); - std::string const wasmHex = allHostFunctionsHex; + testcase("escrow wasm devnet test"); - std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::string const wasmStr = + boost::algorithm::unhex(allHostFunctionsHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); - // let sender = get_tx_account_id(); - // let owner = get_current_escrow_account_id(); - // let dest = get_current_escrow_destination(); - // let dest_balance = get_account_balance(dest); - // let escrow_data = get_current_escrow_data(); - // let ed_str = String::from_utf8(escrow_data).unwrap(); - // let threshold_balance = ed_str.parse::().unwrap(); - // let pl_time = host_lib::getParentLedgerTime(); - // let e_time = get_current_escrow_finish_after(); - // sender == owner && dest_balance <= threshold_balance && - // pl_time >= e_time - using namespace test::jtx; Env env{*this}; { @@ -400,29 +352,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re->result && (re->cost == 10817)); - // std::cout << "good case result " << re.value().result - // << " cost: " << re.value().cost << std::endl; - } - } - - env.close(); - env.close(); - env.close(); - env.close(); - - { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(env, -1); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(!re->result && (re->cost == 10817)); - // std::cout << "bad case (current time < escrow_finish_after " - // "time) result " - // << re.value().result << " cost: " << - // re.value().cost - // << std::endl; + BEAST_EXPECT(re->result && (re->cost == 41'132)); } } @@ -441,7 +371,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; } @@ -460,15 +390,15 @@ struct Wasm_test : public beast::unit_test::suite }; BadTestHostFunctions nfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; } { // fail because recursion too deep - auto wasmHex = deepRecursionHex; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + + auto const wasmStr = boost::algorithm::unhex(deepRecursionHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctionsSink nfs(env); @@ -518,55 +448,6 @@ struct Wasm_test : public beast::unit_test::suite } } - void - testEscrowWasmDN3() - { - testcase("wasm devnet 3 test"); - - std::string const funcName("finish"); - - using namespace test::jtx; - - Env env(*this); - { - std::string const wasmHex = xrplStdExampleHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - TestHostFunctions nfs(env, 0); - - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result && (re->cost == 6570)); - // std::cout << "good case result " << re.value().result - // << " cost: " << re.value().cost << std::endl; - } - } - - env.close(); - env.close(); - env.close(); - env.close(); - env.close(); - - { - std::string const wasmHex = hostFunctions2Hex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - TestHostFunctions nfs(env, 0); - - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result && (re->cost == 16558)); - // std::cout << "good case result " << re.value().result - // << " cost: " << re.value().cost << std::endl; - } - } - } - void testHFCost() { @@ -578,7 +459,7 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = hostFunctions2Hex; + std::string const wasmHex = allHostFunctionsHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -590,13 +471,11 @@ struct Wasm_test : public beast::unit_test::suite i.gas = 0; auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) { - // std::cout << ", ret: " << re->result - // << ", gas spent: " << re->cost << std::endl; - BEAST_EXPECT(re->result && (re->cost == 138)); + BEAST_EXPECT(re->result && (re->cost == 872)); } env.close(); @@ -609,7 +488,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { - std::string const wasmHex = hostFunctions2Hex; + std::string const wasmHex = allHostFunctionsHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -619,13 +498,11 @@ struct Wasm_test : public beast::unit_test::suite std::vector const imp = createWasmImport(&hfs); auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) { - // std::cout << ", ret: " << re->result - // << ", gas spent: " << re->cost << std::endl; - BEAST_EXPECT(re->result && (re->cost == 16558)); + BEAST_EXPECT(re->result && (re->cost == 41'132)); } env.close(); @@ -751,9 +628,7 @@ struct Wasm_test : public beast::unit_test::suite testHFCost(); - // TODO: fix result - testEscrowWasmDN1(); - testEscrowWasmDN3(); + testEscrowWasmDN(); // perfTest(); } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index c2dab9252a3..48b0d20b73a 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -10757,126 +10757,302 @@ extern std::string const sp1_wasm = "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" "756c746976616c7565"; -extern std::string const xrplStdExampleHex = - "0061736d0100000001240560037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" - "7f7f7e017f6000017f0295010608686f73745f6c69620c6765745f74785f6669656c640000" - "08686f73745f6c6962057472616365000108686f73745f6c69620e6163636f756e745f6b65" - "796c6574000208686f73745f6c69621063616368655f6c65646765725f6f626a000008686f" - "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000208686f73745f6c69" - "620974726163655f6e756d00030302010405030100110619037f01418080c0000b7f004190" - "80c0000b7f00419080c0000b072e04066d656d6f727902000666696e69736800060a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020aa203019f0302047f017e238080" - "80800041e0006b2200248080808000200041c0006a41106a22014100360200200041c0006a" - "41086a220242003703002000420037034002400240024041818020200041c0006a41141080" - "808080004101480d00200041086a41106a2001280200360200200041086a41086a20022903" - "0037030020002000290340370308418080c08000410a200041086a41144101108180808000" - "1a200041c0006a41186a220342003703002001420037030020024200370300200042003703" - "400240200041086a4114200041c0006a41201082808080004101480d00200041206a41186a" - "2003290300370300200041206a41106a200041c0006a41106a290300370300200041206a41" - "086a200041c0006a41086a29030037030020002000290340370320200041206a4120410010" - "8380808000220241014e0d020b417b21010c020b417f21010c010b20004200370340417b21" - "01200241828018200041c0006a41081084808080004108470d00418a80c080004106200029" - "034022041085808080001a417741012004501b21010b200041e0006a24808080800020010b" - "0b190100418080c0000b1020204163636f756e743a20204665653a008903046e616d650016" - "157872706c5f7374645f6578616d706c652e7761736d01c9020700335f5a4e387872706c5f" - "73746434686f737431326765745f74785f6669656c64313768646531643438363634626333" - "6138346145012b5f5a4e387872706c5f73746434686f737435747261636531376831626534" - "3662336564373737306363624502355f5a4e387872706c5f73746434686f73743134616363" - "6f756e745f6b65796c6574313768333736666637613833306562626537624503375f5a4e38" - "7872706c5f73746434686f7374313663616368655f6c65646765725f6f626a313768646361" - "6435366531366262633331653345043b5f5a4e387872706c5f73746434686f737432306765" - "745f6c65646765725f6f626a5f6669656c6431376863623833653465366431326162306332" - "45052f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376832363139" - "36306163653839633831313845060666696e697368071201000f5f5f737461636b5f706f69" - "6e746572090a0100072e726f64617461004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d312e38372e302028" - "31373036376539616320323032352d30352d3039290094010f7461726765745f6665617475" - "726573082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663" - "616c6c2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75" - "7461626c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72" - "65666572656e63652d74797065732b087369676e2d657874"; - std::string const ledgerSqnHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" - "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" - "010700100041044a0b004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d31" - "2e38352e31202834656231363132353020323032352d30332d3135290049" - "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" - "732b0a6d756c746976616c7565"; + "0061736d01000000010e0360027f7f017f6000006000017f02160103656e" + "760e6765745f6c65646765725f73716e000003030201020503010002063e" + "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" + "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" + "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300010666696e69736800020362756603000c5f5f64736f5f68616e" + "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" + "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" + "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" + "090a2b0202000b2601017f41800841041000220041800828020020004100" + "481b2200200041044a20004100481b0b007f0970726f647563657273010c" + "70726f6365737365642d62790105636c616e675f31392e312e352d776173" + "692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d" + "2f6c6c766d2d70726f6a6563742061623462356132646235383239353861" + "6631656533303861373930636664623432626432343732302900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; std::string const allHostFunctionsHex = - "0061736d01000000012e0760037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" - "7f7f7e017f60027f7f017f6000017f60017f0002df010808686f73745f6c69620c6765745f" - "74785f6669656c64000008686f73745f6c6962057472616365000108686f73745f6c69621c" - "6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000008686f73745f6c" - "69620e6163636f756e745f6b65796c6574000208686f73745f6c69621063616368655f6c65" - "646765725f6f626a000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669" - "656c64000208686f73745f6c69620974726163655f6e756d000308686f73745f6c69621667" - "65745f706172656e745f6c65646765725f74696d6500040304030506000405017001010105" - "030100110619037f01418080c0000b7f00418481c0000b7f00419081c0000b072e04066d65" - "6d6f727902000666696e69736800080a5f5f646174615f656e6403010b5f5f686561705f62" - "61736503020af80803db0702047f027e23808080800041f0206b2200248080808000200041" - "d0006a41106a22014100360200200041d0006a41086a220242003703002000420037035002" - "4002400240024041818020200041d0006a41141080808080004101480d00200041086a4110" - "6a2001280200360200200041086a41086a2002290300370300200020002903503703084180" - "80c080004109200041086a411441011081808080001a200141003602002002420037030020" - "00420037035041818020200041d0006a411410828080800041004c0d01200041206a41106a" - "200041d0006a41106a2201280200360200200041206a41086a200041d0006a41086a220229" - "030037030020002000290350370320418980c080004108200041206a411441011081808080" - "001a2001410036020020024200370300200042003703500240024041838020200041d0006a" - "411410828080800041004c0d00200041386a41106a2001280200360200200041386a41086a" - "200229030037030020002000290350370338419180c080004107200041386a411441011081" - "808080001a200041d0006a41186a2203420037030020014200370300200242003703002000" - "42003703500240200041386a4114200041d0006a41201083808080004101480d00200041d0" - "206a41186a2003290300370300200041d0206a41106a200041d0006a41106a290300370300" - "200041d0206a41086a200041d0006a41086a290300370300200020002903503703d0202000" - "41d0206a41204100108480808000220241014e0d020b417c21010c050b417d21010c040b20" - "004200370350417c2101200241828018200041d0006a41081085808080004108470d034198" - "80c08000410f200029035022041086808080001a0240418020450d00200041d0006a410041" - "8020fc0b000b0240419b801c200041d0006a418020108280808000220241014e0d00417b21" - "010c040b41a780c08000410a2002ad1086808080001a0240200241084d0d00417a21010c04" - "0b41b180c080004107200041d0006a200241011081808080001a4100210142002105034020" - "05420886200041d0006a20016a3100008421052002200141016a2201470d000b41b880c080" - "00412120051086808080001a200041003602d0200240200041d0206a410410878080800041" - "004e0d00417921010c040b41d980c08000411520003402d0201086808080001a2000108980" - "80800020002802004101710d02417821010c030b417f21010c020b417e21010c010b41ee80" - "c08000411620002802042201ac1086808080001a200041086a200041206a4114108a808080" - "004520042005587120002802d02020014e7121010b200041f0206a24808080800020010b4e" - "01027f23808080800041106b22012480808080002001410036020c41a580082001410c6a41" - "0410828080800021022000200128020c3602042000200241004a360200200141106a248080" - "8080000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205" - "470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21" - "030b20030b0b8e010100418080c0000b8401202073656e6465723a20206f776e65723a2020" - "646573743a2020646573745f62616c616e63653a2020646174615f6c656e2020646174613a" - "20207468726573686f6c645f62616c616e63652c2075736520646174615b695d3a20207061" - "72656e745f6c65646765725f74696d653a2020657363726f775f66696e6973685f61667465" - "723a00d804046e616d650016157872706c5f7374645f6578616d706c652e7761736d019804" - "0b00335f5a4e387872706c5f73746434686f737431326765745f74785f6669656c64313768" - "6465316434383636346263336138346145012b5f5a4e387872706c5f73746434686f737435" - "7472616365313768316265343662336564373737306363624502435f5a4e387872706c5f73" - "746434686f737432386765745f63757272656e745f6c65646765725f6f626a5f6669656c64" - "313768343532633531353638653033353531384503355f5a4e387872706c5f73746434686f" - "737431346163636f756e745f6b65796c657431376833373666663761383330656262653762" - "4504375f5a4e387872706c5f73746434686f7374313663616368655f6c65646765725f6f62" - "6a3137686463616435366531366262633331653345053b5f5a4e387872706c5f7374643468" - "6f737432306765745f6c65646765725f6f626a5f6669656c64313768636238336534653664" - "3132616230633245062f5f5a4e387872706c5f73746434686f73743974726163655f6e756d" - "3137683236313936306163653839633831313845073d5f5a4e387872706c5f73746434686f" - "737432326765745f706172656e745f6c65646765725f74696d653137686234636264356664" - "336463326230383445080666696e69736809415f5a4e387872706c5f73746433316765745f" - "63757272656e745f657363726f775f66696e6973685f616674657231376863333562336366" - "356633353733363933450a066d656d636d70071201000f5f5f737461636b5f706f696e7465" - "72090a0100072e726f64617461004d0970726f64756365727302086c616e67756167650104" - "52757374000c70726f6365737365642d6279010572757374631d312e38372e302028313730" - "36376539616320323032352d30352d3039290094010f7461726765745f6665617475726573" - "082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c" - "2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72656665" - "72656e63652d74797065732b087369676e2d657874"; + "0061736d0100000001540c60027f7f017f60047f7f7f7f017f60037f7f7f" + "017f60057f7f7f7f7f017f60017f017f60037f7f7f0060037f7f7e017f60" + "087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60017f0060027f7f00" + "6000017f0295061908686f73745f6c69620c6765745f74785f6669656c64" + "000208686f73745f6c69620974726163655f6e756d000608686f73745f6c" + "6962057472616365000308686f73745f6c69620e6765745f6c6564676572" + "5f73716e000008686f73745f6c6962166765745f706172656e745f6c6564" + "6765725f74696d65000008686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f68617368000008686f73745f6c6962136765745f7478" + "5f6e65737465645f6669656c64000108686f73745f6c6962106765745f74" + "785f61727261795f6c656e000408686f73745f6c6962176765745f74785f" + "6e65737465645f61727261795f6c656e000008686f73745f6c69621c6765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c6400020868" + "6f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f6669656c64000108686f73745f6c6962206765745f63" + "757272656e745f6c65646765725f6f626a5f61727261795f6c656e000408" + "686f73745f6c6962276765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e000008686f73745f6c69620e" + "6163636f756e745f6b65796c6574000108686f73745f6c69621063616368" + "655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c65" + "646765725f6f626a5f6669656c64000108686f73745f6c69621b6765745f" + "6c65646765725f6f626a5f6e65737465645f6669656c64000308686f7374" + "5f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e00" + "0008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e657374" + "65645f61727261795f6c656e000208686f73745f6c69621163726564656e" + "7469616c5f6b65796c6574000708686f73745f6c69620d657363726f775f" + "6b65796c6574000308686f73745f6c69620d6f7261636c655f6b65796c65" + "74000308686f73745f6c696213636f6d707574655f7368613531325f6861" + "6c66000108686f73745f6c6962076765745f6e6674000808686f73745f6c" + "69620b7570646174655f6461746100000306050505090a0b050301001106" + "19037f01418080c0000b7f0041eb99c0000b7f0041f099c0000b072e0406" + "6d656d6f727902000666696e697368001d0a5f5f646174615f656e640301" + "0b5f5f686561705f6261736503020a951d051900200241214f0440000b20" + "002002360204200020013602000b1900200241094f0440000b2000200236" + "0204200020013602000b970101057f230041206b22012400200141186a22" + "044100360200200141106a22054200370300200142003703080240418180" + "20200141086a411410002203411447044002402003410048044020002003" + "3602040c010b2000417f3602040b410121020c010b200020012903083700" + "01200041116a2004280200360000200041096a20052903003700000b2000" + "20023a0000200141206a24000b450020012d000045044020002001290001" + "370000200041106a200141116a280000360000200041086a200141096a29" + "00003700000f0b418080c000410b20013402041001000bff1a01097f2300" + "41c0036b22002400418b80c000411b41014100410110021a41a680c00041" + "2841014100410110021a41f680c000412b41014100410110021a20004200" + "370380010240024002400240024002400240024020004180016a22064108" + "1003220141004a044041a181c000411d2001ad10011a200041406b200620" + "01101a41be81c000411020002802402000280244410110021a2000420037" + "03a001200041a0016a220341081004220141004c0d0141ce81c000411920" + "01ad10011a200041386a20032001101a41e781c000411120002802382000" + "28023c410110021a200041d8016a22024200370300200041d0016a220542" + "00370300200041c8016a22044200370300200042003703c001200041c001" + "6a22074120100522014120470d0241f881c000411320074120410110021a" + "418b82c000412041014100410110021a419883c000412e41014100410110" + "021a200041b0016a4100360200200041a8016a4200370300200042003703" + "a0014181802020034114100022014114470d0341c683c000411420034114" + "410110021a20004200370380014188801820064108100022014108470d04" + "41da83c0004117420810011a41f183c000412820064108410110021a2000" + "410036026041848008200041e0006a22034104100022014104470d054199" + "84c000411520034104410110021a200041013b004c200242003703002005" + "420037030020044200370300200042003703c0010240200041cc006a4102" + "200741201006220141004e044041ae84c00041142001ad10011a20004130" + "6a20072001101941c284c000410d20002802302000280234410110021a0c" + "010b41cf84c00041292001ac10011a0b41f884c00041154183803c1007ac" + "10011a418d85c00041134189803c1007ac10011a0240200041cc006a4102" + "1008220141004e044041a085c00041142001ad10011a0c010b41b485c000" + "412d2001ac10011a0b41e185c000412341014100410110021a419a87c000" + "413341014100410110021a20004200370380014182801820004180016a22" + "0141081009220341004c0d062003410846044041cd87c000412b42081001" + "1a41f887c000412f20014108410110021a0c080b41a788c000412f2003ad" + "10011a200041286a20004180016a2003101a41d688c00041172000280228" + "200028022c410110021a0c070b41fb82c000411d2001ac10011a419b7f21" + "020c070b41d682c00041252001ac10011a419a7f21020c060b41ab82c000" + "412b2001ac10011a41997f21020c050b41f086c000412a2001ac10011a41" + "b77e21020c040b41af86c00041c1002001ac10011a41b67e21020c030b41" + "8486c000412b2001ac10011a41b57e21020c020b41ed88c00041c5002003" + "ac10011a0b200041b0016a4100360200200041a8016a4200370300200042" + "003703a0010240024002400240024002400240024041818020200041a001" + "6a220141141009220341004a0440200341154f0d0241b289c000411e2001" + "2003410110021a0c010b41d089c00041332003ac10011a0b200041013b00" + "60200041d8016a4200370300200041d0016a4200370300200041c8016a42" + "00370300200042003703c0010240200041e0006a4102200041c0016a2201" + "4120100a220341004e044041838ac000411c2003ad10011a200041206a20" + "0120031019419f8ac000411520002802202000280224410110021a0c010b" + "41b48ac00041392003ac10011a0b41ed8ac00041244183803c100bac1001" + "1a0240200041e0006a4102100c220141004e044041918bc000411c2001ad" + "10011a0c010b41ad8bc000413d2001ac10011a0b41ea8bc0004128410141" + "00410110021a41928cc000412f41014100410110021a200041c0016a2203" + "101b20004180016a22012003101c200041b8016a4200370300200041b001" + "6a4200370300200041a8016a4200370300200042003703a0012001411420" + "0041a0016a22034120100d22014120470d01200341204100100e22044100" + "4a044041c18cc00041232004ad10011a2000420037036020044182801820" + "0041e0006a22014108100f220341004c0d032003410846044041e48cc000" + "412a420810011a418e8dc000412e20014108410110021a0c070b41bc8dc0" + "00412e2003ad10011a200041186a200041e0006a2003101a41ea8dc00041" + "162000280218200028021c410110021a0c060b41a290c000413c2004ac10" + "011a200041d8016a4200370300200041d0016a4200370300200041c8016a" + "4200370300200042003703c001410141828018200041c0016a4120100f22" + "014100480d030c040b000b41f692c000412e2001ac10011a41ef7c21020c" + "050b41808ec000412b2003ac10011a0c020b41de90c00041c1002001ac10" + "011a0b200041013b00604101200041e0006a4102200041c0016a41201010" + "22014100480440419f91c00041352001ac10011a0b41014183803c101122" + "01410048044041d491c00041322001ac10011a0b4101200041e0006a4102" + "101222014100480440418692c00041392001ac10011a0b41bf92c0004137" + "41014100410110021a0c010b200041013b004c200041d8016a4200370300" + "200041d0016a4200370300200041c8016a4200370300200042003703c001" + "02402004200041cc006a4102200041c0016a220141201010220341004e04" + "4041ab8ec000411b2003ad10011a200041106a20012003101941c68ec000" + "411420002802102000280214410110021a0c010b41da8ec00041312003ac" + "10011a0b418b8fc000412320044183803c1011ac10011a02402004200041" + "cc006a41021012220141004e044041ae8fc000411b2001ad10011a0c010b" + "41c98fc00041352001ac10011a0b41fe8fc000412441014100410110021a" + "0b41a493c000412f41014100410110021a200041c0016a2201101b200041" + "cc006a22042001101c200041f8006a4200370300200041f0006a42003703" + "00200041e8006a4200370300200042003703600240024002400240024002" + "4020044114200041e0006a22034120100d2201412046044041d393c00041" + "0f20034120410110021a20004198016a420037030020004190016a420037" + "030020004188016a42003703002000420037038001024020044114200441" + "1441e293c000410920004180016a220141201013220341004a0440200041" + "086a20012003101941ea93c00041122000280208200028020c410110021a" + "0c010b41fc93c000413c2003ac10011a0b200041b8016a22064200370300" + "200041b0016a22024200370300200041a8016a2205420037030020004200" + "3703a001200041cc006a2203411441e807200041a0016a22084120101422" + "014120470d0141b894c000410e20084120410110021a200041d8016a4200" + "370300200041d0016a4200370300200041c8016a42003703002000420037" + "03c00120034114412a200041c0016a22044120101522014120470d0241c6" + "94c000410e20044120410110021a41d494c000412441014100410110021a" + "41cd95c000412541014100410110021a20004198016a4200370300200041" + "90016a420037030020004188016a4200370300200042003703800141f295" + "c000411720004180016a22034120101622014120470d03418996c000410b" + "41f295c0004117410110021a419496c000411120034120410110021a2004" + "101b200041e0006a22072004101c20064200370300200242003703002005" + "4200370300200042003703a0010240200422022002410020026b41037122" + "036a22054f0d0020030440200321010340200241003a0000200241016a21" + "02200141016b22010d000b0b200341016b4107490d000340200241003a00" + "00200241076a41003a0000200241066a41003a0000200241056a41003a00" + "00200241046a41003a0000200241036a41003a0000200241026a41003a00" + "00200241016a41003a0000200241086a22022005470d000b0b2005418002" + "20036b2201417c716a220220054b0440034020054100360200200541046a" + "22052002490d000b0b024020022001410371220120026a22034f0d002001" + "220504400340200241003a0000200241016a2102200541016b22050d000b" + "0b200141016b4107490d000340200241003a0000200241076a41003a0000" + "200241066a41003a0000200241056a41003a0000200241046a41003a0000" + "200241036a41003a0000200241026a41003a0000200241016a41003a0000" + "200241086a22022003470d000b0b02402007411420084120200441800210" + "17220141004a044041a596c00041102001ad10011a20014181024f0d0641" + "b596c000410920042001410110021a0c010b41be96c000412e2001ac1001" + "1a0b41ec96c000411241fe96c00041074101100222014100480d05418597" + "c000411d2001ad10011a41a297c0004111422a10014100480d0641b397c0" + "00411c420010011a4101210241cf97c000411a41014100410110021a41bb" + "98c000412941014100410110021a41e498c000412810182201450440418c" + "99c000412741e498c0004128410110021a41b399c000411e410141004101" + "10021a41ce80c000412841014100410110021a0c080b41d199c000411a20" + "01ac10011a41c37a21020c070b41b095c000411d2001ac10011a418b7c21" + "020c060b419495c000411c2001ac10011a41897c21020c050b41f894c000" + "411c2001ac10011a41887c21020c040b419998c00041222001ac10011a41" + "a77b21020c030b000b418398c00041162001ac10011a41a57b21020c010b" + "41e997c000411a42a47b10011a41a47b21020b200041c0036a240020020b" + "0bf5190100418080c0000beb196572726f725f636f64653d3d3d3d20484f" + "53542046554e4354494f4e532054455354203d3d3d54657374696e672032" + "3620686f73742066756e6374696f6e732028372063617465676f72696573" + "29535543434553533a20416c6c20686f73742066756e6374696f6e207465" + "73747320706173736564212d2d2d2043617465676f727920313a204c6564" + "676572204865616465722046756e6374696f6e73202d2d2d4c6564676572" + "2073657175656e6365206e756d6265722062797465733a4c656467657220" + "73716e20646174613a506172656e74206c65646765722074696d65206279" + "7465733a506172656e742074696d6520646174613a506172656e74206c65" + "6467657220686173683a535543434553533a204c65646765722068656164" + "65722066756e6374696f6e734552524f523a206765745f706172656e745f" + "6c65646765725f686173682077726f6e67206c656e6774683a4552524f52" + "3a206765745f706172656e745f6c65646765725f74696d65206661696c65" + "643a4552524f523a206765745f6c65646765725f73716e206661696c6564" + "3a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" + "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e2041" + "63636f756e743a5472616e73616374696f6e20466565206c656e6774683a" + "5472616e73616374696f6e20466565202873657269616c697a6564205852" + "5020616d6f756e74293a5472616e73616374696f6e2053657175656e6365" + "3a4e6573746564206669656c64206c656e6774683a4e6573746564206669" + "656c643a494e464f3a206765745f74785f6e65737465645f6669656c6420" + "6e6f74206170706c696361626c653a5369676e657273206172726179206c" + "656e6774683a4d656d6f73206172726179206c656e6774683a4e65737465" + "64206172726179206c656e6774683a494e464f3a206765745f74785f6e65" + "737465645f61727261795f6c656e206e6f74206170706c696361626c653a" + "535543434553533a205472616e73616374696f6e20646174612066756e63" + "74696f6e734552524f523a206765745f74785f6669656c64285365717565" + "6e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" + "785f6669656c6428466565292077726f6e67206c656e6774682028657870" + "6563746564203820627974657320666f7220585250293a4552524f523a20" + "6765745f74785f6669656c64284163636f756e74292077726f6e67206c65" + "6e6774683a2d2d2d2043617465676f727920333a2043757272656e74204c" + "6564676572204f626a6563742046756e6374696f6e73202d2d2d43757272" + "656e74206f626a6563742062616c616e6365206c656e6774682028585250" + "20616d6f756e74293a43757272656e74206f626a6563742062616c616e63" + "65202873657269616c697a65642058525020616d6f756e74293a43757272" + "656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e" + "2d58525020616d6f756e74293a43757272656e74206f626a656374206261" + "6c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" + "5f6f626a5f6669656c642842616c616e636529206661696c656420286d61" + "79206265206578706563746564293a43757272656e74206c656467657220" + "6f626a656374206163636f756e743a494e464f3a206765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c64284163636f756e74292066" + "61696c65643a43757272656e74206e6573746564206669656c64206c656e" + "6774683a43757272656e74206e6573746564206669656c643a494e464f3a" + "206765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f6669656c64206e6f74206170706c696361626c653a43757272656e7420" + "6f626a656374205369676e657273206172726179206c656e6774683a4375" + "7272656e74206e6573746564206172726179206c656e6774683a494e464f" + "3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e206e6f74206170706c696361626c653a535543" + "434553533a2043757272656e74206c6564676572206f626a656374206675" + "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564" + "676572204f626a6563742046756e6374696f6e73202d2d2d537563636573" + "7366756c6c7920636163686564206f626a65637420696e20736c6f743a43" + "6163686564206f626a6563742062616c616e6365206c656e677468202858" + "525020616d6f756e74293a436163686564206f626a6563742062616c616e" + "6365202873657269616c697a65642058525020616d6f756e74293a436163" + "686564206f626a6563742062616c616e6365206c656e67746820286e6f6e" + "2d58525020616d6f756e74293a436163686564206f626a6563742062616c" + "616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c" + "642842616c616e636529206661696c65643a436163686564206e65737465" + "64206669656c64206c656e6774683a436163686564206e65737465642066" + "69656c643a494e464f3a206765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64206e6f74206170706c696361626c653a436163686564" + "206f626a656374205369676e657273206172726179206c656e6774683a43" + "6163686564206e6573746564206172726179206c656e6774683a494e464f" + "3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" + "6c656e206e6f74206170706c696361626c653a535543434553533a20416e" + "79206c6564676572206f626a6563742066756e6374696f6e73494e464f3a" + "2063616368655f6c65646765725f6f626a206661696c6564202865787065" + "6374656420776974682074657374206669787475726573293a494e464f3a" + "206765745f6c65646765725f6f626a5f6669656c64206661696c65642061" + "7320657870656374656420286e6f20636163686564206f626a656374293a" + "494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669" + "656c64206661696c65642061732065787065637465643a494e464f3a2067" + "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c6564" + "2061732065787065637465643a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e206661696c6564206173" + "2065787065637465643a535543434553533a20416e79206c656467657220" + "6f626a6563742066756e6374696f6e732028696e74657266616365207465" + "73746564294552524f523a206163636f756e745f6b65796c657420666169" + "6c656420666f722063616368696e6720746573743a2d2d2d204361746567" + "6f727920353a204b65796c65742047656e65726174696f6e2046756e6374" + "696f6e73202d2d2d4163636f756e74206b65796c65743a54657374547970" + "6543726564656e7469616c206b65796c65743a494e464f3a206372656465" + "6e7469616c5f6b65796c6574206661696c65642028657870656374656420" + "2d20696e74657266616365206973737565293a457363726f77206b65796c" + "65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" + "65742067656e65726174696f6e2066756e6374696f6e734552524f523a20" + "6f7261636c655f6b65796c6574206661696c65643a4552524f523a206573" + "63726f775f6b65796c6574206661696c65643a4552524f523a206163636f" + "756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f7279" + "20363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f" + "2c205852504c205741534d20776f726c6421496e70757420646174613a53" + "48413531322068616c6620686173683a4e46542064617461206c656e6774" + "683a4e465420646174613a494e464f3a206765745f6e6674206661696c65" + "6420286578706563746564202d206e6f2073756368204e4654293a546573" + "74207472616365206d6573736167657061796c6f61645472616365206675" + "6e6374696f6e206279746573207772697474656e3a54657374206e756d62" + "657220747261636554726163655f6e756d2066756e6374696f6e20737563" + "636565646564535543434553533a205574696c6974792066756e6374696f" + "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552" + "524f523a2074726163652829206661696c65643a4552524f523a20636f6d" + "707574655f7368613531325f68616c66206661696c65643a2d2d2d204361" + "7465676f727920373a2044617461205570646174652046756e6374696f6e" + "73202d2d2d55706461746564206c656467657220656e7472792064617461" + "2066726f6d205741534d20746573745375636365737366756c6c79207570" + "6461746564206c656467657220656e74727920776974683a535543434553" + "533a2044617461207570646174652066756e6374696f6e734552524f523a" + "207570646174655f64617461206661696c65643a00550970726f64756365" + "727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38362e302d6e696768746c79202862336233" + "363861313820323032352d30312d30352900490f7461726765745f666561" + "7475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c" + "7565"; std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -11598,92 +11774,6 @@ std::string const deepRecursionHex = "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; -extern std::string const hostFunctions2Hex = - "0061736d01000000012f0760047f7f7f7f017f60037f7f7f017f60027f7f" - "017f60057f7f7f7f7f017f60037f7f7e017f60017f017f6000017f028a02" - "0a08686f73745f6c6962057472616365000308686f73745f6c69620c6765" - "745f74785f6669656c64000108686f73745f6c69620974726163655f6e75" - "6d000408686f73745f6c69620e6163636f756e745f6b65796c6574000008" - "686f73745f6c69621063616368655f6c65646765725f6f626a000108686f" - "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000008" - "686f73745f6c6962136765745f74785f6e65737465645f6669656c640000" - "08686f73745f6c6962106765745f74785f61727261795f6c656e00050868" - "6f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" - "6e000208686f73745f6c69620b7570646174655f64617461000203020106" - "05030100110619037f01418080c0000b7f00419187c0000b7f0041a087c0" - "000b072e04066d656d6f727902000666696e697368000a0a5f5f64617461" - "5f656e6403010b5f5f686561705f6261736503020ae50701e20701057f23" - "0041e0006b2201240041b580c000411b41014100410110001a41f380c000" - "412841014100410110001a200141d0006a4100360200200141c8006a4200" - "370300200142003703400240024002400240024002400240418180202001" - "41406b22004114100122024114460440419b81c000410e20004114410110" - "001a2001420037032041888018200141206a41081001220041004c0d0141" - "a981c00041112000ad10021a2001410036020841848008200141086a4104" - "1001220041004c044041d081c00041252000ac10021a0c070b41ba81c000" - "41162000ad10021a41bf82c000412841014100410110001a200141306a22" - "034100360200200141286a22044200370300200142003703204181802020" - "0141206a22024114100122004100480d0220012000360238200141143602" - "3c20004114470d03200141106a2004290300370300200141186a20032802" - "0036020020012001290320370308200141d8006a4200370300200141d000" - "6a4200370300200141c8006a420037030020014200370340024002402001" - "41086a4114200141406b220341201003220041004a044041e782c000410f" - "20034120410110001a41f682c00041172000ad10021a2003200041001004" - "220041004c0d01418d83c00041162000ad10021a20014200370320200041" - "828018200241081005220041004a044041a383c00041152000ad10021a20" - "0041094f0d0841b883c000410e20022000410110001a0c030b41c683c000" - "412b2000ac10021a0c020b41ac84c000411d2000ac10021a417e21000c09" - "0b41f183c000413b2000ac10021a0b41c984c00041234101410041011000" - "1a200141d8006a4200370300200141d0006a4200370300200141c8006a42" - "0037030020014200370340024041ec84c0004102200141406b2202412010" - "06220041004e044041ee84c000411e2000ad10021a200041214f0d07418c" - "85c000411220022000410110001a0c010b419e85c00041292000ac10021a" - "0b02404183803c10072200410048044041c785c00041202000ac10021a0c" - "010b41e785c00041152000ad10021a0b024041ec84c00041021008220041" - "0048044041fc85c000411f2000ac10021a0c010b419b86c00041142000ad" - "10021a0b4101210041af86c000412241014100410110001a41d186c00041" - "0e10092202044041f786c000411a2002ac10021a417c21000c080b41df86" - "c000411841d186c000410e410110001a41d080c000412341014100410110" - "001a0c070b419582c000412a2002ac10021a0c050b41f581c00041202000" - "ac10021a0c040b418080c00041354100410041001000000b200141003602" - "40230041106b2400000b000b000b417f21000b200141e0006a240020000b" - "0b9b070100418080c0000b9107486f73742066756e6374696f6e20676574" - "5f63757272656e745f657363726f775f66696e6973685f6669656c642066" - "61696c6564213d3d3d20484f53542046554e4354494f4e53205445535420" - "3d3d3d535543434553533a20486f73742066756e6374696f6e2074657374" - "73207061737365642d2d2d205465737420313a205472616e73616374696f" - "6e204669656c6420416363657373202d2d2d4163636f756e74206669656c" - "643a466565206669656c64206c656e6774683a53657175656e6365206669" - "656c64206c656e6774683a4552524f523a206765745f74785f6669656c64" - "2853657175656e636529206661696c65643a4552524f523a206765745f74" - "785f6669656c642846656529206661696c65643a4552524f523a20676574" - "5f74785f6669656c64284163636f756e74292077726f6e67206c656e6774" - "683a2d2d2d205465737420323a204c6564676572204f626a656374204f70" - "65726174696f6e73202d2d2d4163636f756e74206b65796c65743a4b6579" - "6c65742062797465732067656e6572617465643a4f626a65637420636163" - "68656420696e20736c6f743a42616c616e6365206669656c64206c656e67" - "74683a42616c616e6365206669656c643a494e464f3a206765745f6c6564" - "6765725f6f626a5f6669656c642842616c616e636529206661696c65643a" - "494e464f3a2063616368655f6c65646765725f6f626a206661696c656420" - "28657870656374656420666f722074657374206669787475726573293a45" - "52524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d" - "2d205465737420333a204e6573746564204669656c642041636365737320" - "2d2d2d01024e6573746564206669656c6420616363657373207375636365" - "656465643a4e6573746564206669656c6420646174613a494e464f3a2067" - "65745f74785f6e65737465645f6669656c64206e6f74206170706c696361" - "626c653a494e464f3a204e6f207369676e657273206172726179206f7220" - "6572726f723a5369676e657273206172726179206c656e6774683a494e46" - "4f3a204e6f206e6573746564206172726179206f72206572726f723a4e65" - "73746564206172726179206c656e6774683a2d2d2d205465737420343a20" - "5374617465204d6f64696669636174696f6e202d2d2d746573745f737461" - "74655f31323353746174652075706461746564207769746820646174613a" - "4552524f523a207570646174655f64617461206661696c65643a00550970" - "726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38362e302d6e696768746c79" - "202862336233363861313820323032352d30312d30352900490f74617267" - "65745f6665617475726573042b0f6d757461626c652d676c6f62616c732b" - "087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" - "6c746976616c7565"; - extern std::string const reqNonexistentField = "0061736d0100000001120360027f7f0060047f7f7f7f017f6000017f02200108686f73745f" "6c6962136765745f74785f6e65737465645f6669656c640001030403020000050301001006" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index aa560580ffa..97b2236d1b8 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -51,10 +51,6 @@ extern std::string const zkProofHex; extern std::string const sp1_wasm; -extern std::string const xrplStdExampleHex; - -extern std::string const hostFunctions2Hex; - extern std::string const reqNonexistentField; extern std::string const hfPerfTest; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index e35af622d46..152c946c7cc 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -92,33 +92,41 @@ getAnyFieldData(STBase const* obj) return Unexpected(HostFunctionError::NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& account(static_cast(obj)); + auto const* account(static_cast(obj)); auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } break; - case STI_AMOUNT: { - auto const& amount(static_cast(obj)); - int64_t const data = amount->xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; + case STI_AMOUNT: + // will be processed by serializer + break; + case STI_ISSUE: { + auto const* issue(static_cast(obj)); + Asset const& asset(issue->value()); + // XRP and IOU will be processed by serializer + if (!asset.holds()) + { + // MPT + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; + } } break; case STI_VL: { - auto const& vl(static_cast(obj)); + auto const* vl(static_cast(obj)); auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT256: { - auto const& num(static_cast const*>(obj)); + auto const* num(static_cast const*>(obj)); auto const& data = num->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT32: { - auto const& num(static_cast const*>(obj)); + auto const* num(static_cast const*>(obj)); std::uint32_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); @@ -131,8 +139,9 @@ getAnyFieldData(STBase const* obj) Serializer msg; obj->add(msg); + auto const data = msg.getData(); - return msg.getData(); + return data; } Expected @@ -600,13 +609,13 @@ WasmHostFunctionsImpl::trace( bool asHex) { #ifdef DEBUG_OUTPUT - auto j = ctx.journal.error(); + auto j = getJournal().error(); #else - auto j = ctx.journal.trace(); + auto j = getJournal().trace(); #endif if (!asHex) { - j << "WAMR TRACE (" << leKey.key << "): " << msg << " - " + j << "WAMR TRACE (" << leKey.key << "): " << msg << " " << std::string_view( reinterpret_cast(data.data()), data.size()); } @@ -614,8 +623,9 @@ WasmHostFunctionsImpl::trace( { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex(data.begin(), data.end(), hex.begin()); - j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << hex; + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); @@ -625,13 +635,11 @@ Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { #ifdef DEBUG_OUTPUT - auto j = ctx.journal.error(); + auto j = getJournal().error(); #else - auto j = ctx.journal.trace(); + auto j = getJournal().trace(); #endif - - j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << data; - + j << "WAMR TRACE NUM(" << leKey.key << "): " << msg << " " << data; return msg.size() + sizeof(data); } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index c2b321e85ac..9fae700988a 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -98,13 +98,14 @@ getDataSlice(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { auto const src = params->data[i].of.i32; auto const ssz = params->data[i + 1].of.i32; - if (src < 0 || ssz <= 0) + if (src < 0 || ssz < 0) return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!ssz) + return Slice(); + if (ssz > maxWasmDataLength) - { return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - } auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) @@ -245,22 +246,6 @@ returnResult( } } -wasm_trap_t* -getLedgerSqnOld_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) -{ - auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); - auto const sqn = hf->getLedgerSqn(); - if (!sqn) - { - return hfResult(results, sqn.error()); - } - return hfResult(results, static_cast(sqn.value())); -} - wasm_trap_t* getLedgerSqn_wrap( void* env, @@ -1172,7 +1157,7 @@ testGetDataIncrement() int index = 0; auto const result = getDataSlice(&rt, ¶ms, index); - if (!result || result.value() != Slice(buffer.data(), 3)) + if (!result || result.value() != Slice(buffer.data(), 3) || index != 2) return false; } @@ -1188,7 +1173,8 @@ testGetDataIncrement() if (!result || result.value() != std::string_view( - reinterpret_cast(buffer.data()), 5)) + reinterpret_cast(buffer.data()), 5) || + index != 2) return false; } @@ -1205,7 +1191,7 @@ testGetDataIncrement() int index = 0; auto const result = getDataAccountID(&rt, ¶ms, index); - if (!result || result.value() != id) + if (!result || result.value() != id || index != 2) return false; } @@ -1221,7 +1207,23 @@ testGetDataIncrement() int index = 0; auto const result = getDataUInt256(&rt, ¶ms, index); - if (!result || result.value() != h1) + if (!result || result.value() != h1 || index != 2) + return false; + } + + { + // test Currency + + Currency const c = xrpCurrency(); + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(c.bytes); + memcpy(&buffer[0], c.data(), c.bytes); + + int index = 0; + auto const result = getDataCurrency(&rt, ¶ms, index); + if (!result || result.value() != c || index != 2) return false; } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 93b681009de..22597716322 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -23,13 +23,6 @@ namespace ripple { -using getLedgerSqnOld_proto = int32_t(); -wasm_trap_t* -getLedgerSqnOld_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getLedgerSqn_wrap( diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index c9badfe460b..0b94150db2f 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -17,6 +17,10 @@ */ //============================================================================== +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + #include #include #include @@ -38,10 +42,6 @@ createWasmImport(HostFunctions* hfs) { // clang-format off - // TODO: remove after escrow_test wasm module will be updated - WASM_IMPORT_FUNC2(i, getLedgerSqnOld, "getLedgerSqn", hfs, 60); - - WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); @@ -111,12 +111,16 @@ runEscrowWasm( if (!ret) { - // std::cout << ", error: " << ret.error() << std::endl; +#ifdef DEBUG_OUTPUT + std::cout << ", error: " << ret.error() << std::endl; +#endif return Unexpected(ret.error()); } - // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << - // std::endl; +#ifdef DEBUG_OUTPUT + std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost + << std::endl; +#endif return EscrowResult{ret->result > 0, ret->cost}; } From 98b898686892ae3d335ace30405339207f8ca51d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 23 Jul 2025 13:47:56 -0400 Subject: [PATCH 35/73] fix merge issues (mostly with Conan2 upgrade) --- .github/workflows/macos.yml | 6 +++--- .github/workflows/nix.yml | 1 + .github/workflows/windows.yml | 12 ++++++------ conanfile.py | 1 + external/wamr/conanfile.py | 14 ++++++-------- src/test/app/Escrow_test.cpp | 4 ++-- src/xrpld/app/tx/detail/Escrow.cpp | 3 ++- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8acd90eeff6..b21d912f44b 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -11,7 +11,7 @@ on: - release - master # Branches that opt-in to running - - 'ci/**' + - "ci/**" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -31,7 +31,6 @@ env: tools.compilation:verbosity=verbose jobs: - test: if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }} strategy: @@ -88,7 +87,7 @@ jobs: sysctl -n hw.logicalcpu clang --version - name: configure Conan - run : | + run: | echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show @@ -98,6 +97,7 @@ jobs: conan export --version 1.1.10 external/snappy conan export --version 9.7.3 external/rocksdb conan export --version 4.0.3 external/soci + conan export --version 2.3.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index dc895285f9f..d404a0fec24 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -384,6 +384,7 @@ jobs: run: | echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ + conan export --version 2.3.1 external/wamr conan profile show - name: build dependencies run: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 254850f26ab..369e4869d47 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -12,7 +12,7 @@ on: - release - master # Branches that opt-in to running - - 'ci/**' + - "ci/**" # https://docs.github.com/en/actions/using-jobs/using-concurrency concurrency: @@ -34,7 +34,6 @@ env: tools.compilation:verbosity=verbose jobs: - test: if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }} strategy: @@ -70,8 +69,8 @@ jobs: - name: restore Python cache directory uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }} + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }} - name: install Conan run: pip install wheel conan - name: check environment @@ -93,6 +92,7 @@ jobs: conan export --version 1.1.10 external/snappy conan export --version 9.7.3 external/rocksdb conan export --version 4.0.3 external/soci + conan export --version 2.3.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash @@ -110,10 +110,10 @@ jobs: - name: build uses: ./.github/actions/build with: - generator: '${{ matrix.version.generator }}' + generator: "${{ matrix.version.generator }}" configuration: ${{ matrix.configuration.type }} # Hard code for now. Move to the matrix if varied options are needed - cmake-args: '-Dassert=TRUE -Dwerr=TRUE -Dreporting=OFF -Dunity=ON' + cmake-args: "-Dassert=TRUE -Dwerr=TRUE -Dreporting=OFF -Dunity=ON" cmake-target: install - name: test shell: bash diff --git a/conanfile.py b/conanfile.py index 19f056dc1d0..9a4eccbdce1 100644 --- a/conanfile.py +++ b/conanfile.py @@ -193,6 +193,7 @@ def package_info(self): 'protobuf::libprotobuf', 'soci::soci', 'sqlite3::sqlite', + 'wamr::wamr', 'xxhash::xxhash', 'zlib::zlib', ] diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index 1fa3281c1e5..f391ea43505 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -1,10 +1,11 @@ -from conans import ConanFile, tools +from conan import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout from conan.tools.files import ( apply_conandata_patches, export_conandata_patches, # get, ) +from conan.tools.scm import Git # import os @@ -21,7 +22,6 @@ class WamrConan(ConanFile): settings = "os", "compiler", "build_type", "arch" options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} - generators = "CMakeToolchain", "CMakeDeps" # requires = [("llvm/20.1.1@")] def export_sources(self): @@ -39,11 +39,10 @@ def layout(self): cmake_layout(self, src_folder="src") def source(self): - git = tools.Git() - git.clone( - "https://github.com/bytecodealliance/wasm-micro-runtime.git", - "2a303861cc916dc182b7fecaa0aacc1b797e7ac6", - shallow=True, + git = Git(self) + git.fetch_commit( + url="https://github.com/bytecodealliance/wasm-micro-runtime.git", + commit="2a303861cc916dc182b7fecaa0aacc1b797e7ac6", ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -89,4 +88,3 @@ def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" - diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index ab2e9a993dc..3fdccae9ee5 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1712,7 +1712,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, supported_amendments() - featureSmartEscrow); + Env env(*this, testable_amendments() - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); @@ -1882,7 +1882,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, supported_amendments() - featureSmartEscrow); + Env env(*this, testable_amendments() - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; env(escrow::finish(carol, alice, 1), diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index f70621fa4ed..048e54805ee 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1189,7 +1189,8 @@ EscrowFinish::doApply() if (ctx_.view().rules().enabled(featureDepositAuth)) { - if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + if (auto err = verifyDepositPreauth( + ctx_.tx, ctx_.view(), account_, destID, sled, ctx_.journal); !isTesSuccess(err)) return err; } From 7f52287aae17751e30564c9ed90fbe944dfb88ee Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 25 Jul 2025 11:54:31 -0400 Subject: [PATCH 36/73] rename variables (#5609) * rename variables * instanceWrapper -> runtime * size -> srcSize * begin -> ptr --- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 386 +++++++++++---------- 1 file changed, 207 insertions(+), 179 deletions(-) diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 9fae700988a..23b89af3d32 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -30,34 +30,34 @@ using SFieldCRef = std::reference_wrapper; static int32_t setData( - InstanceWrapper const* rt, + InstanceWrapper const* runtime, int32_t dst, - int32_t dsz, + int32_t dstSize, uint8_t const* src, - int32_t ssz) + int32_t srcSize) { - if (!ssz) + if (!srcSize) return 0; - if (dst < 0 || dsz < 0 || !src || ssz < 0) + if (dst < 0 || dstSize < 0 || !src || srcSize < 0) return static_cast>( HostFunctionError::INVALID_PARAMS); - auto mem = rt ? rt->getMem() : wmem(); + auto memory = runtime ? runtime->getMem() : wmem(); - if (!mem.s) + if (!memory.s) return static_cast>( HostFunctionError::NO_MEM_EXPORTED); - if (dst + dsz > mem.s) + if (dst + dstSize > memory.s) return static_cast>( HostFunctionError::POINTER_OUT_OF_BOUNDS); - if (ssz > dsz) + if (srcSize > dstSize) return static_cast>( HostFunctionError::BUFFER_TOO_SMALL); - memcpy(mem.p + dst, src, ssz); + memcpy(memory.p + dst, src, srcSize); - return ssz; + return srcSize; } template @@ -94,79 +94,79 @@ getDataSField(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataSlice(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const src = params->data[i].of.i32; - auto const ssz = params->data[i + 1].of.i32; - if (src < 0 || ssz < 0) + auto const ptr = params->data[i].of.i32; + auto const size = params->data[i + 1].of.i32; + if (ptr < 0 || size < 0) return Unexpected(HostFunctionError::INVALID_PARAMS); - if (!ssz) + if (!size) return Slice(); - if (ssz > maxWasmDataLength) + if (size > maxWasmDataLength) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - auto mem = rt ? rt->getMem() : wmem(); - if (!mem.s) + auto memory = runtime ? runtime->getMem() : wmem(); + if (!memory.s) return Unexpected(HostFunctionError::NO_MEM_EXPORTED); - if (src + ssz > mem.s) + if (ptr + size > memory.s) return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); - Slice data(mem.p + src, ssz); + Slice data(memory.p + ptr, size); i += 2; return data; } template Expected -getDataUInt256(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataUInt256(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r) + auto const slice = getDataSlice(runtime, params, i); + if (!slice) { - return Unexpected(r.error()); + return Unexpected(slice.error()); } - if (r->size() != uint256::bytes) + if (slice->size() != uint256::bytes) { return Unexpected(HostFunctionError::INVALID_PARAMS); } - return uint256::fromVoid(r->data()); + return uint256::fromVoid(slice->data()); } template Expected -getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataAccountID(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r || (r->size() != AccountID::bytes)) + auto const slice = getDataSlice(runtime, params, i); + if (!slice || (slice->size() != AccountID::bytes)) return Unexpected(HostFunctionError::INVALID_PARAMS); - return AccountID::fromVoid(r->data()); + return AccountID::fromVoid(slice->data()); } template static Expected -getDataCurrency(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r || (r->size() != Currency::bytes)) + auto const slice = getDataSlice(runtime, params, i); + if (!slice || (slice->size() != Currency::bytes)) return Unexpected(HostFunctionError::INVALID_PARAMS); - return Currency::fromVoid(r->data()); + return Currency::fromVoid(slice->data()); } template Expected -getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataString(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r) - return Unexpected(r.error()); + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + return Unexpected(slice.error()); return std::string_view( - reinterpret_cast(r->data()), r->size()); + reinterpret_cast(slice->data()), slice->size()); } std::nullptr_t @@ -189,7 +189,7 @@ hfResult(wasm_val_vec_t* results, HostFunctionError value) template std::nullptr_t returnResult( - InstanceWrapper const* rt, + InstanceWrapper const* runtime, wasm_val_vec_t const* params, wasm_val_vec_t* results, Expected const& res, @@ -204,7 +204,7 @@ returnResult( return hfResult( results, setData( - rt, + runtime, params->data[index].of.i32, params->data[index + 1].of.i32, res->data(), @@ -215,7 +215,7 @@ returnResult( return hfResult( results, setData( - rt, + runtime, params->data[index].of.i32, params->data[index + 1].of.i32, res->data(), @@ -233,7 +233,7 @@ returnResult( return hfResult( results, setData( - rt, + runtime, params->data[index].of.i32, params->data[index + 1].of.i32, reinterpret_cast(&resultValue), @@ -253,10 +253,10 @@ getLedgerSqn_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult(rt, params, results, hf->getLedgerSqn(), index); + return returnResult(runtime, params, results, hf->getLedgerSqn(), index); } wasm_trap_t* @@ -266,10 +266,11 @@ getParentLedgerTime_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult(rt, params, results, hf->getParentLedgerTime(), index); + return returnResult( + runtime, params, results, hf->getParentLedgerTime(), index); } wasm_trap_t* @@ -279,10 +280,11 @@ getParentLedgerHash_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult(rt, params, results, hf->getParentLedgerHash(), index); + return returnResult( + runtime, params, results, hf->getParentLedgerHash(), index); } wasm_trap_t* @@ -292,23 +294,23 @@ cacheLedgerObj_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const id = getDataUInt256(rt, params, index); + auto const id = getDataUInt256(runtime, params, index); if (!id) { return hfResult(results, id.error()); } - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } return returnResult( - rt, params, results, hf->cacheLedgerObj(*id, *cache), index); + runtime, params, results, hf->cacheLedgerObj(*id, *cache), index); } wasm_trap_t* @@ -318,15 +320,16 @@ getTxField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } - return returnResult(rt, params, results, hf->getTxField(*fname), index); + return returnResult( + runtime, params, results, hf->getTxField(*fname), index); } wasm_trap_t* @@ -336,17 +339,17 @@ getCurrentLedgerObjField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getCurrentLedgerObjField(*fname), index); + runtime, params, results, hf->getCurrentLedgerObjField(*fname), index); } wasm_trap_t* @@ -356,23 +359,23 @@ getLedgerObjField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getLedgerObjField(*cache, *fname), index); + runtime, params, results, hf->getLedgerObjField(*cache, *fname), index); } wasm_trap_t* @@ -382,17 +385,17 @@ getTxNestedField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->getTxNestedField(*bytes), index); + runtime, params, results, hf->getTxNestedField(*bytes), index); } wasm_trap_t* @@ -402,16 +405,20 @@ getCurrentLedgerObjNestedField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->getCurrentLedgerObjNestedField(*bytes), index); + runtime, + params, + results, + hf->getCurrentLedgerObjNestedField(*bytes), + index); } wasm_trap_t* @@ -421,23 +428,23 @@ getLedgerObjNestedField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, + runtime, params, results, hf->getLedgerObjNestedField(*cache, *bytes), @@ -451,16 +458,17 @@ getTxArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } - return returnResult(rt, params, results, hf->getTxArrayLen(*fname), index); + return returnResult( + runtime, params, results, hf->getTxArrayLen(*fname), index); } wasm_trap_t* @@ -470,17 +478,21 @@ getCurrentLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getCurrentLedgerObjArrayLen(*fname), index); + runtime, + params, + results, + hf->getCurrentLedgerObjArrayLen(*fname), + index); } wasm_trap_t* @@ -490,23 +502,27 @@ getLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getLedgerObjArrayLen(*cache, *fname), index); + runtime, + params, + results, + hf->getLedgerObjArrayLen(*cache, *fname), + index); } wasm_trap_t* @@ -516,17 +532,17 @@ getTxNestedArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->getTxNestedArrayLen(*bytes), index); + runtime, params, results, hf->getTxNestedArrayLen(*bytes), index); } wasm_trap_t* @@ -536,17 +552,17 @@ getCurrentLedgerObjNestedArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, + runtime, params, results, hf->getCurrentLedgerObjNestedArrayLen(*bytes), @@ -559,22 +575,22 @@ getLedgerObjNestedArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, + runtime, params, results, hf->getLedgerObjNestedArrayLen(*cache, *bytes), @@ -588,16 +604,17 @@ updateData_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } - return returnResult(rt, params, results, hf->updateData(*bytes), index); + return returnResult( + runtime, params, results, hf->updateData(*bytes), index); } wasm_trap_t* @@ -607,16 +624,16 @@ computeSha512HalfHash_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->computeSha512HalfHash(*bytes), index); + runtime, params, results, hf->computeSha512HalfHash(*bytes), index); } wasm_trap_t* @@ -626,16 +643,17 @@ accountKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - return returnResult(rt, params, results, hf->accountKeylet(*acc), index); + return returnResult( + runtime, params, results, hf->accountKeylet(*acc), index); } wasm_trap_t* @@ -645,23 +663,23 @@ checkKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->checkKeylet(acc.value(), *seq), index); + runtime, params, results, hf->checkKeylet(acc.value(), *seq), index); } wasm_trap_t* @@ -671,29 +689,29 @@ credentialKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const subj = getDataAccountID(rt, params, index); + auto const subj = getDataAccountID(runtime, params, index); if (!subj) { return hfResult(results, subj.error()); } - auto const iss = getDataAccountID(rt, params, index); + auto const iss = getDataAccountID(runtime, params, index); if (!iss) { return hfResult(results, iss.error()); } - auto const credType = getDataSlice(rt, params, index); + auto const credType = getDataSlice(runtime, params, index); if (!credType) { return hfResult(results, credType.error()); } return returnResult( - rt, + runtime, params, results, hf->credentialKeylet(*subj, *iss, *credType), @@ -707,23 +725,23 @@ delegateKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const authorize = getDataAccountID(rt, params, index); + auto const authorize = getDataAccountID(runtime, params, index); if (!authorize) { return hfResult(results, authorize.error()); } return returnResult( - rt, + runtime, params, results, hf->delegateKeylet(acc.value(), authorize.value()), @@ -737,23 +755,23 @@ depositPreauthKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const authorize = getDataAccountID(rt, params, index); + auto const authorize = getDataAccountID(runtime, params, index); if (!authorize) { return hfResult(results, authorize.error()); } return returnResult( - rt, + runtime, params, results, hf->depositPreauthKeylet(acc.value(), authorize.value()), @@ -764,16 +782,17 @@ wasm_trap_t* didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - return returnResult(rt, params, results, hf->didKeylet(acc.value()), index); + return returnResult( + runtime, params, results, hf->didKeylet(acc.value()), index); } wasm_trap_t* @@ -783,23 +802,23 @@ escrowKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->escrowKeylet(*acc, *seq), index); + runtime, params, results, hf->escrowKeylet(*acc, *seq), index); } wasm_trap_t* @@ -809,29 +828,29 @@ lineKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc1 = getDataAccountID(rt, params, index); + auto const acc1 = getDataAccountID(runtime, params, index); if (!acc1) { return hfResult(results, acc1.error()); } - auto const acc2 = getDataAccountID(rt, params, index); + auto const acc2 = getDataAccountID(runtime, params, index); if (!acc2) { return hfResult(results, acc2.error()); } - auto const currency = getDataCurrency(rt, params, index); + auto const currency = getDataCurrency(runtime, params, index); if (!currency) { return hfResult(results, currency.error()); } return returnResult( - rt, + runtime, params, results, hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), @@ -845,23 +864,23 @@ nftOfferKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, + runtime, params, results, hf->nftOfferKeylet(acc.value(), seq.value()), @@ -875,23 +894,27 @@ offerKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->offerKeylet(acc.value(), seq.value()), index); + runtime, + params, + results, + hf->offerKeylet(acc.value(), seq.value()), + index); } wasm_trap_t* @@ -901,22 +924,22 @@ oracleKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const documentId = getDataInt32(rt, params, index); + auto const documentId = getDataInt32(runtime, params, index); if (!documentId) { return hfResult(results, documentId.error()); } return returnResult( - rt, params, results, hf->oracleKeylet(*acc, *documentId), index); + runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); } wasm_trap_t* @@ -926,29 +949,29 @@ paychanKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const dest = getDataAccountID(rt, params, index); + auto const dest = getDataAccountID(runtime, params, index); if (!dest) { return hfResult(results, dest.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, + runtime, params, results, hf->paychanKeylet(acc.value(), dest.value(), seq.value()), @@ -962,17 +985,17 @@ signersKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } return returnResult( - rt, params, results, hf->signersKeylet(acc.value()), index); + runtime, params, results, hf->signersKeylet(acc.value()), index); } wasm_trap_t* @@ -982,23 +1005,27 @@ ticketKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->ticketKeylet(acc.value(), seq.value()), index); + runtime, + params, + results, + hf->ticketKeylet(acc.value(), seq.value()), + index); ; } @@ -1006,29 +1033,30 @@ wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const nftId = getDataUInt256(rt, params, index); + auto const nftId = getDataUInt256(runtime, params, index); if (!nftId) { return hfResult(results, nftId.error()); } - return returnResult(rt, params, results, hf->getNFT(*acc, *nftId), index); + return returnResult( + runtime, params, results, hf->getNFT(*acc, *nftId), index); } wasm_trap_t* trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) @@ -1036,53 +1064,53 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = getDataString(rt, params, index); + auto const msg = getDataString(runtime, params, index); if (!msg) { return hfResult(results, msg.error()); } - auto const data = getDataSlice(rt, params, index); + auto const data = getDataSlice(runtime, params, index); if (!data) { return hfResult(results, data.error()); } - auto const asHex = getDataInt32(rt, params, index); + auto const asHex = getDataInt32(runtime, params, index); if (!asHex) { return hfResult(results, asHex.error()); } return returnResult( - rt, params, results, hf->trace(*msg, *data, *asHex), index); + runtime, params, results, hf->trace(*msg, *data, *asHex), index); } wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; if (params->data[1].of.i32 > maxWasmDataLength) { return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = getDataString(rt, params, index); + auto const msg = getDataString(runtime, params, index); if (!msg) { return hfResult(results, msg.error()); } - auto const number = getDataInt64(rt, params, index); + auto const number = getDataInt64(runtime, params, index); if (!number) { return hfResult(results, number.error()); } return returnResult( - rt, params, results, hf->traceNum(*msg, *number), index); + runtime, params, results, hf->traceNum(*msg, *number), index); } class MockInstanceWrapper @@ -1090,7 +1118,7 @@ class MockInstanceWrapper wmem mem_; public: - MockInstanceWrapper(wmem mem) : mem_(mem) + MockInstanceWrapper(wmem memory) : mem_(memory) { } @@ -1110,7 +1138,7 @@ testGetDataIncrement() std::array buffer = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - MockInstanceWrapper rt(wmem{buffer.data(), buffer.size()}); + MockInstanceWrapper runtime(wmem{buffer.data(), buffer.size()}); { // test int32_t @@ -1119,7 +1147,7 @@ testGetDataIncrement() values[0] = WASM_I32_VAL(42); int index = 0; - auto const result = getDataInt32(&rt, ¶ms, index); + auto const result = getDataInt32(&runtime, ¶ms, index); if (!result || result.value() != 42 || index != 1) return false; } @@ -1131,7 +1159,7 @@ testGetDataIncrement() values[0] = WASM_I64_VAL(1234); int index = 0; - auto const result = getDataInt64(&rt, ¶ms, index); + auto const result = getDataInt64(&runtime, ¶ms, index); if (!result || result.value() != 1234 || index != 1) return false; } @@ -1143,7 +1171,7 @@ testGetDataIncrement() values[0] = WASM_I32_VAL(sfAccount.fieldCode); int index = 0; - auto const result = getDataSField(&rt, ¶ms, index); + auto const result = getDataSField(&runtime, ¶ms, index); if (!result || result.value().get() != sfAccount || index != 1) return false; } @@ -1156,7 +1184,7 @@ testGetDataIncrement() values[1] = WASM_I32_VAL(3); int index = 0; - auto const result = getDataSlice(&rt, ¶ms, index); + auto const result = getDataSlice(&runtime, ¶ms, index); if (!result || result.value() != Slice(buffer.data(), 3) || index != 2) return false; } @@ -1169,7 +1197,7 @@ testGetDataIncrement() values[1] = WASM_I32_VAL(5); int index = 0; - auto const result = getDataString(&rt, ¶ms, index); + auto const result = getDataString(&runtime, ¶ms, index); if (!result || result.value() != std::string_view( @@ -1190,7 +1218,7 @@ testGetDataIncrement() memcpy(&buffer[0], id.data(), id.bytes); int index = 0; - auto const result = getDataAccountID(&rt, ¶ms, index); + auto const result = getDataAccountID(&runtime, ¶ms, index); if (!result || result.value() != id || index != 2) return false; } @@ -1206,7 +1234,7 @@ testGetDataIncrement() memcpy(&buffer[0], h1.data(), h1.bytes); int index = 0; - auto const result = getDataUInt256(&rt, ¶ms, index); + auto const result = getDataUInt256(&runtime, ¶ms, index); if (!result || result.value() != h1 || index != 2) return false; } @@ -1222,7 +1250,7 @@ testGetDataIncrement() memcpy(&buffer[0], c.data(), c.bytes); int index = 0; - auto const result = getDataCurrency(&rt, ¶ms, index); + auto const result = getDataCurrency(&runtime, ¶ms, index); if (!result || result.value() != c || index != 2) return false; } From 3d933791320301ade73a438a47e1c3adb1b0239a Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 25 Jul 2025 15:10:47 -0400 Subject: [PATCH 37/73] add header --- src/xrpld/app/misc/WamrVM.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 64759ff8d07..3f0bd1d95fb 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -21,6 +21,7 @@ #include +#include #include #ifdef _DEBUG From 6f91b8f8d15892cd3964985ecb9b9e53d138e879 Mon Sep 17 00:00:00 2001 From: Oleksandr <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 28 Jul 2025 11:08:40 -0400 Subject: [PATCH 38/73] Fix windows --- cmake/RippledCore.cmake | 5 +++++ external/wamr/patches/ripp_metering.patch | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index b3a6a77bcb5..e5c584d1eb0 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -68,6 +68,11 @@ target_link_libraries(xrpl.imports.main wamr::wamr ) +if (WIN32) + target_link_libraries(xrpl.imports.main INTERFACE ntdll) +endif() + + include(add_module) include(target_link_modules) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 5e09eec8df8..76a2057cc9a 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 88a1642b..aeb29912 100644 +index 88a1642b..e9eab7ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ @@ -11,6 +11,15 @@ index 88a1642b..aeb29912 100644 option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) +@@ -170,7 +170,7 @@ if (MINGW) + endif () + + if (WIN32) +- target_link_libraries(vmlib PRIVATE ntdll) ++ target_link_libraries(vmlib PUBLIC ntdll) + endif() + + set (WAMR_PUBLIC_HEADERS diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index b2c9ed62..87947a18 100644 --- a/core/iwasm/aot/aot_runtime.c @@ -389,7 +398,7 @@ index ddc0b15b..3a707878 100644 #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 1e98b0fa..db6278c5 100644 +index 1e98b0fa..e77fdfcd 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) @@ -406,7 +415,7 @@ index 1e98b0fa..db6278c5 100644 +#define CHECK_INSTRUCTION_LIMIT() \ + do { \ + --instructions_left; \ -+ if (instructions_left <= 0) { \ ++ if (instructions_left < 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ + } \ From 44cb588371e9ba821eba9f33fa63ce33d15a94b1 Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Fri, 25 Jul 2025 20:48:22 +0100 Subject: [PATCH 39/73] Build options cleanup (#5581) As we no longer support old compiler versions, we are bringing back some warnings by removing no longer relevant `-Wno-...` options. --- cmake/RippledCompiler.cmake | 23 ++------- external/ed25519-donna/CMakeLists.txt | 3 ++ .../detail/aged_unordered_container.h | 1 - src/libxrpl/protocol/PublicKey.cpp | 5 +- src/libxrpl/protocol/STTx.cpp | 4 +- src/libxrpl/protocol/tokens.cpp | 4 +- src/test/app/RCLValidations_test.cpp | 1 - .../beast/aged_associative_container_test.cpp | 48 ------------------- src/test/consensus/LedgerTrie_test.cpp | 2 - src/test/consensus/Validations_test.cpp | 1 - src/xrpld/rpc/handlers/LogLevel.cpp | 1 - 11 files changed, 15 insertions(+), 78 deletions(-) diff --git a/cmake/RippledCompiler.cmake b/cmake/RippledCompiler.cmake index 7485605d950..30058fd5036 100644 --- a/cmake/RippledCompiler.cmake +++ b/cmake/RippledCompiler.cmake @@ -90,28 +90,15 @@ if (MSVC) -errorreport:none -machine:X64) else () - # HACK : because these need to come first, before any warning demotion - string (APPEND CMAKE_CXX_FLAGS " -Wall -Wdeprecated") - if (wextra) - string (APPEND CMAKE_CXX_FLAGS " -Wextra -Wno-unused-parameter") - endif () - # not MSVC target_compile_options (common INTERFACE + -Wall + -Wdeprecated + $<$:-Wextra -Wno-unused-parameter> $<$:-Werror> - $<$: - -frtti - -Wnon-virtual-dtor - > - -Wno-sign-compare - -Wno-char-subscripts - -Wno-format - -Wno-unused-local-typedefs -fstack-protector - $<$: - -Wno-unused-but-set-variable - -Wno-deprecated - > + -Wno-sign-compare + -Wno-unused-but-set-variable $<$>:-fno-strict-aliasing> # tweak gcc optimization for debug $<$,$>:-O0> diff --git a/external/ed25519-donna/CMakeLists.txt b/external/ed25519-donna/CMakeLists.txt index 418dc38326b..f060d530aa4 100644 --- a/external/ed25519-donna/CMakeLists.txt +++ b/external/ed25519-donna/CMakeLists.txt @@ -17,6 +17,9 @@ add_library(ed25519 STATIC ) add_library(ed25519::ed25519 ALIAS ed25519) target_link_libraries(ed25519 PUBLIC OpenSSL::SSL) +if(NOT MSVC) + target_compile_options(ed25519 PRIVATE -Wno-implicit-fallthrough) +endif() include(GNUInstallDirs) diff --git a/include/xrpl/beast/container/detail/aged_unordered_container.h b/include/xrpl/beast/container/detail/aged_unordered_container.h index 3b9c83a0149..23200ae007e 100644 --- a/include/xrpl/beast/container/detail/aged_unordered_container.h +++ b/include/xrpl/beast/container/detail/aged_unordered_container.h @@ -3257,7 +3257,6 @@ operator==(aged_unordered_container< { if (size() != other.size()) return false; - using EqRng = std::pair; for (auto iter(cbegin()), last(cend()); iter != last;) { auto const& k(extract(*iter)); diff --git a/src/libxrpl/protocol/PublicKey.cpp b/src/libxrpl/protocol/PublicKey.cpp index cdf646e0f86..54b50c80ef1 100644 --- a/src/libxrpl/protocol/PublicKey.cpp +++ b/src/libxrpl/protocol/PublicKey.cpp @@ -107,8 +107,9 @@ sliceToHex(Slice const& slice) } for (int i = 0; i < slice.size(); ++i) { - s += "0123456789ABCDEF"[((slice[i] & 0xf0) >> 4)]; - s += "0123456789ABCDEF"[((slice[i] & 0x0f) >> 0)]; + constexpr char hex[] = "0123456789ABCDEF"; + s += hex[((slice[i] & 0xf0) >> 4)]; + s += hex[((slice[i] & 0x0f) >> 0)]; } return s; } diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index 615012dba4d..8be8f906a5e 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -671,12 +671,12 @@ isMemoOkay(STObject const& st, std::string& reason) "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"); - for (char c : symbols) + for (unsigned char c : symbols) a[c] = 1; return a; }(); - for (auto c : *optData) + for (unsigned char c : *optData) { if (!allowedSymbols[c]) { diff --git a/src/libxrpl/protocol/tokens.cpp b/src/libxrpl/protocol/tokens.cpp index a822b1937fb..52cffd7a5cb 100644 --- a/src/libxrpl/protocol/tokens.cpp +++ b/src/libxrpl/protocol/tokens.cpp @@ -544,7 +544,7 @@ b58_to_b256_be(std::string_view input, std::span out) XRPL_ASSERT( num_b_58_10_coeffs <= b_58_10_coeff.size(), "ripple::b58_fast::detail::b58_to_b256_be : maximum coeff"); - for (auto c : input.substr(0, partial_coeff_len)) + for (unsigned char c : input.substr(0, partial_coeff_len)) { auto cur_val = ::ripple::alphabetReverse[c]; if (cur_val < 0) @@ -558,7 +558,7 @@ b58_to_b256_be(std::string_view input, std::span out) { for (int j = 0; j < num_full_coeffs; ++j) { - auto c = input[partial_coeff_len + j * 10 + i]; + unsigned char c = input[partial_coeff_len + j * 10 + i]; auto cur_val = ::ripple::alphabetReverse[c]; if (cur_val < 0) { diff --git a/src/test/app/RCLValidations_test.cpp b/src/test/app/RCLValidations_test.cpp index 31c38f23b1c..fce4e94048d 100644 --- a/src/test/app/RCLValidations_test.cpp +++ b/src/test/app/RCLValidations_test.cpp @@ -229,7 +229,6 @@ class RCLValidations_test : public beast::unit_test::suite // support for a ledger hash which is already in the trie. using Seq = RCLValidatedLedger::Seq; - using ID = RCLValidatedLedger::ID; // Max known ancestors for each ledger Seq const maxAncestors = 256; diff --git a/src/test/beast/aged_associative_container_test.cpp b/src/test/beast/aged_associative_container_test.cpp index f88d5acc277..586f4868726 100644 --- a/src/test/beast/aged_associative_container_test.cpp +++ b/src/test/beast/aged_associative_container_test.cpp @@ -703,10 +703,6 @@ aged_associative_container_test_base::checkContentsRefRef( Values const& v) { using Cont = typename std::remove_reference::type; - using Traits = TestTraits< - Cont::is_unordered::value, - Cont::is_multi::value, - Cont::is_map::value>; using size_type = typename Cont::size_type; BEAST_EXPECT(c.size() == v.size()); @@ -761,10 +757,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructEmpty() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Comp = typename Traits::Comp; using Alloc = typename Traits::Alloc; using MyComp = typename Traits::MyComp; @@ -802,10 +794,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructEmpty() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Hash = typename Traits::Hash; using Equal = typename Traits::Equal; using Alloc = typename Traits::Alloc; @@ -870,10 +858,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructRange() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Comp = typename Traits::Comp; using Alloc = typename Traits::Alloc; using MyComp = typename Traits::MyComp; @@ -925,10 +909,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructRange() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Hash = typename Traits::Hash; using Equal = typename Traits::Equal; using Alloc = typename Traits::Alloc; @@ -996,14 +976,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructInitList() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; - using Comp = typename Traits::Comp; - using Alloc = typename Traits::Alloc; - using MyComp = typename Traits::MyComp; - using MyAlloc = typename Traits::MyAlloc; typename Traits::ManualClock clock; // testcase (Traits::name() + " init-list"); @@ -1020,16 +992,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructInitList() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; - using Hash = typename Traits::Hash; - using Equal = typename Traits::Equal; - using Alloc = typename Traits::Alloc; - using MyHash = typename Traits::MyHash; - using MyEqual = typename Traits::MyEqual; - using MyAlloc = typename Traits::MyAlloc; typename Traits::ManualClock clock; // testcase (Traits::name() + " init-list"); @@ -1050,7 +1012,6 @@ void aged_associative_container_test_base::testCopyMove() { using Traits = TestTraits; - using Value = typename Traits::Value; using Alloc = typename Traits::Alloc; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1121,8 +1082,6 @@ void aged_associative_container_test_base::testIterator() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Alloc = typename Traits::Alloc; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1179,8 +1138,6 @@ typename std::enable_if::type aged_associative_container_test_base::testReverseIterator() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Alloc = typename Traits::Alloc; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1190,7 +1147,6 @@ aged_associative_container_test_base::testReverseIterator() typename Traits::template Cont<> c{clock}; using iterator = decltype(c.begin()); - using const_iterator = decltype(c.cbegin()); using reverse_iterator = decltype(c.rbegin()); using const_reverse_iterator = decltype(c.crbegin()); @@ -1394,7 +1350,6 @@ void aged_associative_container_test_base::testChronological() { using Traits = TestTraits; - using Value = typename Traits::Value; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1760,7 +1715,6 @@ typename std::enable_if::type aged_associative_container_test_base::testCompare() { using Traits = TestTraits; - using Value = typename Traits::Value; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1832,8 +1786,6 @@ template void aged_associative_container_test_base::testMaybeUnorderedMultiMap() { - using Traits = TestTraits; - testConstructEmpty(); testConstructRange(); testConstructInitList(); diff --git a/src/test/consensus/LedgerTrie_test.cpp b/src/test/consensus/LedgerTrie_test.cpp index f46fea8e6e0..6ed45777f09 100644 --- a/src/test/consensus/LedgerTrie_test.cpp +++ b/src/test/consensus/LedgerTrie_test.cpp @@ -313,7 +313,6 @@ class LedgerTrie_test : public beast::unit_test::suite testSupport() { using namespace csf; - using Seq = Ledger::Seq; LedgerTrie t; LedgerHistoryHelper h; @@ -596,7 +595,6 @@ class LedgerTrie_test : public beast::unit_test::suite testRootRelated() { using namespace csf; - using Seq = Ledger::Seq; // Since the root is a special node that breaks the no-single child // invariant, do some tests that exercise it. diff --git a/src/test/consensus/Validations_test.cpp b/src/test/consensus/Validations_test.cpp index 4424d7619d2..a04e62b7235 100644 --- a/src/test/consensus/Validations_test.cpp +++ b/src/test/consensus/Validations_test.cpp @@ -805,7 +805,6 @@ class Validations_test : public beast::unit_test::suite Ledger ledgerACD = h["acd"]; using Seq = Ledger::Seq; - using ID = Ledger::ID; auto pref = [](Ledger ledger) { return std::make_pair(ledger.seq(), ledger.id()); diff --git a/src/xrpld/rpc/handlers/LogLevel.cpp b/src/xrpld/rpc/handlers/LogLevel.cpp index 0fc266569e8..a93d010706e 100644 --- a/src/xrpld/rpc/handlers/LogLevel.cpp +++ b/src/xrpld/rpc/handlers/LogLevel.cpp @@ -44,7 +44,6 @@ doLogLevel(RPC::JsonContext& context) Logs::toString(Logs::fromSeverity(context.app.logs().threshold())); std::vector> logTable( context.app.logs().partition_severities()); - using stringPair = std::map::value_type; for (auto const& [k, v] : logTable) lev[k] = v; From 66776b6a85fc58aa5ee5346bb4def911dbd9915e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Jul 2025 16:06:21 -0400 Subject: [PATCH 40/73] test: codecov for WasmHostFuncWrapper.cpp (#5601) --- src/test/app/Escrow_test.cpp | 12 +- src/test/app/TestHostFunctions.h | 36 +- src/test/app/Wasm_test.cpp | 29 + src/test/app/wasm_fixtures/fixtures.cpp | 611 +++++++++++++-------- src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 55 +- 6 files changed, 478 insertions(+), 267 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 3fdccae9ee5..93a37d81037 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2324,14 +2324,9 @@ struct Escrow_test : public beast::unit_test::suite Account const alice{"alice"}; Account const carol{"carol"}; - { - Env env(*this); - env.fund(XRP(5000), alice, carol); - } - { Env env{*this}; - env.fund(XRP(5000), alice, carol); + env.fund(XRP(10000), alice, carol); BEAST_EXPECT(env.seq(alice) == 4); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2355,14 +2350,15 @@ struct Escrow_test : public beast::unit_test::suite escrow::finish_time(env.now() + 100s)); env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); + env(offer(alice, carol["USD"](0.1), XRP(100))); env(create(alice, carol, XRP(1000), 100s, alice.pk())); env(signers(alice, 1, {{carol, 1}})); env(ticket::create(alice, 1)); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 11); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); if (BEAST_EXPECTS( - env.seq(alice) == 16, std::to_string(env.seq(alice)))) + env.seq(alice) == 17, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); XRPAmount txnFees = env.current()->fees().base + 1000; diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 6a177380492..45de5d7b936 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -69,9 +69,7 @@ struct TestHostFunctions : public HostFunctions TestHostFunctions(test::jtx::Env& env, int cd = 0) : env_(env), clock_drift_(cd) { - auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); - if (opt) - accountID_ = *opt; + accountID_ = env_.master.id(); std::string t = "10000"; data_ = Bytes{t.begin(), t.end()}; } @@ -165,19 +163,31 @@ struct TestHostFunctions : public HostFunctions Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) override { - // auto const& sn = fname.getName(); if (fname == sfBalance) { int64_t x = 10'000; uint8_t const* p = reinterpret_cast(&x); return Bytes{p, p + sizeof(x)}; } + else if (fname == sfAccount) + { + return Bytes(accountID_.begin(), accountID_.end()); + } return data_; } Expected getTxNestedField(Slice const& locator) override { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, @@ -188,6 +198,15 @@ struct TestHostFunctions : public HostFunctions Expected getCurrentLedgerObjNestedField(Slice const& locator) override { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, @@ -198,6 +217,15 @@ struct TestHostFunctions : public HostFunctions Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index d03135ae65c..5eee6014e5a 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -606,6 +606,33 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testCodecovWasm() + { + testcase("Codecov wasm test"); + + using namespace test::jtx; + + // Env env{ + // *this, + // envconfig(), + // testable_amendments(), + // nullptr, + // beast::severities::kTrace}; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(codecovWasm); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestHostFunctions hfs(env, 0); + + auto re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re->result); + } + void run() override { @@ -630,6 +657,8 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN(); + testCodecovWasm(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 48b0d20b73a..bddb076df9c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11848,242 +11848,377 @@ extern std::string const opcCallPerfTest = "0b0e01004180080b07623a2025660a00"; extern std::string const keyletHostFunctions = - "0061736d01000000015b0c60057f7f7f7f7f017f60037f7f7f017f60037f7f7e017f60047f" - "7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f60000060037f7f7f0060027f7f0002c6031108686f73745f" - "6c6962057472616365000008686f73745f6c69621063616368655f6c65646765725f6f626a" - "000108686f73745f6c69620974726163655f6e756d000208686f73745f6c6962146765745f" - "6c65646765725f6f626a5f6669656c64000308686f73745f6c69621c6765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c64000108686f73745f6c69620e6163636f756e" - "745f6b65796c6574000308686f73745f6c69620b6c696e655f6b65796c6574000408686f73" - "745f6c69620c636865636b5f6b65796c6574000008686f73745f6c69621163726564656e74" - "69616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c6574" - "000508686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000508" - "686f73745f6c69620a6469645f6b65796c6574000308686f73745f6c69620d657363726f77" - "5f6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c65740000" - "08686f73745f6c69620e7061796368616e5f6b65796c6574000608686f73745f6c69620e73" - "69676e6572735f6b65796c6574000308686f73745f6c69620d7469636b65745f6b65796c65" - "740000030d0c0708090a0a0a0b0b0b0a0b0b05030100110619037f01418080c0000b7f0041" - "f989c0000b7f0041808ac0000b073e05066d656d6f727902000d6f626a6563745f65786973" - "747300110666696e69736800120a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020a94270c9a0603017f037e037f23808080800041f0006b2205248080808000024002" - "40024020012d00000d00200541186a200141196a290000370300200541106a200141116a29" - "0000370300200541086a200141096a29000037030020052001290001370300200220032005" - "412041011080808080001a20054120410010818080800022014101480d0102400240024002" - "4020040d00418b80c08000410f428580141082808080001a200541d0006a41186a42003703" - "00200541d0006a41106a4200370300200541d0006a41086a42003703002005420037035020" - "0141858014200541d0006a412010838080800022014120470d01200541206a41086a200541" - "d0006a410f6a22012900002206370300200541206a41106a200541e7006a22042900002207" - "370300200541206a41186a200541ef006a22032d000022023a000020052005290057220837" - "032020052f015021092005280152210a20052d0056210b2001200637000020042007370000" - "200320023a00002005200b3a00562005200a360152200520093b015020052008370057419a" - "80c08000410c200541d0006a412041011080808080001a0c030b418b80c08000410f2004ac" - "1082808080001a200541e0006a4100360200200541d8006a42003703002005420037035020" - "012004200541d0006a411410838080800022014114460d0141a680c0800041152001417f20" - "01417f481b2201ac1082808080001a200041013a0000200020013602040c050b41a680c080" - "0041152001417f2001417f481b2201ac1082808080001a200041013a000020002001360204" - "0c040b200541226a20052d00523a0000200520052900573703402005200541d0006a410c6a" - "290000370045200541206a410c6a2005290045370000200520052f01503b01202005200528" - "005336002320052005290340370027419a80c08000410c200541206a411441011080808080" - "001a0b20004180023b01000c020b41c280c08000411620012802042201ac1082808080001a" - "200041013a0000200020013602040c010b41bb80c0800041072001ac1082808080001a2000" - "41013a0000200041783602040b200541f0006a2480808080000bd21201067f238080808000" - "4190046b220024808080800041d880c0800041234100410041001080808080001a20004180" - "046a22014100360200200041f8036a22024200370300200042003703f00302400240024002" - "4041818020200041f0036a411410848080800022034114470d00200041046a41026a20002d" - "00f2033a0000200020002900f7033703502000200041f0036a410c6a220329000037005520" - "0041046a410c6a2000290055370000200020002f01f0033b0104200020002800f303360007" - "2000200029035037000b41fb80c08000410a200041046a411441011080808080001a200141" - "0036020020024200370300200042003703f00341838020200041f0036a4114108480808000" - "22014114470d01200041186a41026a20002d00f2033a0000200020002900f7033703502000" - "2003290000370055200041186a410c6a2000290055370000200020002f01f0033b01182000" - "20002800f30336001b2000200029035037001f418581c08000410e200041186a4114410110" - "80808080001a20004188046a2202420037030020004180046a22034200370300200041f803" - "6a22044200370300200042003703f003200041046a4114200041f0036a4120108580808000" - "22014120460d02024002402001417f4a0d00200020013602300c010b2000417f3602300b41" - "0121010c030b418080c08000410b2003417f2003417f481bac1082808080001a1093808080" - "00000b418080c08000410b2001417f2001417f481bac1082808080001a109380808000000b" - "200041c5006a20022903003700002000413d6a2003290300370000200041356a2004290300" - "370000200020002903f00337002d410021010b200020013a002c200041f0036a2000412c6a" - "419381c080004107418180201091808080000240024020002d00f0030d00024020002d00f1" - "030d00419a81c0800041364100410041001080808080001a0c010b4100210141d081c08000" - "41354100410041001080808080001a200041de006a41c4003a0000200041d0006a41086a41" - "00360200200041e3006a41003a0000200041d5a6013b015c20004200370350200041003600" - "5f20004188046a2203420037030020004180046a22044200370300200041f0036a41086a22" - "054200370300200042003703f00302400240200041046a4114200041186a4114200041d000" - "6a4114200041f0036a412010868080800022024120460d00024002402002417f4a0d002000" - "20023602680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000" - "200041f5006a2004290300370000200041ed006a2005290300370000200020002903f00337" - "00650b200020013a0064200041f0036a200041e4006a418582c08000410941001091808080" - "0020002d00f0030d00024020002d00f1030d00418e82c08000413a41004100410010808080" - "80001a0c010b4100210141c882c0800041394100410041001080808080001a20004188046a" - "2203420037030020004180046a22044200370300200041f8036a2205420037030020004200" - "3703f00302400240200041046a41144106200041f0036a412010878080800022024120460d" - "00024002402002417f4a0d002000200236028c010c010b2000417f36028c010b410121010c" - "010b200041a1016a200329030037000020004199016a200429030037000020004191016a20" - "05290300370000200020002903f003370089010b200020013a008801200041f0036a200041" - "88016a418183c0800041054181802010918080800020002d00f0030d00024020002d00f103" - "0d00419a81c0800041364100410041001080808080001a0c010b41d081c080004135410041" - "0041001080808080001a200041ac016a200041046a200041046a109480808000200041f003" - "6a200041ac016a419883c08000410a4198802010918080800020002d00f0030d0002402000" - "2d00f1030d0041a283c08000413b4100410041001080808080001a0c010b41dd83c0800041" - "3a4100410041001080808080001a200041d0016a200041046a200041186a10958080800020" - "0041f0036a200041d0016a419784c0800041084181802010918080800020002d00f0030d00" - "024020002d00f1030d00419f84c0800041394100410041001080808080001a0c010b41d884" - "c0800041384100410041001080808080001a200041f4016a200041046a200041186a109680" - "808000200041f0036a200041f4016a419784c0800041084181802010918080800020002d00" - "f0030d00024020002d00f1030d00419f84c0800041394100410041001080808080001a0c01" - "0b41d884c0800041384100410041001080808080001a20004198026a200041046a10978080" - "8000200041f0036a20004198026a419381c0800041074181802010918080800020002d00f0" - "030d00024020002d00f1030d00419a81c0800041364100410041001080808080001a0c010b" - "41d081c0800041354100410041001080808080001a200041bc026a200041046a1098808080" - "00200041f0036a200041bc026a419085c0800041064181802010918080800020002d00f003" - "0d00024020002d00f1030d00419685c0800041374100410041001080808080001a0c010b41" - "cd85c0800041364100410041001080808080001a200041e0026a200041186a109980808000" - "200041f0036a200041e0026a418386c08000410c4182802010918080800020002d00f0030d" - "00024020002d00f1030d00418f86c08000413d4100410041001080808080001a0c010b41cc" - "86c08000413c4100410041001080808080001a20004184036a200041046a200041186a109a" - "80808000200041f0036a20004184036a418887c08000410a4181802010918080800020002d" - "00f0030d00024020002d00f1030d00419287c08000413b4100410041001080808080001a0c" - "010b41cd87c08000413a4100410041001080808080001a200041a8036a200041046a109b80" - "808000200041f0036a200041a8036a418788c08000410a410010918080800020002d00f003" - "0d00024020002d00f1030d00419188c08000413b4100410041001080808080001a0c010b41" - "cc88c08000413a4100410041001080808080001a200041cc036a200041046a109c80808000" - "200041f0036a200041cc036a418689c0800041064181802010918080800020002d00f0030d" - "00024020002d00f1030d00418c89c0800041374100410041001080808080001a0c010b41c3" - "89c0800041364100410041001080808080001a410121010c010b410021010b20004190046a" - "24808080800020010b0300000bd10101047f23808080800041206b22032480808080002003" - "41186a22044200370300200341106a22054200370300200341086a22064200370300200342" - "00370300024002402001411420024114418683c08000411220034120108880808000220241" - "20460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b41012102" - "0c010b20002003290300370001200041196a2004290300370000200041116a200529030037" - "0000200041096a2006290300370000410021020b200020023a0000200341206a2480808080" - "000bc90101047f23808080800041206b2203248080808000200341186a2204420037030020" - "0341106a22054200370300200341086a220642003703002003420037030002400240200141" - "14200241142003412010898080800022024120460d00024002402002417f4a0d0020002002" - "3602040c010b2000417f3602040b410121020c010b20002003290300370001200041196a20" - "04290300370000200041116a2005290300370000200041096a200629030037000041002102" - "0b200020023a0000200341206a2480808080000bc90101047f23808080800041206b220324" - "8080808000200341186a22044200370300200341106a22054200370300200341086a220642" - "003703002003420037030002400240200141142002411420034120108a8080800022024120" - "460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b410121020c" - "010b20002003290300370001200041196a2004290300370000200041116a20052903003700" - "00200041096a2006290300370000410021020b200020023a0000200341206a248080808000" - "0bc50101047f23808080800041206b2202248080808000200241186a220342003703002002" - "41106a22044200370300200241086a22054200370300200242003703000240024020014114" - "20024120108b8080800022014120460d00024002402001417f4a0d00200020013602040c01" - "0b2000417f3602040b410121010c010b20002002290300370001200041196a200329030037" - "0000200041116a2004290300370000200041096a2005290300370000410021010b20002001" - "3a0000200241206a2480808080000bc70101047f23808080800041206b2202248080808000" - "200241186a22034200370300200241106a22044200370300200241086a2205420037030020" - "0242003703000240024020014114410b20024120108c8080800022014120460d0002400240" - "2001417f4a0d00200020013602040c010b2000417f3602040b410121010c010b2000200229" - "0300370001200041196a2003290300370000200041116a2004290300370000200041096a20" - "05290300370000410021010b200020013a0000200241206a2480808080000bc70101047f23" - "808080800041206b2202248080808000200241186a22034200370300200241106a22044200" - "370300200241086a2205420037030020024200370300024002402001411441042002412010" - "8d8080800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f" - "3602040b410121010c010b20002002290300370001200041196a2003290300370000200041" - "116a2004290300370000200041096a2005290300370000410021010b200020013a00002002" - "41206a2480808080000bcb0101047f23808080800041206b2203248080808000200341186a" - "22044200370300200341106a22054200370300200341086a22064200370300200342003703" - "00024002402001411420024114410c20034120108e8080800022024120460d000240024020" - "02417f4a0d00200020023602040c010b2000417f3602040b410121020c010b200020032903" - "00370001200041196a2004290300370000200041116a2005290300370000200041096a2006" - "290300370000410021020b200020023a0000200341206a2480808080000bc50101047f2380" - "8080800041206b2202248080808000200241186a22034200370300200241106a2204420037" - "0300200241086a2205420037030020024200370300024002402001411420024120108f8080" - "800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f360204" - "0b410121010c010b20002002290300370001200041196a2003290300370000200041116a20" - "04290300370000200041096a2005290300370000410021010b200020013a0000200241206a" - "2480808080000bc70101047f23808080800041206b2202248080808000200241186a220342" - "00370300200241106a22044200370300200241086a22054200370300200242003703000240" - "024020014114410f2002412010908080800022014120460d00024002402001417f4a0d0020" - "0020013602040c010b2000417f3602040b410121010c010b20002002290300370001200041" - "196a2003290300370000200041116a2004290300370000200041096a200529030037000041" - "0021010b200020013a0000200241206a2480808080000b0b830a0100418080c0000bf90965" - "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" - "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" - "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" - "5554494f4e20242424242420204163636f756e743a202044657374696e6174696f6e3a4163" - "636f756e742020436865636b206f626a65637420646f6573206e6f742065786973742c2061" - "626f7274696e6720657363726f772066696e6973682e2020436865636b206f626a65637420" - "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" - "2e54727573746c696e65202054727573746c696e65206f626a65637420646f6573206e6f74" - "2065786973742c2061626f7274696e6720657363726f772066696e6973682e202054727573" - "746c696e65206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e436865636b7465726d73616e64636f6e646974696f6e73" - "43726564656e7469616c202043726564656e7469616c206f626a65637420646f6573206e6f" - "742065786973742c2061626f7274696e6720657363726f772066696e6973682e2020437265" - "64656e7469616c206f626a656374206578697374732c2070726f63656564696e6720776974" - "6820657363726f772066696e6973682e44656c6567617465202044656c6567617465206f62" - "6a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f7720" - "66696e6973682e202044656c6567617465206f626a656374206578697374732c2070726f63" - "656564696e67207769746820657363726f772066696e6973682e457363726f772020457363" - "726f77206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065" - "7363726f772066696e6973682e2020457363726f77206f626a656374206578697374732c20" - "70726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e" - "4f6666657220204e46546f6b656e4f66666572206f626a65637420646f6573206e6f742065" - "786973742c2061626f7274696e6720657363726f772066696e6973682e20204e46546f6b65" - "6e4f66666572206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e5061794368616e6e656c20205061794368616e6e656c" + "0061736d01000000014d0960057f7f7f7f7f017f60047f7f7f7f017f60037f7f7f017f6008" + "7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f02de031208686f73745f6c6962057472616365000008686f" + "73745f6c69621063616368655f6c65646765725f6f626a000208686f73745f6c6962097472" + "6163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f626a5f666965" + "6c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f" + "6669656c64000208686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73" + "745f6c69620b6c696e655f6b65796c6574000308686f73745f6c69620c636865636b5f6b65" + "796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c657400030868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" + "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" + "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" + "725f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000608" + "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" + "636b65745f6b65796c65740000030302070805030100110619037f01418080c0000b7f0041" + "f48bc0000b7f0041808cc0000b073e05066d656d6f727902000d6f626a6563745f65786973" + "747300120666696e69736800130a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020ab82202b50502057f037e230041f0006b220524000240024020012d000045044020" + "0541186a200141196a290000370300200541106a200141116a290000370300200541086a20" + "0141096a290000370300200520012900013703002002200320054120410110001a20054120" + "41001001220141004c0d010240024002402004450440418b80c000410f4285801410021a20" + "0541e8006a4200370300200541e0006a4200370300200541d8006a42003703002005420037" + "0350200141858014200541d0006a22064120100322014120470d01200541286a200541df00" + "6a2201290000220a370300200541306a200541e7006a2202290000220b370300200541386a" + "200541ef006a22032d000022043a000020052005290057220c37032020052f015021072005" + "280152210820052d005621092001200a3700002002200b370000200320043a000020052009" + "3a005620052008360152200520073b01502005200c370057419a80c000410c200641204101" + "10001a0c030b418b80c000410f2004ac10021a200541e0006a4100360200200541d8006a42" + "003703002005420037035020012004200541d0006a4114100322014114460d0141a680c000" + "4115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c050b41a6" + "80c0004115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c04" + "0b200541226a20052d00523a0000200520052900573703402005200541dc006a2900003700" + "452005412c6a2005290045370000200520052f01503b012020052005280053360023200520" + "05290340370027419a80c000410c200541206a4114410110001a0b20004180023b01000c02" + "0b41c280c000411620012802042201ac10021a200041013a0000200020013602040c010b41" + "bb80c00041072001ac10021a200041013a0000200041783602040b200541f0006a24000bfe" + "1c01077f230041c0046b2200240041d880c000412341004100410010001a200041b0046a22" + "014100360200200041a8046a22024200370300200042003703a00402402000027f02404181" + "8020200041a0046a220541141004220341144604402000410e6a20002d00a2043a00002000" + "20002900a7043703582000200041ac046a220429000037005d200041186a200029005d3700" + "00200020002f01a0043b010c200020002800a30436000f2000200029035837001341fb80c0" + "00410a2000410c6a22064114410110001a2001410036020020024200370300200042003703" + "a0044183802020054114100422034114470d03200041226a20002d00a2043a000020002000" + "2900a7043703582000200429000037005d2000412c6a200029005d370000200020002f01a0" + "043b0120200020002800a30436002320002000290358370027418581c000410e200041206a" + "4114410110001a200041b8046a220442003703002001420037030020024200370300200042" + "003703a0042006411420054120100522034120460d01024020034100480440200020033602" + "380c010b2000417f3602380b41010c020b0c020b200041cd006a2004290300370000200041" + "c5006a20012903003700002000413d6a2002290300370000200020002903a0043700354100" + "0b3a0034200041a0046a200041346a419381c0004107418180201012027f024020002d00a0" + "040d0020002d00a104450440419a81c000413641004100410010001a0c010b4100210341d0" + "81c000413541004100410010001a200041e6006a41c4003a0000200041e0006a4100360200" + "200041eb006a41003a0000200041d5a6013b01642000420037035820004100360067200041" + "b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037030020" + "0042003703a00402402000410c6a4114200041206a4114200041d8006a4114200041a0046a" + "4120100622014120470440024020014100480440200020013602740c010b2000417f360274" + "0b410121030c010b20004189016a200229030037000020004181016a200529030037000020" + "0041f9006a2004290300370000200020002903a0043700710b200020033a0070200041a004" + "6a200041f0006a418582c00041094100101220002d00a0040d0020002d00a104450440418e" + "82c000413a41004100410010001a0c010b4100210341c882c000413941004100410010001a" + "200041b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037" + "0300200042003703a00402402000410c6a41144106200041a0046a41201007220141204704" + "4002402001410048044020002001360298010c010b2000417f360298010b410121030c010b" + "200041ad016a2002290300370000200041a5016a20052903003700002000419d016a200429" + "0300370000200020002903a004370095010b200020033a009401200041a0046a2000419401" + "6a418183c000410541818020101220002d00a0040d0020002d00a104450440419a81c00041" + "3641004100410010001a0c010b41d081c000413541004100410010001a230041206b220124" + "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" + "20014200370300200041b8016a2202027f2000410c6a2203411420034114418683c0004112" + "20014120100822034120470440024020034100480440200220033602040c010b2002417f36" + "02040b41010c010b20022001290300370001200241196a2005290300370000200241116a20" + "04290300370000200241096a200629030037000041000b3a0000200141206a2400200041a0" + "046a2002419883c000410a41988020101220002d00a0040d0020002d00a10445044041a283" + "c000413b41004100410010001a0c010b41dd83c000413a41004100410010001a230041206b" + "22012400200141186a22054200370300200141106a22044200370300200141086a22064200" + "37030020014200370300200041dc016a2202027f2000410c6a4114200041206a4114200141" + "20100922034120470440024020034100480440200220033602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" + "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" + "02419784c000410841818020101220002d00a0040d0020002d00a104450440419f84c00041" + "3941004100410010001a0c010b41d884c000413841004100410010001a230041206b220124" + "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" + "2001420037030020004180026a2202027f2000410c6a4114200041206a411420014120100a" + "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" + "010b20022001290300370001200241196a2005290300370000200241116a20042903003700" + "00200241096a200629030037000041000b3a0000200141206a2400200041a0046a20024190" + "85c000410e41818020101220002d00a0040d0020002d00a104450440419e85c000413f4100" + "4100410010001a0c010b41dd85c000413e41004100410010001a230041206b220124002001" + "41186a22054200370300200141106a22044200370300200141086a22064200370300200142" + "00370300200041a4026a2202027f2000410c6a411420014120100b22034120470440024020" + "034100480440200220033602040c010b2002417f3602040b41010c010b2002200129030037" + "0001200241196a2005290300370000200241116a2004290300370000200241096a20062903" + "0037000041000b3a0000200141206a2400200041a0046a2002419381c00041074181802010" + "1220002d00a0040d0020002d00a104450440419a81c000413641004100410010001a0c010b" + "41d081c000413541004100410010001a230041206b22012400200141186a22054200370300" + "200141106a22044200370300200141086a2206420037030020014200370300200041c8026a" + "2202027f2000410c6a4114410b20014120100c220341204704400240200341004804402002" + "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" + "0000200141206a2400200041a0046a2002419b86c000410641818020101220002d00a0040d" + "0020002d00a10445044041a186c000413741004100410010001a0c010b41d886c000413641" + "004100410010001a230041206b22012400200141186a22054200370300200141106a220442" + "00370300200141086a2206420037030020014200370300200041ec026a2202027f20004120" + "6a4114410420014120100d22034120470440024020034100480440200220033602040c010b" + "2002417f3602040b41010c010b20022001290300370001200241196a200529030037000020" + "0241116a2004290300370000200241096a200629030037000041000b3a0000200141206a24" + "00200041a0046a2002418e87c000410c41828020101220002d00a0040d0020002d00a10445" + "0440419a87c000413d41004100410010001a0c010b41d787c000413c41004100410010001a" + "230041206b22012400200141186a22054200370300200141106a2204420037030020014108" + "6a220642003703002001420037030020004190036a2202027f2000410c6a4114410c200141" + "20100e22034120470440024020034100480440200220033602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" + "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" + "02419388c000410541818020101220002d00a0040d0020002d00a104450440419888c00041" + "3641004100410010001a0c010b41ce88c000413541004100410010001a230041206b220124" + "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" + "20014200370300200041b4036a2202027f2000410c6a4114200041206a4114410d20014120" + "100f22034120470440024020034100480440200220033602040c010b2002417f3602040b41" + "010c010b20022001290300370001200241196a2005290300370000200241116a2004290300" + "370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a2002" + "418389c000410a41818020101220002d00a0040d0020002d00a104450440418d89c000413b" + "41004100410010001a0c010b41c889c000413a41004100410010001a230041206b22012400" + "200141186a22054200370300200141106a22044200370300200141086a2206420037030020" + "014200370300200041d8036a2202027f2000410c6a41142001412010102203412047044002" + "4020034100480440200220033602040c010b2002417f3602040b41010c010b200220012903" + "00370001200241196a2005290300370000200241116a2004290300370000200241096a2006" + "29030037000041000b3a0000200141206a2400200041a0046a200241828ac000410a410010" + "1220002d00a0040d0020002d00a104450440418c8ac000413b41004100410010001a0c010b" + "41c78ac000413a41004100410010001a230041206b22012400200141186a22054200370300" + "200141106a22044200370300200141086a2206420037030020014200370300200041fc036a" + "2202027f2000410c6a41144110200141201011220341204704400240200341004804402002" + "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" + "0000200141206a2400200041a0046a200241818bc000410641818020101220002d00a0040d" + "0020002d00a10445044041878bc000413741004100410010001a0c010b41be8bc000413641" + "004100410010001a41010c010b41000b200041c0046a24000f0b418080c000410b417f2003" + "2003417f4e1bac1002000b0bfe0b0100418080c0000bf40b6572726f725f636f64653d4765" + "7474696e67206669656c643a204669656c6420646174613a204572726f722067657474696e" + "67206669656c643a204572726f723a204572726f722067657474696e67206b65796c65743a" + "202424242424205354415254494e47205741534d20455845435554494f4e20242424242420" + "204163636f756e743a202044657374696e6174696f6e3a4163636f756e742020436865636b" "206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065736372" - "6f772066696e6973682e20205061794368616e6e656c206f626a656374206578697374732c" - "2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e6572" - "4c69737420205369676e65724c697374206f626a65637420646f6573206e6f742065786973" - "742c2061626f7274696e6720657363726f772066696e6973682e20205369676e65724c6973" - "74206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" - "6f772066696e6973682e5469636b657420205469636b6574206f626a65637420646f657320" - "6e6f742065786973742c2061626f7274696e6720657363726f772066696e6973682e202054" - "69636b6574206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e00ad0d046e616d650014136b65796c65745f6578616d70" - "6c652e7761736d01ef0c1d002b5f5a4e387872706c5f73746434686f737435747261636531" - "3768356563663766653133666438643166354501375f5a4e387872706c5f73746434686f73" - "74313663616368655f6c65646765725f6f626a313768373838623636346237363634616165" - "3145022f5f5a4e387872706c5f73746434686f73743974726163655f6e756d313768653639" - "3463616436386330376633386345033b5f5a4e387872706c5f73746434686f737432306765" - "745f6c65646765725f6f626a5f6669656c6431376838373939646530383866396236356339" - "4504435f5a4e387872706c5f73746434686f737432386765745f63757272656e745f6c6564" - "6765725f6f626a5f6669656c64313768346239313763353864363137613961394505355f5a" - "4e387872706c5f73746434686f737431346163636f756e745f6b65796c6574313768616233" - "363663616435383039376261304506325f5a4e387872706c5f73746434686f737431316c69" - "6e655f6b65796c6574313768653466386161383862646663633464664507335f5a4e387872" - "706c5f73746434686f73743132636865636b5f6b65796c6574313768333165356538343139" - "326131633631654508385f5a4e387872706c5f73746434686f7374313763726564656e7469" - "616c5f6b65796c6574313768643731653739346561383463373839644509365f5a4e387872" - "706c5f73746434686f7374313564656c65676174655f6b65796c6574313768323639663430" - "63643739663834373237450a3d5f5a4e387872706c5f73746434686f737432326465706f73" - "69745f707265617574685f6b65796c65743137686161306631646338616233346634623745" - "0b315f5a4e387872706c5f73746434686f737431306469645f6b65796c6574313768313866" - "61393935616436326331313139450c345f5a4e387872706c5f73746434686f737431336573" - "63726f775f6b65796c657431376838373464316235373266376333326437450d375f5a4e38" - "7872706c5f73746434686f737431366e66745f6f666665725f6b65796c6574313768663931" - "35393838643961386466633863450e355f5a4e387872706c5f73746434686f737431347061" - "796368616e5f6b65796c657431376862373435373234653534336539333565450f355f5a4e" - "387872706c5f73746434686f737431347369676e6572735f6b65796c657431376866646335" - "3536343961633961626465304510345f5a4e387872706c5f73746434686f73743133746963" - "6b65745f6b65796c65743137683164393432633034663234386362666545110d6f626a6563" - "745f657869737473120666696e69736813305f5a4e34636f72653970616e69636b696e6739" - "70616e69635f666d74313768623931626164616365366565383238374514465f5a4e387872" - "706c5f73746434636f7265357479706573376b65796c657473313763726564656e7469616c" - "5f6b65796c6574313768353839343033303564323939613236354515445f5a4e387872706c" - "5f73746434636f7265357479706573376b65796c657473313564656c65676174655f6b6579" - "6c65743137686665363134666163326238656437626445164b5f5a4e387872706c5f737464" - "34636f7265357479706573376b65796c65747332326465706f7369745f707265617574685f" - "6b65796c65743137683634303539316533346337323839363645173f5f5a4e387872706c5f" - "73746434636f7265357479706573376b65796c65747331306469645f6b65796c6574313768" - "326538323337313938626638373463634518425f5a4e387872706c5f73746434636f726535" - "7479706573376b65796c6574733133657363726f775f6b65796c6574313768363462336265" - "663061333138383233634519455f5a4e387872706c5f73746434636f726535747970657337" - "6b65796c65747331366e66745f6f666665725f6b65796c6574313768633833353933386361" - "63306465646263451a435f5a4e387872706c5f73746434636f7265357479706573376b6579" - "6c65747331347061796368616e5f6b65796c65743137683332396231633338396165343162" - "3638451b435f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331" - "347369676e6572735f6b65796c657431376839633832313566396330386134636565451c42" - "5f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331337469636b" - "65745f6b65796c65743137683366303138626436663561373338326645071201000f5f5f73" - "7461636b5f706f696e746572090a0100072e726f64617461004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d" - "312e38352e31202834656231363132353020323032352d30332d31352900490f7461726765" - "745f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62" - "616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; + "6f772066696e6973682e2020436865636b206f626a656374206578697374732c2070726f63" + "656564696e67207769746820657363726f772066696e6973682e54727573746c696e652020" + "54727573746c696e65206f626a65637420646f6573206e6f742065786973742c2061626f72" + "74696e6720657363726f772066696e6973682e202054727573746c696e65206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e436865636b7465726d73616e64636f6e646974696f6e7343726564656e7469616c2020" + "43726564656e7469616c206f626a65637420646f6573206e6f742065786973742c2061626f" + "7274696e6720657363726f772066696e6973682e202043726564656e7469616c206f626a65" + "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" + "6973682e44656c6567617465202044656c6567617465206f626a65637420646f6573206e6f" + "742065786973742c2061626f7274696e6720657363726f772066696e6973682e202044656c" + "6567617465206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e4465706f7369745072656175746820204465706f736974" + "50726561757468206f626a65637420646f6573206e6f742065786973742c2061626f727469" + "6e6720657363726f772066696e6973682e20204465706f73697450726561757468206f626a" + "656374206578697374732c2070726f63656564696e67207769746820657363726f77206669" + "6e6973682e457363726f772020457363726f77206f626a65637420646f6573206e6f742065" + "786973742c2061626f7274696e6720657363726f772066696e6973682e2020457363726f77" + "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" + "772066696e6973682e4e46546f6b656e4f6666657220204e46546f6b656e4f66666572206f" + "626a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f77" + "2066696e6973682e20204e46546f6b656e4f66666572206f626a656374206578697374732c" + "2070726f63656564696e67207769746820657363726f772066696e6973682e4f6666657220" + "204f66666572206f626a65637420646f6573206e6f742065786973742c2061626f7274696e" + "6720657363726f772066696e6973682e20204f66666572206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e5061794368" + "616e6e656c20205061794368616e6e656c206f626a65637420646f6573206e6f7420657869" + "73742c2061626f7274696e6720657363726f772066696e6973682e20205061794368616e6e" + "656c206f626a656374206578697374732c2070726f63656564696e67207769746820657363" + "726f772066696e6973682e5369676e65724c69737420205369676e65724c697374206f626a" + "65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f772066" + "696e6973682e20205369676e65724c697374206f626a656374206578697374732c2070726f" + "63656564696e67207769746820657363726f772066696e6973682e5469636b657420205469" + "636b6574206f626a65637420646f6573206e6f742065786973742c2061626f7274696e6720" + "657363726f772066696e6973682e20205469636b6574206f626a656374206578697374732c" + "2070726f63656564696e67207769746820657363726f772066696e6973682e004d0970726f" + "64756365727302086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d30332d31352900" + "490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b08" + "7369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c756" + "5"; + +extern std::string const codecovWasm = + "0061736d0100000001570b60057f7f7f7f7f017f60027f7f017f60047f7f7f7f017f60037f" + "7f7f017f60067f7f7f7f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f60037f7f7e01" + "7f60077f7f7f7f7f7f7f017f60047f7f7f7f006000017f0298082308686f73745f6c696209" + "74726163655f6e756d000708686f73745f6c6962057472616365000008686f73745f6c6962" + "0e6765745f6c65646765725f73716e000108686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000108686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000108686f73745f6c69620c6765745f74785f6669656c6400030868" + "6f73745f6c69620e6163636f756e745f6b65796c6574000208686f73745f6c696210636163" + "68655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63757272656e745f" + "6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765745f6c65646765" + "725f6f626a5f6669656c64000208686f73745f6c6962136765745f74785f6e65737465645f" + "6669656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f" + "626a5f6e65737465645f6669656c64000208686f73745f6c69621b6765745f6c6564676572" + "5f6f626a5f6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61" + "727261795f6c656e000508686f73745f6c6962206765745f63757272656e745f6c65646765" + "725f6f626a5f61727261795f6c656e000508686f73745f6c6962186765745f6c6564676572" + "5f6f626a5f61727261795f6c656e000108686f73745f6c6962176765745f74785f6e657374" + "65645f61727261795f6c656e000108686f73745f6c6962276765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f61727261795f6c656e000108686f73745f6c6962" + "1f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000308686f" + "73745f6c69620b7570646174655f64617461000108686f73745f6c696213636f6d70757465" + "5f7368613531325f68616c66000208686f73745f6c69620b6c696e655f6b65796c65740006" + "08686f73745f6c69621163726564656e7469616c5f6b65796c6574000608686f73745f6c69" + "62076765745f6e6674000408686f73745f6c69620c636865636b5f6b65796c657400000868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" + "65796c6574000208686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" + "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" + "725f6b65796c6574000008686f73745f6c69620d6f7261636c655f6b65796c657400000868" + "6f73745f6c69620e7061796368616e5f6b65796c6574000808686f73745f6c69620e736967" + "6e6572735f6b65796c6574000208686f73745f6c69620d7469636b65745f6b65796c657400" + "00030302090a05030100110619037f01418080c0000b7f00419c92c0000b7f0041a092c000" + "0b072e04066d656d6f727902000666696e69736800240a5f5f646174615f656e6403010b5f" + "5f686561705f6261736503020af41802390002402000200147044020004100480d01418b80" + "c000410b2000ad1000000b200220032000ac10001a0f0b418b80c000410b2000ac1000000b" + "b71802087f027e230041a0016b22002400419680c000412341004100410010011a20004100" + "360238200041386a2201410410024104418987c000410e1023200041003602382001410410" + "034104419787c00041161023200041d0006a22064200370300200041c8006a220342003703" + "00200041406b2202420037030020004200370338200141201004412041ad87c00041161023" + "20034100360200200242003703002000420037033841818020200141141005220441144604" + "400240200041066a20002d003a3a00002000200029003f370380012000200041c4006a2900" + "0037008501200041106a200029008501370000200020002f01383b01042000200028003b36" + "0007200020002903800137000b200642003703002003420037030020024200370300200042" + "00370338200041046a411420014120100622044120470d002000411a6a20002d003a3a0000" + "20004188016a200041c7006a290000220837030020004190016a200041cf006a2900002209" + "370300200041276a20083700002000412f6a2009370000200041376a200041d7006a2d0000" + "3a0000200020002f01383b01182000200028003b36001b2000200029003f37001f20004118" + "6a412041001007410141b980c0004110102320034100360200200242003703002000420037" + "033841818020200141141008411441c387c000411c10232003410036020020024200370300" + "20004200370338410141818020200141141009411441df87c0004114102302402001410020" + "016b41037122036a220220014d0d0020030440200321040340200141003a0000200141016a" + "2101200441016b22040d000b0b200341016b4107490d000340200141003a0000200141076a" + "41003a0000200141066a41003a0000200141056a41003a0000200141046a41003a00002001" + "41036a41003a0000200141026a41003a0000200141016a41003a0000200141086a22012002" + "470d000b0b200241c40020036b2203417c716a220120024b04400340200241003602002002" + "41046a22022001490d000b0b024020012003410371220320016a22044f0d00200322020440" + "0340200141003a0000200141016a2101200241016b22020d000b0b200341016b4107490d00" + "0340200141003a0000200141076a41003a0000200141066a41003a0000200141056a41003a" + "0000200141046a41003a0000200141036a41003a0000200141026a41003a0000200141016a" + "41003a0000200141086a22012004470d000b0b200041818020360280014100210103402005" + "41c000490440200041386a20056a20004180016a20016a2d00003a00002000200028027841" + "016a2205360278200141016a22014104470d010b0b20004190016a22044100360200200041" + "88016a220642003703002000420037038001200041386a2201200520004180016a22024114" + "100a411441f387c00041131023200441003602002006420037030020004200370380012001" + "200028027820024114100b4114418688c00041231023200441003602002006420037030020" + "0042003703800141012001200028027820024114100c411441a988c000411b10234189803c" + "100d412041c980c000411010234189803c100e412041d980c0004120102341014189803c10" + "0f412041f980c000411810232001200028027810104120419181c000411710232001200028" + "02781011412041a881c000412710234101200120002802781012412041cf81c000411f1023" + "200041046a220341141013410041ee81c000410b102320004198016a220742003703002004" + "420037030020064200370300200042003703800120012000280278200241201014412041c4" + "88c00041131023417f41041002417141f981c0004116102320004100360280012002417f10" + "02417141d788c0004116102320004182016a41003a0000200041003b018001200241031002" + "417d41ed88c000411c102320004100360280012002418094ebdc0310024173418989c00041" + "1b10234102100d416f418f82c000411f1023417f20002802781010417141ae82c000411f10" + "232001417f1010417141cd82c000411f102320014181201010417441ec82c0004120102320" + "0041b894ebdc036a2205200028027810104173418c83c000411f1023200520002802784101" + "1007417341ab83c000411810232001200028027841011007417141c383c000411a10232007" + "42003703002004420037030020064200370300200042003703800120052000280278200241" + "201006417341a489c000411b10232007420037030020044200370300200642003703002000" + "42003703800120012000280278200241201006417141bf89c0004118102320074200370300" + "20044200370300200642003703002000420037038001200341142003411420052000280278" + "200241201015417341d789c000412110232007420037030020044200370300200642003703" + "002000420037038001200341142003411420012000280278200241201015417141f889c000" + "411e102320052000280278422a1000417341dd83c00041171023200041003b018001410220" + "0241021005416f41968ac000411b1023200041003b0180014102200241021008416f41b18a" + "c000412b1023200041003b01800141014102200241021009416f41dc8ac000412310234102" + "100d416f418f82c000411f10234102100e416f41f483c000412f102341014102100f416f41" + "a384c00041271023200041003b018001200141812020024102100a417441ff8ac000412110" + "23200041003b018001200141812020024102100b417441a08bc00041311023200041003b01" + "80014101200141812020024102100c417441d18bc0004129102320014181201010417441ca" + "84c0004125102320014181201011417441ef84c00041351023410120014181201012417441" + "a485c000412d102320014181201013417441d185c00041191023200041003b018001200141" + "8120200241021014417441fa8bc00041211023200041003b01800120034114200341142001" + "4181202002410210164174419b8cc000411f10232001200028027822042005200441001001" + "417341ea85c000410f10232001200028027841001007417141f985c0004123102320004100" + "3b0180012003411420012000280278200241021017417141ba8cc000411a1023200041003b" + "01800120012000280278200241021006417141d48cc00041231023200041003b0180012001" + "20002802784101200241021018417141f78cc00041211023200041003b0180012001200028" + "027822042003411420012004200241021016417141988dc00041271023200041003b018001" + "2003411420012000280278220420012004200241021016417141bf8dc00041271023200041" + "003b0180012001200028027820034114200241021019417141e68dc0004125102320004100" + "3b01800120034114200120002802782002410210194171418b8ec00041251023200041003b" + "018001200120002802782003411420024102101a417141b08ec000412c1023200041003b01" + "8001200341142001200028027820024102101a417141dc8ec000412c1023200041003b0180" + "012001200028027820024102101b417141888fc000411f1023200041003b01800120012000" + "280278410120024102101c417141a78fc00041221023200041003b01800120012000280278" + "20034114419c86c0004114200241021015417141c98fc00041211023200041003b01800120" + "03411420012000280278419c86c0004114200241021015417141ea8fc00041211023200041" + "003b01800120012000280278410120024102101d4171418b90c00041251023200041003b01" + "800120012000280278410120024102101e417141b090c00041211023200041003b01800120" + "012000280278410120024102101f417141d190c00041221023200041003b01800120012000" + "280278200341144101200241021020417141f390c00041241023200041003b018001200341" + "142001200028027841012002410210204171419791c00041241023200041003b0180012001" + "2000280278200241021021417141bb91c00041231023200041003b01800120012000280278" + "4101200241021022417141de91c00041221023200041003b0180012001200028027841b086" + "c00041202002410210174171418092c000411c10232005200028027841b086c00041204100" + "1001417341d086c0004119102320012000280278200141812041001001417441e986c00041" + "0e1023200141812042011000417441f786c00041121023200041a0016a240041010f0b0b41" + "8080c000410b417f20042004417f4e1bac1000000b0ba6120100418080c0000b9c12657272" + "6f725f636f64653d54455354204641494c45442424242424205354415254494e4720574153" + "4d20455845435554494f4e20242424242463616368655f6c65646765725f6f626a6765745f" + "74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6172" + "7261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f7478" + "5f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f" + "626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e6573" + "7465645f61727261795f6c656e7570646174655f646174616765745f6c65646765725f7371" + "6e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669" + "656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f707472676574" + "5f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65" + "737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f" + "61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f707472" + "5f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e74726163655f6e" + "756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765725f6f62" + "6a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f" + "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65" + "737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269" + "675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c65" + "6e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c" + "69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f626a5f7772" + "6f6e675f73697a655f75696e74323536555344303030303030303030303030303030303030" + "303030303030303030303030303030303030303030303030303030303030316765745f6e66" + "745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e6774726163" + "655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f706172656e" + "745f6c65646765725f74696d656765745f706172656e745f6c65646765725f686173686765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f" + "6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f" + "6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765" + "745f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f6275" + "665f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e" + "676163636f756e745f6b65796c65745f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" + "65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f746f6f5f6c6f" + "6e675f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272" + "656e63796765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375" + "7272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64" + "6765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765" + "745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f626967" + "5f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" + "5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f626967" + "5f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c696365" + "6765745f6e66745f77726f6e675f73697a655f75696e743235366163636f756e745f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072656175" + "74685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369" + "745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" + "326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f" + "775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f6163" + "636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e746964004d" + "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" + "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 97b2236d1b8..b82b9aadcf2 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -58,3 +58,5 @@ extern std::string const hfPerfTest; extern std::string const opcCallPerfTest; extern std::string const keyletHostFunctions; + +extern std::string const codecovWasm; diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 23b89af3d32..a3a6f858c93 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -37,7 +37,7 @@ setData( int32_t srcSize) { if (!srcSize) - return 0; + return 0; // LCOV_EXCL_LINE if (dst < 0 || dstSize < 0 || !src || srcSize < 0) return static_cast>( @@ -45,9 +45,11 @@ setData( auto memory = runtime ? runtime->getMem() : wmem(); + // LCOV_EXCL_START if (!memory.s) return static_cast>( HostFunctionError::NO_MEM_EXPORTED); + // LCOV_EXCL_STOP if (dst + dstSize > memory.s) return static_cast>( HostFunctionError::POINTER_OUT_OF_BOUNDS); @@ -108,8 +110,10 @@ getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); auto memory = runtime ? runtime->getMem() : wmem(); + // LCOV_EXCL_START if (!memory.s) return Unexpected(HostFunctionError::NO_MEM_EXPORTED); + // LCOV_EXCL_STOP if (ptr + size > memory.s) return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); @@ -141,8 +145,15 @@ Expected getDataAccountID(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { auto const slice = getDataSlice(runtime, params, i); - if (!slice || (slice->size() != AccountID::bytes)) + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != AccountID::bytes) + { return Unexpected(HostFunctionError::INVALID_PARAMS); + } return AccountID::fromVoid(slice->data()); } @@ -152,8 +163,15 @@ static Expected getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { auto const slice = getDataSlice(runtime, params, i); - if (!slice || (slice->size() != Currency::bytes)) + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != Currency::bytes) + { return Unexpected(HostFunctionError::INVALID_PARAMS); + } return Currency::fromVoid(slice->data()); } @@ -306,7 +324,7 @@ cacheLedgerObj_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } return returnResult( @@ -365,7 +383,7 @@ getLedgerObjField_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const fname = getDataSField(runtime, params, index); @@ -434,7 +452,7 @@ getLedgerObjNestedField_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const bytes = getDataSlice(runtime, params, index); @@ -508,7 +526,7 @@ getLedgerObjArrayLen_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const fname = getDataSField(runtime, params, index); @@ -581,7 +599,7 @@ getLedgerObjNestedArrayLen_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const bytes = getDataSlice(runtime, params, index); @@ -675,7 +693,7 @@ checkKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -814,7 +832,7 @@ escrowKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -876,7 +894,7 @@ nftOfferKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -906,7 +924,7 @@ offerKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -936,7 +954,7 @@ oracleKeylet_wrap( auto const documentId = getDataInt32(runtime, params, index); if (!documentId) { - return hfResult(results, documentId.error()); + return hfResult(results, documentId.error()); // LCOV_EXCL_LINE } return returnResult( runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); @@ -967,7 +985,7 @@ paychanKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1017,7 +1035,7 @@ ticketKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1079,7 +1097,7 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto const asHex = getDataInt32(runtime, params, index); if (!asHex) { - return hfResult(results, asHex.error()); + return hfResult(results, asHex.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1106,7 +1124,7 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto const number = getDataInt64(runtime, params, index); if (!number) { - return hfResult(results, number.error()); + return hfResult(results, number.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1131,6 +1149,8 @@ class MockInstanceWrapper }; namespace test { + +// LCOV_EXCL_START bool testGetDataIncrement() { @@ -1257,6 +1277,7 @@ testGetDataIncrement() return true; } +// LCOV_EXCL_STOP } // namespace test } // namespace ripple From 3b849ff49753dc791cc5b14268a46772d095d84d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Jul 2025 17:54:48 -0400 Subject: [PATCH 41/73] Add unit tests for host functions (#5578) --- src/test/app/WasmHostFuncImpl_test.cpp | 1693 +++++++++++++++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 153 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 18 + 3 files changed, 1793 insertions(+), 71 deletions(-) create mode 100644 src/test/app/WasmHostFuncImpl_test.cpp diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp new file mode 100644 index 00000000000..5a4b2441748 --- /dev/null +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -0,0 +1,1693 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +namespace ripple { +namespace test { + +static Bytes +toBytes(std::uint16_t value) +{ + auto const* b = reinterpret_cast(&value); + auto const* e = reinterpret_cast(&value + 1); + return Bytes{b, e}; +} + +static Bytes +toBytes(std::uint32_t value) +{ + auto const* b = reinterpret_cast(&value); + auto const* e = reinterpret_cast(&value + 1); + return Bytes{b, e}; +} + +static Bytes +toBytes(Asset const& asset) +{ + if (asset.holds()) + { + Serializer s; + auto const& issue = asset.get(); + s.addBitString(issue.currency); + if (!isXRP(issue.currency)) + s.addBitString(issue.account); + auto const data = s.getData(); + return data; + } + + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; +} + +static Bytes +toBytes(STAmount const& amount) +{ + Serializer msg; + amount.add(msg); + auto const data = msg.getData(); + + return data; +} + +static ApplyContext +createApplyContext( + test::jtx::Env& env, + OpenView& ov, + STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) +{ + ApplyContext ac{ + env.app(), + ov, + tx, + tesSUCCESS, + env.current()->fees().base, + tapNONE, + env.journal}; + return ac; +} + +struct WasmHostFuncImpl_test : public beast::unit_test::suite +{ + void + testGetLedgerSqn() + { + testcase("getLedgerSqn"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerSqn(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().seq); + } + + void + testGetParentLedgerTime() + { + testcase("getParentLedgerTime"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + env.current()->parentCloseTime().time_since_epoch().count()); + } + + void + testGetParentLedgerHash() + { + testcase("getParentLedgerHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getParentLedgerHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().parentHash); + } + void + testCacheLedgerObj() + { + testcase("cacheLedgerObj"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = keylet::escrow(env.master, 2); + auto const accountKeylet = keylet::account(env.master); + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, -1).error() == + HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 257).error() == + HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT( + hfs.cacheLedgerObj(dummyEscrow.key, 0).error() == + HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 0).value() == 1); + + for (int i = 1; i <= 256; ++i) + { + auto const result = hfs.cacheLedgerObj(accountKeylet.key, i); + BEAST_EXPECT(result.has_value() && result.value() == i); + } + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 0).error() == + HostFunctionError::SLOTS_FULL); + } + + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + for (int i = 1; i <= 256; ++i) + { + auto const result = hfs.cacheLedgerObj(accountKeylet.key, 0); + BEAST_EXPECT(result.has_value() && result.value() == i); + } + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 0).error() == + HostFunctionError::SLOTS_FULL); + } + } + + void + testGetTxField() + { + testcase("getTxField"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setAccountID(sfOwner, env.master.id()); + obj.setFieldU32(sfOfferSequence, env.seq(env.master)); + obj.setFieldU32(sfComputationAllowance, 1000); + obj.setFieldArray(sfMemos, STArray{}); + }); + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const account = hfs.getTxField(sfAccount); + BEAST_EXPECT( + account.has_value() && + std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + + auto const owner = hfs.getTxField(sfOwner); + BEAST_EXPECT( + owner.has_value() && + std::equal( + owner.value().begin(), + owner.value().end(), + env.master.id().data())); + + auto const txType = hfs.getTxField(sfTransactionType); + BEAST_EXPECT( + txType.has_value() && + std::equal( + txType.value().begin(), + txType.value().end(), + toBytes(ttESCROW_FINISH).begin())); + + auto const offerSeq = hfs.getTxField(sfOfferSequence); + BEAST_EXPECT( + offerSeq.has_value() && + std::equal( + offerSeq.value().begin(), + offerSeq.value().end(), + toBytes(env.seq(env.master)).begin())); + + auto const compAllowance = hfs.getTxField(sfComputationAllowance); + std::uint32_t const expectedAllowance = 1000; + BEAST_EXPECT( + compAllowance.has_value() && + std::equal( + compAllowance.value().begin(), + compAllowance.value().end(), + toBytes(expectedAllowance).begin())); + + auto const notPresent = hfs.getTxField(sfDestination); + if (BEAST_EXPECT(!notPresent.has_value())) + BEAST_EXPECT( + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + + auto const memos = hfs.getTxField(sfMemos); + if (BEAST_EXPECT(!memos.has_value())) + BEAST_EXPECT( + memos.error() == HostFunctionError::NOT_LEAF_FIELD); + + auto const nonField = hfs.getTxField(sfInvalid); + if (BEAST_EXPECT(!nonField.has_value())) + BEAST_EXPECT( + nonField.error() == HostFunctionError::FIELD_NOT_FOUND); + + auto const nonField2 = hfs.getTxField(sfGeneric); + if (BEAST_EXPECT(!nonField2.has_value())) + BEAST_EXPECT( + nonField2.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + { + auto const iouAsset = env.master["USD"]; + STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldIssue(sfAsset, STIssue{sfAsset, xrpIssue()}); + obj.setFieldIssue( + sfAsset2, STIssue{sfAsset2, iouAsset.issue()}); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const asset = hfs.getTxField(sfAsset); + std::vector expectedAsset(20, 0); + BEAST_EXPECT( + asset.has_value() && + std::equal( + asset.value().begin(), + asset.value().end(), + expectedAsset.begin())); + + auto const asset2 = hfs.getTxField(sfAsset2); + BEAST_EXPECT( + asset2.has_value() && + std::equal( + asset2.value().begin(), + asset2.value().end(), + toBytes(Asset(iouAsset)).begin())); + } + + { + auto const iouAsset = env.master["GBP"]; + auto const mptId = makeMptID(1, env.master); + STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldIssue(sfAsset, STIssue{sfAsset, iouAsset.issue()}); + obj.setFieldIssue(sfAsset2, STIssue{sfAsset2, MPTIssue{mptId}}); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const asset = hfs.getTxField(sfAsset); + if (BEAST_EXPECT(asset.has_value())) + { + BEAST_EXPECT(std::equal( + asset.value().begin(), + asset.value().end(), + toBytes(Asset(iouAsset)).begin())); + } + + auto const asset2 = hfs.getTxField(sfAsset2); + if (BEAST_EXPECT(asset2.has_value())) + { + BEAST_EXPECT(std::equal( + asset2.value().begin(), + asset2.value().end(), + toBytes(Asset(mptId)).begin())); + } + } + } + + void + testGetCurrentLedgerObjField() + { + testcase("getCurrentLedgerObjField"); + using namespace test::jtx; + using namespace std::chrono; + + Env env{*this}; + + // Fund the account and create an escrow so the ledger object exists + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + 1s)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + // Find the escrow ledger object + auto const escrowKeylet = + keylet::escrow(env.master, env.seq(env.master) - 1); + BEAST_EXPECT(env.le(escrowKeylet)); + + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Should return the Account field from the escrow ledger object + auto const account = hfs.getCurrentLedgerObjField(sfAccount); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + BEAST_EXPECT(std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + + // Should return the Amount field from the escrow ledger object + auto const amountField = hfs.getCurrentLedgerObjField(sfAmount); + if (BEAST_EXPECT(amountField.has_value())) + { + BEAST_EXPECT(std::equal( + amountField.value().begin(), + amountField.value().end(), + toBytes(XRP(100)).begin())); + } + + // Should return nullopt for a field not present + auto const notPresent = hfs.getCurrentLedgerObjField(sfOwner); + BEAST_EXPECT( + !notPresent.has_value() && + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl hfs2(ac, dummyEscrow); + auto const account = hfs2.getCurrentLedgerObjField(sfAccount); + if (BEAST_EXPECT(!account.has_value())) + { + BEAST_EXPECT( + account.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + } + } + + void + testGetLedgerObjField() + { + testcase("getLedgerObjField"); + using namespace test::jtx; + using namespace std::chrono; + + Env env{*this}; + // Fund the account and create an escrow so the ledger object exists + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + 1s)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const accountKeylet = keylet::account(env.master.id()); + auto const escrowKeylet = + keylet::escrow(env.master.id(), env.seq(env.master) - 1); + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Cache the escrow ledger object in slot 1 + auto cacheResult = hfs.cacheLedgerObj(accountKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Should return the Account field from the cached ledger object + auto const account = hfs.getLedgerObjField(1, sfAccount); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + BEAST_EXPECT(std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + + // Should return the Balance field from the cached ledger object + auto const balanceField = hfs.getLedgerObjField(1, sfBalance); + if (BEAST_EXPECT(balanceField.has_value())) + { + BEAST_EXPECT(std::equal( + balanceField.value().begin(), + balanceField.value().end(), + toBytes(env.balance(env.master)).begin())); + } + + // Should return error for slot out of range + auto const outOfRange = hfs.getLedgerObjField(0, sfAccount); + BEAST_EXPECT( + !outOfRange.has_value() && + outOfRange.error() == HostFunctionError::SLOT_OUT_RANGE); + + auto const tooHigh = hfs.getLedgerObjField(257, sfAccount); + BEAST_EXPECT( + !tooHigh.has_value() && + tooHigh.error() == HostFunctionError::SLOT_OUT_RANGE); + + // Should return error for empty slot + auto const emptySlot = hfs.getLedgerObjField(2, sfAccount); + BEAST_EXPECT( + !emptySlot.has_value() && + emptySlot.error() == HostFunctionError::EMPTY_SLOT); + + // Should return error for field not present + auto const notPresent = hfs.getLedgerObjField(1, sfOwner); + BEAST_EXPECT( + !notPresent.has_value() && + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetTxNestedField() + { + testcase("getTxNestedField"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + // Create a transaction with a nested array field + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + STArray memos; + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + // Locator for sfMemos[0].sfMemo.sfMemoData + // Locator is a sequence of int32_t codes: + // [sfMemos.fieldCode, 0, sfMemoData.fieldCode] + std::vector locatorVec = { + sfMemos.fieldCode, 0, sfMemoData.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + std::string memoData( + result.value().begin(), result.value().end()); + BEAST_EXPECT(memoData == "hello"); + } + } + + { + // can use the nested locator for base fields too + std::vector locatorVec = {sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const account = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + { + BEAST_EXPECT(std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + } + } + + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError) { + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + // Locator for non-existent base field + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for non-existent index + expectError( + {sfMemos.fieldCode, + 1, // index 1 does not exist + sfMemoData.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Locator for non-existent nested field + expectError( + {sfMemos.fieldCode, + 0, + sfURI.fieldCode}, // sfURI does not exist in the memo + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for non-existent base sfield + expectError( + {field_code(20000, 20000), // nonexistent SField code + 0, + sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Locator for non-existent nested sfield + expectError( + {sfMemos.fieldCode, // nonexistent SField code + 0, + field_code(20000, 20000)}, + HostFunctionError::INVALID_FIELD); + + // Locator for STArray + expectError({sfMemos.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + + // Locator for nesting into non-array/object field + expectError( + {sfAccount.fieldCode, // sfAccount is not an array or object + 0, + sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Locator for empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Locator for malformed locator (not multiple of 4) + { + std::vector locatorVec = {sfMemos.fieldCode}; + Slice malformedLocator( + reinterpret_cast(locatorVec.data()), 3); + auto const malformedResult = hfs.getTxNestedField(malformedLocator); + BEAST_EXPECT( + !malformedResult.has_value() && + malformedResult.error() == + HostFunctionError::LOCATOR_MALFORMED); + } + } + + void + testGetCurrentLedgerObjNestedField() + { + testcase("getCurrentLedgerObjNestedField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + // Find the signer ledger object + auto const signerKeylet = keylet::signers(env.master.id()); + BEAST_EXPECT(env.le(signerKeylet)); + + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + // Locator for base field + std::vector baseLocator = {sfSignerQuorum.fieldCode}; + Slice baseLocatorSlice( + reinterpret_cast(baseLocator.data()), + baseLocator.size() * sizeof(int32_t)); + auto const signerQuorum = + hfs.getCurrentLedgerObjNestedField(baseLocatorSlice); + if (BEAST_EXPECTS( + signerQuorum.has_value(), + std::to_string(static_cast(signerQuorum.error())))) + { + BEAST_EXPECT(std::equal( + signerQuorum.value().begin(), + signerQuorum.value().end(), + toBytes(static_cast(2)).begin())); + } + + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError) { + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getCurrentLedgerObjNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + // Locator for non-existent base field + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + // Locator for nesting into non-array/object field + expectError( + {sfSignerQuorum + .fieldCode, // sfSignerQuorum is not an array or object + 0, + sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Locator for empty locator + Slice emptyLocator(nullptr, 0); + auto const emptyResult = + hfs.getCurrentLedgerObjNestedField(emptyLocator); + BEAST_EXPECT( + !emptyResult.has_value() && + emptyResult.error() == HostFunctionError::LOCATOR_MALFORMED); + + // Locator for malformed locator (not multiple of 4) + std::vector malformedLocatorVec = {sfMemos.fieldCode}; + Slice malformedLocator( + reinterpret_cast(malformedLocatorVec.data()), 3); + auto const malformedResult = + hfs.getCurrentLedgerObjNestedField(malformedLocator); + BEAST_EXPECT( + !malformedResult.has_value() && + malformedResult.error() == HostFunctionError::LOCATOR_MALFORMED); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + std::vector const locatorVec = {sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = + dummyHfs.getCurrentLedgerObjNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, + std::to_string(static_cast(result.error()))); + } + } + + void + testGetLedgerObjNestedField() + { + testcase("getLedgerObjNestedField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Cache the SignerList ledger object in slot 1 + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Locator for sfSignerEntries[0].sfAccount + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 0, sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + BEAST_EXPECT(std::equal( + result.value().begin(), + result.value().end(), + alice.id().data())); + } + } + + // Locator for sfSignerEntries[1].sfAccount + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 1, sfAccount.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result2 = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + result2.has_value(), + std::to_string(static_cast(result2.error())))) + { + BEAST_EXPECT(std::equal( + result2.value().begin(), + result2.value().end(), + becky.id().data())); + } + } + + // Locator for sfSignerEntries[0].sfSignerWeight + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 0, sfSignerWeight.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const weightResult = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + weightResult.has_value(), + std::to_string(static_cast(weightResult.error())))) + { + // Should be 1 + auto const expected = toBytes(static_cast(1)); + BEAST_EXPECT(std::equal( + weightResult.value().begin(), + weightResult.value().end(), + expected.begin())); + } + } + + // Locator for base field sfSignerQuorum + { + std::vector const locatorVec = {sfSignerQuorum.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const quorumResult = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + quorumResult.has_value(), + std::to_string(static_cast(quorumResult.error())))) + { + auto const expected = toBytes(static_cast(2)); + BEAST_EXPECT(std::equal( + quorumResult.value().begin(), + quorumResult.value().end(), + expected.begin())); + } + } + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getLedgerObjNestedField(slot, locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Error: base field not found + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Error: index out of bounds + expectError( + {sfSignerEntries.fieldCode, + 2, // index 2 does not exist + sfAccount.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Error: nested field not found + expectError( + { + sfSignerEntries.fieldCode, + 0, + sfDestination.fieldCode // sfDestination does not exist + }, + HostFunctionError::FIELD_NOT_FOUND); + + // Error: invalid field code + expectError( + {field_code(99999, 99999), 0, sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Error: invalid nested field code + expectError( + {sfSignerEntries.fieldCode, 0, field_code(99999, 99999)}, + HostFunctionError::INVALID_FIELD); + + // Error: slot out of range + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 257); + + // Error: empty slot + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::EMPTY_SLOT, 2); + + // Error: locator for STArray (not leaf field) + expectError( + {sfSignerEntries.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + + // Error: nesting into non-array/object field + expectError( + {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Error: empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator malformed (not multiple of 4) + std::vector const locatorVec = {sfSignerEntries.fieldCode}; + Slice const locator = + Slice(reinterpret_cast(locatorVec.data()), 3); + auto const malformed = hfs.getLedgerObjNestedField(1, locator); + BEAST_EXPECT( + !malformed.has_value() && + malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + } + + void + testGetTxArrayLen() + { + testcase("getTxArrayLen"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + // Transaction with an array field + STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + STArray memos; + { + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + } + { + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("world", 5)); + memos.push_back(memoObj); + } + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should return 1 for sfMemos + auto const memosLen = hfs.getTxArrayLen(sfMemos); + if (BEAST_EXPECT(memosLen.has_value())) + BEAST_EXPECT(memosLen.value() == 2); + + // Should return error for non-array field + auto const notArray = hfs.getTxArrayLen(sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + + // Should return error for missing array field + auto const missingArray = hfs.getTxArrayLen(sfSigners); + if (BEAST_EXPECT(!missingArray.has_value())) + BEAST_EXPECT( + missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetCurrentLedgerObjArrayLen() + { + testcase("getCurrentLedgerObjArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const signerKeylet = keylet::signers(env.master.id()); + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + auto const entriesLen = + hfs.getCurrentLedgerObjArrayLen(sfSignerEntries); + if (BEAST_EXPECT(entriesLen.has_value())) + BEAST_EXPECT(entriesLen.value() == 2); + + auto const arrLen = hfs.getCurrentLedgerObjArrayLen(sfMemos); + if (BEAST_EXPECT(!arrLen.has_value())) + BEAST_EXPECT(arrLen.error() == HostFunctionError::FIELD_NOT_FOUND); + + // Should return NO_ARRAY for non-array field + auto const notArray = hfs.getCurrentLedgerObjArrayLen(sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + auto const len = dummyHfs.getCurrentLedgerObjArrayLen(sfMemos); + if (BEAST_EXPECT(!len.has_value())) + BEAST_EXPECT( + len.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + } + + void + testGetLedgerObjArrayLen() + { + testcase("getLedgerObjArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + { + auto const arrLen = hfs.getLedgerObjArrayLen(1, sfSignerEntries); + if (BEAST_EXPECT(arrLen.has_value())) + // Should return 2 for sfSignerEntries + BEAST_EXPECT(arrLen.value() == 2); + } + { + auto const arrLen = hfs.getLedgerObjArrayLen(0, sfSignerEntries); + if (BEAST_EXPECT(!arrLen.has_value())) + BEAST_EXPECT( + arrLen.error() == HostFunctionError::SLOT_OUT_RANGE); + } + + { + // Should return error for non-array field + auto const notArray = hfs.getLedgerObjArrayLen(1, sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + } + + { + // Should return error for empty slot + auto const emptySlot = hfs.getLedgerObjArrayLen(2, sfSignerEntries); + if (BEAST_EXPECT(!emptySlot.has_value())) + BEAST_EXPECT( + emptySlot.error() == HostFunctionError::EMPTY_SLOT); + } + + { + // Should return error for missing array field + auto const missingArray = hfs.getLedgerObjArrayLen(1, sfMemos); + if (BEAST_EXPECT(!missingArray.has_value())) + BEAST_EXPECT( + missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testGetTxNestedArrayLen() + { + testcase("getTxNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + STArray memos; + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getTxNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Locator for sfMemos + { + std::vector locatorVec = {sfMemos.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getTxNestedArrayLen(locator); + BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 1); + } + + // Error: non-array field + expectError({sfAccount.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetCurrentLedgerObjNestedArrayLen() + { + testcase("getCurrentLedgerObjNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const signerKeylet = keylet::signers(env.master.id()); + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getCurrentLedgerObjNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Locator for sfSignerEntries + { + std::vector locatorVec = {sfSignerEntries.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getCurrentLedgerObjNestedArrayLen(locator); + BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 2); + } + + // Error: non-array field + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + std::vector locatorVec = {sfAccount.fieldCode}; + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = + dummyHfs.getCurrentLedgerObjNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, + std::to_string(static_cast(result.error()))); + } + } + + void + testGetLedgerObjNestedArrayLen() + { + testcase("getLedgerObjNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Locator for sfSignerEntries + std::vector locatorVec = {sfSignerEntries.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getLedgerObjNestedArrayLen(1, locator); + if (BEAST_EXPECT(arrLen.has_value())) + BEAST_EXPECT(arrLen.value() == 2); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getLedgerObjNestedArrayLen(slot, locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Error: non-array field + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + + // Slot out of range + expectError(locatorVec, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError(locatorVec, HostFunctionError::SLOT_OUT_RANGE, 257); + + // Empty slot + expectError(locatorVec, HostFunctionError::EMPTY_SLOT, 2); + + // Error: empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator malformed (not multiple of 4) + Slice malformedLocator( + reinterpret_cast(locator.data()), 3); + auto const malformed = + hfs.getLedgerObjNestedArrayLen(1, malformedLocator); + BEAST_EXPECT( + !malformed.has_value() && + malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator for non-STArray field + expectError( + {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + } + + void + testUpdateData() + { + testcase("updateData"); + using namespace test::jtx; + + Env env{*this}; + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + std::chrono::seconds(1))); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const escrowKeylet = + keylet::escrow(env.master, env.seq(env.master) - 1); + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Should succeed for small data + std::vector data(10, 0x42); + auto result = hfs.updateData(Slice(data.data(), data.size())); + BEAST_EXPECT(result.has_value() && result.value() == 0); + + // Should fail for too large data + std::vector bigData( + 1024 * 1024 + 1, 0x42); // > maxWasmDataLength + auto tooBig = hfs.updateData(Slice(bigData.data(), bigData.size())); + if (BEAST_EXPECT(!tooBig.has_value())) + BEAST_EXPECT( + tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); + + // Should fail if ledger object not found (use a bogus keylet) + auto bogusKeylet = keylet::escrow(env.master, 999999); + WasmHostFunctionsImpl hfs2(ac, bogusKeylet); + auto notFound = hfs2.updateData(Slice(data.data(), data.size())); + if (BEAST_EXPECT(!notFound.has_value())) + BEAST_EXPECT( + notFound.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + void + testComputeSha512HalfHash() + { + testcase("computeSha512HalfHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string data = "hello world"; + auto result = + hfs.computeSha512HalfHash(Slice(data.data(), data.size())); + BEAST_EXPECT(result.has_value()); + + // Should match direct call to sha512Half + auto expected = sha512Half(Slice(data.data(), data.size())); + BEAST_EXPECT(result.value() == expected); + } + + void + testKeyletFunctions() + { + testcase("keylet functions"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto compareKeylet = [](std::vector const& bytes, + Keylet const& kl) { + return bytes.size() == kl.key.size() && + std::equal(bytes.begin(), bytes.end(), kl.key.begin()); + }; +// Lambda to compare a Bytes (std::vector) to a keylet +#define COMPARE_KEYLET(hfsFunc, keyletFunc, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + auto expected = keyletFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(actual.has_value())) \ + { \ + BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ + } \ + } +#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(static_cast(actual.error()))); \ + } \ + } + + // accountKeylet + COMPARE_KEYLET(accountKeylet, keylet::account, env.master.id()); + COMPARE_KEYLET_FAIL( + accountKeylet, + keylet::account, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount()); + COMPARE_KEYLET(checkKeylet, keylet::check, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + checkKeylet, + keylet::check, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + std::string const credType = "test"; + COMPARE_KEYLET( + credentialKeylet, + keylet::credential, + env.master.id(), + env.master.id(), + Slice(credType.data(), credType.size())); + + Account const alice("alice"); + constexpr std::string_view longCredType = + "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]" + "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p"; + static_assert(longCredType.size() > maxCredentialTypeLength); + COMPARE_KEYLET_FAIL( + credentialKeylet, + keylet::credential, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + alice.id(), + Slice(longCredType.data(), longCredType.size())); + COMPARE_KEYLET_FAIL( + credentialKeylet, + keylet::credential, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + alice.id(), + Slice(credType.data(), credType.size())); + COMPARE_KEYLET_FAIL( + credentialKeylet, + keylet::credential, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + Slice(credType.data(), credType.size())); + + COMPARE_KEYLET(didKeylet, keylet::did, env.master.id()); + COMPARE_KEYLET_FAIL( + didKeylet, + keylet::did, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount()); + COMPARE_KEYLET( + delegateKeylet, keylet::delegate, env.master.id(), alice.id()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + keylet::delegate, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + keylet::delegate, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + keylet::delegate, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id()); + + COMPARE_KEYLET( + depositPreauthKeylet, + keylet::depositPreauth, + env.master.id(), + alice.id()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + keylet::depositPreauth, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + keylet::depositPreauth, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + keylet::depositPreauth, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id()); + + // escrowKeylet + COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + escrowKeylet, + keylet::escrow, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + + // lineKeylet + Currency usd = to_currency("USD"); + COMPARE_KEYLET( + lineKeylet, keylet::line, env.master.id(), alice.id(), usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + alice.id(), + to_currency("")); + + COMPARE_KEYLET(nftOfferKeylet, keylet::nftoffer, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + nftOfferKeylet, + keylet::nftoffer, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + COMPARE_KEYLET(offerKeylet, keylet::offer, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + offerKeylet, + keylet::offer, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + COMPARE_KEYLET(oracleKeylet, keylet::oracle, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + oracleKeylet, + keylet::oracle, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + COMPARE_KEYLET( + paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + keylet::payChan, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id(), + 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + keylet::payChan, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + keylet::payChan, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id(), + 1); + + COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); + COMPARE_KEYLET_FAIL( + signersKeylet, + keylet::signers, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount()); + COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + ticketKeylet, + keylet::ticket, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + } + + void + testGetNFT() + { + testcase("getNFT"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + + // Mint NFT for alice + uint256 const nftId = token::getNextID(env, alice, 0u, 0u); + std::string const uri = "https://example.com/nft"; + env(token::mint(alice), token::uri(uri)); + env.close(); + uint256 const nftId2 = token::getNextID(env, alice, 0u, 0u); + env(token::mint(alice)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = keylet::escrow(alice, env.seq(alice)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should succeed for valid NFT + { + auto nftResult = hfs.getNFT(alice.id(), nftId); + if (BEAST_EXPECT(nftResult.has_value())) + BEAST_EXPECT(std::equal( + nftResult.value().begin(), + nftResult.value().end(), + uri.data())); + } + + // Should fail for invalid account + { + auto nftResult = hfs.getNFT(xrpAccount(), nftId); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == HostFunctionError::INVALID_ACCOUNT); + } + + // Should fail for invalid nftId + { + auto nftResult = hfs.getNFT(alice.id(), uint256()); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for invalid nftId + { + auto const badId = token::getNextID(env, alice, 0u, 1u); + auto nftResult = hfs.getNFT(alice.id(), badId); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == + HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + { + auto nftResult = hfs.getNFT(alice.id(), nftId2); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testTrace() + { + testcase("trace"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto result = hfs.trace(msg, slice, false); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == msg.size() + data.size()); + + auto resultHex = hfs.trace(msg, slice, true); + BEAST_EXPECT(resultHex.has_value()); + BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + } + + void + testTraceNum() + { + testcase("traceNum"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace number"; + int64_t num = 123456789; + auto result = hfs.traceNum(msg, num); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + } + + void + run() override + { + testGetLedgerSqn(); + testGetParentLedgerTime(); + testGetParentLedgerHash(); + testCacheLedgerObj(); + testGetTxField(); + testGetCurrentLedgerObjField(); + testGetLedgerObjField(); + testGetTxNestedField(); + testGetCurrentLedgerObjNestedField(); + testGetLedgerObjNestedField(); + testGetTxArrayLen(); + testGetCurrentLedgerObjArrayLen(); + testGetLedgerObjArrayLen(); + testGetTxNestedArrayLen(); + testGetCurrentLedgerObjNestedArrayLen(); + testGetLedgerObjNestedArrayLen(); + testUpdateData(); + testComputeSha512HalfHash(); + testKeyletFunctions(); + testGetNFT(); + testTrace(); + testTraceNum(); + } +}; + +BEAST_DEFINE_TESTSUITE(WasmHostFuncImpl, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 152c946c7cc..7dce3b865aa 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -48,6 +48,17 @@ WasmHostFunctionsImpl::getParentLedgerHash() return ctx.view().info().parentHash; } +Expected +WasmHostFunctionsImpl::normalizeCacheIndex(int32_t cacheIdx) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::EMPTY_SLOT); + return cacheIdx; +} + Expected WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { @@ -55,14 +66,16 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) if (cacheIdx < 0 || cacheIdx > MAX_CACHE) return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cacheIdx) + if (cacheIdx == 0) { for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) if (!cache[cacheIdx]) break; } else - --cacheIdx; + { + cacheIdx--; // convert to 0-based index + } if (cacheIdx >= MAX_CACHE) return Unexpected(HostFunctionError::SLOTS_FULL); @@ -70,7 +83,7 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) cache[cacheIdx] = ctx.view().read(keylet); if (!cache[cacheIdx]) return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - return cacheIdx + 1; + return cacheIdx + 1; // return 1-based index } static Expected @@ -83,10 +96,12 @@ getAnyFieldData(STBase const* obj) auto const stype = obj->getSType(); switch (stype) { + // LCOV_EXCL_START case STI_UNKNOWN: case STI_NOTPRESENT: return Unexpected(HostFunctionError::FIELD_NOT_FOUND); break; + // LCOV_EXCL_STOP case STI_OBJECT: case STI_ARRAY: return Unexpected(HostFunctionError::NOT_LEAF_FIELD); @@ -104,7 +119,7 @@ getAnyFieldData(STBase const* obj) auto const* issue(static_cast(obj)); Asset const& asset(issue->value()); // XRP and IOU will be processed by serializer - if (!asset.holds()) + if (asset.holds()) { // MPT auto const& mptIssue = asset.get(); @@ -119,12 +134,13 @@ getAnyFieldData(STBase const* obj) return Bytes{data.begin(), data.end()}; } break; - case STI_UINT256: { - auto const* num(static_cast const*>(obj)); - auto const& data = num->value(); - return Bytes{data.begin(), data.end()}; + case STI_UINT16: { + auto const& num(static_cast const*>(obj)); + std::uint16_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; } - break; case STI_UINT32: { auto const* num(static_cast const*>(obj)); std::uint32_t const data = num->value(); @@ -133,8 +149,14 @@ getAnyFieldData(STBase const* obj) return Bytes{b, e}; } break; + case STI_UINT256: { + auto const* num(static_cast const*>(obj)); + auto const& data = num->value(); + return Bytes{data.begin(), data.end()}; + } + break; default: - break; + break; // default to serializer } Serializer msg; @@ -153,21 +175,19 @@ WasmHostFunctionsImpl::getTxField(SField const& fname) Expected WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) { - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - return getAnyFieldData(sle->peekAtPField(fname)); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + return getAnyFieldData(sle.value()->peekAtPField(fname)); } Expected WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - return getAnyFieldData(cache[cacheIdx]->peekAtPField(fname)); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + return getAnyFieldData(cache[normalizedIdx.value()]->peekAtPField(fname)); } static inline bool @@ -178,20 +198,20 @@ noField(STBase const* field) } static Expected -locateField(STObject const& obj, Slice const& loc) +locateField(STObject const& obj, Slice const& locator) { - if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - int32_t const* l = reinterpret_cast(loc.data()); - int32_t const sz = loc.size() / 4; + int32_t const* locPtr = reinterpret_cast(locator.data()); + int32_t const locSize = locator.size() / 4; STBase const* field = nullptr; - auto const& m = SField::getKnownCodeToField(); + auto const& knownSFields = SField::getKnownCodeToField(); { - int32_t const c = l[0]; - auto const it = m.find(c); - if (it == m.end()) + int32_t const sfieldCode = locPtr[0]; + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); @@ -200,23 +220,23 @@ locateField(STObject const& obj, Slice const& loc) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } - for (int i = 1; i < sz; ++i) + for (int i = 1; i < locSize; ++i) { - int32_t const c = l[i]; + int32_t const sfieldCode = locPtr[i]; if (STI_ARRAY == field->getSType()) { auto const* arr = static_cast(field); - if (c >= arr->size()) + if (sfieldCode >= arr->size()) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); - field = &(arr->operator[](c)); + field = &(arr->operator[](sfieldCode)); } else if (STI_OBJECT == field->getSType()) { auto const* o = static_cast(field); - auto const it = m.find(c); - if (it == m.end()) + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); @@ -247,11 +267,11 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) { - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); - auto const r = locateField(*sle, locator); + auto const r = locateField(*sle.value(), locator); if (!r) return Unexpected(r.error()); @@ -263,14 +283,11 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( int32_t cacheIdx, Slice const& locator) { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - - auto const r = locateField(*cache[cacheIdx], locator); + auto const r = locateField(*cache[normalizedIdx.value()], locator); if (!r) return Unexpected(r.error()); @@ -288,7 +305,7 @@ WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE int32_t const sz = static_cast(field)->size(); return sz; @@ -300,16 +317,16 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) if (fname.fieldType != STI_ARRAY) return Unexpected(HostFunctionError::NO_ARRAY); - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); - auto const* field = sle->peekAtPField(fname); + auto const* field = sle.value()->peekAtPField(fname); if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE int32_t const sz = static_cast(field)->size(); return sz; @@ -323,18 +340,17 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( if (fname.fieldType != STI_ARRAY) return Unexpected(HostFunctionError::NO_ARRAY); - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - auto const* field = cache[cacheIdx]->peekAtPField(fname); + auto const* field = cache[normalizedIdx.value()]->peekAtPField(fname); if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + int32_t const sz = static_cast(field)->size(); return sz; @@ -358,10 +374,10 @@ WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) { - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - auto const r = locateField(*sle, locator); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + auto const r = locateField(*sle.value(), locator); if (!r) return Unexpected(r.error()); @@ -378,14 +394,11 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( int32_t cacheIdx, Slice const& locator) { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - - auto const r = locateField(*cache[cacheIdx], locator); + auto const r = locateField(*cache[normalizedIdx.value()], locator); if (!r) return Unexpected(r.error()); @@ -557,8 +570,6 @@ WasmHostFunctionsImpl::paychanKeylet( return Unexpected(HostFunctionError::INVALID_ACCOUNT); if (account == destination) return Unexpected(HostFunctionError::INVALID_PARAMS); - if (seq == 0) - return Unexpected(HostFunctionError::INVALID_PARAMS); auto const keylet = keylet::payChan(account, destination, seq); return Bytes{keylet.key.begin(), keylet.key.end()}; } diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a22097ed6be..1fdfbbb20da 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -27,12 +27,30 @@ class WasmHostFunctionsImpl : public HostFunctions { ApplyContext& ctx; Keylet leKey; + std::shared_ptr currentLedgerObj = nullptr; + bool isLedgerObjCached = false; static int constexpr MAX_CACHE = 256; std::array, MAX_CACHE> cache; void const* rt_ = nullptr; + Expected, HostFunctionError> + getCurrentLedgerObj() + { + if (!isLedgerObjCached) + { + isLedgerObjCached = true; + currentLedgerObj = ctx.view().read(leKey); + } + if (currentLedgerObj) + return currentLedgerObj; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + Expected + normalizeCacheIndex(int32_t cacheIdx); + public: WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) : ctx(ctx), leKey(leKey) From 3108ca05499d5b8483cdb08f4ccc43278c65ad49 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 30 Jul 2025 10:38:03 -0400 Subject: [PATCH 42/73] Float point HF (#5611) - added support for 8-byte float point --- include/xrpl/basics/Number.h | 4 + src/libxrpl/basics/Number.cpp | 42 ++ src/test/app/TestHostFunctions.h | 84 ++++ src/test/app/Wasm_test.cpp | 26 + src/test/app/wasm_fixtures/fixtures.cpp | 148 ++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/misc/WasmHostFunc.h | 111 +++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 540 +++++++++++++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 36 ++ src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 339 ++++++++++++- src/xrpld/app/misc/WasmHostFuncWrapper.h | 109 +++++ src/xrpld/app/misc/WasmVM.cpp | 13 + 12 files changed, 1442 insertions(+), 12 deletions(-) diff --git a/include/xrpl/basics/Number.h b/include/xrpl/basics/Number.h index 9ee05bfb450..eb28721ec30 100644 --- a/include/xrpl/basics/Number.h +++ b/include/xrpl/basics/Number.h @@ -342,6 +342,10 @@ abs(Number x) noexcept Number power(Number const& f, unsigned n); +// logarithm with base 10 +Number +lg(Number const& value); + // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing // to find the root of the polynomial g(x) = x^d - f diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index f43288b57b1..50583cc2909 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -623,6 +623,48 @@ power(Number const& f, unsigned n) return r; } +// Continued fraction approximation of ln(x) +static Number +ln(Number const& x, unsigned iterations = 50) +{ + if (x <= 0) + throw std::runtime_error("Not positive value"); + + Number const z = (x - 1) / (x + 1); + Number const zz = z * z; + Number denom = Number(1, -10); + + // Construct the fraction from the bottom up + for (int i = iterations; i > 0; --i) + { + Number k(2 * i - 1); + denom = k - (i * i * zz / denom); + } + + auto const r = 2 * z / denom; + return r; +} + +Number +lg(Number const& x) +{ + static Number const ln10 = ln(Number(10)); + + if (x <= Number(10)) + { + auto const r = ln(x) / ln10; + return r; + } + + // ln(x) = ln(normX * 10^norm) = ln(normX) + norm * ln(10) + int diffExp = 15 + x.exponent(); + Number const normalX = x / Number(1, diffExp); // (1 <= normalX < 10) + auto const lnX = ln(normalX) + diffExp * ln10; + + auto const r = lnX / ln10; + return r; +} + // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing // to find the non-negative root of the polynomial g(x) = x^d - f diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 45de5d7b936..0752d6f6f4c 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -26,6 +26,7 @@ #include namespace ripple { + namespace test { struct TestLedgerDataProvider : public HostFunctions @@ -378,6 +379,89 @@ struct TestHostFunctions : public HostFunctions #endif return msg.size() + sizeof(data); } + + Expected + traceFloat(std::string_view const& msg, Slice const& data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + auto const s = floatToString(data); + j << "WAMR TRACE FLOAT: " << msg << " " << s; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + s.size(); + } + + Expected + floatFromInt(int64_t x, int32_t mode) override + { + return floatFromIntImpl(x, mode); + } + + Expected + floatFromUint(uint64_t x, int32_t mode) override + { + return floatFromUintImpl(x, mode); + } + + Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override + { + return floatSetImpl(mantissa, exponent, mode); + } + + Expected + floatCompare(Slice const& x, Slice const& y) override + { + return floatCompareImpl(x, y); + } + + Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) override + { + return floatAddImpl(x, y, mode); + } + + Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) override + { + return floatSubtractImpl(x, y, mode); + } + + Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) override + { + return floatMultiplyImpl(x, y, mode); + } + + Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) override + { + return floatDivideImpl(x, y, mode); + } + + Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) override + { + return floatRootImpl(x, n, mode); + } + + Expected + floatPower(Slice const& x, int32_t n, int32_t mode) override + { + return floatPowerImpl(x, n, mode); + } + + Expected + floatLog(Slice const& x, int32_t mode) override + { + return floatLogImpl(x, mode); + } }; struct TestHostFunctionsSink : public TestHostFunctions diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 5eee6014e5a..98e06a86361 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -509,6 +509,31 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testFloat() + { + testcase("float point"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = floatHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions hf(env, 0); + auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result && (re->cost == 91'412)); + } + env.close(); + } + } + void perfTest() { @@ -656,6 +681,7 @@ struct Wasm_test : public beast::unit_test::suite testHFCost(); testEscrowWasmDN(); + testFloat(); testCodecovWasm(); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index bddb076df9c..d01835988ac 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12222,3 +12222,151 @@ extern std::string const codecovWasm = "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" "616c7565"; + +extern std::string const floatHex = + "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" + "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" + "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" + "61745f66726f6d5f696e74000108686f73745f6c69620f666c6f61745f66726f6d5f75696e" + "74000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73" + "745f6c696209666c6f61745f736574000308686f73745f6c69620d666c6f61745f636f6d70" + "617265000208686f73745f6c696209666c6f61745f616464000408686f73745f6c69620e66" + "6c6f61745f7375627472616374000408686f73745f6c69620e666c6f61745f6d756c746970" + "6c79000408686f73745f6c69620c666c6f61745f646976696465000408686f73745f6c6962" + "09666c6f61745f706f77000508686f73745f6c69620974726163655f6e756d000608686f73" + "745f6c69620a666c6f61745f726f6f74000508686f73745f6c696209666c6f61745f6c6f67" + "00000302010705030100110619037f01418080c0000b7f0041b48ac0000b7f0041c08ac000" + "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" + "5f686561705f6261736503020acf1301cc1301027f23808080800041206b22002480808080" + "00418080c08000411d4100410041001080808080001a2000420037031002400240428ce000" + "200041106a410841001081808080004108470d00419d80c080004117200041106a41084101" + "1080808080001a0c010b41b480c08000411e4100410041001080808080001a0b2000428ce0" + "0037031802400240200041186a4108200041106a410841001082808080004108470d0041d2" + "80c080004117200041106a41081083808080001a0c010b41e980c08000411e410041004100" + "1080808080001a0b02400240410242fb00200041106a410841001084808080004108470d00" + "418781c080004121200041106a41081083808080001a0c010b41a881c08000412641004100" + "41001080808080001a0b41ce81c08000411541e381c0800041081083808080001a41f381c0" + "8000411641eb81c0800041081083808080001a418982c08000411b41004100410010808080" + "80001a20004200370318024002404201200041186a410841001081808080004108470d0041" + "a482c08000410f200041186a41081083808080001a0c010b41b382c0800041164100410041" + "001080808080001a0b02400240200041186a410841e381c0800041081085808080000d0041" + "c982c08000411b4100410041001080808080001a0c010b41e482c08000411b410041004100" + "1080808080001a0b02400240200041186a410841eb81c0800041081085808080004101470d" + "0041ff82c0800041234100410041001080808080001a0c010b41a283c08000412441004100" + "41001080808080001a0b0240024041eb81c080004108200041186a41081085808080004102" + "470d0041c683c0800041234100410041001080808080001a0c010b41e983c0800041244100" + "410041001080808080001a0b418d84c0800041204100410041001080808080001a200042d4" + "87b6f4c7d4b1c000370310410921010340200041106a410841e381c080004108200041106a" + "410841001086808080001a2001417f6a22010d000b20004200370318420a200041186a4108" + "41001081808080001a02400240200041186a4108200041106a41081085808080000d0041ad" + "84c0800041144100410041001080808080001a0c010b41c184c08000411341004100410010" + "80808080001a0b410b21010340200041106a410841e381c080004108200041106a41084100" + "1087808080001a2001417f6a22010d000b02400240200041106a410841eb81c08000410810" + "85808080000d0041d484c0800041194100410041001080808080001a0c010b41ed84c08000" + "41184100410041001080808080001a0b418585c0800041234100410041001080808080001a" + "20004200370300420a2000410841001081808080001a200042d487b6f4c7d4b1c000370308" + "410621010340200041086a410820004108200041086a410841001088808080001a2001417f" + "6a22010d000b2000420037031042c0843d200041106a410841001081808080001a02400240" + "200041106a4108200041086a41081085808080000d0041a885c08000411941004100410010" + "80808080001a0c010b41c185c0800041184100410041001080808080001a0b410721010340" + "200041086a410820004108200041086a410841001089808080001a2001417f6a22010d000b" + "20004200370318417f4201200041186a410841001084808080001a02400240200041086a41" + "08200041186a41081085808080000d0041d985c0800041174100410041001080808080001a" + "0c010b41f085c0800041164100410041001080808080001a0b418686c08000411741004100" + "41001080808080001a2000420037030841e381c0800041084103200041086a41084100108a" + "808080001a419d86c080004112200041086a41081083808080001a41eb81c0800041084106" + "200041086a41084100108a808080001a41af86c080004118200041086a4108108380808000" + "1a200042003703104209200041106a410841001081808080001a200041106a410841022000" + "41086a41084100108a808080001a41c786c080004114200041086a41081083808080001a20" + "0041106a41084100200041086a41084100108a808080001a41db86c080004117200041086a" + "41081083808080001a200042003703184200200041186a410841001081808080001a200041" + "186a41084102200041086a41084100108a808080001a41f286c080004114200041086a4108" + "1083808080001a418687c080004138200041186a41084100200041086a41084100108a8080" + "8000ac108b808080001a41be87c0800041184100410041001080808080001a200042003703" + "084209200041086a410841001081808080001a20004200370310200041086a410841022000" + "41106a41084100108c808080001a41d687c080004112200041106a41081083808080001a20" + "0041086a41084103200041106a41084100108c808080001a41e887c080004112200041106a" + "41081083808080001a2000420037031842c0843d200041186a410841001081808080001a20" + "0041186a41084103200041106a41084100108c808080001a41fa87c080004118200041106a" + "41081083808080001a200041186a41084106200041106a41084100108c808080001a419288" + "c08000411c200041106a41081083808080001a41ae88c08000411741004100410010808080" + "80001a2000420037031042c0843d200041106a410841001081808080001a20004200370318" + "200041106a4108200041186a41084100108d808080001a41c588c080004114200041186a41" + "081083808080001a41d988c08000411a4100410041001080808080001a2000420037031841" + "e381c08000410841eb81c080004108200041186a410841001088808080001a0240024041eb" + "81c080004108200041186a41081085808080000d0041f388c0800041164100410041001080" + "808080001a0c010b418989c0800041154100410041001080808080001a0b41eb81c0800041" + "0841eb81c080004108200041186a410841001088808080001a0240024041e381c080004108" + "200041186a41081085808080000d00419e89c0800041174100410041001080808080001a0c" + "010b41b589c0800041164100410041001080808080001a0b41cb89c08000411a4100410041" + "001080808080001a2000420037031020004200370318420a200041186a4108410010818080" + "80001a41e381c080004108200041186a4108200041106a410841001089808080001a41e589" + "c080004119200041106a41081083808080001a41e381c080004108200041106a4108200041" + "106a410841001089808080001a41fe89c08000410f200041106a41081083808080001a0240" + "0240200041186a4108200041106a41081085808080000d00418d8ac0800041144100410041" + "001080808080001a0c010b41a18ac0800041134100410041001080808080001a0b20004120" + "6a24808080800041010b0bbe0a0100418080c0000bb40a0a24242420746573745f666c6f61" + "745f66726f6d5f7761736d202424242020666c6f61742066726f6d20693634203132333030" + "3a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61" + "742066726f6d207536342031323330303a2020666c6f61742066726f6d2075363420313233" + "30303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e74697373" + "61203132333a2020666c6f61742066726f6d2065787020322c206d616e746973736120333a" + "206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c6800094" + "838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573" + "745f666c6f61745f636f6d70617265202424242020666c6f61742066726f6d20313a202066" + "6c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d20" + "464c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e4520" + "20666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e45202066" + "6c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c" + "4f41545f4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41" + "545f4e454741544956455f4f4e4520213c20666c6f61742066726f6d20310a242424207465" + "73745f666c6f61745f6164645f737562747261637420242424202072657065617465642061" + "64643a20676f6f6420207265706561746564206164643a2062616420207265706561746564" + "2073756274726163743a20676f6f64202072657065617465642073756274726163743a2062" + "61640a24242420746573745f666c6f61745f6d756c7469706c795f64697669646520242424" + "20207265706561746564206d756c7469706c793a20676f6f6420207265706561746564206d" + "756c7469706c793a2062616420207265706561746564206469766964653a20676f6f642020" + "7265706561746564206469766964653a206261640a24242420746573745f666c6f61745f70" + "6f77202424242020666c6f61742063756265206f6620313a2020666c6f6174203674682070" + "6f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020666c6f61" + "742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a" + "2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" + "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f" + "6f74202424242020666c6f61742073717274206f6620393a2020666c6f6174206362727420" + "6f6620393a2020666c6f61742063627274206f6620313030303030303a2020666c6f617420" + "36746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c" + "6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f66" + "6c6f61745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f64" + "20206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d" + "313a20676f6f6420206e656761746520636f6e7374202d313a206261640a24242420746573" + "745f666c6f61745f696e76657274202424242020696e76657274206120666c6f6174206672" + "6f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20" + "676f6f642020696e766572742074776963653a20626164009c06046e616d65001110666c6f" + "61745f74657374732e7761736d01e1050f002b5f5a4e387872706c5f73746434686f737435" + "7472616365313768303332393563316538663365373233614501355f5a4e387872706c5f73" + "746434686f73743134666c6f61745f66726f6d5f696e743137683032306436373439326164" + "39346333304502365f5a4e387872706c5f73746434686f73743135666c6f61745f66726f6d" + "5f75696e74313768346166373638366538353062383432364503395f5a4e387872706c5f73" + "746434686f7374313874726163655f6f70617175655f666c6f617431376831396639386666" + "35663362313932336245042f5f5a4e387872706c5f73746434686f737439666c6f61745f73" + "6574313768323964346230383964626561326664624505345f5a4e387872706c5f73746434" + "686f73743133666c6f61745f636f6d70617265313768346362313239626634623330373233" + "6445062f5f5a4e387872706c5f73746434686f737439666c6f61745f616464313768383661" + "336165636435336234643937374507355f5a4e387872706c5f73746434686f73743134666c" + "6f61745f7375627472616374313768653033313036323931393464333931364508355f5a4e" + "387872706c5f73746434686f73743134666c6f61745f6d756c7469706c7931376830323839" + "3337633039656534323630644509335f5a4e387872706c5f73746434686f73743132666c6f" + "61745f64697669646531376834363036323038303562623237353632450a2f5f5a4e387872" + "706c5f73746434686f737439666c6f61745f706f7731376833326463303662646430303338" + "626331450b2f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376830" + "336535336633646539393463633033450c315f5a4e387872706c5f73746434686f73743130" + "666c6f61745f726f6f7431376863656632313139376565656136653630450d2f5f5a4e3878" + "72706c5f73746434686f737439666c6f61745f6c6f67313768323530663038303633353663" + "35653639450e0666696e697368071201000f5f5f737461636b5f706f696e746572090a0100" + "072e726f64617461004d0970726f64756365727302086c616e677561676501045275737400" + "0c70726f6365737365642d6279010572757374631d312e38382e3020283662303062633338" + "3820323032352d30362d3233290094010f7461726765745f6665617475726573082b0b6275" + "6c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469" + "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" + "2d74797065732b087369676e2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index b82b9aadcf2..3ffb41caf9a 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -60,3 +60,5 @@ extern std::string const opcCallPerfTest; extern std::string const keyletHostFunctions; extern std::string const codecovWasm; + +extern std::string const floatHex; diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 00f89a4ac73..84e3882cc04 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -49,8 +50,46 @@ enum class HostFunctionError : int32_t { INVALID_ACCOUNT = -16, INVALID_FIELD = -17, INDEX_OUT_OF_BOUNDS = -18, + FLOAT_INPUT_MALFORMED = -19, + FLOAT_COMPUTATION_ERROR = -20, }; +std::string +floatToString(Slice const& data); + +Expected +floatFromIntImpl(int64_t x, int32_t mode); + +Expected +floatFromUintImpl(uint64_t x, int32_t mode); + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode); + +Expected +floatCompareImpl(Slice const& x, Slice const& y); + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode); + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode); + +Expected +floatLogImpl(Slice const& x, int32_t mode); + struct HostFunctions { virtual void @@ -289,6 +328,78 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + traceFloat(std::string_view const& msg, Slice const& data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatFromInt(int64_t x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatFromUint(uint64_t x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatCompare(Slice const& x, Slice const& y) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatPower(Slice const& x, int32_t n, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatLog(Slice const& x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual ~HostFunctions() = default; }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 7dce3b865aa..d8f452159a3 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -654,4 +654,544 @@ WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) return msg.size() + sizeof(data); } +Expected +WasmHostFunctionsImpl::traceFloat( + std::string_view const& msg, + Slice const& data) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const s = floatToString(data); + j << "WAMR TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; + return msg.size() + s.size(); +} + +Expected +WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) +{ + return floatFromIntImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) +{ + return floatFromUintImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatSet( + int64_t mantissa, + int32_t exponent, + int32_t mode) +{ + return floatSetImpl(mantissa, exponent, mode); +} + +Expected +WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) +{ + return floatCompareImpl(x, y); +} + +Expected +WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) +{ + return floatAddImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatSubtract( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return floatSubtractImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatMultiply( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return floatMultiplyImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) +{ + return floatDivideImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) +{ + return floatRootImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) +{ + return floatPowerImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) +{ + return floatLogImpl(x, mode); +} + +class Number2 : public Number +{ + bool good_; + + enum Issue { XRP, MPT, IOU }; + Issue issue_; + +public: + Number2(Slice const& data) : Number(0), good_(false), issue_(IOU) + { + if (data.size() != 8) + return; + + uint64_t const v = SerialIter(data).get64(); + int const neg = (v & STAmount::cPositive) ? 1 : -1; + + Number x; + + if (v & STAmount::cIssuedCurrency) + { + // IOU + int32_t const e = + static_cast((v >> (64 - 10)) & ((1ull << 8) - 1)); + int64_t const m = neg * (v & ((1ull << 54) - 1)); + x = !m ? Number() : Number(m, e - 97); + if (m && (x.exponent() > 80 || x.exponent() < -96)) + return; // invalid number + issue_ = IOU; + } + else if (v & STAmount::cMPToken) + { + // MPT + int64_t const m = neg * (v & ((1ull << 61) - 1)); + x = !m ? Number() : Number(m); + issue_ = MPT; + } + else + { + // XRP + int64_t const m = neg * (v & ((1ull << 61) - 1)); + x = !m ? Number() : Number(m); + issue_ = XRP; + } + + *static_cast(this) = x; + good_ = true; + } + + Number2(int64_t x) : Number(x), good_(true), issue_(IOU) + { + } + + Number2(uint64_t x) : Number(0), good_(false), issue_(IOU) + { + if (x <= + std::numeric_limits< + std::invoke_result_t>:: + max()) + *static_cast(this) = Number(x); + else + { + *static_cast(this) = Number(x / 10, 1) + Number(x % 10); + } + + good_ = true; + } + + Number2(int64_t mantissa, int32_t exponent) + : Number(mantissa, exponent), good_(true), issue_(IOU) + { + } + + Number2(Number const& n) : Number(n), good_(true), issue_(IOU) + { + } + + operator bool() const + { + return good_; + } + + Expected + toBytes() const + { + uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + + if (issue_ == IOU) + { + v |= STAmount::cIssuedCurrency; + + if (!mantissa()) + { + if (exponent() != std::numeric_limits::lowest()) + return Unexpected( + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + else if (exponent() > 80 || exponent() < -96) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + + uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); + if (absM > ((1ull << 54) - 1)) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + + v |= absM; + + int const e = (!mantissa() ? 0 : exponent()) + 97; + v |= ((uint64_t)e) << 54; + } + else if (issue_ == MPT) + { + v |= STAmount::cMPToken; + uint64_t x = toUInt(61); + if (x == std::numeric_limits::max()) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + v |= x; + } + else + { + uint64_t x = toUInt(61); + if (x == std::numeric_limits::max()) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + v |= x; + } + + Serializer msg; + msg.add64(v); + auto const data = msg.getData(); + return data; + } + +protected: + uint64_t + toUInt(unsigned bits) const + { + if (bits >= sizeof(uint64_t) * 8) + return std::numeric_limits::max(); + + uint64_t maxV = (1ull << bits) - 1; + uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); + + if (!absM) + return 0; + else if (exponent() < 0) + { + for (int i = 0; i > exponent(); --i) + { + if (absM < 10) + return std::numeric_limits::max(); // underflow + absM /= 10; + } + } + else + { + for (int i = 0; i < exponent(); ++i) + { + if (absM > maxV / 10) + return std::numeric_limits::max(); // overflow + absM *= 10; + } + } + + return absM > maxV ? std::numeric_limits::max() : absM; + } +}; + +struct SetRound +{ + Number::rounding_mode oldMode_; + bool good_; + + SetRound(int32_t mode) : oldMode_(Number::getround()), good_(false) + { + if (mode < Number::rounding_mode::to_nearest || + mode > Number::rounding_mode::upward) + return; + + Number::setround(static_cast(mode)); + good_ = true; + } + + ~SetRound() + { + Number::setround(oldMode_); + } + + operator bool() const + { + return good_; + } +}; + +std::string +floatToString(Slice const& data) +{ + Number2 const num(data); + if (!num) + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + return "Invalid data: " + hex; + } + + auto const s = to_string(num); + return s; +} + +Expected +floatFromIntImpl(int64_t x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 num(x); + if (!num) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatFromUintImpl(uint64_t x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 num(x); + if (!num) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 num(mantissa, exponent); + if (!num) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatCompareImpl(Slice const& x, Slice const& y) +{ + try + { + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + return xx < yy ? 2 : (xx == yy ? 0 : 1); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx + yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx - yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx * yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx / yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 const res(root(xx, n)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + if (xx == Number() && !n) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + Number2 const res(power(xx, n, 1)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatLogImpl(Slice const& x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 const res(lg(xx)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index 1fdfbbb20da..e23df2c6ecb 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -190,6 +190,42 @@ class WasmHostFunctionsImpl : public HostFunctions Expected traceNum(std::string_view const& msg, int64_t data) override; + + Expected + traceFloat(std::string_view const& msg, Slice const& data) override; + + Expected + floatFromInt(int64_t x, int32_t mode) override; + + Expected + floatFromUint(uint64_t x, int32_t mode) override; + + Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override; + + Expected + floatCompare(Slice const& x, Slice const& y) override; + + Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) override; + + Expected + floatPower(Slice const& x, int32_t n, int32_t mode) override; + + Expected + floatLog(Slice const& x, int32_t mode) override; }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index a3a6f858c93..d9488c3b4e4 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -22,6 +22,7 @@ #include #include +#include #include namespace ripple { @@ -64,7 +65,7 @@ setData( template Expected -getDataInt32(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +getDataInt32(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const result = params->data[i].of.i32; i++; @@ -73,16 +74,29 @@ getDataInt32(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataInt64(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +getDataInt64(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const result = params->data[i].of.i64; i++; return result; } +template +Expected +getDataUint64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(runtime, params, i); + if (!r) + return Unexpected(r.error()); + if (r->size() != sizeof(uint64_t)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return *reinterpret_cast(r->data()); +} + template Expected -getDataSField(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const& m = SField::getKnownCodeToField(); auto const it = m.find(params->data[i].of.i32); @@ -217,7 +231,9 @@ returnResult( { return hfResult(results, res.error()); } - if constexpr (std::is_same_v, Bytes>) + + using t = std::decay_t; + if constexpr (std::is_same_v) { return hfResult( results, @@ -228,7 +244,7 @@ returnResult( res->data(), res->size())); } - else if constexpr (std::is_same_v, Hash>) + else if constexpr (std::is_same_v) { return hfResult( results, @@ -239,13 +255,11 @@ returnResult( res->data(), res->size())); } - else if constexpr (std::is_same_v, int32_t>) + else if constexpr (std::is_same_v) { return hfResult(results, res.value()); } - else if constexpr (std::is_same_v< - std::decay_t, - std::uint32_t>) + else if constexpr (std::is_same_v) { auto const resultValue = res.value(); return hfResult( @@ -1044,7 +1058,6 @@ ticketKeylet_wrap( results, hf->ticketKeylet(acc.value(), seq.value()), index); - ; } wasm_trap_t* @@ -1131,6 +1144,310 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->traceNum(*msg, *number), index); } +wasm_trap_t* +traceFloat_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const number = getDataSlice(runtime, params, i); + if (!number) + return hfResult(results, number.error()); + + return returnResult( + runtime, params, results, hf->traceFloat(*msg, *number), i); +} + +wasm_trap_t* +floatFromInt_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataInt64(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 3; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 1; + return returnResult( + runtime, params, results, hf->floatFromInt(*x, *rounding), i); +} + +wasm_trap_t* +floatFromUint_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataUint64(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatFromUint(*x, *rounding), i); +} + +wasm_trap_t* +floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const exp = getDataInt32(runtime, params, i); + if (!exp) + return hfResult(results, exp.error()); + + auto const mant = getDataInt64(runtime, params, i); + if (!mant) + return hfResult(results, mant.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatSet(*mant, *exp, *rounding), i); +} + +wasm_trap_t* +floatCompare_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + return returnResult(runtime, params, results, hf->floatCompare(*x, *y), i); +} + +wasm_trap_t* +floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatAdd(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatSubtract_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatSubtract(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatMultiply_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatMultiply(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatDivide_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatDivide(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const n = getDataInt32(runtime, params, i); + if (!n) + return hfResult(results, n.error()); + + i = 5; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 3; + return returnResult( + runtime, params, results, hf->floatRoot(*x, *n, *rounding), i); +} + +wasm_trap_t* +floatPower_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const n = getDataInt32(runtime, params, i); + if (!n) + return hfResult(results, n.error()); + + i = 5; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 3; + return returnResult( + runtime, params, results, hf->floatPower(*x, *n, *rounding), i); +} + +wasm_trap_t* +floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatLog(*x, *rounding), i); +} + +namespace test { + class MockInstanceWrapper { wmem mem_; @@ -1148,8 +1465,6 @@ class MockInstanceWrapper } }; -namespace test { - // LCOV_EXCL_START bool testGetDataIncrement() diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 22597716322..6bad18b3686 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -313,4 +313,113 @@ using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +using traceFloat_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceFloat_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatFromInt_proto = int32_t(int64_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatFromInt_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatFromUint_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatFromUint_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatSet_proto = int32_t(int32_t, int64_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatCompare_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +floatCompare_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatAdd_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatSubtract_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatSubtract_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatMultiply_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatMultiply_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatDivide_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatDivide_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatRoot_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatRoot_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatPower_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatPower_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatLog_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 0b94150db2f..9194943737b 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -77,6 +77,19 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + + WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); // clang-format on } From 28470757056c141ecf3c25baf2b4aab6c8572f94 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 31 Jul 2025 10:57:56 -0400 Subject: [PATCH 43/73] fix: ensure `GasUsed` shows up in the metadata even on `tecWASM_REJECTED` (#5633) * always set gas used * fix * add tests * clean up --- src/test/app/Escrow_test.cpp | 100 +++++++++++++++-------- src/xrpld/app/tx/detail/ApplyContext.cpp | 1 + src/xrpld/app/tx/detail/ApplyContext.h | 5 +- src/xrpld/ledger/ApplyViewImpl.h | 2 +- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 93a37d81037..d77de860fd4 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -296,7 +296,7 @@ struct Escrow_test : public beast::unit_test::suite { testcase("Implied Finish Time (without fix1571)"); - Env env(*this, testable_amendments() - fix1571); + Env env(*this, features - fix1571); auto const baseFee = env.current()->fees().base; env.fund(XRP(5000), "alice", "bob", "carol"); env.close(); @@ -1696,7 +1696,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testCreateFinishFunctionPreflight() + testCreateFinishFunctionPreflight(FeatureBitset features) { testcase("Test preflight checks involving FinishFunction"); @@ -1712,7 +1712,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, testable_amendments() - featureSmartEscrow); + Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); @@ -1726,10 +1726,13 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction > max length - Env env(*this, envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_size_limit = 10; // 10 bytes - return cfg; - })); + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + }), + features); XRPAmount const txnFees = env.current()->fees().base + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -1746,10 +1749,13 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } - Env env(*this, envconfig([](std::unique_ptr cfg) { - cfg->START_UP = Config::FRESH; - return cfg; - })); + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + }), + features); XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -1866,7 +1872,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishWasmFailures() + testFinishWasmFailures(FeatureBitset features) { testcase("EscrowFinish Smart Escrow failures"); @@ -1882,7 +1888,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, testable_amendments() - featureSmartEscrow); + Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; env(escrow::finish(carol, alice, 1), @@ -1894,10 +1900,13 @@ struct Escrow_test : public beast::unit_test::suite { // ComputationAllowance > max compute limit - Env env(*this, envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_compute_limit = 1'000; // in gas - return cfg; - })); + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + }), + features); env.fund(XRP(5000), alice, carol); // Run past the flag ledger so that a Fee change vote occurs and // updates FeeSettings. (It also activates all supported @@ -1913,8 +1922,8 @@ struct Escrow_test : public beast::unit_test::suite } { - uint32_t const allowance = 10'000; - Env env(*this); + uint32_t const allowance = 5'664; + Env env(*this, features); env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); XRPAmount const createFee = env.current()->fees().base + 1000; @@ -1937,9 +1946,13 @@ struct Escrow_test : public beast::unit_test::suite escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); } - Env env(*this); + Env env(*this, features); // Run past the flag ledger so that a Fee change vote occurs and // updates FeeSettings. (It also activates all supported @@ -2011,7 +2024,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishFunction() + testFinishFunction(FeatureBitset features) { testcase("Example escrow function"); @@ -2028,7 +2041,7 @@ struct Escrow_test : public beast::unit_test::suite { // basic FinishFunction situation - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2067,6 +2080,14 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecWASM_REJECTED)); env.close(); + + { + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT( + txMeta->getFieldU32(sfGasUsed) == allowance); + } + env(escrow::finish(alice, alice, seq), fee(txnFees), escrow::comp_allowance(allowance), @@ -2082,7 +2103,7 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + Condition - Env env(*this); + Env env(*this, features); env.fund(XRP(5000), alice, carol); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto const seq = env.seq(alice); @@ -2116,6 +2137,9 @@ struct Escrow_test : public beast::unit_test::suite escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECT( + env.meta()->getFieldU32(sfGasUsed) == allowance); env.close(); // no fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), @@ -2148,7 +2172,7 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + FinishAfter - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2196,7 +2220,7 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + FinishAfter #2 - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2227,6 +2251,9 @@ struct Escrow_test : public beast::unit_test::suite escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECT( + env.meta()->getFieldU32(sfGasUsed) == allowance); env.close(); // finish time has passed, function succeeds, tx succeeds env(escrow::finish(carol, alice, seq), @@ -2245,7 +2272,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testAllHostFunctions() + testAllHostFunctions(FeatureBitset features) { testcase("Test all host functions"); @@ -2259,7 +2286,7 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; { - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2311,7 +2338,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testKeyletHostFunctions() + testKeyletHostFunctions(FeatureBitset features) { testcase("Test all keylet host functions"); @@ -2371,12 +2398,17 @@ struct Escrow_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 1'000'000; + auto const allowance = 99'596; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), fee(txnFees)); env.close(); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); } } } @@ -2396,13 +2428,13 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(features); testEscrowWithTickets(features); testCredentials(features); - testCreateFinishFunctionPreflight(); - testFinishWasmFailures(); - testFinishFunction(); + testCreateFinishFunctionPreflight(features); + testFinishWasmFailures(features); + testFinishFunction(features); // TODO: Update module with new host functions - testAllHostFunctions(); - testKeyletHostFunctions(); + testAllHostFunctions(features); + testKeyletHostFunctions(features); } public: diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index 79cbb7f40dc..ff31662494d 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -59,6 +59,7 @@ ApplyContext::discard() std::optional ApplyContext::apply(TER ter) { + view_->setGasUsed(gasUsed_); return view_->apply( base_, tx, ter, parentBatchId_, flags_ & tapDRY_RUN, journal); } diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index a3bdf9a85a7..5334bdabcb4 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -108,9 +108,9 @@ class ApplyContext /** Sets the gas used in the metadata */ void - setGasUsed(std::uint32_t const& gasUsed) + setGasUsed(std::uint32_t const gasUsed) { - view_->setGasUsed(gasUsed); + gasUsed_ = gasUsed; } /** Discard changes and start fresh. */ @@ -164,6 +164,7 @@ class ApplyContext // The ID of the batch transaction we are executing under, if seated. std::optional parentBatchId_; + std::optional gasUsed_; }; } // namespace ripple diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index f7e90b9d54c..cf494217f4b 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -76,7 +76,7 @@ class ApplyViewImpl final : public detail::ApplyViewBase } void - setGasUsed(std::uint32_t const& gasUsed) + setGasUsed(std::optional const gasUsed) { gasUsed_ = gasUsed; } From ccc3280b1a63b399c38283bd4931a9abb8cb1048 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 31 Jul 2025 13:42:53 -0400 Subject: [PATCH 44/73] Update wamr to 2.4.1 (#5640) --- .github/actions/dependencies/action.yml | 2 +- .github/workflows/macos.yml | 2 +- .github/workflows/windows.yml | 2 +- BUILD.md | 4 +- conanfile.py | 2 +- external/wamr/conandata.yml | 2 +- external/wamr/conanfile.py | 4 +- external/wamr/patches/ripp_metering.patch | 76 +++++++++++------------ 8 files changed, 46 insertions(+), 48 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index 2a66f7dc760..a1a46c7e352 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -11,7 +11,7 @@ runs: run: | conan export --version 1.1.10 external/snappy conan export --version 4.0.3 external/soci - conan export --version 2.3.1 external/wamr + conan export --version 2.4.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 4a414935582..f838f083388 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -94,7 +94,7 @@ jobs: run: | conan export --version 1.1.10 external/snappy conan export --version 4.0.3 external/soci - conan export --version 2.3.1 external/wamr + conan export --version 2.4.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e759b2edc8c..e2d0ae370ff 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -89,7 +89,7 @@ jobs: run: | conan export --version 1.1.10 external/snappy conan export --version 4.0.3 external/soci - conan export --version 2.3.1 external/wamr + conan export --version 2.4.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/BUILD.md b/BUILD.md index 0ea3c12e62a..7534e539de3 100644 --- a/BUILD.md +++ b/BUILD.md @@ -184,10 +184,8 @@ Export our [Conan recipe for WAMR](./external/wamr). It add metering and expose some internal structures. ``` -# Conan 1.x -conan export external/wamr wamr/2.3.1@ # Conan 2.x -conan export --version 2.3.1 external/wamr +conan export --version 2.4.1 external/wamr ``` ### Build and Test diff --git a/conanfile.py b/conanfile.py index 898cfe74d70..abffa32f3e6 100644 --- a/conanfile.py +++ b/conanfile.py @@ -31,7 +31,7 @@ class Xrpl(ConanFile): 'openssl/1.1.1w', 'soci/4.0.3', 'zlib/1.3.1', - 'wamr/2.3.1', + 'wamr/2.4.1', ] test_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml index b1459816305..d475ad987c0 100644 --- a/external/wamr/conandata.yml +++ b/external/wamr/conandata.yml @@ -1,5 +1,5 @@ patches: - 2.3.1: + 2.4.1: - patch_description: add metering to iwasm interpreter patch_file: patches/ripp_metering.patch patch_type: conan diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index f391ea43505..eed674adefc 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -14,7 +14,7 @@ class WamrConan(ConanFile): name = "wamr" - version = "2.3.1" + version = "2.4.1" license = "Apache License v2.0" url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" description = "Webassembly micro runtime" @@ -42,7 +42,7 @@ def source(self): git = Git(self) git.fetch_commit( url="https://github.com/bytecodealliance/wasm-micro-runtime.git", - commit="2a303861cc916dc182b7fecaa0aacc1b797e7ac6", + commit="b124f70345d712bead5c0c2393acb2dc583511de", ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 76a2057cc9a..9749d475da9 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 88a1642b..e9eab7ec 100644 +index 4b28fa89..7d523a3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ @@ -21,10 +21,10 @@ index 88a1642b..e9eab7ec 100644 set (WAMR_PUBLIC_HEADERS diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c -index b2c9ed62..87947a18 100644 +index d2621fb2..6c96a844 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c -@@ -5484,7 +5484,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) +@@ -5611,7 +5611,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) import_func->func_ptr_linked = wasm_native_resolve_symbol( import_func->module_name, import_func->func_name, import_func->func_type, &import_func->signature, @@ -220,10 +220,10 @@ index 9a6afee1..0fe4739f 100644 bool diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index dcee0aea..a1f7866e 100644 +index 943b46fc..d026777e 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2288,10 +2288,18 @@ wasm_runtime_access_exce_check_guard_page() +@@ -2344,10 +2344,18 @@ wasm_runtime_access_exce_check_guard_page() #if WASM_ENABLE_INSTRUCTION_METERING != 0 void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -243,7 +243,7 @@ index dcee0aea..a1f7866e 100644 #endif WASMFuncType * -@@ -7348,7 +7356,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, +@@ -7412,7 +7420,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, const char *func_name) { return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, @@ -252,7 +252,7 @@ index dcee0aea..a1f7866e 100644 } bool -@@ -7805,13 +7813,14 @@ wasm_runtime_get_module_name(wasm_module_t module) +@@ -7869,13 +7877,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) { @@ -268,7 +268,7 @@ index dcee0aea..a1f7866e 100644 uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; -@@ -7821,6 +7830,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7885,6 +7894,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; } @@ -276,7 +276,7 @@ index dcee0aea..a1f7866e 100644 return true; } -@@ -7843,7 +7853,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, +@@ -7907,7 +7917,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; if ((uint8 *)&boundary < boundary) { wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), @@ -286,10 +286,10 @@ index dcee0aea..a1f7866e 100644 } return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 64a6cd79..cb674edc 100644 +index 324620be..54155a0c 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h -@@ -795,7 +795,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, +@@ -833,7 +833,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -352,7 +352,7 @@ index 241a0eec..1141744c 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b4ab34be..3fd0949f 100644 +index 81efb8f6..f752a970 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -20,8 +20,10 @@ @@ -367,7 +367,7 @@ index b4ab34be..3fd0949f 100644 #endif #elif defined(__GNUC__) || defined(__clang__) #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) -@@ -1833,7 +1835,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, +@@ -1874,7 +1876,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, */ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, @@ -384,10 +384,10 @@ index b4ab34be..3fd0949f 100644 /** * Dump runtime memory consumption, including: diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h -index ddc0b15b..3a707878 100644 +index 0dd73958..b7cad5f2 100644 --- a/core/iwasm/interpreter/wasm.h +++ b/core/iwasm/interpreter/wasm.h -@@ -579,6 +579,9 @@ typedef struct WASMFunctionImport { +@@ -617,6 +617,9 @@ typedef struct WASMFunctionImport { WASMModule *import_module; WASMFunction *import_func_linked; #endif @@ -398,10 +398,10 @@ index ddc0b15b..3a707878 100644 #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 1e98b0fa..e77fdfcd 100644 +index edc473f2..55071613 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c -@@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) +@@ -1547,13 +1547,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) } #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -423,7 +423,7 @@ index 1e98b0fa..e77fdfcd 100644 #else #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -1625,10 +1626,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1603,10 +1604,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 cache_index, type_index, param_cell_num, cell_num; #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -436,7 +436,7 @@ index 1e98b0fa..e77fdfcd 100644 #endif #if WASM_ENABLE_EXCE_HANDLING != 0 -@@ -6885,6 +6885,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6849,6 +6849,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -448,7 +448,7 @@ index 1e98b0fa..e77fdfcd 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6925,6 +6930,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6889,6 +6894,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -462,10 +462,10 @@ index 1e98b0fa..e77fdfcd 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 4e5edf41..37b36c17 100644 +index 36d4538f..912be3d8 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -106,14 +106,14 @@ typedef float64 CellType_F64; +@@ -90,14 +90,14 @@ typedef float64 CellType_F64; } while (0) #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -488,7 +488,7 @@ index 4e5edf41..37b36c17 100644 #else #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -1454,7 +1454,6 @@ wasm_interp_dump_op_count() +@@ -1438,7 +1438,6 @@ wasm_interp_dump_op_count() do { \ const void *p_label_addr = *(void **)frame_ip; \ frame_ip += sizeof(void *); \ @@ -496,7 +496,7 @@ index 4e5edf41..37b36c17 100644 goto *p_label_addr; \ } while (0) #else -@@ -1466,7 +1465,6 @@ wasm_interp_dump_op_count() +@@ -1450,7 +1449,6 @@ wasm_interp_dump_op_count() /* int32 relative offset was emitted in 64-bit target */ \ p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ frame_ip += sizeof(int32); \ @@ -504,7 +504,7 @@ index 4e5edf41..37b36c17 100644 goto *p_label_addr; \ } while (0) #else -@@ -1477,17 +1475,18 @@ wasm_interp_dump_op_count() +@@ -1461,17 +1459,18 @@ wasm_interp_dump_op_count() /* uint32 label address was emitted in 32-bit target */ \ p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ frame_ip += sizeof(int32); \ @@ -526,7 +526,7 @@ index 4e5edf41..37b36c17 100644 #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1556,10 +1555,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1540,10 +1539,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 opcode = 0, local_type, *global_addr; #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -539,7 +539,7 @@ index 4e5edf41..37b36c17 100644 #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 -@@ -7694,6 +7692,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7672,6 +7670,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, { wasm_interp_call_func_native(module, exec_env, cur_func, prev_frame); @@ -547,7 +547,7 @@ index 4e5edf41..37b36c17 100644 } #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7806,6 +7805,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7784,6 +7783,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); @@ -559,7 +559,7 @@ index 4e5edf41..37b36c17 100644 if (!prev_frame->ip) /* Called from native. */ return; -@@ -7834,6 +7838,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7812,6 +7816,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); @@ -571,10 +571,10 @@ index 4e5edf41..37b36c17 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c -index e66c08ba..d52e677e 100644 +index 771538a1..d6e6a6b8 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c -@@ -636,6 +636,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, +@@ -805,6 +805,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, const char *linked_signature = NULL; void *linked_attachment = NULL; bool linked_call_conv_raw = false; @@ -582,7 +582,7 @@ index e66c08ba..d52e677e 100644 read_leb_uint32(p, p_end, declare_type_index); *p_buf = p; -@@ -647,7 +648,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, +@@ -816,7 +817,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, /* check built-in modules */ linked_func = wasm_native_resolve_symbol( sub_module_name, function_name, declare_func_type, &linked_signature, @@ -591,7 +591,7 @@ index e66c08ba..d52e677e 100644 function->module_name = (char *)sub_module_name; function->field_name = (char *)function_name; -@@ -656,6 +657,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, +@@ -825,6 +826,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, function->signature = linked_signature; function->attachment = linked_attachment; function->call_conv_raw = linked_call_conv_raw; @@ -600,7 +600,7 @@ index e66c08ba..d52e677e 100644 } diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c -index 3cc2afe0..55859d35 100644 +index b4aa483d..2d74e469 100644 --- a/core/iwasm/interpreter/wasm_runtime.c +++ b/core/iwasm/interpreter/wasm_runtime.c @@ -168,7 +168,7 @@ wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) @@ -621,10 +621,10 @@ index 3cc2afe0..55859d35 100644 function->local_count = 0; function->local_types = NULL; diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h -index 8d38c883..a687ab89 100644 +index 16c670f0..5ddac567 100644 --- a/core/iwasm/interpreter/wasm_runtime.h +++ b/core/iwasm/interpreter/wasm_runtime.h -@@ -228,6 +228,10 @@ struct WASMFunctionInstance { +@@ -237,6 +237,10 @@ struct WASMFunctionInstance { WASMFunctionImport *func_import; WASMFunction *func; } u; @@ -661,10 +661,10 @@ index a68c0749..cafb6915 100644 REG_NATIVE_FUNC(putchar, "(i)i"), REG_NATIVE_FUNC(memcmp, "(**~)i"), diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -index 6d057a6a..25879f33 100644 +index f7dfea0b..c01e80a9 100644 --- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -@@ -2257,7 +2257,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) +@@ -2269,7 +2269,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) /* clang-format off */ #define REG_NATIVE_FUNC(func_name, signature) \ From 842647050631c21c3713fe362d75ae720930a623 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 31 Jul 2025 18:39:21 -0400 Subject: [PATCH 45/73] feat: add other misc host functions (#5574) --- src/test/app/TestHostFunctions.h | 70 ++++ src/test/app/WasmHostFuncImpl_test.cpp | 421 +++++++++++++++++++-- src/test/app/wasm_fixtures/fixtures.cpp | 416 +++++++++++--------- src/xrpld/app/misc/WasmHostFunc.h | 69 ++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 83 ++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 36 ++ src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 213 +++++++++++ src/xrpld/app/misc/WasmHostFuncWrapper.h | 76 ++++ src/xrpld/app/misc/WasmVM.cpp | 11 + 9 files changed, 1181 insertions(+), 214 deletions(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 0752d6f6f4c..562d2091a07 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -112,6 +113,36 @@ struct TestHostFunctions : public HostFunctions return env_.current()->info().parentHash; } + Expected + getLedgerAccountHash() override + { + return env_.current()->info().accountHash; + } + + Expected + getLedgerTransactionHash() override + { + return env_.current()->info().txHash; + } + + Expected + getBaseFee() override + { + return 10; + } + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override + { + return 1; + } + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override + { + return 1; + } + virtual Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override { @@ -276,6 +307,15 @@ struct TestHostFunctions : public HostFunctions return 0; } + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override + { + return 1; + } + Expected computeSha512HalfHash(Slice const& data) override { @@ -334,6 +374,36 @@ struct TestHostFunctions : public HostFunctions return Bytes(s.begin(), s.end()); } + Expected + getNFTIssuer(uint256 const& nftId) override + { + return Bytes(accountID_.begin(), accountID_.end()); + } + + Expected + getNFTTaxon(uint256 const& nftId) override + { + return 4; + } + + Expected + getNFTFlags(uint256 const& nftId) override + { + return 8; + } + + Expected + getNFTTransferFee(uint256 const& nftId) override + { + return 10; + } + + Expected + getNFTSerial(uint256 const& nftId) override + { + return 4; + } + Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override { diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp index 5a4b2441748..2f19b7dc30f 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -145,6 +145,112 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(result.value() == env.current()->info().parentHash); } + + void + testGetLedgerAccountHash() + { + testcase("getLedgerAccountHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerAccountHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().accountHash); + } + + void + testGetLedgerTransactionHash() + { + testcase("getLedgerTransactionHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerTransactionHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().txHash); + } + + void + testGetBaseFee() + { + testcase("getBaseFee"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getBaseFee(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->fees().base.drops()); + } + + void + testIsAmendmentEnabled() + { + testcase("isAmendmentEnabled"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Use featureSmartEscrow for testing + auto const amendmentId = featureSmartEscrow; + + // Test by id + { + auto const result = hfs.isAmendmentEnabled(amendmentId); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Test by name + std::string const amendmentName = "SmartEscrow"; + { + auto const result = hfs.isAmendmentEnabled(amendmentName); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Test with a fake amendment id (all zeros) + uint256 fakeId; + { + auto const result = hfs.isAmendmentEnabled(fakeId); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Test with a fake amendment name + std::string fakeName = "FakeAmendment"; + { + auto const result = hfs.isAmendmentEnabled(fakeName); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + } + void testCacheLedgerObj() { @@ -1256,26 +1362,111 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite // Should succeed for small data std::vector data(10, 0x42); - auto result = hfs.updateData(Slice(data.data(), data.size())); + auto const result = hfs.updateData(Slice(data.data(), data.size())); BEAST_EXPECT(result.has_value() && result.value() == 0); // Should fail for too large data std::vector bigData( 1024 * 1024 + 1, 0x42); // > maxWasmDataLength - auto tooBig = hfs.updateData(Slice(bigData.data(), bigData.size())); + auto const tooBig = + hfs.updateData(Slice(bigData.data(), bigData.size())); if (BEAST_EXPECT(!tooBig.has_value())) BEAST_EXPECT( tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); // Should fail if ledger object not found (use a bogus keylet) - auto bogusKeylet = keylet::escrow(env.master, 999999); + auto const bogusKeylet = keylet::escrow(env.master, 999999); WasmHostFunctionsImpl hfs2(ac, bogusKeylet); - auto notFound = hfs2.updateData(Slice(data.data(), data.size())); + auto const notFound = hfs2.updateData(Slice(data.data(), data.size())); if (BEAST_EXPECT(!notFound.has_value())) BEAST_EXPECT( notFound.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } + void + testCheckSignature() + { + testcase("checkSignature"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Generate a keypair and sign a message + auto const kp = generateKeyPair(KeyType::secp256k1, randomSeed()); + PublicKey const& pk = kp.first; + SecretKey const& sk = kp.second; + std::string const& message = "hello signature"; + auto const sig = sign(pk, sk, Slice(message.data(), message.size())); + + // Should succeed for valid signature + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Should fail for invalid signature + { + std::string badSig(sig.size(), 0xFF); + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(badSig.data(), badSig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Should fail for invalid public key + { + std::string badPk(pk.size(), 0x00); + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(badPk.data(), badPk.size())); + BEAST_EXPECT(!result.has_value()); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for empty public key + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(nullptr, 0)); + BEAST_EXPECT(!result.has_value()); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for empty signature + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(nullptr, 0), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Should fail for empty message + { + auto const result = hfs.checkSignature( + Slice(nullptr, 0), + Slice(sig.data(), sig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + } + void testComputeSha512HalfHash() { @@ -1291,7 +1482,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string data = "hello world"; - auto result = + auto const result = hfs.computeSha512HalfHash(Slice(data.data(), data.size())); BEAST_EXPECT(result.has_value()); @@ -1570,45 +1761,213 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite // Should succeed for valid NFT { - auto nftResult = hfs.getNFT(alice.id(), nftId); - if (BEAST_EXPECT(nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), nftId); + if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(std::equal( - nftResult.value().begin(), - nftResult.value().end(), - uri.data())); + result.value().begin(), result.value().end(), uri.data())); } // Should fail for invalid account { - auto nftResult = hfs.getNFT(xrpAccount(), nftId); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(xrpAccount(), nftId); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::INVALID_ACCOUNT); + result.error() == HostFunctionError::INVALID_ACCOUNT); } // Should fail for invalid nftId { - auto nftResult = hfs.getNFT(alice.id(), uint256()); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), uint256()); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::INVALID_PARAMS); + result.error() == HostFunctionError::INVALID_PARAMS); } // Should fail for invalid nftId { auto const badId = token::getNextID(env, alice, 0u, 1u); - auto nftResult = hfs.getNFT(alice.id(), badId); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), badId); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + { + auto const result = hfs.getNFT(alice.id(), nftId2); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == - HostFunctionError::LEDGER_OBJ_NOT_FOUND); + result.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testGetNFTIssuer() + { + testcase("getNFTIssuer"); + using namespace test::jtx; + + Env env{*this}; + // Mint NFT for env.master + uint32_t const taxon = 12345; + uint256 const nftId = token::getNextID(env, env.master, taxon); + env(token::mint(env.master, taxon)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should succeed for valid NFT id + { + auto const result = hfs.getNFTIssuer(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(std::equal( + result.value().begin(), + result.value().end(), + env.master.id().data())); } + // Should fail for zero NFT id { - auto nftResult = hfs.getNFT(alice.id(), nftId2); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFTIssuer(uint256()); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::FIELD_NOT_FOUND); + result.error() == HostFunctionError::INVALID_PARAMS); + } + } + + void + testGetNFTTaxon() + { + testcase("getNFTTaxon"); + using namespace test::jtx; + + Env env{*this}; + + uint32_t const taxon = 54321; + uint256 const nftId = token::getNextID(env, env.master, taxon); + env(token::mint(env.master, taxon)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getNFTTaxon(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == taxon); + } + + void + testGetNFTFlags() + { + testcase("getNFTFlags"); + using namespace test::jtx; + + Env env{*this}; + + // Mint NFT with default flags + uint256 const nftId = + token::getNextID(env, env.master, 0u, tfTransferable); + env(token::mint(env.master, 0), txflags(tfTransferable)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTFlags(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == tfTransferable); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTFlags(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testGetNFTTransferFee() + { + testcase("getNFTTransferFee"); + using namespace test::jtx; + + Env env{*this}; + + uint16_t const transferFee = 250; + uint256 const nftId = + token::getNextID(env, env.master, 0u, tfTransferable, transferFee); + env(token::mint(env.master, 0), + token::xferFee(transferFee), + txflags(tfTransferable)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTTransferFee(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == transferFee); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTTransferFee(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testGetNFTSerial() + { + testcase("getNFTSerial"); + using namespace test::jtx; + + Env env{*this}; + + // Mint NFT with serial 0 + uint256 const nftId = token::getNextID(env, env.master, 0u); + auto const serial = env.seq(env.master); + env(token::mint(env.master)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTSerial(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == serial); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTSerial(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); } } @@ -1629,11 +1988,11 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite std::string msg = "test trace"; std::string data = "abc"; auto const slice = Slice(data.data(), data.size()); - auto result = hfs.trace(msg, slice, false); + auto const result = hfs.trace(msg, slice, false); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == msg.size() + data.size()); - auto resultHex = hfs.trace(msg, slice, true); + auto const resultHex = hfs.trace(msg, slice, true); BEAST_EXPECT(resultHex.has_value()); BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); } @@ -1654,7 +2013,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace number"; int64_t num = 123456789; - auto result = hfs.traceNum(msg, num); + auto const result = hfs.traceNum(msg, num); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); } @@ -1665,6 +2024,10 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite testGetLedgerSqn(); testGetParentLedgerTime(); testGetParentLedgerHash(); + testGetLedgerAccountHash(); + testGetLedgerTransactionHash(); + testGetBaseFee(); + testIsAmendmentEnabled(); testCacheLedgerObj(); testGetTxField(); testGetCurrentLedgerObjField(); @@ -1679,9 +2042,15 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite testGetCurrentLedgerObjNestedArrayLen(); testGetLedgerObjNestedArrayLen(); testUpdateData(); + testCheckSignature(); testComputeSha512HalfHash(); testKeyletFunctions(); testGetNFT(); + testGetNFTIssuer(); + testGetNFTTaxon(); + testGetNFTFlags(); + testGetNFTTransferFee(); + testGetNFTSerial(); testTrace(); testTraceNum(); } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index d01835988ac..eb3e894d91f 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12034,194 +12034,234 @@ extern std::string const keyletHostFunctions = "5"; extern std::string const codecovWasm = - "0061736d0100000001570b60057f7f7f7f7f017f60027f7f017f60047f7f7f7f017f60037f" - "7f7f017f60067f7f7f7f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f60037f7f7e01" - "7f60077f7f7f7f7f7f7f017f60047f7f7f7f006000017f0298082308686f73745f6c696209" - "74726163655f6e756d000708686f73745f6c6962057472616365000008686f73745f6c6962" - "0e6765745f6c65646765725f73716e000108686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000108686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000108686f73745f6c69620c6765745f74785f6669656c6400030868" - "6f73745f6c69620e6163636f756e745f6b65796c6574000208686f73745f6c696210636163" - "68655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63757272656e745f" - "6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765745f6c65646765" - "725f6f626a5f6669656c64000208686f73745f6c6962136765745f74785f6e65737465645f" - "6669656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f" - "626a5f6e65737465645f6669656c64000208686f73745f6c69621b6765745f6c6564676572" - "5f6f626a5f6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61" - "727261795f6c656e000508686f73745f6c6962206765745f63757272656e745f6c65646765" - "725f6f626a5f61727261795f6c656e000508686f73745f6c6962186765745f6c6564676572" - "5f6f626a5f61727261795f6c656e000108686f73745f6c6962176765745f74785f6e657374" - "65645f61727261795f6c656e000108686f73745f6c6962276765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f61727261795f6c656e000108686f73745f6c6962" - "1f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000308686f" - "73745f6c69620b7570646174655f64617461000108686f73745f6c696213636f6d70757465" - "5f7368613531325f68616c66000208686f73745f6c69620b6c696e655f6b65796c65740006" - "08686f73745f6c69621163726564656e7469616c5f6b65796c6574000608686f73745f6c69" - "62076765745f6e6674000408686f73745f6c69620c636865636b5f6b65796c657400000868" - "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" - "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" - "65796c6574000208686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" - "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" - "725f6b65796c6574000008686f73745f6c69620d6f7261636c655f6b65796c657400000868" - "6f73745f6c69620e7061796368616e5f6b65796c6574000808686f73745f6c69620e736967" - "6e6572735f6b65796c6574000208686f73745f6c69620d7469636b65745f6b65796c657400" - "00030302090a05030100110619037f01418080c0000b7f00419c92c0000b7f0041a092c000" - "0b072e04066d656d6f727902000666696e69736800240a5f5f646174615f656e6403010b5f" - "5f686561705f6261736503020af41802390002402000200147044020004100480d01418b80" - "c000410b2000ad1000000b200220032000ac10001a0f0b418b80c000410b2000ac1000000b" - "b71802087f027e230041a0016b22002400419680c000412341004100410010011a20004100" - "360238200041386a2201410410024104418987c000410e1023200041003602382001410410" - "034104419787c00041161023200041d0006a22064200370300200041c8006a220342003703" - "00200041406b2202420037030020004200370338200141201004412041ad87c00041161023" - "20034100360200200242003703002000420037033841818020200141141005220441144604" - "400240200041066a20002d003a3a00002000200029003f370380012000200041c4006a2900" - "0037008501200041106a200029008501370000200020002f01383b01042000200028003b36" - "0007200020002903800137000b200642003703002003420037030020024200370300200042" - "00370338200041046a411420014120100622044120470d002000411a6a20002d003a3a0000" - "20004188016a200041c7006a290000220837030020004190016a200041cf006a2900002209" - "370300200041276a20083700002000412f6a2009370000200041376a200041d7006a2d0000" - "3a0000200020002f01383b01182000200028003b36001b2000200029003f37001f20004118" - "6a412041001007410141b980c0004110102320034100360200200242003703002000420037" - "033841818020200141141008411441c387c000411c10232003410036020020024200370300" - "20004200370338410141818020200141141009411441df87c0004114102302402001410020" - "016b41037122036a220220014d0d0020030440200321040340200141003a0000200141016a" - "2101200441016b22040d000b0b200341016b4107490d000340200141003a0000200141076a" - "41003a0000200141066a41003a0000200141056a41003a0000200141046a41003a00002001" - "41036a41003a0000200141026a41003a0000200141016a41003a0000200141086a22012002" - "470d000b0b200241c40020036b2203417c716a220120024b04400340200241003602002002" - "41046a22022001490d000b0b024020012003410371220320016a22044f0d00200322020440" - "0340200141003a0000200141016a2101200241016b22020d000b0b200341016b4107490d00" - "0340200141003a0000200141076a41003a0000200141066a41003a0000200141056a41003a" - "0000200141046a41003a0000200141036a41003a0000200141026a41003a0000200141016a" - "41003a0000200141086a22012004470d000b0b200041818020360280014100210103402005" - "41c000490440200041386a20056a20004180016a20016a2d00003a00002000200028027841" - "016a2205360278200141016a22014104470d010b0b20004190016a22044100360200200041" - "88016a220642003703002000420037038001200041386a2201200520004180016a22024114" - "100a411441f387c00041131023200441003602002006420037030020004200370380012001" - "200028027820024114100b4114418688c00041231023200441003602002006420037030020" - "0042003703800141012001200028027820024114100c411441a988c000411b10234189803c" - "100d412041c980c000411010234189803c100e412041d980c0004120102341014189803c10" - "0f412041f980c000411810232001200028027810104120419181c000411710232001200028" - "02781011412041a881c000412710234101200120002802781012412041cf81c000411f1023" - "200041046a220341141013410041ee81c000410b102320004198016a220742003703002004" - "420037030020064200370300200042003703800120012000280278200241201014412041c4" - "88c00041131023417f41041002417141f981c0004116102320004100360280012002417f10" - "02417141d788c0004116102320004182016a41003a0000200041003b018001200241031002" - "417d41ed88c000411c102320004100360280012002418094ebdc0310024173418989c00041" - "1b10234102100d416f418f82c000411f1023417f20002802781010417141ae82c000411f10" - "232001417f1010417141cd82c000411f102320014181201010417441ec82c0004120102320" - "0041b894ebdc036a2205200028027810104173418c83c000411f1023200520002802784101" - "1007417341ab83c000411810232001200028027841011007417141c383c000411a10232007" - "42003703002004420037030020064200370300200042003703800120052000280278200241" - "201006417341a489c000411b10232007420037030020044200370300200642003703002000" - "42003703800120012000280278200241201006417141bf89c0004118102320074200370300" - "20044200370300200642003703002000420037038001200341142003411420052000280278" - "200241201015417341d789c000412110232007420037030020044200370300200642003703" - "002000420037038001200341142003411420012000280278200241201015417141f889c000" - "411e102320052000280278422a1000417341dd83c00041171023200041003b018001410220" - "0241021005416f41968ac000411b1023200041003b0180014102200241021008416f41b18a" - "c000412b1023200041003b01800141014102200241021009416f41dc8ac000412310234102" - "100d416f418f82c000411f10234102100e416f41f483c000412f102341014102100f416f41" - "a384c00041271023200041003b018001200141812020024102100a417441ff8ac000412110" - "23200041003b018001200141812020024102100b417441a08bc00041311023200041003b01" - "80014101200141812020024102100c417441d18bc0004129102320014181201010417441ca" - "84c0004125102320014181201011417441ef84c00041351023410120014181201012417441" - "a485c000412d102320014181201013417441d185c00041191023200041003b018001200141" - "8120200241021014417441fa8bc00041211023200041003b01800120034114200341142001" - "4181202002410210164174419b8cc000411f10232001200028027822042005200441001001" - "417341ea85c000410f10232001200028027841001007417141f985c0004123102320004100" - "3b0180012003411420012000280278200241021017417141ba8cc000411a1023200041003b" - "01800120012000280278200241021006417141d48cc00041231023200041003b0180012001" - "20002802784101200241021018417141f78cc00041211023200041003b0180012001200028" - "027822042003411420012004200241021016417141988dc00041271023200041003b018001" - "2003411420012000280278220420012004200241021016417141bf8dc00041271023200041" - "003b0180012001200028027820034114200241021019417141e68dc0004125102320004100" - "3b01800120034114200120002802782002410210194171418b8ec00041251023200041003b" - "018001200120002802782003411420024102101a417141b08ec000412c1023200041003b01" - "8001200341142001200028027820024102101a417141dc8ec000412c1023200041003b0180" - "012001200028027820024102101b417141888fc000411f1023200041003b01800120012000" - "280278410120024102101c417141a78fc00041221023200041003b01800120012000280278" - "20034114419c86c0004114200241021015417141c98fc00041211023200041003b01800120" - "03411420012000280278419c86c0004114200241021015417141ea8fc00041211023200041" - "003b01800120012000280278410120024102101d4171418b90c00041251023200041003b01" - "800120012000280278410120024102101e417141b090c00041211023200041003b01800120" - "012000280278410120024102101f417141d190c00041221023200041003b01800120012000" - "280278200341144101200241021020417141f390c00041241023200041003b018001200341" - "142001200028027841012002410210204171419791c00041241023200041003b0180012001" - "2000280278200241021021417141bb91c00041231023200041003b01800120012000280278" - "4101200241021022417141de91c00041221023200041003b0180012001200028027841b086" - "c00041202002410210174171418092c000411c10232005200028027841b086c00041204100" - "1001417341d086c0004119102320012000280278200141812041001001417441e986c00041" - "0e1023200141812042011000417441f786c00041121023200041a0016a240041010f0b0b41" - "8080c000410b417f20042004417f4e1bac1000000b0ba6120100418080c0000b9c12657272" - "6f725f636f64653d54455354204641494c45442424242424205354415254494e4720574153" - "4d20455845435554494f4e20242424242463616368655f6c65646765725f6f626a6765745f" - "74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6172" - "7261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f7478" - "5f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e6573" - "7465645f61727261795f6c656e7570646174655f646174616765745f6c65646765725f7371" - "6e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669" - "656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f707472676574" - "5f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65" - "737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f" - "61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f707472" - "5f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e74726163655f6e" - "756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765725f6f62" - "6a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f" - "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65" - "737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269" - "675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c65" - "6e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c" - "69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f626a5f7772" - "6f6e675f73697a655f75696e74323536555344303030303030303030303030303030303030" - "303030303030303030303030303030303030303030303030303030303030316765745f6e66" - "745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e6774726163" - "655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f706172656e" - "745f6c65646765725f74696d656765745f706172656e745f6c65646765725f686173686765" - "745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f" - "6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f" - "6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765" - "745f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f6275" - "665f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e" - "676163636f756e745f6b65796c65745f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" - "65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f746f6f5f6c6f" - "6e675f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272" - "656e63796765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375" - "7272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64" - "6765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765" - "745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f626967" - "5f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" - "5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f626967" - "5f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c696365" - "6765745f6e66745f77726f6e675f73697a655f75696e743235366163636f756e745f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072656175" - "74685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369" - "745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" - "326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f" - "775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f6163" - "636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e746964004d" - "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" - "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" - "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" - "616c7565"; + "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60037f" + "7f7f017f60067f7f7f7f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002a90a2d08686f73745f6c696209" + "74726163655f6e756d000808686f73745f6c6962057472616365000208686f73745f6c6962" + "0e6765745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000008686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000008686f73745f6c6962176765745f6c65646765725f6163636f75" + "6e745f68617368000008686f73745f6c6962126765745f6c65646765725f74785f68617368" + "000008686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" + "6d656e646d656e745f656e61626c6564000008686f73745f6c69620c6765745f74785f6669" + "656c64000308686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" + "6c69621063616368655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765" + "745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621b676574" + "5f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c69621067" + "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" + "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" + "5f6c65646765725f6f626a5f61727261795f6c656e000008686f73745f6c6962176765745f" + "74785f6e65737465645f61727261795f6c656e000008686f73745f6c6962276765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00000868" + "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" + "656e000308686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" + "636f6d707574655f7368613531325f68616c66000108686f73745f6c696209636865636b5f" + "736967000408686f73745f6c6962076765745f6e6674000408686f73745f6c69620e676574" + "5f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e00" + "0108686f73745f6c69620d6765745f6e66745f666c616773000008686f73745f6c69621467" + "65745f6e66745f7472616e736665725f666565000008686f73745f6c69620e6765745f6e66" + "745f73657269616c000108686f73745f6c69620b6c696e655f6b65796c6574000708686f73" + "745f6c69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620c6368" + "65636b5f6b65796c6574000208686f73745f6c69620f64656c65676174655f6b65796c6574" + "000408686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000408" + "686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d657363726f77" + "5f6b65796c6574000208686f73745f6c6962106e66745f6f666665725f6b65796c65740002" + "08686f73745f6c69620c6f666665725f6b65796c6574000208686f73745f6c69620d6f7261" + "636c655f6b65796c6574000208686f73745f6c69620e7061796368616e5f6b65796c657400" + "0908686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d" + "7469636b65745f6b65796c657400020303020a0505030100110619037f01418080c0000b7f" + "00419895c0000b7f0041a095c0000b072e04066d656d6f727902000666696e697368002e0a" + "5f5f646174615f656e6403010b5f5f686561705f6261736503020ab21f0239000240200020" + "0147044020004100480d01418b80c000410b2000ad1000000b200220032000ac10001a0f0b" + "418b80c000410b2000ac1000000bf51e02087f027e230041e0016b22002400419680c00041" + "2341004100410010011a20004100360258200041d8006a220141041002410441ca88c00041" + "0e102d20004100360258200141041003410441d888c0004116102d200041f0006a22044200" + "370300200041e8006a22034200370300200041e0006a220242003703002000420037035820" + "0141201004412041ee88c0004116102d200442003703002003420037030020024200370300" + "200042003703582001412010054120418489c0004117102d20044200370300200342003703" + "0020024200370300200042003703582001412010064120419b89c0004112102d1007410a41" + "b980c000410c102d200041186a428182848890a0c08001370300200041106a428182848890" + "a0c08001370300200041086a428182848890a0c080013703002000428182848890a0c08001" + "37030041c580c000410e1008410141d380c0004111102d200041201008410141d380c00041" + "11102d20034100360200200242003703002000420037035802404181802020014114100922" + "064114460440200041266a20002d005a3a00002000200029005f3703c0012000200041e400" + "6a2900003700c501200041306a20002900c501370000200020002f01583b01242000200028" + "005b360027200020002903c00137002b200442003703002003420037030020024200370300" + "20004200370358200041246a411420014120100a22044120470d012000413a6a20002d005a" + "3a0000200041c8016a200041e7006a2900002208370300200041d0016a200041ef006a2900" + "002209370300200041c7006a2008370000200041cf006a2009370000200041d7006a200041" + "f7006a2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37" + "003f200041386a41204100100b410141e480c0004110102d20034100360200200242003703" + "00200042003703584181802020014114100c411441ad89c000411c102d2003410036020020" + "0242003703002000420037035841014181802020014114100d411441c989c0004114102d02" + "402001410020016b41037122036a220220014d0d0020030440200321040340200141003a00" + "00200141016a2101200441016b22040d000b0b200341016b4107490d000340200141003a00" + "00200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a41" + "003a0000200141036a41003a0000200141026a41003a0000200141016a41003a0000200141" + "086a22012002470d000b0b200241c40020036b2203417c716a220120024b04400340200241" + "00360200200241046a22022001490d000b0b024020012003410371220320016a22044f0d00" + "2003220204400340200141003a0000200141016a2101200241016b22020d000b0b20034101" + "6b4107490d000340200141003a0000200141076a41003a0000200141066a41003a00002001" + "41056a41003a0000200141046a41003a0000200141036a41003a0000200141026a41003a00" + "00200141016a41003a0000200141086a22012004470d000b0b2000418180203602c0014100" + "21010340200541c000490440200041d8006a20056a200041c0016a20016a2d00003a000020" + "0020002802980141016a220536029801200141016a22014104470d010b0b200041d0016a22" + "044100360200200041c8016a22064200370300200042003703c001200041d8006a22012005" + "200041c0016a22024114100e411441dd89c0004113102d2004410036020020064200370300" + "200042003703c001200120002802980120024114100f411441f089c0004123102d20044100" + "36020020064200370300200042003703c00141012001200028029801200241141010411441" + "938ac000411b102d4189803c1011412041f480c0004110102d4189803c10124120418481c0" + "004120102d41014189803c1013412041a481c0004118102d20012000280298011014412041" + "bc81c0004117102d20012000280298011015412041d381c0004127102d4101200120002802" + "98011016412041fa81c000411f102d200041246a2203411410174100419982c000410b102d" + "200041d8016a220742003703002004420037030020064200370300200042003703c0012001" + "200028029801200241201018412041ae8ac0004113102d41a482c000410c41b082c000410b" + "41bb82c000410e1019410141c982c0004109102d200041b8016a200041186a290300370300" + "200041b0016a200041106a290300370300200041a8016a200041086a290300370300200020" + "002903003703a001200441003b010020064200370300200042003703c00120034114200041" + "a0016a2205412020024112101a411241c18ac0004107102d20044100360200200642003703" + "00200042003703c0012005412020024114101b411441c88ac000410e102d200041003602c0" + "012005412020024104101c410441d68ac000410d102d20054120101d410841d282c000410d" + "102d20054120101e410a41df82c0004114102d200041003602c0012005412020024104101f" + "410441e38ac000410e102d417f41041002417141f382c0004116102d200041003602c00120" + "02417f1002417141f18ac0004116102d200041c2016a41003a0000200041003b01c0012002" + "41031002417d41878bc000411c102d200041003602c0012002418094ebdc031002417341a3" + "8bc000411b102d41021011416f418983c000411f102d417f2000280298011014417141a883" + "c000411f102d2001417f1014417141c783c000411f102d20014181201014417441e683c000" + "4120102d200041d894ebdc036a220520002802980110144173418684c000411f102d200520" + "00280298014101100b417341a584c0004118102d20012000280298014101100b417141bd84" + "c000411a102d200742003703002004420037030020064200370300200042003703c0012005" + "20002802980120024120100a417341be8bc000411b102d2007420037030020044200370300" + "20064200370300200042003703c001200120002802980120024120100a417141d98bc00041" + "18102d200742003703002004420037030020064200370300200042003703c0012003411420" + "0341142005200028029801200241201020417341f18bc0004121102d200742003703002004" + "420037030020064200370300200042003703c0012003411420034114200120002802980120" + "0241201020417141928cc000411e102d2005200028029801422a1000417341d784c0004117" + "102d200041003b01c0014102200241021009416f41b08cc000411b102d200041003b01c001" + "410220024102100c416f41cb8cc000412b102d200041003b01c0014101410220024102100d" + "416f41f68cc0004123102d41021011416f418983c000411f102d41021012416f41ee84c000" + "412f102d410141021013416f419d85c0004127102d41c580c0004181201008417441d380c0" + "004111102d200041003b01c001200141812020024102100e417441998dc0004121102d2000" + "41003b01c001200141812020024102100f417441ba8dc0004131102d200041003b01c00141" + "012001418120200241021010417441eb8dc0004129102d20014181201014417441c485c000" + "4125102d20014181201015417441e985c0004135102d4101200141812010164174419e86c0" + "00412d102d20014181201017417441cb86c0004119102d41a482c00041812041b082c00041" + "0b41bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c00041812041" + "bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c000410b41bb82c0" + "004181201019417441c982c0004109102d200041003b01c001200141812020024102101841" + "7441948ec0004121102d200041003b01c00120034114200341142001418120200241021021" + "417441b58ec000411f102d200120002802980122042005200441001001417341e486c00041" + "0f102d20012000280298014100100b417141f386c0004123102d200041003b01c001200341" + "14200120002802980120024102101a417141d48ec000411a102d200041003b01c001200120" + "002802980120024102101b417141ee8ec0004121102d200041003b01c00120012000280298" + "0120024102101c4171418f8fc0004120102d2001200028029801101d4171419687c0004120" + "102d2001200028029801101e417141b687c0004127102d200041003602c001200120002802" + "980120024104101f417141af8fc0004121102d200041003b01c00120012000280298012002" + "4102100a417141d08fc0004123102d200041003b01c0012001200028029801410120024102" + "1022417141f38fc0004121102d200041003b01c00120012000280298012204200341142001" + "20042002410210214171419490c0004127102d200041003b01c00120034114200120002802" + "9801220420012004200241021021417141bb90c0004127102d200041003b01c00120012000" + "2802980120034114200241021023417141e290c0004125102d200041003b01c00120034114" + "20012000280298012002410210234171418791c0004125102d200041003b01c00120012000" + "2802980120034114200241021024417141ac91c000412c102d200041003b01c00120034114" + "2001200028029801200241021024417141d891c000412c102d200041003b01c00120012000" + "280298012002410210254171418492c000411f102d200041003b01c0012001200028029801" + "4101200241021026417141a392c0004122102d200041003b01c00120012000280298012003" + "411441dd87c0004114200241021020417141c592c0004121102d200041003b01c001200341" + "14200120002802980141dd87c0004114200241021020417141e692c0004121102d20004100" + "3b01c001200120002802980141012002410210274171418793c0004125102d200041003b01" + "c00120012000280298014101200241021028417141ac93c0004121102d200041003b01c001" + "20012000280298014101200241021029417141cd93c0004122102d200041003b01c0012001" + "20002802980120034114410120024102102a417141ef93c0004124102d200041003b01c001" + "200341142001200028029801410120024102102a4171419394c0004124102d200041003b01" + "c001200120002802980120024102102b417141b794c0004123102d200041003b01c0012001" + "200028029801410120024102102c417141da94c0004122102d200041003b01c00120012000" + "2802980141f187c000412020024102101a417141fc94c000411c102d200520002802980141" + "f187c0004120410010014173419188c0004119102d20012000280298012001418120410010" + "01417441aa88c000410e102d200141812042011000417441b888c0004112102d200041e001" + "6a240041010f0b418080c000410b417f20062006417f4e1bac1000000b418080c000410b41" + "7f20042004417f4e1bac1000000b0ba2150100418080c0000b98156572726f725f636f6465" + "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" + "54494f4e2024242424246765745f626173655f666565746573745f616d656e646d656e7461" + "6d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f74" + "785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f617272" + "61795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f" + "6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e657374" + "65645f61727261795f6c656e7570646174655f6461746174657374206d6573736167657465" + "7374207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e" + "66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c65646765" + "725f73716e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c6964" + "5f736669656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074" + "726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74" + "785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e6573" + "7465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a" + "5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e747261" + "63655f6e756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765" + "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c6564" + "6765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74" + "785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63" + "757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" + "6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269" + "675f736c69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f62" + "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" + "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" + "726f6e675f73697a655f75696e743235365553443030303030303030303030303030303030" + "30303030303030303030303030303030303030303030303030303030303030316765745f6e" + "66745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e67747261" + "63655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f70617265" + "6e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f6861736867" + "65745f6c65646765725f6163636f756e745f686173686765745f6c65646765725f74785f68" + "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" + "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" + "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" + "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" + "6765745f6e66745f73657269616c6765745f6c65646765725f73716e5f6e65675f6c656e67" + "65745f6c65646765725f73716e5f6275665f746f6f5f736d616c6c6765745f6c6564676572" + "5f73716e5f6c656e5f746f6f5f6c6f6e676163636f756e745f6b65796c65745f6c656e5f74" + "6f6f5f6c6f6e676163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b" + "65796c65745f6c656e5f746f6f5f6c6f6e675f63757272656e63796c696e655f6b65796c65" + "745f77726f6e675f6c656e5f63757272656e63796765745f74785f6669656c645f696e7661" + "6c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c" + "645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f" + "696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f" + "5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e657374" + "65645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f736861" + "3531325f68616c665f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c" + "65745f746f6f5f6269675f736c6963656765745f6e66745f77726f6e675f73697a655f7569" + "6e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235" + "366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f" + "6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072" + "65617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e74696431646570" + "6f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646573" + "63726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469" + "64004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d6279010572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c" + "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c" + "746976616c7565"; extern std::string const floatHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 84e3882cc04..cd1848a5227 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -127,6 +127,36 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + getLedgerAccountHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerTransactionHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getBaseFee() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + isAmendmentEnabled(uint256 const& amendmentId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + isAmendmentEnabled(std::string_view const& amendmentName) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { @@ -211,6 +241,15 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected computeSha512HalfHash(Slice const& data) { @@ -316,6 +355,36 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + getNFTIssuer(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTTaxon(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTFlags(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTTransferFee(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTSerial(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected trace(std::string_view const& msg, Slice const& data, bool asHex) { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index d8f452159a3..4adb99a4472 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -48,6 +49,41 @@ WasmHostFunctionsImpl::getParentLedgerHash() return ctx.view().info().parentHash; } +Expected +WasmHostFunctionsImpl::getLedgerAccountHash() +{ + return ctx.view().info().accountHash; +} + +Expected +WasmHostFunctionsImpl::getLedgerTransactionHash() +{ + return ctx.view().info().txHash; +} + +Expected +WasmHostFunctionsImpl::getBaseFee() +{ + auto fee = ctx.view().fees().base.drops(); + if (fee > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(fee); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) +{ + return ctx.view().rules().enabled(amendmentId); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) +{ + auto const& table = ctx.app.getAmendmentTable(); + auto const amendment = table.find(std::string(amendmentName)); + return ctx.view().rules().enabled(amendment); +} + Expected WasmHostFunctionsImpl::normalizeCacheIndex(int32_t cacheIdx) { @@ -425,6 +461,19 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return 0; } +Expected +WasmHostFunctionsImpl::checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) +{ + if (!publicKeyType(pubkey)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + PublicKey const pk(pubkey); + return verify(pk, message, signature, /*canonical*/ true); +} + Expected WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) { @@ -613,6 +662,40 @@ WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) return Bytes(s.begin(), s.end()); } +Expected +WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) +{ + auto const issuer = nft::getIssuer(nftId); + if (!issuer) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Bytes{issuer.begin(), issuer.end()}; +} + +Expected +WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) +{ + return nft::toUInt32(nft::getTaxon(nftId)); +} + +Expected +WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) +{ + return nft::getFlags(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) +{ + return nft::getTransferFee(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) +{ + return nft::getSerial(nftId); +} + Expected WasmHostFunctionsImpl::trace( std::string_view const& msg, diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index e23df2c6ecb..a6051bb1c74 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -84,6 +84,21 @@ class WasmHostFunctionsImpl : public HostFunctions Expected getParentLedgerHash() override; + Expected + getLedgerAccountHash() override; + + Expected + getLedgerTransactionHash() override; + + Expected + getBaseFee() override; + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override; + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override; + Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override; @@ -126,6 +141,12 @@ class WasmHostFunctionsImpl : public HostFunctions Expected updateData(Slice const& data) override; + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override; + Expected computeSha512HalfHash(Slice const& data) override; @@ -185,6 +206,21 @@ class WasmHostFunctionsImpl : public HostFunctions Expected getNFT(AccountID const& account, uint256 const& nftId) override; + Expected + getNFTIssuer(uint256 const& nftId) override; + + Expected + getNFTTaxon(uint256 const& nftId) override; + + Expected + getNFTFlags(uint256 const& nftId) override; + + Expected + getNFTTransferFee(uint256 const& nftId) override; + + Expected + getNFTSerial(uint256 const& nftId) override; + Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override; diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index d9488c3b4e4..6fb7b0c58c0 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -319,6 +319,83 @@ getParentLedgerHash_wrap( runtime, params, results, hf->getParentLedgerHash(), index); } +wasm_trap_t* +getLedgerAccountHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getLedgerAccountHash(), index); +} + +wasm_trap_t* +getLedgerTransactionHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getLedgerTransactionHash(), index); +} + +wasm_trap_t* +getBaseFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult(runtime, params, results, hf->getBaseFee(), index); +} + +wasm_trap_t* +isAmendmentEnabled_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const slice = getDataSlice(runtime, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + if (slice->size() == uint256::bytes) + { + if (auto ret = hf->isAmendmentEnabled(uint256::fromVoid(slice->data())); + *ret == 1) + { + return returnResult(runtime, params, results, ret, index); + } + } + + if (slice->size() > 64) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const str = std::string_view( + reinterpret_cast(slice->data()), slice->size()); + return returnResult( + runtime, params, results, hf->isAmendmentEnabled(str), index); +} + wasm_trap_t* cacheLedgerObj_wrap( void* env, @@ -649,6 +726,42 @@ updateData_wrap( runtime, params, results, hf->updateData(*bytes), index); } +wasm_trap_t* +checkSignature_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const message = getDataSlice(runtime, params, index); + if (!message) + { + return hfResult(results, message.error()); + } + + auto const signature = getDataSlice(runtime, params, index); + if (!signature) + { + return hfResult(results, signature.error()); + } + + auto const pubkey = getDataSlice(runtime, params, index); + if (!pubkey) + { + return hfResult(results, pubkey.error()); + } + + return returnResult( + runtime, + params, + results, + hf->checkSignature(*message, *signature, *pubkey), + index); +} + wasm_trap_t* computeSha512HalfHash_wrap( void* env, @@ -1083,6 +1196,106 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->getNFT(*acc, *nftId), index); } +wasm_trap_t* +getNFTIssuer_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTIssuer(*nftId), index); +} + +wasm_trap_t* +getNFTTaxon_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTTaxon(*nftId), index); +} + +wasm_trap_t* +getNFTFlags_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTFlags(*nftId), index); +} + +wasm_trap_t* +getNFTTransferFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTTransferFee(*nftId), index); +} + +wasm_trap_t* +getNFTSerial_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTSerial(*nftId), index); +} + wasm_trap_t* trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 6bad18b3686..aac8ba387ea 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -44,6 +44,34 @@ getParentLedgerHash_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using getLedgerAccountHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getLedgerAccountHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerTransactionHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getLedgerTransactionHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getBaseFee_proto = int32_t(); +wasm_trap_t* +getBaseFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using isAmendmentEnabled_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +isAmendmentEnabled_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using cacheLedgerObj_proto = int32_t(uint8_t const*, int32_t, int32_t); wasm_trap_t* cacheLedgerObj_wrap( @@ -147,6 +175,19 @@ updateData_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using checkSignature_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t); +wasm_trap_t* +checkSignature_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using computeSha512HalfHash_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -304,6 +345,41 @@ using getNFT_proto = int32_t( wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +using getNFTIssuer_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTIssuer_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTTaxon_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTTaxon_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTFlags_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getNFTFlags_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTTransferFee_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getNFTTransferFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTSerial_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTSerial_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using trace_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); wasm_trap_t* diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 9194943737b..49990dfb998 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -45,6 +46,10 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); @@ -59,6 +64,7 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); @@ -75,6 +81,11 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); + WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); From 58741d27910710da9f5b808bec6ae44268b3a734 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 4 Aug 2025 09:25:47 -0400 Subject: [PATCH 46/73] feat: return an int instead of boolean from `finish`, display in metadata (#5641) * create STInt32 and STInt64, use it for sfWasmReturnCode in metadata * get it actually working * add tests * update comment * change type * respond to comments --- include/xrpl/protocol/SField.h | 7 +- include/xrpl/protocol/STInteger.h | 3 + include/xrpl/protocol/STObject.h | 8 +++ include/xrpl/protocol/TxMeta.h | 27 ++++++- include/xrpl/protocol/detail/sfields.macro | 3 + src/libxrpl/protocol/STInteger.cpp | 78 +++++++++++++++++++++ src/libxrpl/protocol/STObject.cpp | 24 +++++++ src/libxrpl/protocol/STParsedJSON.cpp | 52 ++++++++++++-- src/libxrpl/protocol/STVar.cpp | 6 ++ src/libxrpl/protocol/Serializer.cpp | 12 ++++ src/libxrpl/protocol/TxMeta.cpp | 7 ++ src/test/app/Escrow_test.cpp | 10 +++ src/xrpld/app/misc/WasmParamsHelper.h | 2 +- src/xrpld/app/tx/detail/ApplyContext.cpp | 4 ++ src/xrpld/app/tx/detail/ApplyContext.h | 8 +++ src/xrpld/app/tx/detail/Escrow.cpp | 4 +- src/xrpld/ledger/ApplyViewImpl.h | 7 ++ src/xrpld/ledger/detail/ApplyStateTable.cpp | 3 + src/xrpld/ledger/detail/ApplyStateTable.h | 1 + src/xrpld/ledger/detail/ApplyViewImpl.cpp | 10 ++- 20 files changed, 263 insertions(+), 13 deletions(-) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index 777cfa02ba9..5d0215102ac 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -71,8 +71,10 @@ class STCurrency; STYPE(STI_VL, 7) \ STYPE(STI_ACCOUNT, 8) \ STYPE(STI_NUMBER, 9) \ + STYPE(STI_INT32, 10) \ + STYPE(STI_INT64, 11) \ \ - /* 10-13 are reserved */ \ + /* 12-13 are reserved */ \ STYPE(STI_OBJECT, 14) \ STYPE(STI_ARRAY, 15) \ \ @@ -352,6 +354,9 @@ using SF_UINT256 = TypedField>; using SF_UINT384 = TypedField>; using SF_UINT512 = TypedField>; +using SF_INT32 = TypedField>; +using SF_INT64 = TypedField>; + using SF_ACCOUNT = TypedField; using SF_AMOUNT = TypedField; using SF_ISSUE = TypedField; diff --git a/include/xrpl/protocol/STInteger.h b/include/xrpl/protocol/STInteger.h index b2596387742..f86d3023481 100644 --- a/include/xrpl/protocol/STInteger.h +++ b/include/xrpl/protocol/STInteger.h @@ -81,6 +81,9 @@ using STUInt16 = STInteger; using STUInt32 = STInteger; using STUInt64 = STInteger; +using STInt32 = STInteger; +using STInt64 = STInteger; + template inline STInteger::STInteger(Integer v) : value_(v) { diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 6cd083ef857..19d4bc714d1 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -231,6 +231,10 @@ class STObject : public STBase, public CountedObject getFieldH192(SField const& field) const; uint256 getFieldH256(SField const& field) const; + std::int32_t + getFieldI32(SField const& field) const; + std::int64_t + getFieldI64(SField const& field) const; AccountID getAccountID(SField const& field) const; @@ -365,6 +369,10 @@ class STObject : public STBase, public CountedObject void setFieldH256(SField const& field, uint256 const&); void + setFieldI32(SField const& field, std::int32_t); + void + setFieldI64(SField const& field, std::int64_t); + void setFieldVL(SField const& field, Blob const&); void setFieldVL(SField const& field, Slice const&); diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index eb594fcc57f..6b1c24e9eb5 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -161,7 +161,8 @@ class TxMeta getGasUsed() const { XRPL_ASSERT( - hasGasUsed(), "ripple::TxMeta::getGasUsed : non-null batch id"); + hasGasUsed(), + "ripple::TxMeta::getGasUsed : non-null gas used field"); return *gasUsed_; } @@ -171,6 +172,27 @@ class TxMeta return static_cast(gasUsed_); } + void + setWasmReturnCode(std::int32_t const& wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + + std::int32_t + getWasmReturnCode() const + { + XRPL_ASSERT( + hasWasmReturnCode(), + "ripple::TxMeta::getWasmReturnCode : non-null wasm return code"); + return *wasmReturnCode_; + } + + bool + hasWasmReturnCode() const + { + return static_cast(wasmReturnCode_); + } + private: uint256 mTransactionID; std::uint32_t mLedger; @@ -178,8 +200,9 @@ class TxMeta int mResult; std::optional mDelivered; - std::optional gasUsed_; std::optional parentBatchId_; + std::optional gasUsed_; + std::optional wasmReturnCode_; STArray mNodes; }; diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index d5f98ca9995..1fcf1da6225 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -210,6 +210,9 @@ TYPED_SFIELD(sfAssetsMaximum, NUMBER, 3) TYPED_SFIELD(sfAssetsTotal, NUMBER, 4) TYPED_SFIELD(sfLossUnrealized, NUMBER, 5) +// 32-bit signed (common) +TYPED_SFIELD(sfWasmReturnCode, INT32, 1) + // currency amount (common) TYPED_SFIELD(sfAmount, AMOUNT, 1) TYPED_SFIELD(sfBalance, AMOUNT, 2) diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index a90e21491c0..458bc2b57ce 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -251,4 +251,82 @@ STUInt64::getJson(JsonOptions) const return convertToString(value_, 16); // Convert to base 16 } +//------------------------------------------------------------------------------ + +template <> +STInteger::STInteger(SerialIter& sit, SField const& name) + : STInteger(name, sit.get32()) +{ +} + +template <> +SerializedTypeID +STInt32::getSType() const +{ + return STI_INT32; +} + +template <> +std::string +STInt32::getText() const +{ + return std::to_string(value_); +} + +template <> +Json::Value +STInt32::getJson(JsonOptions) const +{ + return value_; +} + +//------------------------------------------------------------------------------ + +template <> +STInteger::STInteger(SerialIter& sit, SField const& name) + : STInteger(name, sit.get64()) +{ +} + +template <> +SerializedTypeID +STInt64::getSType() const +{ + return STI_INT64; +} + +template <> +std::string +STInt64::getText() const +{ + return std::to_string(value_); +} + +template <> +Json::Value +STInt64::getJson(JsonOptions) const +{ + auto convertToString = [](int64_t const value, int const base) { + XRPL_ASSERT( + base == 10 || base == 16, + "ripple::STInt64::getJson : base 10 or 16"); + std::string str( + base == 10 ? 20 : 16, 0); // Allocate space depending on base + auto ret = + std::to_chars(str.data(), str.data() + str.size(), value, base); + XRPL_ASSERT( + ret.ec == std::errc(), + "ripple::STInt64::getJson : to_chars succeeded"); + str.resize(std::distance(str.data(), ret.ptr)); + return str; + }; + + if (auto const& fName = getFName(); fName.shouldMeta(SField::sMD_BaseTen)) + { + return convertToString(value_, 10); // Convert to base 10 + } + + return convertToString(value_, 16); // Convert to base 16 +} + } // namespace ripple diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 9c23898a743..384ab527701 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -647,6 +647,18 @@ STObject::getFieldH256(SField const& field) const return getFieldByValue(field); } +std::int32_t +STObject::getFieldI32(SField const& field) const +{ + return getFieldByValue(field); +} + +std::int64_t +STObject::getFieldI64(SField const& field) const +{ + return getFieldByValue(field); +} + AccountID STObject::getAccountID(SField const& field) const { @@ -761,6 +773,18 @@ STObject::setFieldH256(SField const& field, uint256 const& v) setFieldUsingSetValue(field, v); } +void +STObject::setFieldI32(SField const& field, std::int32_t v) +{ + setFieldUsingSetValue(field, v); +} + +void +STObject::setFieldI64(SField const& field, std::int64_t v) +{ + setFieldUsingSetValue(field, v); +} + void STObject::setFieldV256(SField const& field, STVector256 const& v) { diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index a5f163ba65c..56d5f5c60ee 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -501,14 +501,14 @@ parseLeaf( break; } - case STI_UINT192: { + case STI_UINT160: { if (!value.isString()) { error = bad_type(json_name, fieldName); return ret; } - uint192 num; + uint160 num; if (auto const s = value.asString(); !num.parseHex(s)) { @@ -521,18 +521,18 @@ parseLeaf( num.zero(); } - ret = detail::make_stvar(field, num); + ret = detail::make_stvar(field, num); break; } - case STI_UINT160: { + case STI_UINT192: { if (!value.isString()) { error = bad_type(json_name, fieldName); return ret; } - uint160 num; + uint192 num; if (auto const s = value.asString(); !num.parseHex(s)) { @@ -545,7 +545,7 @@ parseLeaf( num.zero(); } - ret = detail::make_stvar(field, num); + ret = detail::make_stvar(field, num); break; } @@ -573,6 +573,46 @@ parseLeaf( break; } + case STI_INT32: + try + { + if (value.isString()) + { + ret = detail::make_stvar( + field, + beast::lexicalCastThrow( + value.asString())); + } + else if (value.isInt()) + { + ret = detail::make_stvar(field, value.asInt()); + } + else if (value.isUInt()) + { + if (value.asUInt() > + static_cast( + std::numeric_limits::max())) + { + error = out_of_range(json_name, fieldName); + return ret; + } + ret = detail::make_stvar( + field, safe_cast(value.asInt())); + } + else + { + error = bad_type(json_name, fieldName); + return ret; + } + } + catch (std::exception const&) + { + error = invalid_data(json_name, fieldName); + return ret; + } + + break; + case STI_VL: if (!value.isString()) { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index 24954c4add7..72b348091c9 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -208,6 +208,12 @@ STVar::constructST(SerializedTypeID id, int depth, Args&&... args) case STI_UINT256: construct(std::forward(args)...); return; + case STI_INT32: + construct(std::forward(args)...); + return; + case STI_INT64: + construct(std::forward(args)...); + return; case STI_VECTOR256: construct(std::forward(args)...); return; diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index b8a68d28b83..d85f25ec8b2 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -83,6 +83,18 @@ Serializer::addInteger(std::uint64_t i) { return add64(i); } +template <> +int +Serializer::addInteger(std::int32_t i) +{ + return add32(i); +} +template <> +int +Serializer::addInteger(std::int64_t i) +{ + return add64(i); +} int Serializer::addRaw(Blob const& vector) diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index 9a33cb81f19..923059e1114 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -60,6 +60,8 @@ TxMeta::TxMeta( setParentBatchId(obj.getFieldH256(sfParentBatchID)); if (obj.isFieldPresent(sfGasUsed)) setGasUsed(obj.getFieldU32(sfGasUsed)); + if (obj.isFieldPresent(sfWasmReturnCode)) + setWasmReturnCode(obj.getFieldI32(sfWasmReturnCode)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) @@ -86,6 +88,9 @@ TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) if (obj.isFieldPresent(sfGasUsed)) setGasUsed(obj.getFieldU32(sfGasUsed)); + + if (obj.isFieldPresent(sfWasmReturnCode)) + setWasmReturnCode(obj.getFieldI32(sfWasmReturnCode)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, Blob const& vec) @@ -257,6 +262,8 @@ TxMeta::getAsObject() const metaData.setFieldH256(sfParentBatchID, getParentBatchId()); if (hasGasUsed()) metaData.setFieldU32(sfGasUsed, getGasUsed()); + if (hasWasmReturnCode()) + metaData.setFieldI32(sfWasmReturnCode, getWasmReturnCode()); return metaData; } diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index d77de860fd4..640743a8699 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2096,6 +2096,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2164,6 +2166,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2213,6 +2217,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2264,6 +2270,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2330,6 +2338,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 39'596); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/misc/WasmParamsHelper.h index 224d7431d30..8bdf11e6182 100644 --- a/src/xrpld/app/misc/WasmParamsHelper.h +++ b/src/xrpld/app/misc/WasmParamsHelper.h @@ -48,7 +48,7 @@ struct WasmResult T result; int64_t cost; }; -typedef WasmResult EscrowResult; +typedef WasmResult EscrowResult; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index ff31662494d..42f6c7ecfa5 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -59,6 +59,10 @@ ApplyContext::discard() std::optional ApplyContext::apply(TER ter) { + if (wasmReturnCode_.has_value()) + { + view_->setWasmReturnCode(*wasmReturnCode_); + } view_->setGasUsed(gasUsed_); return view_->apply( base_, tx, ter, parentBatchId_, flags_ & tapDRY_RUN, journal); diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 5334bdabcb4..22b270b8479 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -113,6 +113,13 @@ class ApplyContext gasUsed_ = gasUsed; } + /** Sets the gas used in the metadata */ + void + setWasmReturnCode(std::int32_t const wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + /** Discard changes and start fresh. */ void discard(); @@ -165,6 +172,7 @@ class ApplyContext // The ID of the batch transaction we are executing under, if seated. std::optional parentBatchId_; std::optional gasUsed_; + std::optional wasmReturnCode_; }; } // namespace ripple diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 83dcef2fa9b..c993d8ba593 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1282,13 +1282,13 @@ EscrowFinish::doApply() if (re.has_value()) { auto reValue = re.value().result; + ctx_.setWasmReturnCode(reValue); // TODO: better error handling for this conversion ctx_.setGasUsed(static_cast(re.value().cost)); JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << re.value().cost; - if (!reValue) + if (reValue <= 0) { - // ctx_.view().update(slep); return tecWASM_REJECTED; } } diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index cf494217f4b..e6eb4a683d9 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -81,6 +81,12 @@ class ApplyViewImpl final : public detail::ApplyViewBase gasUsed_ = gasUsed; } + void + setWasmReturnCode(std::int32_t const wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + /** Get the number of modified entries */ std::size_t @@ -100,6 +106,7 @@ class ApplyViewImpl final : public detail::ApplyViewBase private: std::optional deliver_; std::optional gasUsed_; + std::optional wasmReturnCode_; }; } // namespace ripple diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 039088205bd..026955baba0 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -118,6 +118,7 @@ ApplyStateTable::apply( std::optional const& deliver, std::optional const& parentBatchId, std::optional const& gasUsed, + std::optional const& wasmReturnCode, bool isDryRun, beast::Journal j) { @@ -136,6 +137,8 @@ ApplyStateTable::apply( meta.setParentBatchId(*parentBatchId); if (gasUsed) meta.setGasUsed(*gasUsed); + if (wasmReturnCode) + meta.setWasmReturnCode(*wasmReturnCode); Mods newMod; for (auto& item : items_) { diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index 896705042fd..1ba7f00945b 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -74,6 +74,7 @@ class ApplyStateTable std::optional const& deliver, std::optional const& parentBatchId, std::optional const& gasUsed, + std::optional const& wasmReturnCode, bool isDryRun, beast::Journal j); diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index a90fc3fcbbc..1191f6573fb 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -36,7 +36,15 @@ ApplyViewImpl::apply( beast::Journal j) { return items_.apply( - to, tx, ter, deliver_, parentBatchId, gasUsed_, isDryRun, j); + to, + tx, + ter, + deliver_, + parentBatchId, + gasUsed_, + wasmReturnCode_, + isDryRun, + j); } std::size_t From 38c7a27010da7465c1436a5fde98df970ddaac03 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 5 Aug 2025 18:06:34 -0400 Subject: [PATCH 47/73] clean up WASM functions a bit (#5628) --- src/test/app/Wasm_test.cpp | 59 ++++++++----- src/xrpld/app/misc/WasmVM.cpp | 129 +++++++++++++++-------------- src/xrpld/app/misc/WasmVM.h | 6 +- src/xrpld/app/tx/detail/Escrow.cpp | 8 +- 4 files changed, 114 insertions(+), 88 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 98e06a86361..c8db385c670 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -141,14 +141,19 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; TestLedgerDataProvider hf(&env); - std::string const funcName("finish"); std::vector imports; WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, funcName, {}, imports, &hf, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &hf, + 1'000'000, + env.journal); // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) @@ -160,7 +165,8 @@ struct Wasm_test : public beast::unit_test::suite env.close(); // empty module - run the same instance - re = engine.run({}, funcName, {}, imports, &hf, 1'000'000, env.journal); + re = engine.run( + {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) @@ -327,10 +333,9 @@ struct Wasm_test : public beast::unit_test::suite "6d756c746976616c7565"; auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("finish"); - auto const re = - preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + auto const re = preflightEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); BEAST_EXPECT(!isTesSuccess(re)); } } @@ -348,8 +353,8 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { TestHostFunctions nfs(env, 0); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result && (re->cost == 41'132)); @@ -369,8 +374,8 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(env); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100000); BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; @@ -389,8 +394,8 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(env); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; @@ -431,7 +436,6 @@ struct Wasm_test : public beast::unit_test::suite { auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - std::string const funcName("finish"); TestLedgerDataProvider ledgerDataProvider(&env); std::vector imports; @@ -441,7 +445,13 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + nullptr, + 1'000'000, + env.journal); // expected import not provided BEAST_EXPECT(!re); @@ -453,8 +463,6 @@ struct Wasm_test : public beast::unit_test::suite { testcase("wasm test host functions cost"); - std::string const funcName("finish"); - using namespace test::jtx; Env env(*this); @@ -471,7 +479,13 @@ struct Wasm_test : public beast::unit_test::suite i.gas = 0; auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); if (BEAST_EXPECT(re.has_value())) { @@ -498,7 +512,13 @@ struct Wasm_test : public beast::unit_test::suite std::vector const imp = createWasmImport(&hfs); auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); if (BEAST_EXPECT(re.has_value())) { @@ -542,7 +562,6 @@ struct Wasm_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; - std::string const funcName("finish"); // std::string const funcName("test"); auto const& wasmHex = hfPerfTest; // auto const& wasmHex = opcCallPerfTest; @@ -614,7 +633,7 @@ struct Wasm_test : public beast::unit_test::suite PerfHostFunctions nfs(env, k, env.tx()); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs); + auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result); diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 49990dfb998..d815c9939d1 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -34,6 +34,71 @@ namespace ripple { +static void +setCommonHostFunctions(HostFunctions* hfs, std::vector& i) +{ + // clang-format off + WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); + WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); + WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); + WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); + WASM_IMPORT_FUNC (i, trace, hfs, 500); + WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + + WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); + // clang-format on +} + std::vector createWasmImport(HostFunctions* hfs) { @@ -41,68 +106,8 @@ createWasmImport(HostFunctions* hfs) if (hfs) { - // clang-format off - - WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); - WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); - WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); - WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); - WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); - WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); - WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); - WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); - WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); - WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); - WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); - WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); - WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); - WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); - WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); - WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); - WASM_IMPORT_FUNC (i, trace, hfs, 500); - WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); - WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); - - WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); - - // clang-format on + setCommonHostFunctions(hfs, i); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); } return i; diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index c4db2fedd5d..d4a9072740a 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -34,6 +34,8 @@ static std::string_view const W_ALLOC = "allocate"; static std::string_view const W_DEALLOC = "deallocate"; static std::string_view const W_PROC_EXIT = "proc_exit"; +static std::string_view const ESCROW_FUNCTION_NAME = "finish"; + uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 class WamrEngine; @@ -92,7 +94,7 @@ createWasmImport(HostFunctions* hfs); Expected runEscrowWasm( Bytes const& wasmCode, - std::string_view funcName, + std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, HostFunctions* hfs = nullptr, int64_t gasLimit = -1, @@ -101,7 +103,7 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, - std::string_view funcName, + std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, HostFunctions* hfs = nullptr, beast::Journal j = beast::Journal(beast::Journal::getNullSink())); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index c993d8ba593..f0389c06ad9 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -232,7 +232,8 @@ EscrowCreate::preflight(PreflightContext const& ctx) } HostFunctions mock; - auto const re = preflightEscrowWasm(code, "finish", {}, &mock, ctx.j); + auto const re = + preflightEscrowWasm(code, ESCROW_FUNCTION_NAME, {}, &mock, ctx.j); if (!isTesSuccess(re)) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; @@ -1266,7 +1267,6 @@ EscrowFinish::doApply() // WASM execution auto const wasmStr = slep->getFieldVL(sfFinishFunction); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("finish"); WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); @@ -1276,8 +1276,8 @@ EscrowFinish::doApply() return tecINTERNAL; } std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; - auto re = - runEscrowWasm(wasm, funcName, {}, &ledgerDataProvider, allowance); + auto re = runEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From c15947da56b01a27b0234cfa960d0ba2dbc043a0 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 6 Aug 2025 12:41:12 -0400 Subject: [PATCH 48/73] fix CI --- .github/actions/dependencies/action.yml | 5 +++++ .github/workflows/macos.yml | 5 +++++ .github/workflows/windows.yml | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index e32d8934ba6..51b0080899a 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -6,6 +6,11 @@ inputs: runs: using: composite steps: + - name: export custom recipes + shell: bash + # TODO: add WAMR to conan center index + # This is a workaround until WAMR is available in conan center + run: conan export --version 2.4.1 external/wamr - name: add Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8fea7c6fc22..371944fd946 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -87,6 +87,11 @@ jobs: echo "${CONAN_GLOBAL_CONF}" > $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show + - name: export custom recipes + shell: bash + # TODO: add WAMR to conan center index + # This is a workaround until WAMR is available in conan center + run: conan export --version 2.4.1 external/wamr - name: build dependencies uses: ./.github/actions/dependencies with: diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 4922c7d6bdc..a56a74a498d 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -82,6 +82,11 @@ jobs: echo "${CONAN_GLOBAL_CONF}" > $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show + - name: export custom recipes + shell: bash + # TODO: add WAMR to conan center index + # This is a workaround until WAMR is available in conan center + run: conan export --version 2.4.1 external/wamr - name: build dependencies uses: ./.github/actions/dependencies with: From 5dc0cee28a2f35e01e7874401aaaf9f513387033 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 11 Aug 2025 15:52:21 -0400 Subject: [PATCH 49/73] cache data instead of setting it in `updateData` (#5642) Co-authored-by: Oleksandr <115580134+oleks-rip@users.noreply.github.com> --- src/test/app/WasmHostFuncImpl_test.cpp | 8 -------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 6 +----- src/xrpld/app/misc/WasmHostFuncImpl.h | 7 +++++++ src/xrpld/app/tx/detail/Escrow.cpp | 6 ++++++ 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp index 2f19b7dc30f..b8d86f375bc 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -1373,14 +1373,6 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(!tooBig.has_value())) BEAST_EXPECT( tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); - - // Should fail if ledger object not found (use a bogus keylet) - auto const bogusKeylet = keylet::escrow(env.master, 999999); - WasmHostFunctionsImpl hfs2(ac, bogusKeylet); - auto const notFound = hfs2.updateData(Slice(data.data(), data.size())); - if (BEAST_EXPECT(!notFound.has_value())) - BEAST_EXPECT( - notFound.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } void diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 4adb99a4472..1b95a0dbf38 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -453,11 +453,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) { return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto sle = ctx.view().peek(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - sle->setFieldVL(sfData, data); - ctx.view().update(sle); + data_ = Bytes(data.begin(), data.end()); return 0; } diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a6051bb1c74..a56c2379436 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -32,6 +32,7 @@ class WasmHostFunctionsImpl : public HostFunctions static int constexpr MAX_CACHE = 256; std::array, MAX_CACHE> cache; + std::optional data_; void const* rt_ = nullptr; @@ -75,6 +76,12 @@ class WasmHostFunctionsImpl : public HostFunctions return ctx.journal; } + std::optional const& + getData() const + { + return data_; + } + Expected getLedgerSqn() override; diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index f0389c06ad9..9ba02cc877f 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1279,6 +1279,12 @@ EscrowFinish::doApply() auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; + + if (auto const& data = ledgerDataProvider.getData(); data.has_value()) + { + slep->setFieldVL(sfData, makeSlice(*data)); + } + if (re.has_value()) { auto reValue = re.value().result; From 0d0e279ae226309746bb38591f72235b67fcd455 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:21:21 -0400 Subject: [PATCH 50/73] Float point Hostfunctions unit tests (#5656) * Added direct unittests for float hostfunctions --- include/xrpl/protocol/IOUAmount.h | 7 + src/libxrpl/protocol/IOUAmount.cpp | 10 +- src/test/app/WasmHostFuncImpl_test.cpp | 999 +++++++++++++++++++++--- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 103 ++- 4 files changed, 992 insertions(+), 127 deletions(-) diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index 93fba4150d7..c9838a6a804 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -58,6 +58,13 @@ class IOUAmount : private boost::totally_ordered, normalize(); public: + /* The range for the mantissa when normalized */ + static std::int64_t constexpr minMantissa = 1000000000000000ull; + static std::int64_t constexpr maxMantissa = 9999999999999999ull; + /* The range for the exponent when normalized */ + static int constexpr minExponent = -96; + static int constexpr maxExponent = 80; + IOUAmount() = default; explicit IOUAmount(Number const& other); IOUAmount(beast::Zero); diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 9bd1ceb5eb3..b4f3f18e2e1 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -58,13 +58,6 @@ setSTNumberSwitchover(bool v) *getStaticSTNumberSwitchover() = v; } -/* The range for the mantissa when normalized */ -static std::int64_t constexpr minMantissa = 1000000000000000ull; -static std::int64_t constexpr maxMantissa = 9999999999999999ull; -/* The range for the exponent when normalized */ -static int constexpr minExponent = -96; -static int constexpr maxExponent = 80; - IOUAmount IOUAmount::minPositiveAmount() { @@ -312,7 +305,8 @@ mulRatio( { if (!result) { - return IOUAmount(-minMantissa, minExponent); + return IOUAmount( + -IOUAmount::minMantissa, IOUAmount::minExponent); } // This subtraction cannot underflow because `result` is not zero return IOUAmount(result.mantissa() - 1, result.exponent()); diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp index b8d86f375bc..bab142391d1 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -323,44 +323,21 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const account = hfs.getTxField(sfAccount); BEAST_EXPECT( - account.has_value() && - std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + account && std::ranges::equal(*account, env.master.id())); auto const owner = hfs.getTxField(sfOwner); - BEAST_EXPECT( - owner.has_value() && - std::equal( - owner.value().begin(), - owner.value().end(), - env.master.id().data())); + BEAST_EXPECT(owner && std::ranges::equal(*owner, env.master.id())); auto const txType = hfs.getTxField(sfTransactionType); - BEAST_EXPECT( - txType.has_value() && - std::equal( - txType.value().begin(), - txType.value().end(), - toBytes(ttESCROW_FINISH).begin())); + BEAST_EXPECT(txType && *txType == toBytes(ttESCROW_FINISH)); auto const offerSeq = hfs.getTxField(sfOfferSequence); - BEAST_EXPECT( - offerSeq.has_value() && - std::equal( - offerSeq.value().begin(), - offerSeq.value().end(), - toBytes(env.seq(env.master)).begin())); + BEAST_EXPECT(offerSeq && *offerSeq == toBytes(env.seq(env.master))); auto const compAllowance = hfs.getTxField(sfComputationAllowance); std::uint32_t const expectedAllowance = 1000; BEAST_EXPECT( - compAllowance.has_value() && - std::equal( - compAllowance.value().begin(), - compAllowance.value().end(), - toBytes(expectedAllowance).begin())); + compAllowance && *compAllowance == toBytes(expectedAllowance)); auto const notPresent = hfs.getTxField(sfDestination); if (BEAST_EXPECT(!notPresent.has_value())) @@ -396,20 +373,10 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite auto const asset = hfs.getTxField(sfAsset); std::vector expectedAsset(20, 0); - BEAST_EXPECT( - asset.has_value() && - std::equal( - asset.value().begin(), - asset.value().end(), - expectedAsset.begin())); + BEAST_EXPECT(asset && *asset == expectedAsset); auto const asset2 = hfs.getTxField(sfAsset2); - BEAST_EXPECT( - asset2.has_value() && - std::equal( - asset2.value().begin(), - asset2.value().end(), - toBytes(Asset(iouAsset)).begin())); + BEAST_EXPECT(asset2 && *asset2 == toBytes(Asset(iouAsset))); } { @@ -426,19 +393,13 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite auto const asset = hfs.getTxField(sfAsset); if (BEAST_EXPECT(asset.has_value())) { - BEAST_EXPECT(std::equal( - asset.value().begin(), - asset.value().end(), - toBytes(Asset(iouAsset)).begin())); + BEAST_EXPECT(*asset == toBytes(Asset(iouAsset))); } auto const asset2 = hfs.getTxField(sfAsset2); if (BEAST_EXPECT(asset2.has_value())) { - BEAST_EXPECT(std::equal( - asset2.value().begin(), - asset2.value().end(), - toBytes(Asset(mptId)).begin())); + BEAST_EXPECT(*asset2 == toBytes(Asset(mptId))); } } } @@ -472,19 +433,13 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECTS( account.has_value(), std::to_string(static_cast(account.error())))) - BEAST_EXPECT(std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); // Should return the Amount field from the escrow ledger object auto const amountField = hfs.getCurrentLedgerObjField(sfAmount); if (BEAST_EXPECT(amountField.has_value())) { - BEAST_EXPECT(std::equal( - amountField.value().begin(), - amountField.value().end(), - toBytes(XRP(100)).begin())); + BEAST_EXPECT(*amountField == toBytes(XRP(100))); } // Should return nullopt for a field not present @@ -536,19 +491,13 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECTS( account.has_value(), std::to_string(static_cast(account.error())))) - BEAST_EXPECT(std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); // Should return the Balance field from the cached ledger object auto const balanceField = hfs.getLedgerObjField(1, sfBalance); if (BEAST_EXPECT(balanceField.has_value())) { - BEAST_EXPECT(std::equal( - balanceField.value().begin(), - balanceField.value().end(), - toBytes(env.balance(env.master)).begin())); + BEAST_EXPECT(*balanceField == toBytes(env.balance(env.master))); } // Should return error for slot out of range @@ -633,10 +582,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite account.has_value(), std::to_string(static_cast(account.error())))) { - BEAST_EXPECT(std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); } } @@ -744,10 +690,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite signerQuorum.has_value(), std::to_string(static_cast(signerQuorum.error())))) { - BEAST_EXPECT(std::equal( - signerQuorum.value().begin(), - signerQuorum.value().end(), - toBytes(static_cast(2)).begin())); + BEAST_EXPECT(*signerQuorum == toBytes(static_cast(2))); } auto expectError = [&](std::vector const& locatorVec, @@ -848,10 +791,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite result.has_value(), std::to_string(static_cast(result.error())))) { - BEAST_EXPECT(std::equal( - result.value().begin(), - result.value().end(), - alice.id().data())); + BEAST_EXPECT(std::ranges::equal(*result, alice.id())); } } @@ -867,10 +807,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite result2.has_value(), std::to_string(static_cast(result2.error())))) { - BEAST_EXPECT(std::equal( - result2.value().begin(), - result2.value().end(), - becky.id().data())); + BEAST_EXPECT(std::ranges::equal(*result2, becky.id())); } } @@ -888,10 +825,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite { // Should be 1 auto const expected = toBytes(static_cast(1)); - BEAST_EXPECT(std::equal( - weightResult.value().begin(), - weightResult.value().end(), - expected.begin())); + BEAST_EXPECT(*weightResult == expected); } } @@ -907,10 +841,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite std::to_string(static_cast(quorumResult.error())))) { auto const expected = toBytes(static_cast(2)); - BEAST_EXPECT(std::equal( - quorumResult.value().begin(), - quorumResult.value().end(), - expected.begin())); + BEAST_EXPECT(*quorumResult == expected); } } @@ -1499,8 +1430,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite auto compareKeylet = [](std::vector const& bytes, Keylet const& kl) { - return bytes.size() == kl.key.size() && - std::equal(bytes.begin(), bytes.end(), kl.key.begin()); + return std::ranges::equal(bytes, kl.key); }; // Lambda to compare a Bytes (std::vector) to a keylet #define COMPARE_KEYLET(hfsFunc, keyletFunc, ...) \ @@ -1755,8 +1685,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.getNFT(alice.id(), nftId); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(std::equal( - result.value().begin(), result.value().end(), uri.data())); + BEAST_EXPECT(std::ranges::equal(*result, uri)); } // Should fail for invalid account @@ -1816,10 +1745,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.getNFTIssuer(nftId); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(std::equal( - result.value().begin(), - result.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*result, env.master.id())); } // Should fail for zero NFT id @@ -2010,6 +1936,886 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); } + // clang-format off + + int const normalExp = 15; + + Bytes const floatIntMin = {0x99, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // -2^63 + Bytes const floatIntZero = {0xd8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 + Bytes const floatIntMax = {0xd9, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // 2^63-1 + Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64 + Bytes const floatMaxExp = {0xEC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(80+15) + Bytes const floatPreMaxExp = {0xEC, 0x03, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(79+15) + Bytes const floatMinusMaxExp = {0xAC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1e(80+15) + Bytes const floatMaxIOU = {0xEC, 0x63, 0x86, 0xF2, 0x6F, 0xC0, 0xFF, 0xFF}; // 1e(81+15)-1 + Bytes const floatMinExp = {0xC0, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e-96 + Bytes const float1 = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1 + Bytes const floatMinus1 = {0x94, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1 + Bytes const float1More = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x01}; // 1.000 000 000 000 001 + Bytes const float2 = {0xD4, 0x87, 0x1A, 0xFD, 0x49, 0x8D, 0x00, 0x00}; // 2 + Bytes const float10 = {0xD4, 0xC3, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 10 + Bytes const floatMaxXRP = {0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 + Bytes const floatMaxMPT = {0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 + + std::string const invalid = "invalid_data"; + + // clang-format on + + void + testFloatTrace() + { + testcase("FloatTrace"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace float"; + + { + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); + BEAST_EXPECT( + result && + *result == + msg.size() + 14 /* error msg size*/ + invalid.size() * 2); + } + + { + auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + BEAST_EXPECT( + result && *result == msg.size() + 19 /* string represenation*/); + } + } + + void + testFloatFromInt() + { + testcase("FloatFromInt"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = hfs.floatFromInt(0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::max(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMax); + } + } + + void + testFloatFromUint() + { + testcase("FloatFromUint"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatFromUint(0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::max(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatUIntMax); + } + } + + void + testFloatSet() + { + testcase("FloatSet"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatSet(1, 0, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSet(1, 0, 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatSet(1, Number::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::minExponent + normalExp - 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); + } + + { + auto const result = + hfs.floatSet(-1, IOUAmount::maxExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinusMaxExp); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp - 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); + } + + { + auto const result = + hfs.floatSet(IOUAmount::maxMantissa, IOUAmount::maxExponent, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::minExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinExp); + } + + { + auto const result = hfs.floatSet(10, -1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + } + + void + testFloatCompare() + { + testcase("FloatCompare"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatCompare(Slice(), Slice()); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto x = floatMaxExp; + // exp = 81 + 97 = 178 + x[1] |= 0x80; + x[1] &= 0xBF; + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(floatMaxExp)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatCompare( + makeSlice(floatIntMin), makeSlice(floatIntZero)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 2); + } + + { + auto const result = hfs.floatCompare( + makeSlice(floatIntMax), makeSlice(floatIntZero)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 1); + } + + { + auto const result = + hfs.floatCompare(makeSlice(float1), makeSlice(float1)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 0); + } + } + + void + testFloatAdd() + { + testcase("floatAdd"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatAdd(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatAdd(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxIOU), makeSlice(floatMaxExp), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatAdd( + makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatIntMax), makeSlice(floatIntMin), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + } + + void + testFloatSubtract() + { + testcase("floatSubtract"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatSubtract(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSubtract(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatSubtract(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatMaxIOU), makeSlice(floatMinusMaxExp), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatIntZero), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinus1); + } + } + + void + testFloatMultiply() + { + testcase("floatMultiply"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatMultiply(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatMultiply(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatMultiply(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatMaxIOU), makeSlice(float1More), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatMultiply(makeSlice(float1), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatIntZero), makeSlice(floatMaxIOU), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(float10), makeSlice(floatPreMaxExp), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); + } + } + + void + testFloatDivide() + { + testcase("floatDivide"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatDivide(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatDivide(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatDivide(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatDivide(makeSlice(float1), makeSlice(floatIntZero), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const y = hfs.floatSet( + IOUAmount::maxMantissa, -normalExp - 1, 0); // 0.9999999... + if (BEAST_EXPECT(y)) + { + auto const result = + hfs.floatDivide(makeSlice(floatMaxIOU), makeSlice(*y), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + } + + { + auto const result = + hfs.floatDivide(makeSlice(floatIntZero), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatDivide(makeSlice(floatMaxExp), makeSlice(float10), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); + } + } + + void + testFloatRoot() + { + testcase("floatRoot"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatRoot(Slice(), 2, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(invalid), 3, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(float1), -2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(floatIntZero), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = hfs.floatRoot(makeSlice(floatMaxIOU), 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float10); + } + } + + { + auto const x = hfs.floatSet(1000, 0, 0); // 1000 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 3, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float10); + } + } + + { + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = hfs.floatSet(1, -1, 0); // 0.1 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatPower() + { + testcase("floatPower"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatPower(Slice(), 2, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(invalid), 3, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(float1), -2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatPower(makeSlice(floatMaxIOU), 40000, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatPower(makeSlice(float10), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *x); + } + } + + { + auto const x = hfs.floatSet(1, -1, 0); // 0.1 + auto const y = hfs.floatSet(1, -2, 0); // 0.01 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatPower(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatLog() + { + testcase("floatLog"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatLog(Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatLog(makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const x = + hfs.floatSet(9'500'000'000'000'001, -14, 0); // almost 80+15 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatLog(makeSlice(floatMaxExp), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *x); + } + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float2); + } + } + + { + auto const x = hfs.floatSet(1000, 0, 0); // 1000 + auto const y = hfs.floatSet(3, 0, 0); // 0.1 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + + { + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = + hfs.floatSet(-1999999993734431, -15, 0); // almost -2 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatNonIOU() + { + testcase("Float Xrp+Mpt"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const y = hfs.floatSet(20, 0, 0); + if (!BEAST_EXPECT(y)) + return; + + Bytes x(8); + + // XRP + memset(x.data(), 0, x.size()); + x[0] = 0x40; + x[7] = 10; + + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT(result && *result == 0); + } + + { + auto const result = + hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); + if (BEAST_EXPECT(result)) + { + auto const result2 = + hfs.floatCompare(makeSlice(*result), makeSlice(*y)); + BEAST_EXPECT(result2 && *result2 == 0); + } + } + + // underflow + x[7] = 1; + { + auto const result = + hfs.floatDivide(makeSlice(x), makeSlice(float1More), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatMaxXRP), makeSlice(floatIntZero), 0); + if (BEAST_EXPECT(result)) + { + auto const result2 = hfs.floatCompare( + makeSlice(*result), makeSlice(floatIntZero)); + BEAST_EXPECT(result2 && *result2 == 0); + } + } + + // overflow + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxXRP), makeSlice(float1), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + // MPT + memset(x.data(), 0, x.size()); + x[0] = 0x60; + x[7] = 10; + + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT(result && *result == 0); + } + + { + auto const result = + hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); + if (BEAST_EXPECT(result)) + { + auto const result2 = + hfs.floatCompare(makeSlice(*result), makeSlice(*y)); + BEAST_EXPECT(result2 && *result2 == 0); + } + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxMPT), makeSlice(float1), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + } + + void + testFloats() + { + testFloatFromInt(); + testFloatFromUint(); + testFloatSet(); + testFloatCompare(); + testFloatAdd(); + testFloatSubtract(); + testFloatMultiply(); + testFloatDivide(); + testFloatRoot(); + testFloatPower(); + testFloatLog(); + testFloatNonIOU(); + testFloatTrace(); + } + void run() override { @@ -2045,6 +2851,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite testGetNFTSerial(); testTrace(); testTraceNum(); + testFloats(); } }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 1b95a0dbf38..ed5417ce0fa 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -825,9 +825,11 @@ WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) class Number2 : public Number { - bool good_; - +public: enum Issue { XRP, MPT, IOU }; + +protected: + bool good_; Issue issue_; public: @@ -847,8 +849,9 @@ class Number2 : public Number int32_t const e = static_cast((v >> (64 - 10)) & ((1ull << 8) - 1)); int64_t const m = neg * (v & ((1ull << 54) - 1)); - x = !m ? Number() : Number(m, e - 97); - if (m && (x.exponent() > 80 || x.exponent() < -96)) + x = !m || (e < 1) ? Number() + : Number(m, e + IOUAmount::minExponent - 1); + if (m && (x.exponent() > IOUAmount::maxExponent)) return; // invalid number issue_ = IOU; } @@ -871,6 +874,10 @@ class Number2 : public Number good_ = true; } + Number2() : Number(), good_(true), issue_(IOU) + { + } + Number2(int64_t x) : Number(x), good_(true), issue_(IOU) { } @@ -904,6 +911,18 @@ class Number2 : public Number return good_; } + Issue + getIssue() const + { + return issue_; + } + + void + setIssue(Issue i) + { + issue_ = i; + } + Expected toBytes() const { @@ -917,18 +936,24 @@ class Number2 : public Number { if (exponent() != std::numeric_limits::lowest()) return Unexpected( - HostFunctionError::FLOAT_COMPUTATION_ERROR); + HostFunctionError:: + FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } - else if (exponent() > 80 || exponent() < -96) + else if (exponent() > IOUAmount::maxExponent) return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (exponent() < IOUAmount::minExponent) + return Number2().toBytes(); uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); if (absM > ((1ull << 54) - 1)) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + return Unexpected( + HostFunctionError:: + FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE v |= absM; - int const e = (!mantissa() ? 0 : exponent()) + 97; + int const e = + (!mantissa() ? 0 : exponent()) - IOUAmount::minExponent + 1; v |= ((uint64_t)e) << 54; } else if (issue_ == MPT) @@ -950,6 +975,16 @@ class Number2 : public Number Serializer msg; msg.add64(v); auto const data = msg.getData(); + +#ifdef DEBUG_OUTPUT + std::cout << "m: " << std::setw(20) << mantissa() + << ", e: " << std::setw(12) << exponent() << ", hex: "; + std::cout << std::hex << std::uppercase << std::setfill('0'); + for (auto const& c : data) + std::cout << std::setw(2) << (unsigned)c << " "; + std::cout << std::dec << std::setfill(' ') << std::endl; +#endif + return data; } @@ -958,7 +993,7 @@ class Number2 : public Number toUInt(unsigned bits) const { if (bits >= sizeof(uint64_t) * 8) - return std::numeric_limits::max(); + return std::numeric_limits::max(); // LCOV_EXCL_LINE uint64_t maxV = (1ull << bits) - 1; uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); @@ -969,8 +1004,9 @@ class Number2 : public Number { for (int i = 0; i > exponent(); --i) { + // underflow if (absM < 10) - return std::numeric_limits::max(); // underflow + return std::numeric_limits::max(); absM /= 10; } } @@ -978,8 +1014,9 @@ class Number2 : public Number { for (int i = 0; i < exponent(); ++i) { + // overflow if (absM > maxV / 10) - return std::numeric_limits::max(); // overflow + return std::numeric_limits::max(); absM *= 10; } } @@ -1041,15 +1078,14 @@ floatFromIntImpl(int64_t x, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 num(x); - if (!num) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - return num.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1062,15 +1098,14 @@ floatFromUintImpl(uint64_t x, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 num(x); - if (!num) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - return num.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1082,8 +1117,6 @@ floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 num(mantissa, exponent); - if (!num) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); return num.toBytes(); } catch (...) @@ -1105,10 +1138,12 @@ floatCompareImpl(Slice const& x, Slice const& y) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); return xx < yy ? 2 : (xx == yy ? 0 : 1); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1127,12 +1162,15 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx + yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1150,12 +1188,15 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx - yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1173,12 +1214,15 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx * yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1196,6 +1240,7 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx / yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } catch (...) @@ -1209,6 +1254,9 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) { try { + if (n < 1) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + SetRound rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -1216,14 +1264,17 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) Number2 xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 const res(root(xx, n)); + Number2 res(root(xx, n)); + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1231,6 +1282,9 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) { try { + if (n < 0) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + SetRound rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -1241,8 +1295,8 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) if (xx == Number() && !n) return Unexpected(HostFunctionError::INVALID_PARAMS); - Number2 const res(power(xx, n, 1)); - + Number2 res(power(xx, n, 1)); + res.setIssue(xx.getIssue()); return res.toBytes(); } catch (...) @@ -1263,14 +1317,17 @@ floatLogImpl(Slice const& x, int32_t mode) Number2 xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 const res(lg(xx)); + Number2 res(lg(xx)); + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } } // namespace ripple From 1d141bf2e834e85acd312aa5c64ec2115d16c221 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 14 Aug 2025 11:46:10 -0400 Subject: [PATCH 51/73] chore: move WASM files to separate folder (#5666) --- src/test/app/Escrow_test.cpp | 2 +- .../{WasmHostFuncImpl_test.cpp => HostFuncImpl_test.cpp} | 6 +++--- src/test/app/TestHostFunctions.h | 4 ++-- src/test/app/Wasm_test.cpp | 4 ++-- src/xrpld/app/tx/detail/Escrow.cpp | 4 ++-- src/xrpld/app/{misc/WasmHostFunc.h => wasm/HostFunc.h} | 2 +- .../app/{misc/WasmHostFuncImpl.h => wasm/HostFuncImpl.h} | 2 +- .../{misc/WasmHostFuncWrapper.h => wasm/HostFuncWrapper.h} | 2 +- .../app/{misc/WasmParamsHelper.h => wasm/ParamsHelper.h} | 0 src/xrpld/app/{misc => wasm}/WamrVM.h | 2 +- src/xrpld/app/{misc => wasm}/WasmVM.h | 2 +- .../WasmHostFuncImpl.cpp => wasm/detail/HostFuncImpl.cpp} | 2 +- .../detail/HostFuncWrapper.cpp} | 6 +++--- src/xrpld/app/{misc => wasm/detail}/WamrVM.cpp | 2 +- src/xrpld/app/{misc => wasm/detail}/WasmVM.cpp | 6 +++--- 15 files changed, 23 insertions(+), 23 deletions(-) rename src/test/app/{WasmHostFuncImpl_test.cpp => HostFuncImpl_test.cpp} (99%) rename src/xrpld/app/{misc/WasmHostFunc.h => wasm/HostFunc.h} (99%) rename src/xrpld/app/{misc/WasmHostFuncImpl.h => wasm/HostFuncImpl.h} (99%) rename src/xrpld/app/{misc/WasmHostFuncWrapper.h => wasm/HostFuncWrapper.h} (99%) rename src/xrpld/app/{misc/WasmParamsHelper.h => wasm/ParamsHelper.h} (100%) rename src/xrpld/app/{misc => wasm}/WamrVM.h (99%) rename src/xrpld/app/{misc => wasm}/WasmVM.h (98%) rename src/xrpld/app/{misc/WasmHostFuncImpl.cpp => wasm/detail/HostFuncImpl.cpp} (99%) rename src/xrpld/app/{misc/WasmHostFuncWrapper.cpp => wasm/detail/HostFuncWrapper.cpp} (99%) rename src/xrpld/app/{misc => wasm/detail}/WamrVM.cpp (99%) rename src/xrpld/app/{misc => wasm/detail}/WasmVM.cpp (98%) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 640743a8699..c07f3edd61c 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -20,8 +20,8 @@ #include #include -#include #include +#include #include #include diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp similarity index 99% rename from src/test/app/WasmHostFuncImpl_test.cpp rename to src/test/app/HostFuncImpl_test.cpp index bab142391d1..980d8d2b436 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -19,7 +19,7 @@ #include -#include +#include namespace ripple { namespace test { @@ -86,7 +86,7 @@ createApplyContext( return ac; } -struct WasmHostFuncImpl_test : public beast::unit_test::suite +struct HostFuncImpl_test : public beast::unit_test::suite { void testGetLedgerSqn() @@ -2855,7 +2855,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite } }; -BEAST_DEFINE_TESTSUITE(WasmHostFuncImpl, app, ripple); +BEAST_DEFINE_TESTSUITE(HostFuncImpl, app, ripple); } // namespace test } // namespace ripple diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 562d2091a07..2d7793463fd 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -21,9 +21,9 @@ #include #include -#include -#include #include +#include +#include #include namespace ripple { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c8db385c670..002dc22ac4f 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -23,8 +23,8 @@ #include -#include -#include +#include +#include namespace ripple { namespace test { diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 9ba02cc877f..4b5a92e8c2b 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -19,10 +19,10 @@ #include #include -#include -#include #include #include +#include +#include #include #include #include diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/wasm/HostFunc.h similarity index 99% rename from src/xrpld/app/misc/WasmHostFunc.h rename to src/xrpld/app/wasm/HostFunc.h index cd1848a5227..865ce49fb36 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncImpl.h rename to src/xrpld/app/wasm/HostFuncImpl.h index a56c2379436..4067afccb47 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -19,8 +19,8 @@ #pragma once -#include #include +#include namespace ripple { class WasmHostFunctionsImpl : public HostFunctions diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncWrapper.h rename to src/xrpld/app/wasm/HostFuncWrapper.h index aac8ba387ea..a6cbd91b188 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -19,7 +19,7 @@ #pragma once -#include +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h similarity index 100% rename from src/xrpld/app/misc/WasmParamsHelper.h rename to src/xrpld/app/wasm/ParamsHelper.h diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/wasm/WamrVM.h similarity index 99% rename from src/xrpld/app/misc/WamrVM.h rename to src/xrpld/app/wasm/WamrVM.h index 3be35c673ee..a32257feb6c 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/wasm/WamrVM.h @@ -18,7 +18,7 @@ //============================================================================== #pragma once -#include +#include #include #include diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h similarity index 98% rename from src/xrpld/app/misc/WasmVM.h rename to src/xrpld/app/wasm/WasmVM.h index d4a9072740a..32eb239f609 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -18,7 +18,7 @@ //============================================================================== #pragma once -#include +#include #include diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncImpl.cpp rename to src/xrpld/app/wasm/detail/HostFuncImpl.cpp index ed5417ce0fa..d619c6e58f4 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -18,8 +18,8 @@ //============================================================================== #include -#include #include +#include #include #include diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncWrapper.cpp rename to src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 6fb7b0c58c0..20b52e418f8 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include -#include -#include #include +#include +#include +#include #include #include diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp similarity index 99% rename from src/xrpld/app/misc/WamrVM.cpp rename to src/xrpld/app/wasm/detail/WamrVM.cpp index 3f0bd1d95fb..d7cf9aa78da 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -17,7 +17,7 @@ */ //============================================================================== -#include +#include #include diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp similarity index 98% rename from src/xrpld/app/misc/WasmVM.cpp rename to src/xrpld/app/wasm/detail/WasmVM.cpp index d815c9939d1..7d20f67fa12 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -21,9 +21,9 @@ // #define DEBUG_OUTPUT 1 #endif -#include -#include -#include +#include +#include +#include #include #include From b0a1ad3b06f5c72a6803a476f5389cf2c2da29b3 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:59:55 -0400 Subject: [PATCH 52/73] Disable float point instructions (#5679) --- external/wamr/conanfile.py | 10 +- external/wamr/patches/ripp_metering.patch | 217 +++++++++++++++++++++- src/test/app/Wasm_test.cpp | 31 ++++ src/test/app/wasm_fixtures/fixtures.cpp | 12 ++ src/test/app/wasm_fixtures/fixtures.h | 2 + 5 files changed, 264 insertions(+), 8 deletions(-) diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index eed674adefc..429c509795f 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -55,13 +55,15 @@ def generate(self): tc.variables["WAMR_BUILD_AOT"] = 0 tc.variables["WAMR_BUILD_JIT"] = 0 tc.variables["WAMR_BUILD_FAST_JIT"] = 0 + tc.variables["WAMR_BUILD_SIMD"] = 0 + tc.variables["WAMR_BUILD_LIB_PTHREAD"] = 0 + tc.variables["WAMR_BUILD_LIB_WASI_THREADS"] = 0 + tc.variables["WAMR_BUILD_TAIL_CALL"] = 1 + tc.variables["WAMR_BUILD_BULK_MEMORY"] = 0 tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" - # tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 - # ll_dep = self.dependencies["llvm"] - # self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") - # tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.generate() # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 9749d475da9..2e8ec70d7a8 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -462,7 +462,7 @@ index edc473f2..55071613 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 36d4538f..912be3d8 100644 +index 36d4538f..4d03603e 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -90,14 +90,14 @@ typedef float64 CellType_F64; @@ -539,7 +539,216 @@ index 36d4538f..912be3d8 100644 #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 -@@ -7672,6 +7670,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -4012,7 +4010,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + + /* constant instructions */ ++#ifdef ENABLE_FLOAT_POINT + HANDLE_OP(WASM_OP_F64_CONST) ++#else ++ HANDLE_OP(WASM_OP_F64_CONST) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + HANDLE_OP(WASM_OP_I64_CONST) + { + uint8 *orig_ip = frame_ip; +@@ -4025,7 +4031,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ HANDLE_OP(WASM_OP_F32_CONST) ++#else + HANDLE_OP(WASM_OP_F32_CONST) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + HANDLE_OP(WASM_OP_I32_CONST) + { + uint8 *orig_ip = frame_ip; +@@ -4172,6 +4186,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + /* comparison instructions of f32 */ + HANDLE_OP(WASM_OP_F32_EQ) + { +@@ -4245,6 +4261,24 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + DEF_OP_CMP(float64, F64, >=); + HANDLE_OP_END(); + } ++#else ++ HANDLE_OP(WASM_OP_F32_EQ) ++ HANDLE_OP(WASM_OP_F32_NE) ++ HANDLE_OP(WASM_OP_F32_LT) ++ HANDLE_OP(WASM_OP_F32_GT) ++ HANDLE_OP(WASM_OP_F32_LE) ++ HANDLE_OP(WASM_OP_F32_GE) ++ HANDLE_OP(WASM_OP_F64_EQ) ++ HANDLE_OP(WASM_OP_F64_NE) ++ HANDLE_OP(WASM_OP_F64_LT) ++ HANDLE_OP(WASM_OP_F64_GT) ++ HANDLE_OP(WASM_OP_F64_LE) ++ HANDLE_OP(WASM_OP_F64_GE) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + + /* numeric instructions of i32 */ + HANDLE_OP(WASM_OP_I32_CLZ) +@@ -4573,6 +4607,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + /* numeric instructions of f32 */ + HANDLE_OP(WASM_OP_F32_ABS) + { +@@ -4784,6 +4820,43 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ ++ HANDLE_OP(WASM_OP_F32_ABS) ++ HANDLE_OP(WASM_OP_F32_NEG) ++ HANDLE_OP(WASM_OP_F32_CEIL) ++ HANDLE_OP(WASM_OP_F32_FLOOR) ++ HANDLE_OP(WASM_OP_F32_TRUNC) ++ HANDLE_OP(WASM_OP_F32_NEAREST) ++ HANDLE_OP(WASM_OP_F32_SQRT) ++ HANDLE_OP(WASM_OP_F32_ADD) ++ HANDLE_OP(WASM_OP_F32_SUB) ++ HANDLE_OP(WASM_OP_F32_MUL) ++ HANDLE_OP(WASM_OP_F32_DIV) ++ HANDLE_OP(WASM_OP_F32_MIN) ++ HANDLE_OP(WASM_OP_F32_MAX) ++ HANDLE_OP(WASM_OP_F32_COPYSIGN) ++ HANDLE_OP(WASM_OP_F64_ABS) ++ HANDLE_OP(WASM_OP_F64_NEG) ++ HANDLE_OP(WASM_OP_F64_CEIL) ++ HANDLE_OP(WASM_OP_F64_FLOOR) ++ HANDLE_OP(WASM_OP_F64_TRUNC) ++ HANDLE_OP(WASM_OP_F64_NEAREST) ++ HANDLE_OP(WASM_OP_F64_SQRT) ++ HANDLE_OP(WASM_OP_F64_ADD) ++ HANDLE_OP(WASM_OP_F64_SUB) ++ HANDLE_OP(WASM_OP_F64_MUL) ++ HANDLE_OP(WASM_OP_F64_DIV) ++ HANDLE_OP(WASM_OP_F64_MIN) ++ HANDLE_OP(WASM_OP_F64_MAX) ++ HANDLE_OP(WASM_OP_F64_COPYSIGN) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + /* conversions of i32 */ + HANDLE_OP(WASM_OP_I32_WRAP_I64) + { +@@ -4792,6 +4865,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++ ++#ifdef ENABLE_FLOAT_POINT + HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) + { + /* We don't use INT32_MIN/INT32_MAX/UINT32_MIN/UINT32_MAX, +@@ -4821,6 +4896,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ ++ HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) ++ HANDLE_OP(WASM_OP_I32_TRUNC_U_F32) ++ HANDLE_OP(WASM_OP_I32_TRUNC_S_F64) ++ HANDLE_OP(WASM_OP_I32_TRUNC_U_F64) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + /* conversions of i64 */ + HANDLE_OP(WASM_OP_I64_EXTEND_S_I32) + { +@@ -4834,6 +4922,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) + { + DEF_OP_TRUNC_F32(-9223373136366403584.0f, +@@ -4937,6 +5027,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) ++ HANDLE_OP(WASM_OP_I64_TRUNC_U_F32) ++ HANDLE_OP(WASM_OP_I64_TRUNC_S_F64) ++ HANDLE_OP(WASM_OP_I64_TRUNC_U_F64) ++ HANDLE_OP(WASM_OP_F32_CONVERT_S_I32) ++ HANDLE_OP(WASM_OP_F32_CONVERT_U_I32) ++ HANDLE_OP(WASM_OP_F32_CONVERT_S_I64) ++ HANDLE_OP(WASM_OP_F32_CONVERT_U_I64) ++ HANDLE_OP(WASM_OP_F32_DEMOTE_F64) ++ HANDLE_OP(WASM_OP_F64_CONVERT_S_I32) ++ HANDLE_OP(WASM_OP_F64_CONVERT_U_I32) ++ HANDLE_OP(WASM_OP_F64_CONVERT_S_I64) ++ HANDLE_OP(WASM_OP_F64_CONVERT_U_I64) ++ HANDLE_OP(WASM_OP_F64_PROMOTE_F32) ++ HANDLE_OP(WASM_OP_I32_REINTERPRET_F32) ++ HANDLE_OP(WASM_OP_F32_REINTERPRET_I32) ++ HANDLE_OP(WASM_OP_I64_REINTERPRET_F64) ++ HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + HANDLE_OP(EXT_OP_COPY_STACK_TOP) + { + addr1 = GET_OFFSET(); +@@ -5108,6 +5224,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + { + GET_OPCODE(); + switch (opcode) { ++ ++#ifdef ENABLE_FLOAT_POINT + case WASM_OP_I32_TRUNC_SAT_S_F32: + DEF_OP_TRUNC_SAT_F32(-2147483904.0f, 2147483648.0f, + true, true); +@@ -5140,6 +5258,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + DEF_OP_TRUNC_SAT_F64(-1.0, 18446744073709551616.0, + false, false); + break; ++ ++#endif ++ + #if WASM_ENABLE_BULK_MEMORY != 0 + case WASM_OP_MEMORY_INIT: + { +@@ -7672,6 +7793,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, { wasm_interp_call_func_native(module, exec_env, cur_func, prev_frame); @@ -547,7 +756,7 @@ index 36d4538f..912be3d8 100644 } #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7784,6 +7783,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7784,6 +7906,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); @@ -559,7 +768,7 @@ index 36d4538f..912be3d8 100644 if (!prev_frame->ip) /* Called from native. */ return; -@@ -7812,6 +7816,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7812,6 +7939,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 002dc22ac4f..b423153a8a3 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -677,6 +677,35 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(re->result); } + void + testDisabledFloat() + { + testcase("disabled float"); + + using namespace test::jtx; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(disabledFloatHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestHostFunctions hfs(env, 0); + + { + // f32 set constant, opcode disabled exception + auto const re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + } + + { + // f32 add, can't create module exception + wasm[0x117] = 0x92; + auto const re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + } + } + void run() override { @@ -704,6 +733,8 @@ struct Wasm_test : public beast::unit_test::suite testCodecovWasm(); + testDisabledFloat(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index eb3e894d91f..4a8e0e73855 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12410,3 +12410,15 @@ extern std::string const floatHex = "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" "2d74797065732b087369676e2d657874"; + +extern std::string const disabledFloatHex = + "0061736d010000000108026000006000017f03030200010503010002063e" + "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" + "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" + "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300000666696e69736800010362756603000c5f5f64736f5f68616e" + "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" + "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" + "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" + "090a150202000b100043000000c54300200045921a41010b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 3ffb41caf9a..948646404ae 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -62,3 +62,5 @@ extern std::string const keyletHostFunctions; extern std::string const codecovWasm; extern std::string const floatHex; + +extern std::string const disabledFloatHex; From 647b47567e6be5ecc2ed647398fb32552951ccf1 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 15 Aug 2025 09:51:40 -0400 Subject: [PATCH 53/73] Fix float point binary format (#5688) --- src/test/app/HostFuncImpl_test.cpp | 69 ++------ src/test/app/Wasm_test.cpp | 17 +- src/test/app/wasm_fixtures/fixtures.cpp | 43 +++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 193 ++++++--------------- 5 files changed, 132 insertions(+), 192 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 980d8d2b436..bd8ef8a3792 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1941,7 +1941,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite int const normalExp = 15; Bytes const floatIntMin = {0x99, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // -2^63 - Bytes const floatIntZero = {0xd8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 + Bytes const floatIntZero = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 Bytes const floatIntMax = {0xd9, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // 2^63-1 Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64 Bytes const floatMaxExp = {0xEC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(80+15) @@ -1954,8 +1954,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Bytes const float1More = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x01}; // 1.000 000 000 000 001 Bytes const float2 = {0xD4, 0x87, 0x1A, 0xFD, 0x49, 0x8D, 0x00, 0x00}; // 2 Bytes const float10 = {0xD4, 0xC3, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 10 - Bytes const floatMaxXRP = {0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 - Bytes const floatMaxMPT = {0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 + Bytes const floatInvalidZero = {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // INVALID std::string const invalid = "invalid_data"; @@ -2187,6 +2186,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } + { + auto const result = + hfs.floatCompare(makeSlice(floatInvalidZero), Slice()); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + { auto const result = hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); @@ -2723,48 +2730,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float10)); - BEAST_EXPECT(result && *result == 0); - } - - { - auto const result = - hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); - if (BEAST_EXPECT(result)) - { - auto const result2 = - hfs.floatCompare(makeSlice(*result), makeSlice(*y)); - BEAST_EXPECT(result2 && *result2 == 0); - } - } - - // underflow - x[7] = 1; - { - auto const result = - hfs.floatDivide(makeSlice(x), makeSlice(float1More), 0); BEAST_EXPECT( !result && - result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); - } - - { - auto const result = hfs.floatMultiply( - makeSlice(floatMaxXRP), makeSlice(floatIntZero), 0); - if (BEAST_EXPECT(result)) - { - auto const result2 = hfs.floatCompare( - makeSlice(*result), makeSlice(floatIntZero)); - BEAST_EXPECT(result2 && *result2 == 0); - } + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } - // overflow { auto const result = - hfs.floatAdd(makeSlice(floatMaxXRP), makeSlice(float1), 0); + hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); BEAST_EXPECT( !result && - result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } // MPT @@ -2775,26 +2751,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float10)); - BEAST_EXPECT(result && *result == 0); - } - - { - auto const result = - hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); - if (BEAST_EXPECT(result)) - { - auto const result2 = - hfs.floatCompare(makeSlice(*result), makeSlice(*y)); - BEAST_EXPECT(result2 && *result2 == 0); - } + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = - hfs.floatAdd(makeSlice(floatMaxMPT), makeSlice(float1), 0); + hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); BEAST_EXPECT( !result && - result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index b423153a8a3..4fb30242fb0 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -546,10 +546,18 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hf(env, 0); auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result && (re->cost == 91'412)); - } + BEAST_EXPECT(re && re->result && (re->cost == 91'412)); + env.close(); + } + + { + std::string const wasmHex = float0Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions hf(env, 0); + auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + BEAST_EXPECT(re && re->result && (re->cost == 6'533)); env.close(); } } @@ -732,7 +740,6 @@ struct Wasm_test : public beast::unit_test::suite testFloat(); testCodecovWasm(); - testDisabledFloat(); // perfTest(); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 4a8e0e73855..3424de7006c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12411,6 +12411,49 @@ extern std::string const floatHex = "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" "2d74797065732b087369676e2d657874"; +extern std::string const float0Hex = + "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" + "7f7f7f7f7f7f7f017f60047f7f7f7f017f6000017f025f0408686f73745f" + "6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f" + "6d5f696e74000108686f73745f6c69620e666c6f61745f73756274726163" + "74000208686f73745f6c69620d666c6f61745f636f6d7061726500030302" + "010405030100110619037f01418080c0000b7f00419281c0000b7f0041a0" + "81c0000b072e04066d656d6f727902000666696e69736800040a5f5f6461" + "74615f656e6403010b5f5f686561705f6261736503020abe0201bb020101" + "7f23808080800041206b2200248080808000418080c08000411541004100" + "41001080808080001a200042003703084200200041086a41084100108180" + "8080001a20004200370310420a200041106a410841001081808080001a20" + "0042003703180240200041106a4108200041106a4108200041186a410841" + "001082808080004108460d00419580c08000411541004100410010808080" + "80001a0b02400240200041086a4108200041186a41081083808080000d00" + "41aa80c0800041174100410041001080808080001a0c010b41c180c08000" + "41164100410041001080808080001a0b02400240200041086a410841d780" + "c0800041081083808080000d0041df80c08000411a410041004100108080" + "8080001a0c010b41f980c0800041194100410041001080808080001a0b20" + "0041206a24808080800041010b0b9c010100418080c0000b92010a242424" + "20746573745f666c6f61745f30202424242020666c6f61742031302d3130" + "3a206661696c65642020666c6f6174203020636f6d706172653a20676f6f" + "642020666c6f6174203020636f6d706172653a2062616480000000000000" + "002020464c4f41545f5a45524f20636f6d706172653a20676f6f64202046" + "4c4f41545f5a45524f20636f6d706172653a20626164009502046e616d65" + "001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e3878" + "72706c5f73746434686f7374357472616365313768616338383262323664" + "656162656436364501355f5a4e387872706c5f73746434686f7374313466" + "6c6f61745f66726f6d5f696e743137683032343066386533613839643139" + "39654502355f5a4e387872706c5f73746434686f73743134666c6f61745f" + "737562747261637431376864363430633135323334353432393563450334" + "5f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d7061" + "72653137683663386465656231323864393638386645040666696e697368" + "071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461" + "7461004d0970726f64756365727302086c616e6775616765010452757374" + "000c70726f6365737365642d6279010572757374631d312e38392e302028" + "32393438333838336520323032352d30382d3034290094010f7461726765" + "745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b" + "2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665" + "726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f" + "62616c732b136e6f6e7472617070696e672d6670746f696e742b0f726566" + "6572656e63652d74797065732b087369676e2d657874"; + extern std::string const disabledFloatHex = "0061736d010000000108026000006000017f03030200010503010002063e" "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 948646404ae..f3fdf66aaef 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -63,4 +63,6 @@ extern std::string const codecovWasm; extern std::string const floatHex; +extern std::string const float0Hex; + extern std::string const disabledFloatHex; diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index d619c6e58f4..441caddd77b 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -825,84 +825,66 @@ WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) class Number2 : public Number { -public: - enum Issue { XRP, MPT, IOU }; - protected: + static Bytes const FLOAT_NULL; + bool good_; - Issue issue_; public: - Number2(Slice const& data) : Number(0), good_(false), issue_(IOU) + Number2(Slice const& data) : Number(), good_(false) { if (data.size() != 8) return; + if (std::ranges::equal(FLOAT_NULL, data)) + { + good_ = true; + return; + } + uint64_t const v = SerialIter(data).get64(); - int const neg = (v & STAmount::cPositive) ? 1 : -1; + if (!(v & STAmount::cIssuedCurrency)) + return; - Number x; + int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; + int32_t const e = static_cast((v >> (64 - 10)) & 0xFFull); + if (e < 1 || e > 177) + return; - if (v & STAmount::cIssuedCurrency) - { - // IOU - int32_t const e = - static_cast((v >> (64 - 10)) & ((1ull << 8) - 1)); - int64_t const m = neg * (v & ((1ull << 54) - 1)); - x = !m || (e < 1) ? Number() - : Number(m, e + IOUAmount::minExponent - 1); - if (m && (x.exponent() > IOUAmount::maxExponent)) - return; // invalid number - issue_ = IOU; - } - else if (v & STAmount::cMPToken) - { - // MPT - int64_t const m = neg * (v & ((1ull << 61) - 1)); - x = !m ? Number() : Number(m); - issue_ = MPT; - } - else - { - // XRP - int64_t const m = neg * (v & ((1ull << 61) - 1)); - x = !m ? Number() : Number(m); - issue_ = XRP; - } + int64_t const m = neg * static_cast(v & ((1ull << 54) - 1)); + if (!m) + return; + Number x(m, e + IOUAmount::minExponent - 1); *static_cast(this) = x; good_ = true; } - Number2() : Number(), good_(true), issue_(IOU) + Number2() : Number(), good_(true) { } - Number2(int64_t x) : Number(x), good_(true), issue_(IOU) + Number2(int64_t x) : Number(x), good_(true) { } - Number2(uint64_t x) : Number(0), good_(false), issue_(IOU) + Number2(uint64_t x) : Number(0), good_(false) { - if (x <= - std::numeric_limits< - std::invoke_result_t>:: - max()) - *static_cast(this) = Number(x); + using mtype = std::invoke_result_t; + if (x <= std::numeric_limits::max()) + *this = Number(x); else - { - *static_cast(this) = Number(x / 10, 1) + Number(x % 10); - } + *this = Number(x / 10, 1) + Number(x % 10); good_ = true; } Number2(int64_t mantissa, int32_t exponent) - : Number(mantissa, exponent), good_(true), issue_(IOU) + : Number(mantissa, exponent), good_(true) { } - Number2(Number const& n) : Number(n), good_(true), issue_(IOU) + Number2(Number const& n) : Number(n), good_(true) { } @@ -911,66 +893,38 @@ class Number2 : public Number return good_; } - Issue - getIssue() const - { - return issue_; - } - - void - setIssue(Issue i) - { - issue_ = i; - } - Expected toBytes() const { uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + v |= STAmount::cIssuedCurrency; - if (issue_ == IOU) + uint64_t const absM = mantissa() >= 0 ? mantissa() : -mantissa(); + if (!absM) { - v |= STAmount::cIssuedCurrency; - - if (!mantissa()) + using etype = + std::invoke_result_t; + if (exponent() != std::numeric_limits::lowest()) { - if (exponent() != std::numeric_limits::lowest()) - return Unexpected( - HostFunctionError:: - FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - } - else if (exponent() > IOUAmount::maxExponent) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (exponent() < IOUAmount::minExponent) - return Number2().toBytes(); - - uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); - if (absM > ((1ull << 54) - 1)) return Unexpected( HostFunctionError:: FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - - v |= absM; - - int const e = - (!mantissa() ? 0 : exponent()) - IOUAmount::minExponent + 1; - v |= ((uint64_t)e) << 54; - } - else if (issue_ == MPT) - { - v |= STAmount::cMPToken; - uint64_t x = toUInt(61); - if (x == std::numeric_limits::max()) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - v |= x; + } + return FLOAT_NULL; } - else + else if (absM > ((1ull << 54) - 1)) { - uint64_t x = toUInt(61); - if (x == std::numeric_limits::max()) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - v |= x; + return Unexpected( + HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } + else if (exponent() > IOUAmount::maxExponent) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (exponent() < IOUAmount::minExponent) + return FLOAT_NULL; + + int const e = exponent() - IOUAmount::minExponent + 1; //+97 + v |= absM; + v |= ((uint64_t)e) << 54; Serializer msg; msg.add64(v); @@ -987,44 +941,11 @@ class Number2 : public Number return data; } - -protected: - uint64_t - toUInt(unsigned bits) const - { - if (bits >= sizeof(uint64_t) * 8) - return std::numeric_limits::max(); // LCOV_EXCL_LINE - - uint64_t maxV = (1ull << bits) - 1; - uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); - - if (!absM) - return 0; - else if (exponent() < 0) - { - for (int i = 0; i > exponent(); --i) - { - // underflow - if (absM < 10) - return std::numeric_limits::max(); - absM /= 10; - } - } - else - { - for (int i = 0; i < exponent(); ++i) - { - // overflow - if (absM > maxV / 10) - return std::numeric_limits::max(); - absM *= 10; - } - } - - return absM > maxV ? std::numeric_limits::max() : absM; - } }; +Bytes const Number2::FLOAT_NULL = + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + struct SetRound { Number::rounding_mode oldMode_; @@ -1162,7 +1083,7 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx + yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1188,7 +1109,7 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx - yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1214,7 +1135,7 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx * yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1240,7 +1161,7 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx / yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } catch (...) @@ -1266,7 +1187,7 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res(root(xx, n)); - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1296,7 +1217,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) return Unexpected(HostFunctionError::INVALID_PARAMS); Number2 res(power(xx, n, 1)); - res.setIssue(xx.getIssue()); + return res.toBytes(); } catch (...) @@ -1319,7 +1240,7 @@ floatLogImpl(Slice const& x, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res(lg(xx)); - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START From 77875c9133dfa90abc86de23e59f96daacc516b0 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 15 Aug 2025 13:58:38 -0400 Subject: [PATCH 54/73] fix: actually return int instead of bool (#5651) --- src/test/app/HostFuncImpl_test.cpp | 18 +++++++++--------- src/test/app/Wasm_test.cpp | 16 ++++++++++------ src/xrpld/app/wasm/HostFunc.h | 6 ++++++ src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 15 +++++---------- src/xrpld/app/wasm/detail/WasmVM.cpp | 2 +- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index bd8ef8a3792..dea7ce4d510 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1442,15 +1442,15 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ } \ } -#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ - { \ - auto actual = hfs.hfsFunc(__VA_ARGS__); \ - if (BEAST_EXPECT(!actual.has_value())) \ - { \ - BEAST_EXPECTS( \ - actual.error() == expected, \ - std::to_string(static_cast(actual.error()))); \ - } \ +#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(HfErrorToInt(actual.error()))); \ + } \ } // accountKeylet diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 4fb30242fb0..42e3951869b 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -376,9 +376,11 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); - // std::cout << "bad case (access nonexistent field) result " - // << re.error() << std::endl; + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result == -201); + BEAST_EXPECT(re->cost == 5831); + } } { // fail because trying to allocate more than MAX_PAGES memory @@ -396,9 +398,11 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); - // std::cout << "bad case (more than MAX_PAGES) result " - // << re.error() << std::endl; + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result == -201); + BEAST_EXPECT(re->cost == 5831); + } } { // fail because recursion too deep diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 865ce49fb36..d1552df5a50 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -54,6 +54,12 @@ enum class HostFunctionError : int32_t { FLOAT_COMPUTATION_ERROR = -20, }; +inline int32_t +HfErrorToInt(HostFunctionError e) +{ + return static_cast(e); +} + std::string floatToString(Slice const& data); diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 20b52e418f8..75f072be2a1 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -41,22 +41,18 @@ setData( return 0; // LCOV_EXCL_LINE if (dst < 0 || dstSize < 0 || !src || srcSize < 0) - return static_cast>( - HostFunctionError::INVALID_PARAMS); + return HfErrorToInt(HostFunctionError::INVALID_PARAMS); auto memory = runtime ? runtime->getMem() : wmem(); // LCOV_EXCL_START if (!memory.s) - return static_cast>( - HostFunctionError::NO_MEM_EXPORTED); + return HfErrorToInt(HostFunctionError::NO_MEM_EXPORTED); // LCOV_EXCL_STOP if (dst + dstSize > memory.s) - return static_cast>( - HostFunctionError::POINTER_OUT_OF_BOUNDS); + return HfErrorToInt(HostFunctionError::POINTER_OUT_OF_BOUNDS); if (srcSize > dstSize) - return static_cast>( - HostFunctionError::BUFFER_TOO_SMALL); + return HfErrorToInt(HostFunctionError::BUFFER_TOO_SMALL); memcpy(memory.p + dst, src, srcSize); @@ -212,8 +208,7 @@ hfResult(wasm_val_vec_t* results, int32_t value) std::nullptr_t hfResult(wasm_val_vec_t* results, HostFunctionError value) { - results->data[0] = WASM_I32_VAL( - static_cast>(value)); + results->data[0] = WASM_I32_VAL(HfErrorToInt(value)); results->num_elems = 1; return nullptr; } diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 7d20f67fa12..335d406254f 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -150,7 +150,7 @@ runEscrowWasm( std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << std::endl; #endif - return EscrowResult{ret->result > 0, ret->cost}; + return EscrowResult{ret->result, ret->cost}; } NotTEC From 293d8e4ddb39b61a66012005ca795442eec741fb Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 15 Aug 2025 15:32:36 -0400 Subject: [PATCH 55/73] test: store Rust source code in rippled, instead of just opaque hex strings (#5653) --- .clang-format | 3 + src/test/app/Escrow_test.cpp | 41 +- src/test/app/Wasm_test.cpp | 191 +- src/test/app/wasm_fixtures/.gitignore | 3 + .../all_host_functions/Cargo.lock | 15 + .../all_host_functions/Cargo.toml | 21 + .../all_host_functions/src/lib.rs | 828 +++++++ .../app/wasm_fixtures/all_keylets/Cargo.lock | 15 + .../app/wasm_fixtures/all_keylets/Cargo.toml | 21 + .../app/wasm_fixtures/all_keylets/src/lib.rs | 156 ++ src/test/app/wasm_fixtures/b58.c | 73 + .../wasm_fixtures/codecov_tests/Cargo.lock | 15 + .../wasm_fixtures/codecov_tests/Cargo.toml | 19 + .../codecov_tests/src/host_bindings_loose.rs | 47 + .../wasm_fixtures/codecov_tests/src/lib.rs | 953 +++++++ src/test/app/wasm_fixtures/copyFixtures.py | 130 + src/test/app/wasm_fixtures/disableFloat.wat | 34 + src/test/app/wasm_fixtures/fib.c | 12 + src/test/app/wasm_fixtures/fixtures.cpp | 2199 +---------------- src/test/app/wasm_fixtures/fixtures.h | 36 +- .../app/wasm_fixtures/float_tests/Cargo.lock | 15 + .../app/wasm_fixtures/float_tests/Cargo.toml | 21 + .../app/wasm_fixtures/float_tests/src/lib.rs | 460 ++++ src/test/app/wasm_fixtures/ledgerSqn.c | 27 + src/test/app/wasm_fixtures/sha512Pure.c | 145 ++ src/test/app/wasm_fixtures/sp1/Cargo.lock | 1384 +++++++++++ src/test/app/wasm_fixtures/sp1/Cargo.toml | 16 + src/test/app/wasm_fixtures/sp1/src/lib.rs | 37 + .../app/wasm_fixtures/zk_proof/Cargo.lock | 106 + .../app/wasm_fixtures/zk_proof/Cargo.toml | 19 + .../app/wasm_fixtures/zk_proof/src/lib.rs | 254 ++ src/xrpld/app/wasm/detail/WamrVM.cpp | 2 +- src/xrpld/app/wasm/detail/WasmVM.cpp | 1 - 33 files changed, 4942 insertions(+), 2357 deletions(-) create mode 100644 src/test/app/wasm_fixtures/.gitignore create mode 100644 src/test/app/wasm_fixtures/all_host_functions/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/all_host_functions/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/all_host_functions/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/all_keylets/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/all_keylets/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/all_keylets/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/b58.c create mode 100644 src/test/app/wasm_fixtures/codecov_tests/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/codecov_tests/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs create mode 100644 src/test/app/wasm_fixtures/codecov_tests/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/copyFixtures.py create mode 100644 src/test/app/wasm_fixtures/disableFloat.wat create mode 100644 src/test/app/wasm_fixtures/fib.c create mode 100644 src/test/app/wasm_fixtures/float_tests/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/float_tests/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/float_tests/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/ledgerSqn.c create mode 100644 src/test/app/wasm_fixtures/sha512Pure.c create mode 100644 src/test/app/wasm_fixtures/sp1/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/sp1/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/sp1/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/zk_proof/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/zk_proof/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/zk_proof/src/lib.rs diff --git a/.clang-format b/.clang-format index 660a60c4a19..883549168b2 100644 --- a/.clang-format +++ b/.clang-format @@ -95,3 +95,6 @@ Standard: Cpp11 TabWidth: 8 UseTab: Never QualifierAlignment: Right +--- +Language: Json +IndentWidth: 2 diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index c07f3edd61c..c74b98e8c7c 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1708,7 +1708,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnHex; + static auto wasmHex = ledgerSqnWasmHex; { // featureSmartEscrow disabled @@ -1884,7 +1884,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnHex; + static auto wasmHex = ledgerSqnWasmHex; { // featureSmartEscrow disabled @@ -1921,37 +1921,6 @@ struct Escrow_test : public beast::unit_test::suite ter(temBAD_LIMIT)); } - { - uint32_t const allowance = 5'664; - Env env(*this, features); - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - XRPAmount const createFee = env.current()->fees().base + 1000; - - // Escrow with FinishFunction + Condition - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - env(escrowCreate, - escrow::finish_function(reqNonexistentField), - escrow::condition(escrow::cb1), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - env.close(); - env.close(); - - // Rejected as wasm code request nonexistent memo field - XRPAmount const txnFees = env.current()->fees().base * 34 + 1000; - env(escrow::finish(alice, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb1), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - } - Env env(*this, features); // Run past the flag ledger so that a Fee change vote occurs and @@ -2036,7 +2005,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - auto const& wasmHex = ledgerSqnHex; + auto const& wasmHex = ledgerSqnWasmHex; std::uint32_t const allowance = 71; { @@ -2288,7 +2257,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: create wasm module for all host functions - static auto wasmHex = allHostFunctionsHex; + static auto wasmHex = allHostFunctionsWasmHex; Account const alice{"alice"}; Account const carol{"carol"}; @@ -2356,7 +2325,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: create wasm module for all host functions - static auto wasmHex = keyletHostFunctions; + static auto wasmHex = allKeyletsWasmHex; Account const alice{"alice"}; Account const carol{"carol"}; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 42e3951869b..46c116637a9 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -57,13 +57,17 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm fibo"); - auto const ws = boost::algorithm::unhex(fib32Hex); + auto const ws = boost::algorithm::unhex(fibWasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = engine.run(wasm, "fib", wasmParams(10)); - BEAST_EXPECT(re.has_value() && (re->result == 55) && (re->cost == 755)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 755, std::to_string(re->cost)); + } } void @@ -71,22 +75,25 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm sha"); - auto const ws = boost::algorithm::unhex(sha512PureHex); + auto const ws = boost::algorithm::unhex(sha512PureWasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = - engine.run(wasm, "sha512_process", wasmParams(sha512PureHex)); + engine.run(wasm, "sha512_process", wasmParams(sha512PureWasmHex)); - BEAST_EXPECT( - re.has_value() && (re->result == 34432) && (re->cost == 157'452)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 157'452, std::to_string(re->cost)); + } } void testWasmB58() { testcase("Wasm base58"); - auto const ws = boost::algorithm::unhex(b58Hex); + auto const ws = boost::algorithm::unhex(b58WasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); @@ -95,38 +102,51 @@ struct Wasm_test : public beast::unit_test::suite auto const minsz = std::min( static_cast(512), - static_cast(b58Hex.size())); - auto const s = std::string_view(b58Hex.c_str(), minsz); + static_cast(b58WasmHex.size())); + auto const s = std::string_view(b58WasmHex.c_str(), minsz); + auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); - BEAST_EXPECT(re.has_value() && re->result && (re->cost == 3'066'129)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 3'066'129, std::to_string(re->cost)); + } } void testWasmSP1Verifier() { testcase("Wasm sp1 zkproof verifier"); - auto const ws = boost::algorithm::unhex(sp1_wasm); + auto const ws = boost::algorithm::unhex(sp1WasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = engine.run(wasm, "sp1_groth16_verifier"); - BEAST_EXPECT( - re.has_value() && re->result && (re->cost == 4'191'711'969ll)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS( + re->cost == 4'191'711'969ll, std::to_string(re->cost)); + } } void testWasmBG16Verifier() { testcase("Wasm BG16 zkproof verifier"); - auto const ws = boost::algorithm::unhex(zkProofHex); + auto const ws = boost::algorithm::unhex(zkProofWasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = engine.run(wasm, "bellman_groth16_test"); - BEAST_EXPECT(re.has_value() && re->result && (re->cost == 332'205'984)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 332'205'984, std::to_string(re->cost)); + } } void @@ -134,7 +154,7 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm get ledger sequence"); - auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); using namespace test::jtx; @@ -157,7 +177,10 @@ struct Wasm_test : public beast::unit_test::suite // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re->result && (re->cost == 44)); + { + BEAST_EXPECTS(!re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 44, std::to_string(re->cost)); + } env.close(); env.close(); @@ -170,74 +193,12 @@ struct Wasm_test : public beast::unit_test::suite // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re->result && (re->cost == 88)); - } - - void - testWasmCheckJson() - { - testcase("Wasm check json"); - - using namespace test::jtx; - Env env{*this}; - - auto const wasmStr = boost::algorithm::unhex(checkJsonHex); - Bytes const wasm(wasmStr.begin(), wasmStr.end()); - std::string const funcName("check_accountID"); - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - Bytes data(str.begin(), str.end()); - auto re = runEscrowWasm( - wasm, funcName, wasmParams(data), nullptr, -1, env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result && (re->cost == 838)); - } { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; - Bytes data(str.begin(), str.end()); - auto re = runEscrowWasm( - wasm, funcName, wasmParams(data), nullptr, -1, env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result && (re->cost == 822)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 88, std::to_string(re->cost)); } } - void - testWasmCompareJson() - { - testcase("Wasm compare json"); - - using namespace test::jtx; - Env env{*this}; - - auto wasmStr = boost::algorithm::unhex(compareJsonHex); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::vector const tx_data(tx_js.begin(), tx_js.end()); - std::vector const lo_data(lo_js.begin(), lo_js.end()); - auto re = runEscrowWasm( - wasm, - funcName, - wasmParams(tx_data, lo_data), - nullptr, - -1, - env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result && (re->cost == 42'212)); - - std::vector const lo_data2(lo_js2.begin(), lo_js2.end()); - re = runEscrowWasm( - wasm, - funcName, - wasmParams(tx_data, lo_data2), - nullptr, - -1, - env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result && (re->cost == 41'496)); - } - void testWasmLib() { @@ -281,7 +242,11 @@ struct Wasm_test : public beast::unit_test::suite // if (res) printf("invokeAdd get the result: %d\n", res.value()); - BEAST_EXPECT(re.has_value() && re->result == 6912 && (re->cost == 2)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); + } } void @@ -346,7 +311,7 @@ struct Wasm_test : public beast::unit_test::suite testcase("escrow wasm devnet test"); std::string const wasmStr = - boost::algorithm::unhex(allHostFunctionsHex); + boost::algorithm::unhex(allHostFunctionsWasmHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); using namespace test::jtx; @@ -357,7 +322,8 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 41'132)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); } } @@ -375,11 +341,11 @@ struct Wasm_test : public beast::unit_test::suite }; BadTestHostFunctions nfs(env); auto re = - runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100000); + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result == -201); - BEAST_EXPECT(re->cost == 5831); + BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); } } @@ -400,8 +366,8 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result == -201); - BEAST_EXPECT(re->cost == 5831); + BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); } } @@ -412,7 +378,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctionsSink nfs(env); std::string funcName("recursive"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1000'000'000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -438,7 +404,7 @@ struct Wasm_test : public beast::unit_test::suite } { - auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); TestLedgerDataProvider ledgerDataProvider(&env); @@ -471,7 +437,7 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = allHostFunctionsHex; + std::string const wasmHex = allHostFunctionsWasmHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -493,7 +459,8 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 872)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 872, std::to_string(re->cost)); } env.close(); @@ -506,7 +473,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { - std::string const wasmHex = allHostFunctionsHex; + std::string const wasmHex = allHostFunctionsWasmHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -526,7 +493,8 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 41'132)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); } env.close(); @@ -544,13 +512,17 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = floatHex; + std::string const wasmHex = floatTestsWasmHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hf(env, 0); auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); - BEAST_EXPECT(re && re->result && (re->cost == 91'412)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 91'412, std::to_string(re->cost)); + } env.close(); } @@ -561,7 +533,11 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hf(env, 0); auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); - BEAST_EXPECT(re && re->result && (re->cost == 6'533)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 6'533, std::to_string(re->cost)); + } env.close(); } } @@ -677,7 +653,7 @@ struct Wasm_test : public beast::unit_test::suite // beast::severities::kTrace}; Env env{*this}; - auto const wasmStr = boost::algorithm::unhex(codecovWasm); + auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); Bytes const wasm(wasmStr.begin(), wasmStr.end()); std::string const funcName("finish"); TestHostFunctions hfs(env, 0); @@ -686,7 +662,10 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re->result); + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 100'784, std::to_string(re->cost)); + } } void @@ -706,7 +685,10 @@ struct Wasm_test : public beast::unit_test::suite // f32 set constant, opcode disabled exception auto const re = runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } } { @@ -714,7 +696,10 @@ struct Wasm_test : public beast::unit_test::suite wasm[0x117] = 0x92; auto const re = runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } } } @@ -726,8 +711,6 @@ struct Wasm_test : public beast::unit_test::suite testGetDataHelperFunctions(); testWasmLib(); testBadWasm(); - testWasmCheckJson(); - testWasmCompareJson(); testWasmLedgerSqn(); testWasmFib(); diff --git a/src/test/app/wasm_fixtures/.gitignore b/src/test/app/wasm_fixtures/.gitignore new file mode 100644 index 00000000000..08b2e8a2569 --- /dev/null +++ b/src/test/app/wasm_fixtures/.gitignore @@ -0,0 +1,3 @@ +**/target +**/debug +*.wasm diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock new file mode 100644 index 00000000000..13931f02298 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "all_host_functions" +version = "0.1.0" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml new file mode 100644 index 00000000000..4c3455b3ca8 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "all_host_functions" +version = "0.1.0" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" +opt-level = "z" +lto = true diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs new file mode 100644 index 00000000000..b685de59dac --- /dev/null +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -0,0 +1,828 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +// +// Host Functions Test +// Tests 26 host functions (across 7 categories) +// +// With craft you can run this test with: +// craft test --project host_functions_test --test-case host_functions_test +// +// Amount Format Update: +// - XRP amounts now return as 8-byte serialized rippled objects +// - IOU and MPT amounts return in variable-length serialized format +// - Format details: https://xrpl.org/docs/references/protocol/binary-format#amount-fields +// +// Error Code Ranges: +// -100 to -199: Ledger Header Functions (3 functions) +// -200 to -299: Transaction Data Functions (5 functions) +// -300 to -399: Current Ledger Object Functions (4 functions) +// -400 to -499: Any Ledger Object Functions (5 functions) +// -500 to -599: Keylet Generation Functions (4 functions) +// -600 to -699: Utility Functions (4 functions) +// -700 to -799: Data Update Functions (1 function) +// + +use xrpl_std::core::current_tx::escrow_finish::EscrowFinish; +use xrpl_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_std::host::trace::{DataRepr, trace_data, trace_num}; +use xrpl_std::host::*; +use xrpl_std::sfield; + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace_data("=== HOST FUNCTIONS TEST ===", &[], DataRepr::AsHex); + let _ = trace_data("Testing 26 host functions", &[], DataRepr::AsHex); + + // Category 1: Ledger Header Data Functions (3 functions) + // Error range: -100 to -199 + match test_ledger_header_functions() { + 0 => (), + err => return err, + } + + // Category 2: Transaction Data Functions (5 functions) + // Error range: -200 to -299 + match test_transaction_data_functions() { + 0 => (), + err => return err, + } + + // Category 3: Current Ledger Object Functions (4 functions) + // Error range: -300 to -399 + match test_current_ledger_object_functions() { + 0 => (), + err => return err, + } + + // Category 4: Any Ledger Object Functions (5 functions) + // Error range: -400 to -499 + match test_any_ledger_object_functions() { + 0 => (), + err => return err, + } + + // Category 5: Keylet Generation Functions (4 functions) + // Error range: -500 to -599 + match test_keylet_generation_functions() { + 0 => (), + err => return err, + } + + // Category 6: Utility Functions (4 functions) + // Error range: -600 to -699 + match test_utility_functions() { + 0 => (), + err => return err, + } + + // Category 7: Data Update Functions (1 function) + // Error range: -700 to -799 + match test_data_update_functions() { + 0 => (), + err => return err, + } + + let _ = trace_data( + "SUCCESS: All host function tests passed!", + &[], + DataRepr::AsHex, + ); + 1 // Success return code for WASM finish function +} + +/// Test Category 1: Ledger Header Data Functions (3 functions) +/// - get_ledger_sqn() - Get ledger sequence number +/// - get_parent_ledger_time() - Get parent ledger timestamp +/// - get_parent_ledger_hash() - Get parent ledger hash +fn test_ledger_header_functions() -> i32 { + let _ = trace_data( + "--- Category 1: Ledger Header Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 1.1: get_ledger_sqn() - should return current ledger sequence number + let mut ledger_sqn_buffer = [0u8; 8]; + let sqn_result = + unsafe { get_ledger_sqn(ledger_sqn_buffer.as_mut_ptr(), ledger_sqn_buffer.len()) }; + + if sqn_result <= 0 { + let _ = trace_num("ERROR: get_ledger_sqn failed:", sqn_result as i64); + return -101; // Ledger sequence number test failed + } + let _ = trace_num("Ledger sequence number bytes:", sqn_result as i64); + let _ = trace_data( + "Ledger sqn data:", + &ledger_sqn_buffer[..sqn_result as usize], + DataRepr::AsHex, + ); + + // Test 1.2: get_parent_ledger_time() - should return parent ledger timestamp + let mut time_buffer = [0u8; 8]; + let time_result = + unsafe { get_parent_ledger_time(time_buffer.as_mut_ptr(), time_buffer.len()) }; + + if time_result <= 0 { + let _ = trace_num("ERROR: get_parent_ledger_time failed:", time_result as i64); + return -102; // Parent ledger time test failed + } + let _ = trace_num("Parent ledger time bytes:", time_result as i64); + let _ = trace_data( + "Parent time data:", + &time_buffer[..time_result as usize], + DataRepr::AsHex, + ); + + // Test 1.3: get_parent_ledger_hash() - should return parent ledger hash (32 bytes) + let mut hash_buffer = [0u8; 32]; + let hash_result = + unsafe { get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; + + if hash_result != 32 { + let _ = trace_num( + "ERROR: get_parent_ledger_hash wrong length:", + hash_result as i64, + ); + return -103; // Parent ledger hash test failed - should be exactly 32 bytes + } + let _ = trace_data("Parent ledger hash:", &hash_buffer, DataRepr::AsHex); + + let _ = trace_data("SUCCESS: Ledger header functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 2: Transaction Data Functions (5 functions) +/// Tests all functions for accessing current transaction data +fn test_transaction_data_functions() -> i32 { + let _ = trace_data( + "--- Category 2: Transaction Data Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 2.1: get_tx_field() - Basic transaction field access + // Test with Account field (required, 20 bytes) + let mut account_buffer = [0u8; 20]; + let account_len = unsafe { + get_tx_field( + sfield::Account, + account_buffer.as_mut_ptr(), + account_buffer.len(), + ) + }; + + if account_len != 20 { + let _ = trace_num( + "ERROR: get_tx_field(Account) wrong length:", + account_len as i64, + ); + return -201; // Basic transaction field test failed + } + let _ = trace_data("Transaction Account:", &account_buffer, DataRepr::AsHex); + + // Test with Fee field (XRP amount - 8 bytes in new serialized format) + // New format: XRP amounts are always 8 bytes (positive: value | cPositive flag, negative: just value) + let mut fee_buffer = [0u8; 8]; + let fee_len = unsafe { get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; + + if fee_len != 8 { + let _ = trace_num( + "ERROR: get_tx_field(Fee) wrong length (expected 8 bytes for XRP):", + fee_len as i64, + ); + return -202; // Fee field test failed - XRP amounts should be exactly 8 bytes + } + let _ = trace_num("Transaction Fee length:", fee_len as i64); + let _ = trace_data( + "Transaction Fee (serialized XRP amount):", + &fee_buffer, + DataRepr::AsHex, + ); + + // Test with Sequence field (required, 4 bytes uint32) + let mut seq_buffer = [0u8; 4]; + let seq_len = + unsafe { get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; + + if seq_len != 4 { + let _ = trace_num( + "ERROR: get_tx_field(Sequence) wrong length:", + seq_len as i64, + ); + return -203; // Sequence field test failed + } + let _ = trace_data("Transaction Sequence:", &seq_buffer, DataRepr::AsHex); + + // NOTE: get_tx_field2() through get_tx_field6() have been deprecated. + // Use get_tx_field() with appropriate parameters for all transaction field access. + + // Test 2.2: get_tx_nested_field() - Nested field access with locator + let locator = [0x01, 0x00]; // Simple locator for first element + let mut nested_buffer = [0u8; 32]; + let nested_result = unsafe { + get_tx_nested_field( + locator.as_ptr(), + locator.len(), + nested_buffer.as_mut_ptr(), + nested_buffer.len(), + ) + }; + + if nested_result < 0 { + let _ = trace_num( + "INFO: get_tx_nested_field not applicable:", + nested_result as i64, + ); + // Expected - locator may not match transaction structure + } else { + let _ = trace_num("Nested field length:", nested_result as i64); + let _ = trace_data( + "Nested field:", + &nested_buffer[..nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 2.3: get_tx_array_len() - Get array length + let signers_len = unsafe { get_tx_array_len(sfield::Signers) }; + let _ = trace_num("Signers array length:", signers_len as i64); + + let memos_len = unsafe { get_tx_array_len(sfield::Memos) }; + let _ = trace_num("Memos array length:", memos_len as i64); + + // Test 2.4: get_tx_nested_array_len() - Get nested array length with locator + let nested_array_len = unsafe { get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; + + if nested_array_len < 0 { + let _ = trace_num( + "INFO: get_tx_nested_array_len not applicable:", + nested_array_len as i64, + ); + } else { + let _ = trace_num("Nested array length:", nested_array_len as i64); + } + + let _ = trace_data("SUCCESS: Transaction data functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 3: Current Ledger Object Functions (4 functions) +/// Tests functions that access the current ledger object being processed +fn test_current_ledger_object_functions() -> i32 { + let _ = trace_data( + "--- Category 3: Current Ledger Object Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 3.1: get_current_ledger_obj_field() - Access field from current ledger object + // Test with Balance field (XRP amount - 8 bytes in new serialized format) + let mut balance_buffer = [0u8; 8]; + let balance_result = unsafe { + get_current_ledger_obj_field( + sfield::Balance, + balance_buffer.as_mut_ptr(), + balance_buffer.len(), + ) + }; + + if balance_result <= 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_field(Balance) failed (may be expected):", + balance_result as i64, + ); + // This might fail if current ledger object doesn't have balance field + } else if balance_result == 8 { + let _ = trace_num( + "Current object balance length (XRP amount):", + balance_result as i64, + ); + let _ = trace_data( + "Current object balance (serialized XRP amount):", + &balance_buffer, + DataRepr::AsHex, + ); + } else { + let _ = trace_num( + "Current object balance length (non-XRP amount):", + balance_result as i64, + ); + let _ = trace_data( + "Current object balance:", + &balance_buffer[..balance_result as usize], + DataRepr::AsHex, + ); + } + + // Test with Account field + let mut current_account_buffer = [0u8; 20]; + let current_account_result = unsafe { + get_current_ledger_obj_field( + sfield::Account, + current_account_buffer.as_mut_ptr(), + current_account_buffer.len(), + ) + }; + + if current_account_result <= 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_field(Account) failed:", + current_account_result as i64, + ); + } else { + let _ = trace_data( + "Current ledger object account:", + ¤t_account_buffer[..current_account_result as usize], + DataRepr::AsHex, + ); + } + + // Test 3.2: get_current_ledger_obj_nested_field() - Nested field access + let locator = [0x01, 0x00]; // Simple locator + let mut current_nested_buffer = [0u8; 32]; + let current_nested_result = unsafe { + get_current_ledger_obj_nested_field( + locator.as_ptr(), + locator.len(), + current_nested_buffer.as_mut_ptr(), + current_nested_buffer.len(), + ) + }; + + if current_nested_result < 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_nested_field not applicable:", + current_nested_result as i64, + ); + } else { + let _ = trace_num("Current nested field length:", current_nested_result as i64); + let _ = trace_data( + "Current nested field:", + ¤t_nested_buffer[..current_nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 3.3: get_current_ledger_obj_array_len() - Array length in current object + let current_array_len = unsafe { get_current_ledger_obj_array_len(sfield::Signers) }; + let _ = trace_num( + "Current object Signers array length:", + current_array_len as i64, + ); + + // Test 3.4: get_current_ledger_obj_nested_array_len() - Nested array length + let current_nested_array_len = + unsafe { get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; + + if current_nested_array_len < 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_nested_array_len not applicable:", + current_nested_array_len as i64, + ); + } else { + let _ = trace_num( + "Current nested array length:", + current_nested_array_len as i64, + ); + } + + let _ = trace_data( + "SUCCESS: Current ledger object functions", + &[], + DataRepr::AsHex, + ); + 0 +} + +/// Test Category 4: Any Ledger Object Functions (5 functions) +/// Tests functions that work with cached ledger objects +fn test_any_ledger_object_functions() -> i32 { + let _ = trace_data( + "--- Category 4: Any Ledger Object Functions ---", + &[], + DataRepr::AsHex, + ); + + // First we need to cache a ledger object to test the other functions + // Get the account from transaction and generate its keylet + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + + // Test 4.1: cache_ledger_obj() - Cache a ledger object + let mut keylet_buffer = [0u8; 32]; + let keylet_result = unsafe { + account_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + keylet_buffer.as_mut_ptr(), + keylet_buffer.len(), + ) + }; + + if keylet_result != 32 { + let _ = trace_num( + "ERROR: account_keylet failed for caching test:", + keylet_result as i64, + ); + return -401; // Keylet generation failed for caching test + } + + let cache_result = + unsafe { cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; + + if cache_result <= 0 { + let _ = trace_num( + "INFO: cache_ledger_obj failed (expected with test fixtures):", + cache_result as i64, + ); + // Test fixtures may not contain the account object - this is expected + // We'll test the interface but expect failures + + // Test 4.2-4.5 with invalid slot (should fail gracefully) + let mut test_buffer = [0u8; 32]; + + // Test get_ledger_obj_field with invalid slot + let field_result = unsafe { + get_ledger_obj_field( + 1, + sfield::Balance, + test_buffer.as_mut_ptr(), + test_buffer.len(), + ) + }; + if field_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_field failed as expected (no cached object):", + field_result as i64, + ); + } + + // Test get_ledger_obj_nested_field with invalid slot + let locator = [0x01, 0x00]; + let nested_result = unsafe { + get_ledger_obj_nested_field( + 1, + locator.as_ptr(), + locator.len(), + test_buffer.as_mut_ptr(), + test_buffer.len(), + ) + }; + if nested_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_field failed as expected:", + nested_result as i64, + ); + } + + // Test get_ledger_obj_array_len with invalid slot + let array_result = unsafe { get_ledger_obj_array_len(1, sfield::Signers) }; + if array_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_array_len failed as expected:", + array_result as i64, + ); + } + + // Test get_ledger_obj_nested_array_len with invalid slot + let nested_array_result = + unsafe { get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; + if nested_array_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_array_len failed as expected:", + nested_array_result as i64, + ); + } + + let _ = trace_data( + "SUCCESS: Any ledger object functions (interface tested)", + &[], + DataRepr::AsHex, + ); + return 0; + } + + // If we successfully cached an object, test the access functions + let slot = cache_result; + let _ = trace_num("Successfully cached object in slot:", slot as i64); + + // Test 4.2: get_ledger_obj_field() - Access field from cached object + let mut cached_balance_buffer = [0u8; 8]; + let cached_balance_result = unsafe { + get_ledger_obj_field( + slot, + sfield::Balance, + cached_balance_buffer.as_mut_ptr(), + cached_balance_buffer.len(), + ) + }; + + if cached_balance_result <= 0 { + let _ = trace_num( + "INFO: get_ledger_obj_field(Balance) failed:", + cached_balance_result as i64, + ); + } else if cached_balance_result == 8 { + let _ = trace_num( + "Cached object balance length (XRP amount):", + cached_balance_result as i64, + ); + let _ = trace_data( + "Cached object balance (serialized XRP amount):", + &cached_balance_buffer, + DataRepr::AsHex, + ); + } else { + let _ = trace_num( + "Cached object balance length (non-XRP amount):", + cached_balance_result as i64, + ); + let _ = trace_data( + "Cached object balance:", + &cached_balance_buffer[..cached_balance_result as usize], + DataRepr::AsHex, + ); + } + + // Test 4.3: get_ledger_obj_nested_field() - Nested field from cached object + let locator = [0x01, 0x00]; + let mut cached_nested_buffer = [0u8; 32]; + let cached_nested_result = unsafe { + get_ledger_obj_nested_field( + slot, + locator.as_ptr(), + locator.len(), + cached_nested_buffer.as_mut_ptr(), + cached_nested_buffer.len(), + ) + }; + + if cached_nested_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_field not applicable:", + cached_nested_result as i64, + ); + } else { + let _ = trace_num("Cached nested field length:", cached_nested_result as i64); + let _ = trace_data( + "Cached nested field:", + &cached_nested_buffer[..cached_nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 4.4: get_ledger_obj_array_len() - Array length from cached object + let cached_array_len = unsafe { get_ledger_obj_array_len(slot, sfield::Signers) }; + let _ = trace_num( + "Cached object Signers array length:", + cached_array_len as i64, + ); + + // Test 4.5: get_ledger_obj_nested_array_len() - Nested array length from cached object + let cached_nested_array_len = + unsafe { get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; + + if cached_nested_array_len < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_array_len not applicable:", + cached_nested_array_len as i64, + ); + } else { + let _ = trace_num( + "Cached nested array length:", + cached_nested_array_len as i64, + ); + } + + let _ = trace_data("SUCCESS: Any ledger object functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 5: Keylet Generation Functions (4 functions) +/// Tests keylet generation functions for different ledger entry types +fn test_keylet_generation_functions() -> i32 { + let _ = trace_data( + "--- Category 5: Keylet Generation Functions ---", + &[], + DataRepr::AsHex, + ); + + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + + // Test 5.1: account_keylet() - Generate keylet for account + let mut account_keylet_buffer = [0u8; 32]; + let account_keylet_result = unsafe { + account_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + account_keylet_buffer.as_mut_ptr(), + account_keylet_buffer.len(), + ) + }; + + if account_keylet_result != 32 { + let _ = trace_num( + "ERROR: account_keylet failed:", + account_keylet_result as i64, + ); + return -501; // Account keylet generation failed + } + let _ = trace_data("Account keylet:", &account_keylet_buffer, DataRepr::AsHex); + + // Test 5.2: credential_keylet() - Generate keylet for credential + let mut credential_keylet_buffer = [0u8; 32]; + let credential_keylet_result = unsafe { + credential_keylet( + account_id.0.as_ptr(), // Subject + account_id.0.len(), + account_id.0.as_ptr(), // Issuer - same account for test + account_id.0.len(), + b"TestType".as_ptr(), // Credential type + 9usize, // Length of "TestType" + credential_keylet_buffer.as_mut_ptr(), + credential_keylet_buffer.len(), + ) + }; + + if credential_keylet_result <= 0 { + let _ = trace_num( + "INFO: credential_keylet failed (expected - interface issue):", + credential_keylet_result as i64, + ); + // This is expected to fail due to unusual parameter types + } else { + let _ = trace_data( + "Credential keylet:", + &credential_keylet_buffer[..credential_keylet_result as usize], + DataRepr::AsHex, + ); + } + + // Test 5.3: escrow_keylet() - Generate keylet for escrow + let mut escrow_keylet_buffer = [0u8; 32]; + let escrow_keylet_result = unsafe { + escrow_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + 1000, // Sequence number + escrow_keylet_buffer.as_mut_ptr(), + escrow_keylet_buffer.len(), + ) + }; + + if escrow_keylet_result != 32 { + let _ = trace_num("ERROR: escrow_keylet failed:", escrow_keylet_result as i64); + return -503; // Escrow keylet generation failed + } + let _ = trace_data("Escrow keylet:", &escrow_keylet_buffer, DataRepr::AsHex); + + // Test 5.4: oracle_keylet() - Generate keylet for oracle + let mut oracle_keylet_buffer = [0u8; 32]; + let oracle_keylet_result = unsafe { + oracle_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + 42, // Document ID + oracle_keylet_buffer.as_mut_ptr(), + oracle_keylet_buffer.len(), + ) + }; + + if oracle_keylet_result != 32 { + let _ = trace_num("ERROR: oracle_keylet failed:", oracle_keylet_result as i64); + return -504; // Oracle keylet generation failed + } + let _ = trace_data("Oracle keylet:", &oracle_keylet_buffer, DataRepr::AsHex); + + let _ = trace_data("SUCCESS: Keylet generation functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 6: Utility Functions (4 functions) +/// Tests utility functions for hashing, NFT access, and tracing +fn test_utility_functions() -> i32 { + let _ = trace_data( + "--- Category 6: Utility Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 6.1: compute_sha512_half() - SHA512 hash computation (first 32 bytes) + let test_data = b"Hello, XRPL WASM world!"; + let mut hash_output = [0u8; 32]; + let hash_result = unsafe { + compute_sha512_half( + test_data.as_ptr(), + test_data.len(), + hash_output.as_mut_ptr(), + hash_output.len(), + ) + }; + + if hash_result != 32 { + let _ = trace_num("ERROR: compute_sha512_half failed:", hash_result as i64); + return -601; // SHA512 half computation failed + } + let _ = trace_data("Input data:", test_data, DataRepr::AsHex); + let _ = trace_data("SHA512 half hash:", &hash_output, DataRepr::AsHex); + + // Test 6.2: get_nft() - NFT data retrieval + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + let nft_id = [0u8; 32]; // Dummy NFT ID for testing + let mut nft_buffer = [0u8; 256]; + let nft_result = unsafe { + get_nft( + account_id.0.as_ptr(), + account_id.0.len(), + nft_id.as_ptr(), + nft_id.len(), + nft_buffer.as_mut_ptr(), + nft_buffer.len(), + ) + }; + + if nft_result <= 0 { + let _ = trace_num( + "INFO: get_nft failed (expected - no such NFT):", + nft_result as i64, + ); + // This is expected - test account likely doesn't own the dummy NFT + } else { + let _ = trace_num("NFT data length:", nft_result as i64); + let _ = trace_data( + "NFT data:", + &nft_buffer[..nft_result as usize], + DataRepr::AsHex, + ); + } + + // Test 6.3: trace() - Debug logging with data + let trace_message = b"Test trace message"; + let trace_data_payload = b"payload"; + let trace_result = unsafe { + trace( + trace_message.as_ptr(), + trace_message.len(), + trace_data_payload.as_ptr(), + trace_data_payload.len(), + 1, // as_hex = true + ) + }; + + if trace_result < 0 { + let _ = trace_num("ERROR: trace() failed:", trace_result as i64); + return -603; // Trace function failed + } + let _ = trace_num("Trace function bytes written:", trace_result as i64); + + // Test 6.4: trace_num() - Debug logging with number + let test_number = 42i64; + let trace_num_result = trace_num("Test number trace", test_number); + + use xrpl_std::host::Result; + match trace_num_result { + Result::Ok(_) => { + let _ = trace_num("Trace_num function succeeded", 0); + } + Result::Err(_) => { + let _ = trace_num("ERROR: trace_num() failed:", -604); + return -604; // Trace number function failed + } + } + + let _ = trace_data("SUCCESS: Utility functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 7: Data Update Functions (1 function) +/// Tests the function for modifying the current ledger entry +fn test_data_update_functions() -> i32 { + let _ = trace_data( + "--- Category 7: Data Update Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 7.1: update_data() - Update current ledger entry data + let update_payload = b"Updated ledger entry data from WASM test"; + + let update_result = unsafe { update_data(update_payload.as_ptr(), update_payload.len()) }; + + if update_result != 0 { + let _ = trace_num("ERROR: update_data failed:", update_result as i64); + return -701; // Data update failed + } + + let _ = trace_data( + "Successfully updated ledger entry with:", + update_payload, + DataRepr::AsHex, + ); + let _ = trace_data("SUCCESS: Data update functions", &[], DataRepr::AsHex); + 0 +} diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock new file mode 100644 index 00000000000..cc667d4d346 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "all_keylets" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml new file mode 100644 index 00000000000..e1fd222bebe --- /dev/null +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -0,0 +1,21 @@ +[package] +edition = "2024" +name = "all_keylets" +version = "0.0.1" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs new file mode 100644 index 00000000000..167541eae63 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -0,0 +1,156 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use crate::host::{Result, Result::Err, Result::Ok}; +use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; +use xrpl_std::core::ledger_objects::ledger_object; +use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; +use xrpl_std::core::types::amount::currency_code::CurrencyCode; +use xrpl_std::core::types::keylets; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_data, trace_num, DataRepr}; +use xrpl_std::sfield; + +#[unsafe(no_mangle)] +pub fn object_exists( + keylet_result: Result, + keylet_type: &str, + field: i32, +) -> Result { + match keylet_result { + Ok(keylet) => { + let _ = trace_data(keylet_type, &keylet, DataRepr::AsHex); + + let slot = unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }; + if slot <= 0 { + let _ = trace_num("Error: ", slot.into()); + return Err(host::Error::NoFreeSlots); + } + if field == 0 { + let new_field = sfield::PreviousTxnID; + let _ = trace_num("Getting field: ", new_field.into()); + match ledger_object::get_hash_256_field(slot, new_field) { + Ok(data) => { + let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); + } + Err(result_code) => { + let _ = trace_num("Error getting field: ", result_code.into()); + return Err(result_code); + } + } + } else { + let _ = trace_num("Getting field: ", field.into()); + match ledger_object::get_account_id_field(slot, field) { + Ok(data) => { + let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); + } + Err(result_code) => { + let _ = trace_num("Error getting field: ", result_code.into()); + return Err(result_code); + } + } + } + + Ok(true) + } + Err(error) => { + let _ = trace_num("Error getting keylet: ", error.into()); + Err(error) + } + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("$$$$$ STARTING WASM EXECUTION $$$$$"); + + let escrow: CurrentEscrow = get_current_escrow(); + + let account = escrow.get_account().unwrap_or_panic(); + let _ = trace_data(" Account:", &account.0, DataRepr::AsHex); + + let destination = escrow.get_destination().unwrap_or_panic(); + let _ = trace_data(" Destination:", &destination.0, DataRepr::AsHex); + + macro_rules! check_object_exists { + ($keylet:expr, $type:expr, $field:expr) => { + match object_exists($keylet, $type, $field) { + Ok(exists) => { + if exists { + let _ = trace(concat!( + $type, + " object exists, proceeding with escrow finish." + )); + } else { + let _ = trace(concat!( + $type, + " object does not exist, aborting escrow finish." + )); + return 0; + } + } + Err(error) => return error.code(), + } + }; + } + + let account_keylet = keylets::account_keylet(&account); + check_object_exists!(account_keylet, "Account", sfield::Account); + + let mut seq = 5; + let currency_code: &[u8; 3] = b"USD"; + let currency: CurrencyCode = CurrencyCode::from(*currency_code); + let line_keylet = keylets::line_keylet(&account, &destination, ¤cy); + check_object_exists!(line_keylet, "Trustline", sfield::Generic); + seq += 1; + + let check_keylet = keylets::check_keylet(&account, seq); + check_object_exists!(check_keylet, "Check", sfield::Account); + seq += 1; + + let cred_type: &[u8] = b"termsandconditions"; + let credential_keylet = keylets::credential_keylet(&account, &account, cred_type); + check_object_exists!(credential_keylet, "Credential", sfield::Subject); + seq += 1; + + let delegate_keylet = keylets::delegate_keylet(&account, &destination); + check_object_exists!(delegate_keylet, "Delegate", sfield::Account); + seq += 1; + + let deposit_preauth_keylet = keylets::deposit_preauth_keylet(&account, &destination); + check_object_exists!(deposit_preauth_keylet, "DepositPreauth", sfield::Account); + seq += 1; + + let did_keylet = keylets::did_keylet(&account); + check_object_exists!(did_keylet, "DID", sfield::Account); + seq += 1; + + let escrow_keylet = keylets::escrow_keylet(&account, seq); + check_object_exists!(escrow_keylet, "Escrow", sfield::Account); + seq += 1; + + let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 4); + check_object_exists!(nft_offer_keylet, "NFTokenOffer", sfield::Owner); + + let offer_keylet = keylets::offer_keylet(&account, seq); + check_object_exists!(offer_keylet, "Offer", sfield::Account); + seq += 1; + + let paychan_keylet = keylets::paychan_keylet(&account, &destination, seq); + check_object_exists!(paychan_keylet, "PayChannel", sfield::Account); + seq += 1; + + let signers_keylet = keylets::signers_keylet(&account); + check_object_exists!(signers_keylet, "SignerList", sfield::Generic); + seq += 1; + + seq += 1; // ticket sequence number is one greater + let ticket_keylet = keylets::ticket_keylet(&account, seq); + check_object_exists!(ticket_keylet, "Ticket", sfield::Account); + // seq += 1; + + 1 // All keylets exist, finish the escrow. +} diff --git a/src/test/app/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/b58.c new file mode 100644 index 00000000000..00b6178ec05 --- /dev/null +++ b/src/test/app/wasm_fixtures/b58.c @@ -0,0 +1,73 @@ +#include + +static char const b58digits_ordered[] = + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + +uint8_t e_data[32 * 1024]; + +void* +allocate(int sz) +{ + static int idx = 0; + if (idx >= 32) + return 0; + if (sz > 1024) + return 0; + return &e_data[idx++ << 10]; +} + +void +deallocate(void* p) +{ +} + +extern int32_t +b58enco(char* b58, int32_t b58sz, void const* data, int32_t binsz) +{ + uint8_t const* bin = data; + int32_t carry; + int32_t i, j, high, zcount = 0; + int32_t size; + + while (zcount < binsz && !bin[zcount]) + ++zcount; + + size = (binsz - zcount) * 138 / 100 + 1; + uint8_t* buf = allocate(size); + if (!buf) + return 0; + // memset(buf, 0, size); + for (i = 0; i < size; ++i) + buf[i] = 0; + + for (i = zcount, high = size - 1; i < binsz; ++i, high = j) + { + for (carry = bin[i], j = size - 1; (j > high) || carry; --j) + { + carry += 256 * buf[j]; + buf[j] = carry % 58; + carry /= 58; + if (!j) + break; + } + } + + for (j = 0; j < size && !buf[j]; ++j) + ; + + if (b58sz <= zcount + size - j) + return 0; + + if (zcount) + { + // memset(b58, '1', zcount); + for (i = 0; i < zcount; ++i) + b58[i] = '1'; + } + + for (i = zcount; j < size; ++i, ++j) + b58[i] = b58digits_ordered[buf[j]]; + b58[i] = '\0'; + + return i + 1; +} diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock new file mode 100644 index 00000000000..00b548911b4 --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "codecov_tests" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml new file mode 100644 index 00000000000..e379fe9790c --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -0,0 +1,19 @@ +[package] +edition = "2024" +name = "codecov_tests" +version = "0.0.1" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs new file mode 100644 index 00000000000..0e8a1ecee08 --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -0,0 +1,47 @@ +//TODO add docs after discussing the interface +//Note that Craft currently does not honor the rounding modes +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_TO_NEAREST: i32 = 0; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_TOWARDS_ZERO: i32 = 1; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_DOWNWARD: i32 = 2; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_UPWARD: i32 = 3; + +// pub enum RippledRoundingModes{ +// ToNearest = 0, +// TowardsZero = 1, +// DOWNWARD = 2, +// UPWARD = 3 +// } + +#[allow(unused)] +#[link(wasm_import_module = "host_lib")] +unsafe extern "C" { + pub fn get_ledger_sqn(out_buff_ptr: i32, out_buff_len: i32) -> i32; + + pub fn cache_ledger_obj(keylet_ptr: i32, keylet_len: i32, cache_num: i32) -> i32; + + pub fn get_tx_nested_array_len(locator_ptr: i32, locator_len: i32) -> i32; + + pub fn account_keylet( + account_ptr: i32, + account_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn line_keylet( + account1_ptr: *const u8, + account1_len: usize, + account2_ptr: *const u8, + account2_len: usize, + currency_ptr: i32, + currency_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn trace_num(msg_read_ptr: i32, msg_read_len: i32, number: i64) -> i32; +} diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs new file mode 100644 index 00000000000..1323068b397 --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -0,0 +1,953 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use core::panic; +use xrpl_std::core::current_tx::escrow_finish::{EscrowFinish, get_current_escrow_finish}; +use xrpl_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_std::core::error_codes; +use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::keylets; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_num as trace_number}; +use xrpl_std::sfield; + +mod host_bindings_loose; +include!("host_bindings_loose.rs"); + +fn check_result(result: i32, expected: i32, test_name: &'static str) { + match result { + code if code == expected => { + let _ = trace_number(test_name, code.into()); + } + code if code >= 0 => { + let _ = trace(test_name); + let _ = trace_number("TEST FAILED", code.into()); + panic!("Unexpected success code: {}", code); + } + code => { + let _ = trace_number("TEST FAILED", code.into()); + panic!("Error code: {}", code); + } + } +} + +fn with_buffer(mut f: F) -> R +where + F: FnMut(*mut u8, usize) -> R, +{ + let mut buf = [0u8; N]; + f(buf.as_mut_ptr(), buf.len()) +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("$$$$$ STARTING WASM EXECUTION $$$$$"); + + // ######################################## + // Step #1: Test all host function happy paths + // Note: not testing all the keylet functions, + // that's in a separate test file. + // ######################################## + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_sqn(ptr, len) }, + 4, + "get_ledger_sqn", + ) + }); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_parent_ledger_time(ptr, len) }, + 4, + "get_parent_ledger_time", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_parent_ledger_hash(ptr, len) }, + 32, + "get_parent_ledger_hash", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_account_hash(ptr, len) }, + 32, + "get_ledger_account_hash", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_tx_hash(ptr, len) }, + 32, + "get_ledger_tx_hash", + ); + }); + check_result(unsafe { host::get_base_fee() }, 10, "get_base_fee"); + let amendment_name: &[u8] = b"test_amendment"; + let amendment_id: [u8; 32] = [1; 32]; + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), amendment_name.len()) }, + 1, + "amendment_enabled", + ); + check_result( + unsafe { host::amendment_enabled(amendment_id.as_ptr(), amendment_id.len()) }, + 1, + "amendment_enabled", + ); + let tx: EscrowFinish = get_current_escrow_finish(); + let account = tx.get_account().unwrap_or_panic(); // get_tx_field under the hood + let keylet = keylets::account_keylet(&account).unwrap_or_panic(); // account_keylet under the hood + check_result( + unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }, + 1, + "cache_ledger_obj", + ); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_current_ledger_obj_field(sfield::Account, ptr, len) }, + 20, + "get_current_ledger_obj_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_field(1, sfield::Account, ptr, len) }, + 20, + "get_ledger_obj_field", + ); + }); + let mut locator = Locator::new(); + locator.pack(sfield::Account); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_nested_field(locator.as_ptr(), locator.len(), ptr, len) }, + 20, + "get_tx_nested_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_current_ledger_obj_nested_field(locator.as_ptr(), locator.len(), ptr, len) + }, + 20, + "get_current_ledger_obj_nested_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_ledger_obj_nested_field(1, locator.as_ptr(), locator.len(), ptr, len) + }, + 20, + "get_ledger_obj_nested_field", + ); + }); + check_result( + unsafe { host::get_tx_array_len(sfield::Memos) }, + 32, + "get_tx_array_len", + ); + check_result( + unsafe { host::get_current_ledger_obj_array_len(sfield::Memos) }, + 32, + "get_current_ledger_obj_array_len", + ); + check_result( + unsafe { host::get_ledger_obj_array_len(1, sfield::Memos) }, + 32, + "get_ledger_obj_array_len", + ); + check_result( + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), locator.len()) }, + 32, + "get_tx_nested_array_len", + ); + check_result( + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }, + 32, + "get_current_ledger_obj_nested_array_len", + ); + check_result( + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }, + 32, + "get_ledger_obj_nested_array_len", + ); + check_result( + unsafe { host::update_data(account.0.as_ptr(), account.0.len()) }, + 0, + "update_data", + ); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::compute_sha512_half(locator.as_ptr(), locator.len(), ptr, len) }, + 32, + "compute_sha512_half", + ); + }); + let message: &[u8] = b"test message"; + let pubkey: &[u8] = b"test pubkey"; //tx.get_public_key().unwrap_or_panic(); + let signature: &[u8] = b"test signature"; + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + signature.len(), + ) + }, + 1, + "check_sig", + ); + + let nft_id: [u8; 32] = amendment_id; + with_buffer::<18, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + account.0.as_ptr(), + account.0.len(), + nft_id.as_ptr(), + nft_id.len(), + ptr, + len, + ) + }, + 18, + "get_nft", + ) + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_issuer(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 20, + "get_nft_issuer", + ) + }); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_taxon(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 4, + "get_nft_taxon", + ) + }); + check_result( + unsafe { host::get_nft_flags(nft_id.as_ptr(), nft_id.len()) }, + 8, + "get_nft_flags", + ); + check_result( + unsafe { host::get_nft_transfer_fee(nft_id.as_ptr(), nft_id.len()) }, + 10, + "get_nft_transfer_fee", + ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_serial(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 4, + "get_nft_serial", + ) + }); + + // ######################################## + // Step #2: Test set_data edge cases + // ######################################## + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(-1, 4) }, + error_codes::INVALID_PARAMS, + "get_ledger_sqn_neg_ptr", + ); + with_buffer::<4, _, _>(|ptr, _len| { + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, -1) }, + error_codes::INVALID_PARAMS, + "get_ledger_sqn_neg_len", + ) + }); + with_buffer::<3, _, _>(|ptr, len| { + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, len as i32) }, + error_codes::BUFFER_TOO_SMALL, + "get_ledger_sqn_buf_too_small", + ) + }); + with_buffer::<4, _, _>(|ptr, _len| { + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, 1_000_000_000) }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_ledger_sqn_len_too_long", + ) + }); + + // ######################################## + // Step #3: Test getData[Type] edge cases + // ######################################## + + // SField + check_result( + unsafe { host::get_tx_array_len(2) }, // not a valid SField value + error_codes::INVALID_FIELD, + "get_tx_array_len_invalid_sfield", + ); + + // Slice + check_result( + unsafe { host_bindings_loose::get_tx_nested_array_len(-1, locator.len() as i32) }, + error_codes::INVALID_PARAMS, + "get_tx_nested_array_len_neg_ptr", + ); + check_result( + unsafe { host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, -1) }, + error_codes::INVALID_PARAMS, + "get_tx_nested_array_len_neg_len", + ); + let long_len = 4 * 1024 + 1; + check_result( + unsafe { + host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, long_len as i32) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_array_len_too_long", + ); + check_result( + unsafe { + host_bindings_loose::get_tx_nested_array_len( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_tx_nested_array_len_ptr_oob", + ); + + // uint256 + check_result( + unsafe { + host_bindings_loose::cache_ledger_obj( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + 1, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "cache_ledger_obj_ptr_oob", + ); + check_result( + unsafe { + host_bindings_loose::cache_ledger_obj(locator.as_ptr() as i32, locator.len() as i32, 1) + }, + error_codes::INVALID_PARAMS, + "cache_ledger_obj_wrong_len", + ); + + // AccountID + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::account_keylet( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "account_keylet_len_too_long", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::account_keylet( + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "account_keylet_wrong_len", + ) + }); + + // Currency + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::line_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "line_keylet_len_too_long_currency", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::line_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_len_currency", + ) + }); + + // string + check_result( + unsafe { + host_bindings_loose::trace_num( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + 42, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_num_wrong_len_str", + ); + + // ######################################## + // Step #4: Test other host function edge cases + // ######################################## + + // invalid SFields + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_field(2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_tx_field_invalid_sfield", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_current_ledger_obj_field(2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_current_ledger_obj_field_invalid_sfield", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_field(1, 2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_ledger_obj_field_invalid_sfield", + ); + }); + check_result( + unsafe { host::get_tx_array_len(2) }, + error_codes::INVALID_FIELD, + "get_tx_array_len_invalid_sfield", + ); + check_result( + unsafe { host::get_current_ledger_obj_array_len(2) }, + error_codes::INVALID_FIELD, + "get_current_ledger_obj_array_len_invalid_sfield", + ); + check_result( + unsafe { host::get_ledger_obj_array_len(1, 2) }, + error_codes::INVALID_FIELD, + "get_ledger_obj_array_len_invalid_sfield", + ); + + // invalid Slice + + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "amendment_enabled", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_nested_field(locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_field_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_current_ledger_obj_nested_field(locator.as_ptr(), long_len, ptr, len) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_current_ledger_obj_nested_field_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_nested_field(1, locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_ledger_obj_nested_field_too_big_slice", + ); + }); + check_result( + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_current_ledger_obj_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_ledger_obj_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::update_data(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "update_data_too_big_slice", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + long_len, + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + signature.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + long_len, + signature.as_ptr(), + signature.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + long_len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::compute_sha512_half(locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "compute_sha512_half_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), + long_len, + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "credential_keylet_too_big_slice", + ) + }); + check_result( + unsafe { + host::trace( + locator.as_ptr(), + locator.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + 0, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_oob_slice", + ); + + // invalid UInt256 + + check_result( + unsafe { host::cache_ledger_obj(locator.as_ptr(), locator.len(), 0) }, + error_codes::INVALID_PARAMS, + "cache_ledger_obj_wrong_size_uint256", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "get_nft_wrong_size_uint256", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_issuer(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_issuer_wrong_size_uint256", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_taxon(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_taxon_wrong_size_uint256", + ) + }); + check_result( + unsafe { host::get_nft_flags(locator.as_ptr(), locator.len()) }, + error_codes::INVALID_PARAMS, + "get_nft_flags_wrong_size_uint256", + ); + check_result( + unsafe { host::get_nft_transfer_fee(locator.as_ptr(), locator.len()) }, + error_codes::INVALID_PARAMS, + "get_nft_transfer_fee_wrong_size_uint256", + ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_serial(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_serial_wrong_size_uint256", + ) + }); + + // invalid AccountID + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::account_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "account_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::check_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "check_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // valid slice size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "credential_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + locator.as_ptr(), // valid slice size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "credential_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::delegate_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "delegate_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::delegate_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "delegate_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::deposit_preauth_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "deposit_preauth_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::deposit_preauth_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "deposit_preauth_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::did_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "did_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::escrow_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "escrow_keylet_wrong_size_accountid", + ) + }); + let currency: &[u8] = b"USD00000000000000000"; // 20 bytes + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::line_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + currency.as_ptr(), + currency.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::line_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + currency.as_ptr(), + currency.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::nft_offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "nft_offer_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "offer_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::oracle_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "oracle_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + 1, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + 1, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::signers_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "signers_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::ticket_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "ticket_keylet_wrong_size_accountid", + ) + }); + let uint256: &[u8] = b"00000000000000000000000000000001"; + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + locator.as_ptr(), + locator.len(), + uint256.as_ptr(), + uint256.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "get_nft_wrong_size_accountid", + ) + }); + + // invalid Currency was already tested above + // invalid string + + check_result( + unsafe { + host::trace( + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + uint256.as_ptr(), + uint256.len(), + 0, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_nft_wrong_size_string", + ); + + // trace too large + + check_result( + unsafe { + host::trace( + locator.as_ptr(), + locator.len(), + locator.as_ptr(), + long_len, + 0, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_too_long", + ); + check_result( + unsafe { host::trace_num(locator.as_ptr(), long_len, 1) }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_num_too_long", + ); + + 1 // <-- If we get here, finish the escrow. +} diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py new file mode 100644 index 00000000000..1198946eb50 --- /dev/null +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -0,0 +1,130 @@ +import os +import sys +import subprocess +import re + +OPT = "-Oz" + + +def update_fixture(project_name, wasm): + fixture_name = ( + re.sub(r"_([a-z])", lambda m: m.group(1).upper(), project_name) + "WasmHex" + ) + print(f"Updating fixture: {fixture_name}") + + cpp_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "fixtures.cpp")) + h_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "fixtures.h")) + with open(cpp_path, "r", encoding="utf8") as f: + cpp_content = f.read() + + pattern = rf'extern std::string const {fixture_name} =[ \n]+"[^;]*;' + if re.search(pattern, cpp_content, flags=re.MULTILINE): + updated_cpp_content = re.sub( + pattern, + f'extern std::string const {fixture_name} = "{wasm}";', + cpp_content, + flags=re.MULTILINE, + ) + else: + with open(h_path, "r", encoding="utf8") as f: + h_content = f.read() + updated_h_content = ( + h_content.rstrip() + f"\n\n extern std::string const {fixture_name};\n" + ) + with open(h_path, "w", encoding="utf8") as f: + f.write(updated_h_content) + updated_cpp_content = ( + cpp_content.rstrip() + + f'\n\nextern std::string const {fixture_name} = "{wasm}";\n' + ) + + with open(cpp_path, "w", encoding="utf8") as f: + f.write(updated_cpp_content) + + +def process_rust(project_name): + project_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), project_name) + ) + wasm_location = f"target/wasm32-unknown-unknown/release/{project_name}.wasm" + build_cmd = ( + f"(cd {project_path} " + f"&& cargo build --target wasm32-unknown-unknown --release " + f"&& wasm-opt {wasm_location} {OPT} -o {wasm_location}" + ")" + ) + try: + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") + print(f"WASM file for {project_name} has been built and optimized.") + except subprocess.CalledProcessError as e: + print(f"exec error: {e}") + sys.exit(1) + + src_path = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + f"{project_name}/target/wasm32-unknown-unknown/release/{project_name}.wasm", + ) + ) + with open(src_path, "rb") as f: + data = f.read() + wasm = data.hex() + update_fixture(project_name, wasm) + + +def process_c(project_name): + project_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), f"{project_name}.c") + ) + wasm_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), f"{project_name}.wasm") + ) + build_cmd = ( + f"$CC --sysroot=$SYSROOT -I$SYSROOT/include/wasm32-wasi " + f"-O3 -ffast-math --target=wasm32 -fno-exceptions -fno-threadsafe-statics -fvisibility=default -Wl,--export-all -Wl,--no-entry -Wl,--allow-undefined -DNDEBUG --no-standard-libraries -fno-builtin-memset " + f"-o {wasm_path} {project_path}" + f"&& wasm-opt {wasm_path} {OPT} -o {wasm_path}" + ) + try: + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") + print( + f"WASM file for {project_name} has been built with WASI support using clang." + ) + except subprocess.CalledProcessError as e: + print(f"exec error: {e}") + sys.exit(1) + + with open(wasm_path, "rb") as f: + data = f.read() + wasm = data.hex() + update_fixture(project_name, wasm) + + +if __name__ == "__main__": + if len(sys.argv) > 2: + print("Usage: python copyFixtures.py []") + sys.exit(1) + if len(sys.argv) == 2: + process_rust(sys.argv[1]) + else: + dirs = [ + d + for d in os.listdir(os.path.dirname(__file__)) + if os.path.isdir(os.path.join(os.path.dirname(__file__), d)) + ] + c_files = [f for f in os.listdir(os.path.dirname(__file__)) if f.endswith(".c")] + for d in dirs: + process_rust(d) + for c in c_files: + process_c(c[:-2]) + print("All fixtures have been processed.") diff --git a/src/test/app/wasm_fixtures/disableFloat.wat b/src/test/app/wasm_fixtures/disableFloat.wat new file mode 100644 index 00000000000..035a849e30d --- /dev/null +++ b/src/test/app/wasm_fixtures/disableFloat.wat @@ -0,0 +1,34 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (result i32))) + (func (;0;) (type 0)) + (func (;1;) (type 1) (result i32) + f32.const -2048 + f32.const 2050 + f32.sub + drop + i32.const 1) + (memory (;0;) 2) + (global (;0;) i32 (i32.const 1024)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 2048)) + (global (;3;) i32 (i32.const 2048)) + (global (;4;) i32 (i32.const 67584)) + (global (;5;) i32 (i32.const 1024)) + (global (;6;) i32 (i32.const 67584)) + (global (;7;) i32 (i32.const 131072)) + (global (;8;) i32 (i32.const 0)) + (global (;9;) i32 (i32.const 1)) + (export "memory" (memory 0)) + (export "__wasm_call_ctors" (func 0)) + (export "finish" (func 1)) + (export "buf" (global 0)) + (export "__dso_handle" (global 1)) + (export "__data_end" (global 2)) + (export "__stack_low" (global 3)) + (export "__stack_high" (global 4)) + (export "__global_base" (global 5)) + (export "__heap_base" (global 6)) + (export "__heap_end" (global 7)) + (export "__memory_base" (global 8)) + (export "__table_base" (global 9))) diff --git a/src/test/app/wasm_fixtures/fib.c b/src/test/app/wasm_fixtures/fib.c new file mode 100644 index 00000000000..4410923054f --- /dev/null +++ b/src/test/app/wasm_fixtures/fib.c @@ -0,0 +1,12 @@ +// typedef long long mint; +typedef int mint; + +mint +fib(mint n) +{ + if (!n) + return 0; + if (n <= 2) + return 1; + return fib(n - 1) + fib(n - 2); +} diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 3424de7006c..9e530997a0e 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -21,67 +21,14 @@ #include -extern std::string const tx_js = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; -extern std::string const lo_js = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - -extern std::string const lo_js2 = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode": "0", - "PreviousTxnID": "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - -extern std::string const fib32Hex = +extern std::string const fibWasmHex = "0061736d0100000001090260000060017f017f0303020001071b02115f5f" "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" "01017f200045044041000f0b2000410348044041010f0b200041026a2100" "0340200041036b100120016a2101200041026b220041044a0d000b200141" "016a0b"; -extern std::string const fib64Hex = - "0061736d0100000001090260000060017e017e0303020001071b02115f5f" - "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" - "01017e200050044042000f0b2000420353044042010f0b200042027c2100" - "0340200042037d100120017c2101200042027d22004204550d000b200142" - "017c0b00490f7461726765745f6665617475726573042b0f6d757461626c" - "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e6365" - "2d74797065732b0a6d756c746976616c7565"; - -extern std::string const b58Hex = +extern std::string const b58WasmHex = "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" @@ -117,7 +64,7 @@ extern std::string const b58Hex = "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" "65666572656e63652d74797065732b0a6d756c746976616c7565"; -extern std::string const sha512PureHex = +extern std::string const sha512PureWasmHex = "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" "05040001020305030100020607017f0041800d0b075006066d656d6f7279" "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" @@ -175,2097 +122,7 @@ extern std::string const sha512PureHex = "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" "7065732b0a6d756c746976616c7565"; -extern std::string const checkJsonHex = - "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" - "00030c0b01010200000000000003000405017001030305030100110619037f0141" - "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" - "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" - "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" - "200010012200450d0120000f0b230041206b220024002000410036021820004101" - "36020c200041b480c00036020820004204370210200041086a41d080c000100500" - "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" - "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" - "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" - "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" - "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" - "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" - "0245044041002100410021010c040b4100210020054100411920074101766b2007" - "411f461b7421044100210103400240200228020441787122062005490d00200620" - "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" - "021422062000200620022004411d764104716a41106a2802002202471b20002006" - "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" - "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" - "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" - "000b20012000410372360204200020016a220020002802044101723602040c060b" - "024041022000742203410020036b72200120007471682206410374220041a483c0" - "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" - "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" - "360204200120056a2206200020056b2204410172360204200020016a2004360200" - "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" - "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" - "200220057236020020000c010b20002802080b2102200020033602082002200336" - "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" - "043602000c050b200068410274419482c0006a280200220128020441787120056b" - "2103200121020240034002400240200128021022000d00200128021422000d0020" - "022802182107024002402002200228020c22004604402002411441102002280214" - "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" - "013602080c010b200241146a200241106a20001b21040340200421062001220041" - "146a200041106a200028021422011b210420004114411020011b6a28020022010d" - "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" - "28020047044020074110411420072802102002461b6a20003602002000450d040c" - "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" - "77713602000c030b200028020441787120056b22012003200120034922011b2103" - "2000200220011b2102200021010c010b0b20002007360218200228021022010440" - "20002001360210200120003602180b20022802142201450d002000200136021420" - "0120003602180b02400240200341104f044020022005410372360204200220056a" - "22062003410172360204200320066a200336020041b485c0002802002204450d01" - "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" - "2205410120044103767422047145044041ac85c000200420057236020020000c01" - "0b20002802080b2104200020013602082004200136020c2001200036020c200120" - "043602080c010b2002200320056a2200410372360204200020026a220020002802" - "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" - "41086a0f0b20002001724504404100210141022007742200410020006b72200871" - "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" - "20012000280204417871220420056b220620034922071b21082000280210220245" - "0440200028021421020b20012008200420054922001b210120032006200320071b" - "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" - "200020056b4f710d0020012802182107024002402001200128020c220046044020" - "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" - "2202200036020c200020023602080c010b200141146a200141106a20001b210403" - "40200421062002220041146a200041106a200028021422021b2104200041144110" - "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" - "28021c410274419482c0006a220228020047044020074110411420072802102001" - "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" - "b085c000280200417e200128021c77713602000c010b2000200736021820012802" - "102202044020002002360210200220003602180b20012802142202450d00200020" - "02360214200220003602180b0240200341104f0440200120054103723602042001" - "20056a22022003410172360204200220036a200336020020034180024f04402002" - "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" - "410120034103767422037145044041ac85c000200320047236020020000c010b20" - "002802080b2103200020023602082003200236020c2002200036020c2002200336" - "02080c010b2001200320056a2200410372360204200020016a2200200028020441" - "01723602040b0c010b024002400240024002400240200541b485c0002802002201" - "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" - "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" - "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" - "02002201200020002001491b3602000240024041c085c000280200220304404194" - "83c0002100034020002802002201200028020422066a2002460d02200028020822" - "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" - "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" - "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" - "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" - "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" - "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" - "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" - "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" - "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" - "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" - "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" - "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" - "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" - "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" - "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" - "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" - "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" - "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" - "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" - "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" - "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" - "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" - "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" - "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" - "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" - "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" - "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" - "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" - "85c000200441286b220036020020022000410172360204200020026a4128360204" - "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" - "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" - "20046a2101419483c0002100024002400340200120002802002206470440200028" - "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" - "0028020022014f04402003200120002802046a2206490d010b200028020821000c" - "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" - "0172360204200020026a412836020441cc85c00041808080013602002003200641" - "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" - "002109200141106a419c83c00029020037020020012009370208419883c0002004" - "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" - "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" - "012003460d0720012001280204417e713602042003200120036b22004101723602" - "042001200036020020004180024f04402003200010070c080b200041f8017141a4" - "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" - "ac85c000200020027236020020010c010b20012802080b21002001200336020820" - "00200336020c2003200136020c200320003602080c070b20002002360200200020" - "0028020420046a360204200220054103723602042006410f6a41787141086b2201" - "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" - "460d04200128020422054103714101460440200120054178712200100820002001" - "6a22012802042105200020036a21030b20012005417e7136020420042003410172" - "360204200320046a200336020020034180024f04402004200310070c060b200341" - "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" - "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" - "043602082003200436020c2004200036020c200420033602080c050b41b885c000" - "200020056b220136020041c085c00041c085c000280200220020056a2202360200" - "2002200141017236020420002005410372360204200041086a21000c060b41bc85" - "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" - "85c000410036020020002001410372360204200020016a22012001280204410172" - "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" - "2002410172360204200020016a2002360200200020054103723602040b20004108" - "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" - "71220141086b220236020041b885c00041b885c00028020020046a220320002001" - "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" - "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" - "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" - "0041b485c00041b485c00028020020036a22003602002004200041017236020420" - "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" - "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" - "20056a22023602002002200141017236020420002005410372360204200041086a" - "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" - "402007410020076b41037122026a21062002044020072103418080c00021050340" - "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" - "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" - "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" - "6b411871210820052802002105034020062005200c762004280200220520087472" - "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" - "20022104034020062004280200360200200441046a2104200641046a2206200349" - "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" - "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" - "4122460440200021032007210241002105412221080240034020032d0000220920" - "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" - "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" - "0b000bd20601047f0240200041046b280200220241787122034104410820024103" - "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" - "0041046b280200220341787122006a21020240024020034101710d002003410271" - "450d012001280200220320006a2100200120036b220141bc85c000280200460440" - "20022802044103714103470d0141b485c000200036020020022002280204417e71" - "36020420012000410172360204200220003602000c020b2001200310080b024002" - "4002400240024020022802042203410271450440200241c085c000280200460d02" - "200241bc85c000280200460d0320022003417871220210082001200020026a2200" - "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" - "0020003602000c060b20022003417e713602042001200041017236020420002001" - "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" - "c00028020041016b220036020020000d04419c83c0002802002200044003402001" - "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" - "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" - "003602002001200041017236020441bc85c000280200200146044041b485c00041" - "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" - "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" - "00210103402002200128020022054f04402002200520012802046a490d040b2001" - "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" - "20006a220036020020012000410172360204200020016a20003602000c020b2000" - "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" - "007145044041ac85c000200020037236020020020c010b20022802080b21002002" - "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" - "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" - "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" - "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" - "7f230041206b220224002002410036021020024101360204200242043702082002" - "412e36021c200220003602182002200241186a360200200220011005000ba40201" - "037f230041206b22022400200241106a2203200041106a29020037030020024108" - "6a2204200041086a290200370300200241013b011c200220013602182002200029" - "0200370300230041206b2200240020022802182101200041106a20032902003703" - "00200041086a20042902003703002000200236021c200020013602182000200229" - "020037030041002102230041106b22012400200028020c21030240024002400240" - "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" - "2802042102200328020021030c010b20014180808080783602002001200036020c" - "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" - "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" - "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" - "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" - "2002410274419482c0006a21044101200274220341b085c0002802007145044020" - "042000360200200020043602182000200036020c2000200036020841b085c00041" - "b085c0002802002003723602000f0b024002402001200428020022032802044178" - "71460440200321020c010b20014100411920024101766b2002411f461b74210503" - "4020032005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c200220" - "00360208200041003602182000200236020c200020013602080f0b200420003602" - "00200020033602182000200036020c200020003602080bf10201047f200028020c" - "21020240024020014180024f044020002802182103024002402000200246044020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" - "2201200236020c200220013602080c010b200041146a200041106a20021b210403" - "40200421052001220241146a200241106a200228021422011b2104200241144110" - "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" - "0274419482c0006a220128020047044020034110411420032802102000461b6a20" - "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" - "280200417e200028021c77713602000c020b200028020822002002470440200020" - "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" - "77713602000f0b2002200336021820002802102201044020022001360210200120" - "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" - "017f230041106b22032400419082c000419082c000280200220441016a36020002" - "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" - "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" - "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" - "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" - "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" - "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" - "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" - "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" - "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" - "64006000100029000000a804000009000000617373657274696f6e206661696c65" - "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" - "6765010452757374000c70726f6365737365642d62790105727573746325312e38" - "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" - "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - -extern std::string const compareJsonHex = - "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" - "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" - "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" - "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" - "616004030305060001070808080809040702000000040403030304030500020306" - "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" - "0903020201020200000405000203030402020205100b0303000005030101010104" - "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" - "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" - "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" - "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" - "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" - "360228200320023602242003200136022020034180013a002c2003410036021c20" - "03428080808010370214200341c8006a200341146a108180808000024002400240" - "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" - "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" - "2903483703300240024020032802282202200328022422064f0d00200328022021" - "070340200720026a2d000041776a220141174b0d02410120017441938080047145" - "0d022006200241016a2202470d000b200320063602280b20002003290330370300" - "200041106a2004290300370300200041086a200529030037030020032802142202" - "450d04200328021820021082808080000c040b20032002360228200341086a2007" - "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" - "200328020c21012003280208210641141084808080002202450d01200220063602" - "0c2002411636020020002002360204200041063a00002002200136021020034130" - "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" - "032802142202450d00200328021820021082808080000b200341e0006a24808080" - "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" - "210302400240024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f0006a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" - "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" - "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241386a200320052005200441016a220420052004491b" - "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" - "84808080002207450d1f2007200836020c20074105360200200720043602100c08" - "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" - "c080001a200228024c21042002280248210841141084808080002207450d1e2007" - "200836020c20074107360200200720043602100c070b20022902dc02210e200228" - "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228024421042002280240210841141084808080002207450d1c2007200836020c" - "20074115360200200720043602100c050b200241b0016a20011081808080000240" - "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" - "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" - "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" - "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" - "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" - "000120042007360204200441106a2003290300370300200441036a20052d00003a" - "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" - "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" - "0000200420083602100c180b200628020021030b200241306a2003200520052004" - "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" - "042002280230210841141084808080002207450d172007200836020c2007410236" - "0200200720043602100b200241d8026a109180808000024020022802d802220445" - "0d002009200441186c1082808080000b200128020c210320012802142104200128" - "0210210541062106410121090b200120012d001841016a3a001802400240200420" - "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" - "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" - "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28021421082002280210210541141084808080002204450d1d200441163602000c" - "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" - "41776a220841174b0d024101200874419380800471450d022001200441016a2204" - "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" - "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" - "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" - "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" - "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" - "210541141084808080002204450d1a200441153602000c040b200241206a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228022421082002280220210541141084808080002204450d1920044116360200" - "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" - "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" - "001a200228021c21082002280218210541141084808080002204450d1620044102" - "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" - "01200220073602b401200220063a00b001024020090d00200241063a0078200220" - "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" - "200241c8016a1092808080000c110b200241086a20032005200520042005200449" - "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" - "1084808080002204450d142004200136020c200441183602002000200436020420" - "0041063a0000200420083602100c130b200141003602082001200441016a360214" - "200241b0016a2006200110938080800020022802b40121080240024020022802b0" - "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" - "948080800020022d00784106460d1320002002290378370300200041106a200241" - "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" - "150b41002101024020044100480d00024020040d0041012101410021050c030b41" - "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" - "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" - "086a220320012008200410df808080003602002002200536027c200241033a0078" - "2002200436028401200041106a200241f8006a41106a290300370300200041086a" - "2003290300370300200020022903783703000c120b2001200441016a3602142002" - "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" - "20024190016a109680808000024020022d00784106460d00200020022903783703" - "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" - "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" - "200020043602040c120b2000200228029801360204200041063a00000c110b0240" - "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" - "14200141bb80c0800041031086808080002204450d02200041063a000020002004" - "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" - "0a490d042002200320052005200441016a220420052004491b1083808080004100" - "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" - "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" - "200241003a007820002002290378370300200041086a200241f8006a41086a2903" - "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" - "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" - "00200020043602040c0e0b20024181023b01782000200229037837030020004108" - "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" - "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" - "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" - "02290378370300200041086a200241f8006a41086a290300370300200041106a20" - "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" - "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" - "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" - "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" - "21070c070b20022802d401220441003602082004200428021441016a3602142002" - "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" - "460d06200241d8026a200720022802b801109880808000024020022802d8022204" - "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" - "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" - "41003602dc01200220053602e002200220083602dc02200220043602d802200241" - "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" - "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" - "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" - "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" - "024020022d00b101450d0020022802d40122044100360208200420042802144101" - "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" - "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" - "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" - "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" - "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" - "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" - "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" - "290300220f370300200220022903b00122103703d802200541106a200e37020020" - "0541086a200f3702002005201037020020024180026a41086a200c290200370300" - "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" - "186a280200360200200220022902b00137038002200220033602a4022002200736" - "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" - "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" - "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" - "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" - "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" - "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" - "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" - "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" - "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" - "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" - "200820041082808080000b200241dc016a109b808080000b41062106410121090b" - "200120012d001841016a3a0018200128020c210302400240024020012802142204" - "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" - "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" - "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" - "21040c050b200241e8006a200320052005200441016a220420052004491b108380" - "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" - "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" - "200441016a220436021420052004470d000b200521040b200241e0006a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28026421082002280260210541141084808080002204450d072004200536020c20" - "044103360200200420083602100c010b200241d8006a200320052005200441016a" - "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" - "280258210541141084808080002204450d062004200536020c2004411636020020" - "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" - "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" - "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" - "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" - "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" - "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" - "80000c010b200241d0006a200320052005200420052004491b1083808080004100" - "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" - "0d042004200136020c2004411836020020002004360204200041063a0000200420" - "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" - "200041063a0000200020043602040c010b20002002290378370300200041106a20" - "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" - "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" - "002202417871220341044108200241037122021b20016a490d0002402002450d00" - "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" - "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" - "0301057f02400240024002400240024020022003490d0041012104410021052003" - "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" - "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" - "418a94a8d000736b20077241808182847871418081828478460d00034020062001" - "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" - "034109490d0103400240024020074108480d004180828408200120076a22064178" - "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" - "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" - "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" - "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" - "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" - "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" - "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" - "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" - "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" - "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" - "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" - "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" - "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" - "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" - "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" - "0041002100410021060c040b4100210020024100411920054101766b2005411f46" - "1b74210741002106034002402001220128020441787122082002490d0020082002" - "6b220820034f0d00200821032001210620080d004100210320012106200121000c" - "060b200128021422082000200820012007411d764104716a41106a280200220147" - "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" - "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" - "0022032802082206460d002006200236020c200220063602080c010b4100200141" - "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" - "0204410172360204200341086a0f0b024002402000200374410220037422004100" - "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" - "0022002802082207460d002007200636020c200620073602080c010b4100200141" - "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" - "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" - "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" - "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" - "d2c08000200621010c010b200628020821010b200620033602082001200336020c" - "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" - "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" - "787120026b2103200621010240024003400240200628021022000d002006280214" - "22000d0020012802182105024002400240200128020c22002001470d0020014114" - "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" - "0036020c200020063602080c010b200141146a200141106a20001b210703402007" - "21082006220041146a200041106a200028021422061b210720004114411020061b" - "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" - "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" - "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" - "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" - "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" - "360218024020012802102206450d0020002006360210200620003602180b200128" - "02142206450d0020002006360214200620003602180b0240024002402003411049" - "0d0020012002410372360204200120026a22022003410172360204200220036a20" - "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" - "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" - "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" - "0b200620003602082007200036020c2000200636020c200020073602080c010b20" - "01200320026a2200410372360204200120006a220020002802044101723602040c" - "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" - "4020002006720d004100210641022005742200410020006b722004712200450d03" - "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" - "280204417871220120026b220820034922051b2104200120024921072008200320" - "051b21080240200028021022010d00200028021421010b2006200420071b210620" - "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" - "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" - "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" - "410021000c020b20062802082201200036020c200020013602080c010b20064114" - "6a200641106a20001b21070340200721082001220041146a200041106a20002802" - "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" - "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" - "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" - "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" - "c080000c010b20002005360218024020062802102201450d002000200136021020" - "0120003602180b20062802142201450d0020002001360214200120003602180b02" - "40024020034110490d0020062002410372360204200620026a2200200341017236" - "0204200020036a200336020002402003418002490d002000200310d7808080000c" - "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" - "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" - "200228020821030b200220003602082003200036020c2000200236020c20002003" - "3602080c010b2006200320026a2200410372360204200620006a22002000280204" - "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" - "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" - "200241af80046a220641107640002203417f4622070d0720034110742201450d07" - "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" - "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" - "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" - "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" - "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" - "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" - "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" - "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" - "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" - "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" - "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" - "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" - "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" - "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" - "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" - "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" - "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" - "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" - "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" - "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" - "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" - "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" - "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" - "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" - "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" - "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" - "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" - "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" - "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" - "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" - "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" - "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" - "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" - "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" - "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" - "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" - "003602f0d2c0800020012000410172360204200120006a41283602044100418080" - "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" - "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" - "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" - "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" - "02402000280200220620034b0d002003200620002802046a2206490d020b200028" - "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" - "800020012000410172360204200120006a412836020441004180808001360284d3" - "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" - "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" - "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" - "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" - "200041046a22002006490d000b20072003460d0720072007280204417e71360204" - "2003200720036b22004101723602042007200036020002402000418002490d0020" - "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" - "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" - "c08000200621000c010b200628020821000b200620033602082000200336020c20" - "03200636020c200320003602080c070b200020013602002000200028020420086a" - "360204200120024103723602042007410f6a41787141786a2206200120026a2200" - "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" - "200628020422024103714101470d0020062002417871220210a880808000200220" - "036a2103200620026a220628020421020b20062002417e71360204200020034101" - "72360204200020036a200336020002402003418002490d002000200310d7808080" - "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" - "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" - "010b200228020821030b200220003602082003200036020c2000200236020c2000" - "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" - "8000220020026a22063602f8d2c080002006200341017236020420002002410372" - "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" - "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" - "410372360204200320006a220020002802044101723602040c010b410020063602" - "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" - "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" - "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" - "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" - "d2c0800020062001410172360204200020036a4128360204410041808080013602" - "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" - "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" - "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" - "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" - "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" - "0020026a22063602f8d2c080002006200341017236020420002002410372360204" - "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" - "02000b200041046a109b808080000c020b20002802042201450d01200028020820" - "011082808080000f0b200041046a10918080800020002802042201450d00200028" - "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" - "80808080002000280214220420002802102205200420054b1b2106200028020c21" - "0702400240024002400340024020020d00410021040c050b20062004460d012000" - "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" - "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" - "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" - "8080002204450d01200441093602000c020b200320072005200610838080800041" - "002d00c0cfc080001a200328020421012003280200210241141084808080002204" - "450d00200441053602000c010b000b2004200236020c200420013602100b200341" - "106a24808080800020040b970202027f027e23808080800041106b220424808080" - "8000024002400240024002400240024002402001280214220520012802104f0d00" - "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" - "020b2002450d02420121060c050b20042001200220034100108880808000200428" - "02000d020c030b200420012002200341001089808080002004280200450d022000" - "2004280204360208200042033703000c040b420021060240420020037d22074200" - "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" - "020b20002004280204360208200042033703000c020b2004290308210342002106" - "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" - "23808080800041106b220524808080800020012001280214220641016a22073602" - "140240024002402007200128021022084f0d00200720086b2109200128020c210a" - "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" - "410a490d00024020060d002005200a20082008200741016a220720082007491b10" - "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" - "808080002207450d072007200c36020c2007410d36020020002007360204200041" - "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" - "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" - "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" - "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" - "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" - "20002001200220032007108b808080000c010b200541086a200128020c20082008" - "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" - "0c21062005280208210c41141084808080002207450d012007200c36020c200741" - "053602002000200736020420004101360200200720063602100b200541106a2480" - "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" - "0620012001280214220741016a220836021402402008200128021022094f0d0041" - "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" - "2001200741026a22083602140b200128020c210a02400240024002400240024002" - "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" - "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" - "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" - "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" - "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" - "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" - "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" - "042007200836020c20074105360200200020073602042000410136020020072001" - "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" - "020421012005280200210841141084808080002207450d032007200836020c2007" - "410d3602002000200736020420004101360200200720013602100c040b20042008" - "6a2207411f7541808080807873200720084100482007200448731b21070b200020" - "01200220032007108b808080000c020b2000200120022003502006108c80808000" - "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" - "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" - "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" - "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" - "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" - "22052480808080002003ba2106024002400240024002400240024020042004411f" - "7522077320076b220741b502490d0003402006440000000000000000610d062004" - "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" - "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" - "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" - "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" - "84808080002204450d022004200136020c2004410e360200200020043602042004" - "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" - "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" - "28020c21072005280208210141141084808080002204450d012004200136020c20" - "04410e36020020002004360204200420073602100b410121040c020b000b200020" - "0620069a20021b390308410021040b20002004360200200541106a248080808000" - "0b840201027f23808080800041106b220524808080800002400240024002402004" - "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" - "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" - "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" - "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" - "1084808080002204450d002004200336020c2004410e3602002000200436020420" - "042001360210410121040c020b000b200044000000000000000044000000000000" - "008020021b390308410021040b20002004360200200541106a2480808080000b95" - "0502067f017e23808080800041306b2203248080808000200128020c2104024002" - "40024002400240024020012802142205200128021022064f0d002001200541016a" - "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" - "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" - "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" - "21072003280218210441141084808080002201450d022001200436020c20014105" - "3602002000200136020820004203370300200120073602100c040b200341086a20" - "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" - "1a200328020c21072003280208210441141084808080002201450d012001200436" - "020c2001410d3602002000200136020820004203370300200120073602100c030b" - "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" - "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" - "01450d012001200436020c2001410d360200200020013602082000420337030020" - "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" - "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" - "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" - "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" - "0b0b200341206a200120022009108e808080000240024020032802200d00200020" - "032b0328390308420021090c010b20002003280224360208420321090b20002009" - "3703000c020b000b20002001200220091087808080000b200341306a2480808080" - "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" - "0641016a2107200520066b2108200128020c20066a210541002104034002402005" - "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" - "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" - "200720046a3602142008200441016a2204470d000b200821040b20002001200220" - "032004108b808080000f0b200020012002200320041088808080000bc80101047f" - "23808080800041206b2202248080808000024002400240200028020c450d002000" - "21010c010b200241106a41086a2203200041086a28020036020020022000290200" - "370310200241086a200128020c2001280210200128021410838080800041002d00" - "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" - "200120022903103702002001200536020c20012004360210200141086a20032802" - "00360200200041141082808080000b200241206a24808080800020010f0b000b59" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "014108411810d480808000024020012802082200418180808078460d0020002001" - "28020c109580808000000b200141106a2480808080000b950101027f0240200028" - "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" - "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" - "0041046a28020020021082808080000c010b200010918080800020002802002202" - "450d00200041046a280200200241186c1082808080000b200041186a2100200141" - "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" - "01020b20002802082201450d01200028020420011082808080000c010b20002d00" - "044103470d00200028020822012802002102024020012802042203280200220445" - "0d002002200411808080800080808080000b024020032802042203450d00200220" - "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" - "097f017e23808080800041306b2203248080808000024002400240024002400240" - "0240024002400340024002402001280208220420012802042205460d0002400240" - "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" - "00460d0120074120490d012006200441016a22086a21094100200520086b417871" - "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" - "800020012802042105200128020821070c040b200741086a2107200b41086a2109" - "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" - "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" - "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" - "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" - "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" - "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" - "1084808080002207450d052007200936020c200741043602002000200736020420" - "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" - "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" - "024020094122470d002002280208450d0520072004490d072002200b20046a2007" - "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" - "0204200228020810ca8080800020032802282207450d032000200328022c360208" - "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" - "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" - "450d052007200936020c2007411036020020002007360204200041023602002007" - "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" - "80002001200741016a2209360208024020092005490d00200341206a200b200520" - "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" - "1084808080002207450d06200741043602000c090b2001200741026a2204360208" - "02400240024002400240024002400240024002400240200b20096a2d0000220741" - "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" - "00470d020240200228020822072002280200470d00200210cb808080000b200220" - "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" - "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" - "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" - "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" - "22072002280200470d00200210cb808080000b2002200741016a36020820022802" - "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" - "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" - "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" - "02200741016a360208200228020420076a41083a0000410021070c050b02402002" - "28020822072002280200470d00200210cb808080000b2002200741016a36020820" - "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" - "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" - "0000410021070c030b0240200228020822072002280200470d00200210cb808080" - "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" - "40200228020822072002280200470d00200210cb808080000b2002200741016a36" - "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" - "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" - "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" - "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" - "40024020032802282207450d002000200328022c3602084100210b0c010b410221" - "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" - "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" - "200936020c2007200b3602100b20004102360200200020073602040b200341306a" - "2480808080000b7901027f410021030240024020024100480d00024020020d0041" - "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" - "040d01410121030b20032002109580808000000b20042001200210df8080800021" - "012000200236020c2000200136020820002003360204200041033a00000b100002" - "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" - "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" - "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" - "370308200041023a0000200020012903083703100f0b200041023a000020002001" - "290308220337031020002003423f883703080bb40701077f23808080800041306b" - "22022480808080002001280200220328020c210402400240024002402003280214" - "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" - "174b0d024101200874419380800471450d022003200541016a2205360214200620" - "05470d000b200621050b41012108200241286a200420062006200541016a220520" - "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" - "210341141084808080002205450d022005200336020c2005410336020020002005" - "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" - "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" - "20053602140240200520064f0d00034002400240024002400240200420056a2d00" - "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" - "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" - "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" - "0c21062002280208210341141084808080002205450d092005200336020c200541" - "1136020020002005360204200520063602100c080b200041013a0001410021080c" - "070b41012108200241186a200420062006200541016a220520062005491b108380" - "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" - "80002205450d072005200336020c20054115360200200020053602042005200636" - "02100c060b2003200541016a220536021420062005470d000b200621050b410121" - "08200241106a200420062006200541016a220520062005491b1083808080004100" - "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" - "0d042005200336020c2005410536020020002005360204200520063602100c030b" - "41002108200141003a0004024020074122460d002002200420062006200541016a" - "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" - "280200210641141084808080002205450d042005200636020c2005411136020020" - "002005360204200520083602100c020b200041013a00010c020b200241206a2004" - "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" - "21082002280220210641141084808080002205450d022005200636020c20054108" - "36020020002005360204200520083602100b410121080b200020083a0000200241" - "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" - "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" - "8080800022040d01410121030b20032002109580808000000b20042001200210df" - "8080800021012000200236020820002001360204200020033602000bdc0201067f" - "23808080800041106b22022480808080002001280200220328020c210402400240" - "02400240024020032802142201200341106a28020022054f0d000340200420016a" - "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" - "41016a220136021420052001470d000b200521010b200241086a20042005200520" - "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" - "21072002280208210541141084808080002201450d03200141033602000c010b02" - "402006413a470d002003200141016a360214200020031081808080000c020b2002" - "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" - "001a200228020421072002280200210541141084808080002201450d0220014106" - "3602000b2001200536020c20002001360204200041063a0000200120073602100b" - "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" - "042480808080000240024002400240024002400240024002400240024002400240" - "20012802002205450d002002280208210620022802042107200128020421080240" - "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" - "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" - "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" - "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" - "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" - "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" - "2002290204220fa721092002280200220b418080808078470d03200921050c010b" - "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" - "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" - "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" - "028c02200142808080801037020420012009360200200920032903003703002009" - "41086a200341086a290300370300200941106a200341106a2903003703000c010b" - "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" - "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" - "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" - "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" - "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" - "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" - "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" - "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" - "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" - "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" - "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" - "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" - "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" - "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" - "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" - "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" - "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" - "200420042903880137026020042005360208200420063602782008280200220d41" - "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" - "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" - "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" - "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" - "370300200b2003290300370300200b41086a200341086a290300370300200d200e" - "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" - "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" - "246a200441dc006a41186a28020036020020042010370234200420073602302004" - "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" - "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" - "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" - "210d200b2f019203410b490d02200641016a210602400240024002400240024002" - "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" - "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" - "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" - "36027820044188016a200441f8006a10c18080800020042802b001410520044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" - "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" - "2105200d418080808078460d032004200d3602302008200441086a412410df8080" - "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" - "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" - "41003b019203200d410036028802200b41003b019003200b200d36028802200120" - "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" - "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" - "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" - "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" - "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" - "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" - "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" - "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" - "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" - "6a200941106a220d290300370300200041086a200941086a220b29030037030020" - "092003290300370300200b200341086a290300370300200d200341106a29030037" - "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" - "80808080004100210241002103024020002802002204450d002001200436021820" - "014100360214200120043602082001410036020420012000280204220336021c20" - "01200336020c20002802082103410121020b200120033602202001200236021020" - "01200236020002400240024003400240024002400240024020030d002001280200" - "450d0820012802082104200128020422030d0141002100200128020c2203450d06" - "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" - "024020024101712203450d0020012802040d0020012802082103200128020c2200" - "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" - "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" - "3702082001200336020441012102200141013602000b2001280208210002402001" - "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" - "20012802242203450d0120012802282100200128022c220520032f019203490d02" - "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" - "2001200436020c20014100360208200120033602040c010b200320044102746a41" - "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" - "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" - "2802002204450d00200028020420041082808080000b0240024002400240200320" - "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" - "20032802042200450d01200328020820001082808080000c010b200341046a1091" - "8080800020032802042200450d002003280208200041186c1082808080000b2001" - "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" - "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" - "03037f017e037f23808080800041f0006b22022480808080004100210302402000" - "2d0000220420012d0000470d00410121030240024002400240024020040e060500" - "01020304050b20002d000120012d00014621030c040b4100210320002903082205" - "2001290308520d030240024002402005a70e03000102000b200029031020012903" - "105121030c050b200029031020012903105121030c040b20002b031020012b0310" - "6121030c030b41002103200028020c2204200128020c470d022000280208200128" - "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" - "0d012001280208210420002802082100200641016a210103402001417f6a220145" - "21032001450d0220002004109c808080002106200441186a2104200041186a2100" - "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" - "6c2002420037026420024100360254200241003602442002410036023020024100" - "36022020022001280208220636025c200220012802042203360258200220063602" - "4c2002200336024820022000280208220636023820022000280204220136023420" - "0220063602282002200136022420022004410020031b3602602002200341004722" - "033602502002200336024020022004410020011b36023c20022001410047220336" - "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" - "80004101210320022802102201450d0120022802142104200241086a2007109d80" - "80800020022802082200450d0141002103200128020822062000280208470d0120" - "0228020c210820012802042000280204200610dc808080000d0120042008109c80" - "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" - "200128022022020d00410021020c010b20012002417f6a36022002400240024020" - "012802004101470d0020012802040d01200128020821030240200128020c220245" - "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" - "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" - "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" - "050c010b03402003280288022205450d03200241016a210220032f019003210420" - "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" - "21060c010b200520034102746a4198036a21030340200328020022064198036a21" - "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" - "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" - "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" - "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" - "001a200010848080800022010d01410121010b20012000109580808000000b2001" - "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" - "108080808000024002400240024020042d00384106460d00200441086a41106a20" - "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" - "29030037030020042004290338370308200441386a200220031080808080002004" - "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" - "0629030037030020042004290338370320200441086a10a0808080002205450d02" - "200441206a10a0808080002206450d0320052006109c808080002105200441206a" - "108580808000200441086a10858080800002402003450d00200220031082808080" - "000b02402001450d00200020011082808080000b200441d0006a24808080800020" - "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" - "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" - "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" - "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" - "004105470d0020002802042202450d002000280208210303402002418c026a2100" - "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" - "0c020b2000280208210120002802042107200641016a2106200541746a21052000" - "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" - "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" - "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" - "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" - "0041c0006b22052480808080002005200136020c20052000360208200520033602" - "14200520023602102005410236021c200541dc82c0800036021820054202370224" - "2005418180808000ad422086200541106aad843703382005418280808000ad4220" - "86200541086aad843703302005200541306a360220200541186a200410a4808080" - "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" - "41206b2200248080808000200041003602182000410136020c200041ac81c08000" - "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" - "23808080800041206b2202248080808000200241106a200041106a290200370300" - "200241086a200041086a290200370300200241013b011c20022001360218200220" - "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" - "6a280200220241787122006a21030240024020024101710d002002410271450d01" - "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" - "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" - "7136020420012000410172360204200320003602000f0b2001200210a880808000" - "0b024002400240024002400240200328020422024102710d00200341002802f8d2" - "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" - "80002001200220006a2200410172360204200120006a2000360200200141002802" - "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" - "2000410172360204200120006a20003602000b2000418002490d022001200010d7" - "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" - "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" - "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" - "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" - "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" - "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" - "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" - "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" - "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" - "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" - "00220241012000410376742200710d00410020022000723602e4d2c08000200321" - "000c010b200328020821000b200320013602082000200136020c2001200336020c" - "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" - "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" - "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" - "0041206b2203248080808000200341003602102003410136020420034204370208" - "2003200136021c200320003602182003200341186a3602002003200210a4808080" - "00000b840601057f0240024002402000417c6a2203280200220441787122054104" - "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" - "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" - "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" - "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" - "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" - "7871220420056a22052001490d042006200410a880808000200520016b22024110" - "490d0120032001200328020041017172410272360200200720016a220120024103" - "72360204200720056a220520052802044101723602042001200210a98080800020" - "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" - "20016a22052002410372360204200620062802044101723602042005200210a980" - "80800020000f0b20032005200328020041017172410272360200200720056a2202" - "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" - "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" - "200720056a2202200228020441017236020441002102410021010c010b20032001" - "200441017172410272360200200720016a22012002410172360204200720056a22" - "05200236020020052005280204417e713602040b410020013602f4d2c080004100" - "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" - "0240200210848080800022050d0041000f0b20052000417c417820032802002201" - "4103711b20014178716a2201200220012002491b10df808080002102200010a580" - "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" - "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" - "410272360200200720016a2202200520016b2205410172360204410020053602f0" - "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" - "4002402001418002490d002000280218210302400240024020022000470d002000" - "41144110200028021422021b6a28020022010d01410021020c020b200028020822" - "01200236020c200220013602080c010b200041146a200041106a20021b21040340" - "200421052001220241146a200241106a200228021422011b210420024114411020" - "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" - "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" - "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" - "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" - "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" - "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d0020022001360214" - "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" - "4101710d002003410271450d012000280200220320016a21010240200020036b22" - "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" - "d2c0800020022002280204417e7136020420002001410172360204200220013602" - "000c020b2000200310a8808080000b024002400240024020022802042203410271" - "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" - "03417871220310a8808080002000200320016a2201410172360204200020016a20" - "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" - "2003417e7136020420002001410172360204200020016a20013602000b02402001" - "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" - "0240024041002802e4d2c08000220341012001410376742201710d004100200320" - "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" - "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" - "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" - "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" - "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" - "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" - "7e23808080800041306b2203248080808000200320003602002003200136020420" - "03410236020c200341c485c08000360208200342023702142003418380808000ad" - "4220862204200341046aad84370328200320042003ad843703202003200341206a" - "360210200341086a200210a480808000000b110020003502004101200110ad8080" - "80000b7902017f017e23808080800041306b220324808080800020032001360204" - "200320003602002003410236020c200341c882c080003602082003420237021420" - "03418380808000ad42208622042003ad8437032820032004200341046aad843703" - "202003200341206a360210200341086a200210a480808000000bec0203027f017e" - "037f23808080800041306b2203248080808000412721040240024020004290ce00" - "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" - "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" - "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" - "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" - "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" - "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" - "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" - "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" - "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" - "23808080800041206b220124808080800020002802182102200141106a20004110" - "6a290200370300200141086a200041086a2902003703002001200036021c200120" - "0236021820012000290200370300200110d880808000000bcb0501077f02400240" - "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" - "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" - "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" - "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" - "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" - "28021422012000280218220920082002200310b080808000450d0041010f0b2001" - "20042005200928020c11818080800080808080000f0b0240024002400240200028" - "0204220120064b0d00200028021422012000280218220920082002200310b08080" - "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" - "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" - "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" - "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" - "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" - "00202000200736021041000f0b200120042005200928020c118180808000808080" - "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" - "020b20072101410021070c010b20074101762101200741016a41017621070b2001" - "41016a210120002802102106200028021821092000280214210a02400340200141" - "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" - "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" - "020c11818080800080808080000d00410021010340024020072001470d00200720" - "07490f0b200141016a2101200a200620092802101182808080008080808000450d" - "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" - "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" - "200020032004200128020c11818080800080808080000b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c200341e485c08000360208200342023702142003418380808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" - "200028020022040d002003410171450d010b02402003410171450d00200120026a" - "210502400240200028020c22060d0041002107200121080c010b41002107410021" - "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" - "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" - "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" - "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" - "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" - "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" - "2007200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a02402002" - "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" - "0641002103024020012007460d004100210302402009417c4b0d00410021034100" - "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" - "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" - "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" - "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" - "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" - "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" - "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" - "41002108024020054104490d002004200d41f007716a2109410021082004210303" - "40200328020c2207417f7341077620074106767241818284087120032802082207" - "417f7341077620074106767241818284087120032802042207417f734107762007" - "4106767241818284087120032802002207417f7341077620074106767241818284" - "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" - "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" - "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" - "4107762003410676724181828408712103200c4101460d0220082802042207417f" - "7341077620074106767241818284087120036a2103200c4102460d022008280208" - "2208417f7341077620084106767241818284087120036a21030c020b024020020d" - "00410021060c030b2002410371210802400240200241044f0d0041002106410021" - "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" - "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" - "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" - "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" - "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" - "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" - "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" - "024020002d00200e0402000102020b20052103410021050c010b20054101762103" - "200541016a41017621050b200341016a2103200028021021092000280218210820" - "00280214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c118180" - "80800080808080000f0b0240200720012002200828020c11818080800080808080" - "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" - "016a21032007200920082802101182808080008080808000450d000b2003417f6a" - "2005490b140020012000280200200028020410b2808080000b1c00200028020020" - "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" - "306b2203248080808000200341033a002c2003412036021c410021042003410036" - "02282003200136022420032000360220200341003602142003410036020c024002" - "40024002400240200228021022050d00200228020c2200450d0120022802082101" - "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" - "0240200041046a2802002207450d00200328022020002802002007200328022428" - "020c11818080800080808080000d040b20012802002003410c6a20012802041182" - "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" - "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" - "41016a210420022802082109200228020021004100210603400240200041046a28" - "02002201450d00200328022020002802002001200328022428020c118180808000" - "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" - "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" - "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" - "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" - "02102003200b36020c200141046a280200210702400240024020012802000e0301" - "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" - "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" - "2802002003410c6a200128020411828080800080808080000d02200041086a2100" - "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" - "0020044103746a22012802002001280204200328022428020c1181808080008080" - "808000450d010b410121010c010b410021010b200341306a24808080800020010b" - "d70201057f2380808080004180016b220224808080800002400240024002402001" - "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" - "030b41ff00210303402002200322046a22052000410f712203413072200341d700" - "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" - "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" - "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" - "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" - "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" - "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" - "20024180016a24808080800020000b7902017f017e23808080800041306b220324" - "808080800020032000360200200320013602042003410236020c2003419886c080" - "00360208200342023702142003418380808000ad4220862204200341046aad8437" - "0328200320042003ad843703202003200341206a360210200341086a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" - "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" - "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" - "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" - "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" - "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" - "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" - "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" - "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" - "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" - "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" - "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" - "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" - "0010a280808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641a888c0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541b089c080003602302005420537023c20054182" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418480808000ad422086200541286aad843703582005418580808000ad42" - "2086200541246aad843703502005418380808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541f089c080003602302005420337023c2005" - "418280808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418380808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541d088c080003602302005420437023c2005418280" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" - "000d00200128021441d881c080004102200128021828020c118180808000808080" - "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111828080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111828080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11818080800080808080000d010b2004412720011182808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410de808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" - "400240024041c8031084808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" - "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "df80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" - "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" - "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" - "00200028020021002002410036022c2002428080808010370224200241033a0050" - "200241203602402002410036024c200241c0a0c080003602482002410036023820" - "0241003602302002200241246a3602440240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002400240" - "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" - "1314151617180b024002400240024020002d00040e0400010203000b2002200028" - "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" - "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" - "2900e4ccc08000370000200241143602602002200336025c200241143602582002" - "410336026c200241ccccc08000360268200242023702742002418680808000ad42" - "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" - "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" - "8080002103024020022802582204450d00200228025c20041082808080000b2003" - "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" - "013702742002418280808000ad422086200241086aad8437035820022003410274" - "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" - "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" - "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" - "0c190b20002802082203280200200241306a200328020428021011828080800080" - "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" - "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" - "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" - "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" - "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" - "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" - "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" - "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" - "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" - "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" - "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" - "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" - "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" - "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" - "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" - "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" - "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" - "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" - "6a200241246a41086a280200360200200220022902243703582002418380808000" - "36027c2002418380808000360274200241888080800036026c2002410436020c20" - "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" - "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" - "280218200241086a10b5808080002100024020022802582201450d00200228025c" - "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" - "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" - "00280204200028020810b2808080000b4b01017f02402000280200200028020822" - "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" - "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" - "8080800041106b2202248080808000200028020821032000280204210441012105" - "024020012802142206412220012802182207280210220811828080800080808080" - "000d000240024020030d0041002103410021000c010b410021094100210a200421" - "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" - "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" - "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" - "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" - "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" - "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" - "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" - "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" - "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" - "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" - "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" - "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" - "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" - "0d010240024020022d0004418001470d0020062002280208200811828080800080" - "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" - "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" - "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" - "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" - "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" - "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" - "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" - "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" - "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" - "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" - "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" - "200728020c11818080800080808080000d00200641222008118280808000808080" - "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" - "05200128021828020c11818080800080808080000b1e01017f0240200028020022" - "01450d00200028020420011082808080000b0b5301047f02402000280208220120" - "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" - "200441dc00460d0120044120490d012000200141016a220136020820022001470d" - "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" - "0210cf80808000200028020821030b200028020420036a2001200210df80808000" - "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" - "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" - "20026b21074100210503400240024002400240200220056a2d00002208c0220941" - "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" - "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" - "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" - "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" - "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" - "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" - "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" - "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" - "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" - "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" - "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" - "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" - "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" - "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" - "0520042802082108024041141084808080002203450d002003200836020c200341" - "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" - "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" - "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" - "41106a2480808080000b5901017f23808080800041106b22012480808080002001" - "41086a2000200028020041014101410110d4808080000240200128020822004181" - "80808078460d002000200128020c109580808000000b200141106a248080808000" - "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" - "8080000240024020022f01140d0002400240024002400240024020022f01162203" - "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" - "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" - "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" - "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" - "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" - "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" - "2205418080046a210302402001280200200128020822006b41034b0d0020012000" - "410410cf80808000200128020821000b2001200041046a36020820012802042000" - "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" - "002005410676413f71418001723a000220002003410c76413f71418001723a0001" - "410021000c070b200220002802002000280204200028020810838080800041002d" - "00c0cfc080001a200228020421012002280200210341141084808080002200450d" - "042000200336020c20004114360200200020013602100c060b200241086a200028" - "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" - "21012002280208210341141084808080002200450d032000200336020c20004114" - "360200200020013602100c050b200241173602142000200241146a10d080808000" - "21000c040b200241173602142000200241146a10d08080800021000c030b024002" - "4002402003418001490d0002402001280200200128020822046b41034b0d002001" - "2004410410cf80808000200128020821040b200128020420046a21002003418010" - "4f0d0120034106764140722106410221050c020b02402001280208220020012802" - "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" - "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" - "60722106410321050b200020063a00002001200420056a360208200020056a417f" - "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" - "206a24808080800020000b910301057f23808080800041106b2202248080808000" - "02400240024002402001280204220320012802082204490d000240200320046b41" - "034b0d0020012003360208200241086a2001280200200320031083808080004100" - "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" - "0d022001200436020c2001410436020020002001360204200120033602100c030b" - "2001200441046a220536020802402001280200220620046a22012d000141017441" - "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" - "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" - "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" - "001a200228020421032002280200210441141084808080002201450d0220012004" - "36020c2001410c36020020002001360204200120033602100c030b200020013b01" - "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" - "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" - "022480808080000240024002402001280208220320012802042204490d00200241" - "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" - "032002280208210441141084808080002201450d022001200436020c2001410436" - "02002000200136020420012003360210410121010c010b2000200128020020036a" - "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" - "5601017f23808080800041106b2203248080808000200341086a20002001200241" - "01410110d480808000024020032802082202418180808078460d00200220032802" - "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" - "106b2202248080808000200241086a200028020020002802042000280208108380" - "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" - "8080800022000d00000b2000200436020c20002001290200370200200020033602" - "10200041086a200141086a280200360200200241106a24808080800020000b1f00" - "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" - "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" - "00200320016a3602080b200241106a24808080800041000b820101017f02400240" - "024002402003280204450d000240200328020822040d002002450d0341002d00c0" - "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" - "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" - "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" - "8080800041206b2206248080808000024002400240200220036a220320024f0d00" - "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" - "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" - "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" - "20080d00410021020c010b2006200820056c36021c200620012802043602142004" - "21020b20062002360218200641086a20042009200641146a10d380808000024020" - "062802080d00200628020c21022001200736020020012002360204418180808078" - "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" - "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" - "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" - "017120024101746b413e6a21020b200042003702102000200236021c2002410274" - "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" - "00360200200020033602182000200036020c20002000360208410041002802e8d2" - "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" - "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" - "03034020042003411d764104716a41106a22052802002202450d02200341017421" - "032002210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b20052000" - "360200200020043602182000200036020c200020003602080b0b00200010d98080" - "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" - "024002400240024020002802040e020001020b20020d0141012102410021030c02" - "0b20020d00200028020022022802042103200228020021020c010b200141808080" - "80783602002001200036020c2001418980808000200028021c22002d001c20002d" - "001d10da80808000000b20012003360204200120023602002001418a8080800020" - "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" - "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" - "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" - "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" - "086a200020011183808080008080808000000b410041003a0094d3c08000200245" - "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" - "02402002450d000240034020002d0000220420012d00002205470d01200041016a" - "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" - "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" - "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" - "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" - "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" - "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" - "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" - "280200210803402005417c6a220520082003742001280200220820027672360200" - "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" - "210103402005417c6a220520012802003602002001417c6a210120042005490d00" - "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" - "036a210502402003450d0020002104200121080340200420082d00003a00002008" - "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" - "6a210402400240200120036a2206410371450d0020074101480d01200641037422" - "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" - "21080340200520082002762001280200220820037472360200200141046a210120" - "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" - "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" - "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" - "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" - "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" - "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" - "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" - "00410020006b41037122046a210502402004450d00200021032001210603402003" - "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" - "01480d012009410374220641187121022009417c71220a41046a2101410020066b" - "4118712104200a2802002106034020052006200276200128020022062004747236" - "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" - "092101034020052001280200360200200141046a2101200541046a22052003490d" - "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" - "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" - "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" - "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" - "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" - "0a000000150000004b000000450010000a000000160000004b0000004163636f75" - "6e7400450010000a0000001700000033000000450010000a000000180000003300" - "00006361706163697479206f766572666c6f770000009800100011000000616c6c" - "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" - "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" - "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" - "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" - "686520696e6465782069732000150110002000000035011000120000003a200000" - "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" - "7273006c0110001300000066000000170000003078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230323132" - "323233323432353236323732383239333033313332333333343335333633373338" - "333934303431343234333434343534363437343834393530353135323533353435" - "353536353735383539363036313632363336343635363636373638363937303731" - "373237333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939636f72652f7372632f66" - "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" - "000000a40900001a00000072616e676520737461727420696e64657820206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" - "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" - "10000000a202100022000000736c69636520696e64657820737461727473206174" - "202062757420656e64732061742000f4021000160000000a0310000d0000000101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000020202020202" - "020202020202020202020202020202020202020202020202030303030303030303" - "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" - "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" - "000e0000003b041000040000003f041000100000004f0410000100000062797465" - "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" - "7420697320696e7369646520202862797465732029206f66206000700410000b00" - "00007b04100026000000a104100008000000a9041000060000004f041000010000" - "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" - "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" - "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" - "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" - "002c0510001d0000000a0000002b00000000060101030104020507070208080902" - "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" - "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" - "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" - "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" - "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" - "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" - "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" - "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" - "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" - "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" - "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" - "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" - "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" - "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" - "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" - "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" - "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" - "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" - "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" - "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" - "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" - "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" - "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" - "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" - "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" - "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" - "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" - "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" - "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" - "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" - "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" - "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" - "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" - "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" - "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" - "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" - "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" - "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" - "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" - "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" - "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" - "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" - "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" - "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" - "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" - "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" - "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" - "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" - "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" - "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" - "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" - "0239010405010204011402160601013a0101020104080107030a021e013b010101" - "0c01090128010301370101030503010407020b021d013a01020102010301050207" - "020b021c02390201010204080109010a021d014801040102030101080151010207" - "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" - "0202021902040310040d01020206010f01000300031d021e021e02400201070801" - "020b09012d030101750222017603040209010603db0202013a0101070101010102" - "08060a0201301f310430070101050128090c022004020201033801010203010103" - "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" - "04010a200250020001030104011902050197021a120d012608190b2e0330010204" - "020227014306020202020c0108012f01330101030202050201012a020801ee0102" - "01040100010010101000020001e201950500030102050428030401a50200040002" - "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" - "090a0402015f0302010102060102019d010308150239020101010116010e070305" - "c308020301011701510102060101020101020102eb010204060201021b02550802" - "0101026a0101010206010165030204010500090102f5010a020101040190040202" - "0401200a280602040801090602032e0d010200070106010152160207010201027a" - "06030101020107010148020301010100020b023405050101010001060f00053b07" - "00013f0451010002002e0217000101030405080802071e0494030037043208010e" - "011605010f000701110207010201056401a00700013d04000400076d07006080f0" - "002f72757374632f63326637346333663932386165623530336631356234653965" - "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" - "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" - "0e10006000000071010000360000002f72757374632f6332663734633366393238" - "61656235303366313562346539656635373738653737663330353862382f6c6962" - "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" - "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" - "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" - "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" - "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" - "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" - "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" - "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" - "00181d10005f00000058020000300000000d0000000c000000040000000e000000" - "0f00000010000000000000000000000001000000110000006120446973706c6179" - "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" - "20756e65787065637465646c792f72757374632f63326637346333663932386165" - "6235303366313562346539656635373738653737663330353862382f6c69627261" - "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" - "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" - "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" - "207768696c652070617273696e67206120737472696e67454f46207768696c6520" - "70617273696e6720612076616c7565657870656374656420603a60657870656374" - "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" - "78706563746564206964656e7465787065637465642076616c7565657870656374" - "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" - "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" - "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" - "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" - "206120737472696e676b6579206d757374206265206120737472696e67696e7661" - "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" - "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" - "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" - "6164696e6720737572726f6761746520696e206865782065736361706574726169" - "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" - "70656374656420656e64206f662068657820657363617065726563757273696f6e" - "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" - "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" - "4826100001000000000000000000f03f0000000000002440000000000000594000" - "00000000408f40000000000088c34000000000006af8400000000080842e410000" - "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" - "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" - "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" - "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" - "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" - "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" - "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" - "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" - "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" - "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" - "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" - "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" - "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" - "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" - "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" - "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" - "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" - "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" - "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" - "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" - "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" - "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" - "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" - "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" - "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" - "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" - "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" - "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" - "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" - "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" - "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" - "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" - "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" - "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" - "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" - "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" - "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" - "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" - "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" - "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" - "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" - "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" - "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" - "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" - "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" - "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" - "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" - "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" - "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" - "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" - "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" - "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" - "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" - "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" - "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" - "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" - "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" - "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" - "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" - "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" - "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" - "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" - "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" - "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" - "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" - "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" - "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" - "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" - "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" - "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" - "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" - "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" - "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" - "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" - "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" - "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" - "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" - "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" - "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" - "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" - "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" - "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" - "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" - "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" - "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" - "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" - "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" - "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" - "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" - "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" - "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" - "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" - "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" - "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" - "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" - "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" - "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" - "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" - "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" - "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" - "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" - "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" - "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" - "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" - "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" - "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" - "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" - "64656466696c6520746f6f206c617267657265736f757263652062757379657865" - "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" - "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" - "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" - "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" - "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" - "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" - "0048261000010000006f7065726174696f6e207375636365737366756c10000000" - "1100000012000000100000001000000013000000120000000d0000000e00000015" - "0000000c0000000b00000015000000150000000f0000000e000000130000002600" - "00003800000019000000170000000c000000090000000a00000010000000170000" - "00190000000e0000000d00000014000000080000001b0000000e00000010000000" - "16000000150000000b000000160000000d0000000b000000130000005023100060" - "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" - "1000f8231000042410000f24100024241000392410004824100056241000692410" - "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" - "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" - "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" - "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" - "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" - "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" - "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" - "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" - "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" - "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" - "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" - "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" - "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" - "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" - "243137683533326265333033376461316237656445064a5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" - "70617273655f6964656e743137683663353964643731393635353139313045074b" - "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" - "4c54245224475424313270617273655f6e756d6265723137683738336134316134" - "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" - "73657269616c697a6572244c54245224475424313370617273655f646563696d61" - "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" - "70617273655f6578706f6e656e7431376833366464376462643233653461346562" - "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" - "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" - "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" - "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" - "346636345f66726f6d5f7061727473313768633863316239626161613836666637" - "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" - "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" - "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" - "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" - "24313670617273655f616e795f6e756d6265723137683931643533303465356139" - "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" - "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" - "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" - "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" - "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" - "61775f7665633139526177566563244c54245424432441244754243867726f775f" - "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" - "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" - "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" - "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" - "62653863353535633862636433353545143c5f5a4e357365726465326465375669" - "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" - "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" - "68616e646c655f6572726f72313768393762376462643066373264643738384516" - "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" - "35766973697431376838366238393638313662613130613765451781015f5a4e37" - "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" - "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" - "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" - "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" - "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" - "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" - "244754243976697369745f73747231376835356436653830653061376366383938" - "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" - "6363657373244c5424522447542424753230246173247532302473657264652e2e" - "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" - "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" - "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" - "4c54244b24432456244324412447542436696e7365727431376834643164623464" - "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" - "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" - "244b244324562443244124475424247532302461732475323024636f72652e2e6f" - "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" - "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" - "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" - "702e2e5061727469616c4571244754243265713137683162323138393234373831" - "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" - "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" - "475424247532302461732475323024636f72652e2e697465722e2e747261697473" - "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" - "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" - "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" - "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" - "6e646578244754243130696e6465785f696e746f31376864333238633634636161" - "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" - "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" - "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" - "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" - "63617061636974795f6f766572666c6f7731376834393964343832613965643537" - "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" - "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" - "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" - "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" - "70616e69636b696e673570616e6963313768303465656239313764643933633232" - "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" - "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" - "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" - "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "244754243133646973706f73655f6368756e6b3137683665306363636434353836" - "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" - "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" - "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" - "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" - "2475323024666f7224753230247533322447542433666d74313768626633653032" - "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" - "70616e69635f626f756e64735f636865636b313768336436623861613463383034" - "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" - "363431376864353231666136656636613036373261452e11727573745f62656769" - "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" - "327061645f696e74656772616c3137686334656130376130626331333536633445" - "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" - "656772616c313277726974655f7072656669783137686139613433323830623630" - "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" - "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" - "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" - "706164313768343736396165333839333734636335314533495f5a4e34345f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" - "706c61792447542433666d74313768376666346430623836303963323437324534" - "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" - "2e666d742e2e44656275672447542433666d743137683361366261613162623437" - "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" - "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" - "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" - "3024666f7224753230247533322447542433666d74313768353533393862313635" - "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" - "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" - "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" - "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" - "6275675f657874313768656366613566303431373437393039384539345f5a4e34" - "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" - "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" - "6963655f6572726f725f6661696c31376862303364323439386438646362363433" - "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" - "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" - "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" - "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" - "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" - "656275672447542433666d7431376865613566643964626339343936626665453e" - "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" - "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" - "30246933322447542433666d743137686365643930633761363339633031646445" - "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" - "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" - "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" - "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" - "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" - "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" - "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" - "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" - "3130696e736572745f666974313768633861306366353339656666303131314541" - "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" - "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" - "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" - "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" - "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" - "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" - "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768343032353764366634326532" - "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" - "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" - "61792447542433666d74313768636534323236616131663732366331634544615f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" - "74655f73747231376835393964396535373839343664643938452e31393245575f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768623637326562313939633335643138364546555f5a4e35335f244c542463" - "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768663761653238353562323439" - "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" - "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" - "313768376236353738393966393837353963624548475f5a4e313073657264655f" - "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" - "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" - "616c6c6f63337665633136566563244c5424542443244124475424313765787465" - "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" - "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" - "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" - "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" - "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" - "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" - "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" - "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" - "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" - "6f64655f6865785f65736361706531376834376265353936383535663830346461" - "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" - "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" - "63377261775f7665633230526177566563496e6e6572244c542441244754243772" - "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" - "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" - "3472656164356572726f7231376865663535323764333333633963323666455130" - "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" - "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" - "666d742e2e577269746524475424313077726974655f6368617231376832313433" - "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" - "766563313166696e6973685f67726f773137683533383539626133383962373164" - "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" - "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" - "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" - "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" - "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" - "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" - "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" - "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" - "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" - "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" - "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" - "75376424247537642431376865313761333937376638396331313738455a3b5f5a" - "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" - "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" - "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" - "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" - "61735f73747231376865623366373232643232346534326638455c066d656d636d" - "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" - "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" - "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" - "2e726f6461746100550970726f64756365727302086c616e677561676501045275" - "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" - "6768746c79202863326637346333663920323032342d30392d30392900490f7461" - "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - -extern std::string const zkProofHex = +extern std::string const zkProofWasmHex = "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" @@ -5385,7 +3242,7 @@ extern std::string const zkProofHex = "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; -extern std::string const sp1_wasm = +extern std::string const sp1WasmHex = "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" @@ -10757,7 +8614,7 @@ extern std::string const sp1_wasm = "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" "756c746976616c7565"; -std::string const ledgerSqnHex = +std::string const ledgerSqnWasmHex = "0061736d01000000010e0360027f7f017f6000006000017f02160103656e" "760e6765745f6c65646765725f73716e000003030201020503010002063e" "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" @@ -10778,7 +8635,7 @@ std::string const ledgerSqnHex = "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" "6d756c746976616c7565"; -std::string const allHostFunctionsHex = +std::string const allHostFunctionsWasmHex = "0061736d0100000001540c60027f7f017f60047f7f7f7f017f60037f7f7f" "017f60057f7f7f7f7f017f60017f017f60037f7f7f0060037f7f7e017f60" "087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60017f0060027f7f00" @@ -11774,32 +9631,6 @@ std::string const deepRecursionHex = "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; -extern std::string const reqNonexistentField = - "0061736d0100000001120360027f7f0060047f7f7f7f017f6000017f02200108686f73745f" - "6c6962136765745f74785f6e65737465645f6669656c640001030403020000050301001006" - "19037f01418080c0000b7f00418080c0000b7f00418080c0000b072e04066d656d6f727902" - "000666696e69736800010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0abc04035f01037f230041d0206b220124002001410c6a220241802010032001418c206a22" - "0041c400100320004189803c10022000410010022000418a803810022000418d801c100220" - "0020012802cc2020024180201000200141d0206a240041004a0b6101027f230041106b2103" - "024020002802402202413d6b41bf7f490d002003200136020c4100210103402002413f4b0d" - "01200020026a2003410c6a20016a2d00003a00002000200028024041016a22023602402001" - "41016a22014104470d000b0b0bf70201037f200141104f044002402000410020006b410371" - "22036a220220004d0d0020030440200321040340200041003a0000200041016a2100200441" - "016b22040d000b0b200341016b4107490d000340200041003a0000200041076a41003a0000" - "200041066a41003a0000200041056a41003a0000200041046a41003a0000200041036a4100" - "3a0000200041026a41003a0000200041016a41003a0000200041086a22002002470d000b0b" - "2002200120036b2201417c716a220020024b0440034020024100360200200241046a220220" - "00490d000b0b200141037121010b02402000200020016a22034f0d00200141077122020440" - "0340200041003a0000200041016a2100200241016b22020d000b0b200141016b4107490d00" - "0340200041003a0000200041076a41003a0000200041066a41003a0000200041056a41003a" - "0000200041046a41003a0000200041036a41003a0000200041026a41003a0000200041016a" - "41003a0000200041086a22002003470d000b0b0b004d0970726f64756365727302086c616e" - "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3835" - "2e31202834656231363132353020323032352d30332d31352900490f7461726765745f6665" - "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" - "65666572656e63652d74797065732b0a6d756c746976616c7565"; - extern std::string const hfPerfTest = "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" "6000017f021d0203656e760974726163655f6e756d000003656e76057472" @@ -11837,17 +9668,7 @@ extern std::string const hfPerfTest = "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" "6572656e63652d74797065732b0a6d756c746976616c7565"; -extern std::string const opcCallPerfTest = - "0061736d010000000112046000017e60027f7f017f6000017f6000000304" - "0303020104050170010101050401008002061c047f0141b08880040b7f00" - "41ac080b7f0041b08880040b7f01410a0b073305066d656d6f7279020004" - "6d61696e0002047465737400010a5f5f646174615f656e6403010b5f5f68" - "6561705f6261736503020a4e030400010f0b3b04017f017c017f027e4180" - "84afdf0021004494b768e11b6c9b42210141d1e3c6012102024003401000" - "200041016b220041004a0d000b0b41010f0b0b01017f1001210220020f0b" - "0b0e01004180080b07623a2025660a00"; - -extern std::string const keyletHostFunctions = +extern std::string const allKeyletsWasmHex = "0061736d01000000014d0960057f7f7f7f7f017f60047f7f7f7f017f60037f7f7f017f6008" "7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" "7f60057f7f7f7f7f006000017f02de031208686f73745f6c6962057472616365000008686f" @@ -12033,7 +9854,7 @@ extern std::string const keyletHostFunctions = "7369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c756" "5"; -extern std::string const codecovWasm = +extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60037f" "7f7f017f60067f7f7f7f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002a90a2d08686f73745f6c696209" @@ -12263,7 +10084,7 @@ extern std::string const codecovWasm = "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c" "746976616c7565"; -extern std::string const floatHex = +extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index f3fdf66aaef..0e7e3785ea8 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -23,45 +23,29 @@ #include -extern std::string const ledgerSqnHex; +extern std::string const ledgerSqnWasmHex; -extern std::string const allHostFunctionsHex; +extern std::string const allHostFunctionsWasmHex; extern std::string const deepRecursionHex; -extern std::string const tx_js; +extern std::string const fibWasmHex; -extern std::string const lo_js; +extern std::string const b58WasmHex; -extern std::string const lo_js2; +extern std::string const sha512PureWasmHex; -extern std::string const fib32Hex; +extern std::string const zkProofWasmHex; -extern std::string const fib64Hex; - -extern std::string const b58Hex; - -extern std::string const sha512PureHex; - -extern std::string const checkJsonHex; - -extern std::string const compareJsonHex; - -extern std::string const zkProofHex; - -extern std::string const sp1_wasm; - -extern std::string const reqNonexistentField; +extern std::string const sp1WasmHex; extern std::string const hfPerfTest; -extern std::string const opcCallPerfTest; - -extern std::string const keyletHostFunctions; +extern std::string const allKeyletsWasmHex; -extern std::string const codecovWasm; +extern std::string const codecovTestsWasmHex; -extern std::string const floatHex; +extern std::string const floatTestsWasmHex; extern std::string const float0Hex; diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/float_tests/Cargo.lock new file mode 100644 index 00000000000..972bf3ce61e --- /dev/null +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "float_tests" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/float_tests/Cargo.toml new file mode 100644 index 00000000000..b4dec2aa504 --- /dev/null +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "float_tests" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/float_tests/src/lib.rs b/src/test/app/wasm_fixtures/float_tests/src/lib.rs new file mode 100644 index 00000000000..9688ebd6029 --- /dev/null +++ b/src/test/app/wasm_fixtures/float_tests/src/lib.rs @@ -0,0 +1,460 @@ +#![allow(unused_imports)] +#![allow(unused_variables)] +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_std::core::locator::Locator; +use xrpl_std::decode_hex_32; +use xrpl_std::host::trace::DataRepr::AsHex; +use xrpl_std::host::trace::{trace, trace_data, trace_float, trace_num, DataRepr}; +use xrpl_std::host::{ + cache_ledger_obj, float_add, float_compare, float_divide, float_from_int, float_from_uint, + float_log, float_multiply, float_pow, float_root, float_set, float_subtract, + get_ledger_obj_array_len, get_ledger_obj_field, get_ledger_obj_nested_field, + trace_opaque_float, FLOAT_NEGATIVE_ONE, FLOAT_ONE, FLOAT_ROUNDING_MODES_TO_NEAREST, +}; +use xrpl_std::sfield; +use xrpl_std::sfield::{ + Account, AccountTxnID, Balance, Domain, EmailHash, Flags, LedgerEntryType, MessageKey, + OwnerCount, PreviousTxnID, PreviousTxnLgrSeq, RegularKey, Sequence, TicketCount, TransferRate, +}; + +fn test_float_from_wasm() { + let _ = trace("\n$$$ test_float_from_wasm $$$"); + + let mut f: [u8; 8] = [0u8; 8]; + if 8 == unsafe { float_from_int(12300, f.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace_float(" float from i64 12300:", &f); + let _ = trace_data(" float from i64 12300 as HEX:", &f, AsHex); + } else { + let _ = trace(" float from i64 12300: failed"); + } + + let u64_value: u64 = 12300; + if 8 == unsafe { + float_from_uint( + &u64_value as *const u64 as *const u8, + 8, + f.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + } { + let _ = trace_float(" float from u64 12300:", &f); + } else { + let _ = trace(" float from u64 12300: failed"); + } + + if 8 == unsafe { float_set(2, 123, f.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace_float(" float from exp 2, mantissa 123:", &f); + } else { + let _ = trace(" float from exp 2, mantissa 3: failed"); + } + + let _ = trace_float(" float from const 1:", &FLOAT_ONE); + let _ = trace_float(" float from const -1:", &FLOAT_NEGATIVE_ONE); +} + +fn test_float_compare() { + let _ = trace("\n$$$ test_float_compare $$$"); + + let mut f1: [u8; 8] = [0u8; 8]; + if 8 != unsafe { float_from_int(1, f1.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace(" float from 1: failed"); + } else { + let _ = trace_float(" float from 1:", &f1); + } + + if 0 == unsafe { float_compare(f1.as_ptr(), 8, FLOAT_ONE.as_ptr(), 8) } { + let _ = trace(" float from 1 == FLOAT_ONE"); + } else { + let _ = trace(" float from 1 != FLOAT_ONE"); + } + + if 1 == unsafe { float_compare(f1.as_ptr(), 8, FLOAT_NEGATIVE_ONE.as_ptr(), 8) } { + let _ = trace(" float from 1 > FLOAT_NEGATIVE_ONE"); + } else { + let _ = trace(" float from 1 !> FLOAT_NEGATIVE_ONE"); + } + + if 2 == unsafe { float_compare(FLOAT_NEGATIVE_ONE.as_ptr(), 8, f1.as_ptr(), 8) } { + let _ = trace(" FLOAT_NEGATIVE_ONE < float from 1"); + } else { + let _ = trace(" FLOAT_NEGATIVE_ONE !< float from 1"); + } +} + +fn test_float_add_subtract() { + let _ = trace("\n$$$ test_float_add_subtract $$$"); + + let mut f_compute: [u8; 8] = FLOAT_ONE; + for i in 0..9 { + unsafe { + float_add( + f_compute.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + } + let mut f10: [u8; 8] = [0u8; 8]; + if 8 != unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + // let _ = trace(" float from 10: failed"); + } + if 0 == unsafe { float_compare(f10.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" repeated add: good"); + } else { + let _ = trace(" repeated add: bad"); + } + + for i in 0..11 { + unsafe { + float_subtract( + f_compute.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + } + if 0 == unsafe { float_compare(f_compute.as_ptr(), 8, FLOAT_NEGATIVE_ONE.as_ptr(), 8) } { + let _ = trace(" repeated subtract: good"); + } else { + let _ = trace(" repeated subtract: bad"); + } +} + +fn test_float_multiply_divide() { + let _ = trace("\n$$$ test_float_multiply_divide $$$"); + + let mut f10: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + let mut f_compute: [u8; 8] = FLOAT_ONE; + for i in 0..6 { + unsafe { + float_multiply( + f_compute.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + } + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + if 0 == unsafe { float_compare(f1000000.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" repeated multiply: good"); + } else { + let _ = trace(" repeated multiply: bad"); + } + + for i in 0..7 { + unsafe { + float_divide( + f_compute.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + } + let mut f01: [u8; 8] = [0u8; 8]; + unsafe { float_set(-1, 1, f01.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + + if 0 == unsafe { float_compare(f_compute.as_ptr(), 8, f01.as_ptr(), 8) } { + let _ = trace(" repeated divide: good"); + } else { + let _ = trace(" repeated divide: bad"); + } +} + +fn test_float_pow() { + let _ = trace("\n$$$ test_float_pow $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_pow( + FLOAT_ONE.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cube of 1:", &f_compute); + + unsafe { + float_pow( + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + 6, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 6th power of -1:", &f_compute); + + let mut f9: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(9, f9.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_pow( + f9.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float square of 9:", &f_compute); + + unsafe { + float_pow( + f9.as_ptr(), + 8, + 0, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 0th power of 9:", &f_compute); + + let mut f0: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(0, f0.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_pow( + f0.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float square of 0:", &f_compute); + + let r = unsafe { + float_pow( + f0.as_ptr(), + 8, + 0, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_num( + " float 0th power of 0 (expecting INVALID_PARAMS error):", + r as i64, + ); +} + +fn test_float_root() { + let _ = trace("\n$$$ test_float_root $$$"); + + let mut f9: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(9, f9.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_root( + f9.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float sqrt of 9:", &f_compute); + unsafe { + float_root( + f9.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cbrt of 9:", &f_compute); + + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + unsafe { + float_root( + f1000000.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cbrt of 1000000:", &f_compute); + unsafe { + float_root( + f1000000.as_ptr(), + 8, + 6, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 6th root of 1000000:", &f_compute); +} + +fn test_float_log() { + let _ = trace("\n$$$ test_float_log $$$"); + + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_log( + f1000000.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" log_10 of 1000000:", &f_compute); +} + +fn test_float_negate() { + let _ = trace("\n$$$ test_float_negate $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_multiply( + FLOAT_ONE.as_ptr(), + 8, + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + if 0 == unsafe { float_compare(FLOAT_NEGATIVE_ONE.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" negate const 1: good"); + } else { + let _ = trace(" negate const 1: bad"); + } + + unsafe { + float_multiply( + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + if 0 == unsafe { float_compare(FLOAT_ONE.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" negate const -1: good"); + } else { + let _ = trace(" negate const -1: bad"); + } +} + +fn test_float_invert() { + let _ = trace("\n$$$ test_float_invert $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + let mut f10: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_divide( + FLOAT_ONE.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" invert a float from 10:", &f_compute); + unsafe { + float_divide( + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" invert again:", &f_compute); + + // if f10's value is 7, then invert twice won't match the original value + if 0 == unsafe { float_compare(f10.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" invert twice: good"); + } else { + let _ = trace(" invert twice: bad"); + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + test_float_from_wasm(); + test_float_compare(); + test_float_add_subtract(); + test_float_multiply_divide(); + test_float_pow(); + test_float_root(); + test_float_log(); + test_float_negate(); + test_float_invert(); + + 1 +} diff --git a/src/test/app/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c new file mode 100644 index 00000000000..66ed1d42c7d --- /dev/null +++ b/src/test/app/wasm_fixtures/ledgerSqn.c @@ -0,0 +1,27 @@ +#include + +int32_t +get_ledger_sqn(uint8_t*, int32_t); +// int32_t trace(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +// int32_t trace_num(uint8_t const*, int32_t, int64_t); + +uint8_t buf[1024]; + +// char const test_res[] = "sqn: "; +// char const test_name[] = "TEST get_ledger_sqn"; + +int +finish() +{ + // trace((uint8_t const *)test_name, sizeof(test_name) - 1, 0, 0, 0); + + // memset(buf, 0, sizeof(buf)); + // for(int i = 0; i < sizeof(buf); ++i) buf[i] = 0; + + int x = get_ledger_sqn(buf, sizeof(int32_t)); + if (x >= 0) + x = *((int32_t*)buf); + // trace_num((uint8_t const *)test_res, sizeof(test_res) - 1, x); + + return x < 0 ? x : (x >= 5 ? 1 : 0); +} diff --git a/src/test/app/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/sha512Pure.c new file mode 100644 index 00000000000..fe82aa2a659 --- /dev/null +++ b/src/test/app/wasm_fixtures/sha512Pure.c @@ -0,0 +1,145 @@ +#include +#include + +static uint64_t const K512[] = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, + 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, + 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, + 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, + 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, + 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, + 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, + 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, + 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, + 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, + 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, + 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, + 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, + 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, + 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, + 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, + 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; + +#define ROTATE(x, y) (((x) >> (y)) | ((x) << (64 - (y)))) +#define Sigma0(x) (ROTATE((x), 28) ^ ROTATE((x), 34) ^ ROTATE((x), 39)) +#define Sigma1(x) (ROTATE((x), 14) ^ ROTATE((x), 18) ^ ROTATE((x), 41)) +#define sigma0(x) (ROTATE((x), 1) ^ ROTATE((x), 8) ^ ((x) >> 7)) +#define sigma1(x) (ROTATE((x), 19) ^ ROTATE((x), 61) ^ ((x) >> 6)) + +#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) +#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +static inline uint64_t +B2U64(uint8_t val, uint8_t sh) +{ + return ((uint64_t)val) << sh; +} + +void* +allocate(int sz) +{ + return malloc(sz); +} +void +deallocate(void* p) +{ + free(p); +} + +uint8_t e_data[32 * 1024]; + +uint8_t* +sha512_process(uint8_t const* data, int32_t length) +{ + static uint64_t state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + + uint64_t a, b, c, d, e, f, g, h, s0, s1, T1, T2; + uint64_t X[16]; + + uint64_t blocks = length / 128; + while (blocks--) + { + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + unsigned i; + for (i = 0; i < 16; i++) + { + X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | + B2U64(data[2], 40) | B2U64(data[3], 32) | B2U64(data[4], 24) | + B2U64(data[5], 16) | B2U64(data[6], 8) | B2U64(data[7], 0); + data += 8; + + T1 = h; + T1 += Sigma1(e); + T1 += Ch(e, f, g); + T1 += K512[i]; + T1 += X[i]; + + T2 = Sigma0(a); + T2 += Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + for (i = 16; i < 80; i++) + { + s0 = X[(i + 1) & 0x0f]; + s0 = sigma0(s0); + s1 = X[(i + 14) & 0x0f]; + s1 = sigma1(s1); + + T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf]; + T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; + T2 = Sigma0(a) + Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + } + + return (uint8_t*)(state); +} + +// int main () +//{ +// return 0; +// } diff --git a/src/test/app/wasm_fixtures/sp1/Cargo.lock b/src/test/app/wasm_fixtures/sp1/Cargo.lock new file mode 100644 index 00000000000..4374624cd2c --- /dev/null +++ b/src/test/app/wasm_fixtures/sp1/Cargo.lock @@ -0,0 +1,1384 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "camino" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "libredox" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "p3-baby-bear" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" +dependencies = [ + "num-bigint", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" +dependencies = [ + "itertools", + "num-bigint", + "num-traits", + "p3-util", + "rand", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" +dependencies = [ + "itertools", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" + +[[package]] +name = "p3-mds" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" +dependencies = [ + "itertools", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-poseidon2" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" +dependencies = [ + "itertools", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" +dependencies = [ + "serde", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sp1" +version = "0.0.1" +dependencies = [ + "sp1-verifier", +] + +[[package]] +name = "sp1-build" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05372b4e3eecca255ba8e385f8dc294861a3b4ea0b0a9946873e39941011db4c" +dependencies = [ + "anyhow", + "cargo_metadata", + "chrono", + "clap", + "dirs", +] + +[[package]] +name = "sp1-lib" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e166e94b13146c65de433cf29acc1030f021414fbebfc24cd4eeaeb787ba3443" +dependencies = [ + "bincode", + "elliptic-curve", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a85ffe9606bd2cc93575ce608f063ca08521cee9bdebf611914c5b2d90d7412" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "hex", + "lazy_static", + "num-bigint", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "sp1-verifier" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d94a7db4a54984acf4d64c6ba55c4698104f02ef213cc21882e233b4409e7155" +dependencies = [ + "blake3", + "cfg-if", + "hex", + "lazy_static", + "sha2", + "sp1-build", + "substrate-bn-succinct", + "thiserror 2.0.12", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "substrate-bn-succinct" +version = "0.6.0-v4.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ac8ce0a40e721f790e2ef99beab32b99b3121c58edaaa140ffd8f1795a6af7" +dependencies = [ + "bytemuck", + "byteorder", + "cfg-if", + "crunchy", + "lazy_static", + "num-bigint", + "rand", + "rustc-hex", + "sp1-lib", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/src/test/app/wasm_fixtures/sp1/Cargo.toml b/src/test/app/wasm_fixtures/sp1/Cargo.toml new file mode 100644 index 00000000000..d730160aeaa --- /dev/null +++ b/src/test/app/wasm_fixtures/sp1/Cargo.toml @@ -0,0 +1,16 @@ +[package] +edition = "2021" +name = "sp1" +version = "0.0.1" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +sp1-verifier = "4.1.3" + +[profile.release] +opt-level = 3 # "z" for size or "3" for speed +lto = true # Link Time Optimization +codegen-units = 1 # Single unit = better optimization +panic = "abort" # Smaller binary, faster execution diff --git a/src/test/app/wasm_fixtures/sp1/src/lib.rs b/src/test/app/wasm_fixtures/sp1/src/lib.rs new file mode 100644 index 00000000000..f918e4f42df --- /dev/null +++ b/src/test/app/wasm_fixtures/sp1/src/lib.rs @@ -0,0 +1,37 @@ +use sp1_verifier::Groth16Verifier; + +#[no_mangle] +pub fn sp1_groth16_verifier() -> bool { + let groth16_vk = *sp1_verifier::GROTH16_VK_BYTES; + + let proof: Vec = vec![ + 17, 182, 160, 157, 31, 189, 116, 200, 17, 224, 230, 34, 195, 108, 230, 185, 62, 91, 181, + 212, 80, 111, 197, 89, 247, 206, 99, 206, 147, 13, 216, 101, 252, 192, 149, 2, 40, 4, 249, + 44, 97, 227, 127, 36, 244, 18, 27, 75, 248, 3, 45, 11, 103, 45, 183, 204, 61, 217, 19, 208, + 66, 73, 202, 108, 136, 162, 221, 184, 6, 189, 49, 196, 104, 128, 151, 21, 104, 109, 145, + 150, 243, 51, 27, 243, 203, 75, 176, 59, 193, 51, 177, 64, 83, 13, 133, 140, 248, 242, 13, + 24, 12, 103, 126, 112, 244, 181, 129, 246, 52, 110, 134, 57, 149, 23, 163, 43, 202, 7, 164, + 233, 179, 160, 16, 5, 22, 45, 129, 76, 183, 76, 150, 139, 27, 224, 191, 59, 47, 105, 71, + 47, 8, 176, 157, 159, 234, 253, 239, 131, 138, 120, 101, 4, 98, 236, 106, 235, 98, 76, 93, + 220, 174, 153, 58, 216, 28, 141, 129, 191, 188, 40, 184, 225, 22, 61, 75, 139, 159, 162, + 117, 83, 214, 239, 1, 246, 236, 255, 64, 228, 116, 107, 206, 23, 59, 3, 221, 95, 14, 170, + 28, 171, 36, 179, 75, 101, 177, 40, 198, 12, 193, 82, 105, 155, 177, 62, 158, 72, 209, 252, + 51, 169, 109, 32, 121, 179, 194, 73, 164, 14, 8, 206, 181, 9, 5, 38, 74, 136, 97, 0, 89, + 80, 75, 88, 228, 94, 46, 196, 199, 83, 229, 11, 103, 115, 25, 31, 215, 137, 65, 159, 95, + 192, + ]; + + let sp1_public_values = vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, + ]; + + let sp1_vkey_hash: String = + "0x00aea8e9c83c73d74036923de1b4a66d18547d58eee4eacfee70235ed291954c".to_string(); + + let _ = Groth16Verifier::verify(&proof, &sp1_public_values, &sp1_vkey_hash, groth16_vk); + + true +} diff --git a/src/test/app/wasm_fixtures/zk_proof/Cargo.lock b/src/test/app/wasm_fixtures/zk_proof/Cargo.lock new file mode 100644 index 00000000000..f042837723f --- /dev/null +++ b/src/test/app/wasm_fixtures/zk_proof/Cargo.lock @@ -0,0 +1,106 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zk_proof" +version = "0.0.1" +dependencies = [ + "bls12_381", + "group", +] diff --git a/src/test/app/wasm_fixtures/zk_proof/Cargo.toml b/src/test/app/wasm_fixtures/zk_proof/Cargo.toml new file mode 100644 index 00000000000..3e556d43176 --- /dev/null +++ b/src/test/app/wasm_fixtures/zk_proof/Cargo.toml @@ -0,0 +1,19 @@ +[package] +edition = "2021" +name = "zk_proof" +version = "0.0.1" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# bellman = "=0.14.0" +bls12_381 = "=0.8.0" +group = "0.13.0" + +[profile.release] +# opt-level = 3 # Optimize for time +opt-level = "z" # Optimize for size +lto = true # Enable Link Time Optimization +codegen-units = 1 +panic = "abort" # Remove unnecessary panic machinery diff --git a/src/test/app/wasm_fixtures/zk_proof/src/lib.rs b/src/test/app/wasm_fixtures/zk_proof/src/lib.rs new file mode 100644 index 00000000000..4d44d8e3424 --- /dev/null +++ b/src/test/app/wasm_fixtures/zk_proof/src/lib.rs @@ -0,0 +1,254 @@ +use bls12_381::multi_miller_loop; +use bls12_381::Scalar; +use bls12_381::{G1Affine, G2Affine, G2Prepared}; +use group::prime::PrimeCurveAffine; +use group::Curve; + +use std::mem; +use std::os::raw::c_void; +// use std::time::{Instant}; + +// Groth16 proof struct +pub struct Proof { + pub a: G1Affine, + pub b: G2Affine, + pub c: G1Affine, +} + +// Groth16 verification key struct +pub struct VerifyingKey { + pub alpha_g1: G1Affine, + pub beta_g1: G1Affine, + pub beta_g2: G2Affine, + pub gamma_g2: G2Affine, + pub delta_g1: G1Affine, + pub delta_g2: G2Affine, + pub ic: Vec, +} + +#[no_mangle] +pub extern "C" fn allocate(size: usize) -> *mut c_void { + let mut buffer = Vec::with_capacity(size); + let pointer = buffer.as_mut_ptr(); + mem::forget(buffer); + pointer as *mut c_void + // } +} + +#[no_mangle] +fn deserialize_g1_wasm(buffer: &mut Vec) -> G1Affine { + let d_g1 = G1Affine::from_compressed(&buffer[0..48].try_into().unwrap()) + .expect("Failed to deserialize vk"); + + d_g1 +} + +fn deserialize_g2_wasm(buffer: &mut Vec) -> G2Affine { + let d_g2 = G2Affine::from_compressed(&buffer[0..96].try_into().unwrap()) + .expect("Failed to deserialize vk"); + + d_g2 +} + +#[no_mangle] +// pub extern fn bellman_groth16_test(pointer: *mut u8, capacity: usize) -> bool { +pub extern "C" fn bellman_groth16_test() -> bool { + // let mut bytes = Vec::new(); + // unsafe { + // // println!("Test in vm {:?}", pointer); + // let v = Vec::from_raw_parts(pointer, capacity, capacity); //TODO no need to deallocate?? + // bytes.extend_from_slice(&v); + // } + + // Hardcode the input bytes for testing in different WASM VMs + // let bytes = [172, 197, 81, 189, 121, 193, 159, 27, 92, 95, 151, 164, 40, 59, 214, 96, 132, 58, 87, 37, 169, 1, 63, 230, 35, 74, 245, 6, 185, 56, 120, 108, 214, 179, 187, 21, 36, 206, 43, 160, 10, 250, 249, 73, 210, 35, 137, 87, 177, 66, 65, 154, 11, 232, 137, 246, 125, 72, 227, 222, 116, 168, 87, 24, 165, 160, 132, 109, 108, 101, 222, 143, 78, 97, 48, 95, 59, 177, 29, 247, 219, 166, 73, 249, 69, 206, 15, 151, 30, 248, 235, 63, 148, 240, 17, 22, 150, 67, 252, 141, 95, 179, 94, 111, 207, 201, 192, 144, 154, 94, 21, 2, 22, 58, 96, 144, 227, 107, 107, 182, 142, 0, 57, 27, 168, 39, 226, 40, 163, 159, 112, 83, 196, 182, 215, 74, 92, 20, 158, 60, 23, 184, 198, 143, 17, 6, 242, 7, 75, 220, 87, 47, 224, 145, 99, 169, 203, 218, 112, 185, 51, 102, 59, 56, 171, 46, 49, 255, 116, 108, 241, 50, 180, 247, 62, 218, 181, 197, 155, 80, 61, 252, 8, 41, 232, 73, 51, 250, 223, 82, 94, 8, 185, 83, 223, 187, 6, 41, 20, 62, 189, 254, 11, 11, 58, 187, 200, 88, 53, 234, 98, 172, 213, 62, 22, 34, 90, 166, 182, 133, 8, 230, 103, 219, 233, 141, 10, 137, 210, 151, 4, 129, 29, 92, 103, 251, 72, 182, 162, 59, 20, 222, 188, 232, 13, 74, 214, 182, 172, 120, 33, 198, 57, 204, 134, 93, 26, 79, 213, 45, 146, 6, 128, 103, 63, 202, 226, 120, 141, 193, 248, 65, 196, 235, 21, 184, 104, 228, 206, 117, 190, 28, 153, 183, 68, 36, 63, 60, 131, 87, 137, 213, 105, 27, 110, 37, 238, 200, 250, 145, 76, 25, 57, 81, 69, 164, 208, 255, 49, 80, 14, 64, 181, 143, 12, 58, 35, 63, 199, 35, 70, 25, 86, 158, 210, 150, 59, 159, 253, 238, 174, 211, 142, 166, 223, 51, 134, 118, 171, 27, 218, 219, 117, 163, 71, 134, 95, 142, 83, 251, 240, 241, 162, 232, 93, 248, 167, 112, 197, 212, 169, 209, 159, 101, 140, 248, 222, 234, 201, 169, 76, 242, 7, 10, 192, 30, 151, 167, 74, 186, 97, 121, 144, 36, 6, 187, 92, 7, 248, 45, 134, 85, 240, 112, 74, 224, 70, 64, 198, 59, 26, 195, 192, 140, 101, 118, 175, 17, 160, 195, 142, 133, 1, 139, 5, 130, 245, 17, 73, 176, 232, 107, 130, 172, 110, 20, 190, 37, 108, 250, 178, 187, 151, 158, 35, 248, 246, 143, 38, 212, 133, 226, 24, 45, 33, 164, 46, 125, 200, 157, 253, 225, 132, 181, 60, 90, 7, 240, 80, 232, 97, 206, 164, 28, 12, 75, 68, 126, 230, 145, 216, 45, 180, 203, 19, 152, 29, 203, 9, 4, 145, 122, 206, 146, 179, 44, 145, 191, 126, 199, 175, 171, 127, 189, 222, 108, 126, 161, 80, 190, 47, 44, 8, 40, 65, 68, 95, 61, 109, 148, 175, 113, 226, 8, 93, 126, 53, 39, 192, 196, 6, 152, 194, 105, 169, 226, 192, 201, 184, 198, 134, 210, 153, 170, 12, 241, 90, 250, 233, 20, 152, 119, 142, 120, 83, 2, 164, 80, 178, 125, 227, 253, 207, 240, 201, 127, 213, 196, 100, 90, 65, 120, 50, 108, 175, 34, 192, 197, 173, 202, 176, 210, 131, 22, 216, 57, 169, 241, 28, 40, 44, 62, 11, 42, 50, 46, 204, 242, 109, 158, 114, 41, 127, 206, 25, 194, 255, 128, 245, 232, 193, 189, 229, 51, 93, 94, 64, 117, 33, 132, 75, 253, 114, 64, 116, 155, 183, 137, 112, 201, 243, 13, 221, 142, 164, 59, 98, 152, 249, 40, 133, 70, 185, 231, 249, 151, 253, 240, 122, 214, 60, 18, 132, 177, 37, 42, 75, 206, 12, 100, 214, 248, 234, 78, 165, 74, 212, 248, 32, 162, 254, 227, 218, 46, 9, 87, 0, 118, 13, 249, 107, 83, 5, 138, 223, 9, 247, 70, 160, 228, 197, 54, 87, 18, 1, 37, 199, 162, 84, 189, 161, 10, 26, 75, 45, 168, 185, 153, 245, 243, 51, 176, 208, 187, 235, 135, 239, 231, 42, 43, 233, 150, 46, 249, 73, 229, 138, 84, 89, 75, 129, 238, 211, 80, 147, 67, 159, 227, 214, 131, 188, 130, 70, 224, 1, 77, 139, 239, 185, 53, 68, 41, 193, 207, 16, 2, 33, 139, 214, 103, 240, 14, 141, 223, 24, 236, 50, 64, 79, 178, 6, 79, 38, 165, 35, 173, 203, 101, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + let bytes = [ + 147, 235, 138, 182, 249, 146, 149, 28, 58, 36, 144, 99, 188, 155, 153, 135, 239, 79, 76, + 109, 152, 156, 202, 1, 153, 84, 239, 184, 69, 145, 133, 48, 156, 80, 122, 227, 231, 161, + 137, 232, 67, 183, 34, 186, 230, 135, 25, 90, 136, 201, 110, 134, 208, 93, 78, 82, 153, + 239, 208, 236, 160, 231, 192, 150, 215, 128, 193, 255, 107, 39, 133, 12, 136, 148, 119, 17, + 59, 198, 100, 49, 37, 89, 132, 205, 45, 79, 151, 112, 247, 140, 94, 179, 215, 165, 52, 182, + 153, 68, 204, 210, 218, 156, 69, 74, 192, 30, 160, 13, 80, 188, 23, 112, 21, 124, 91, 147, + 21, 140, 217, 226, 248, 60, 182, 119, 18, 34, 32, 41, 181, 128, 165, 97, 168, 76, 98, 44, + 114, 122, 128, 215, 68, 156, 18, 91, 5, 33, 22, 141, 249, 137, 49, 252, 82, 122, 206, 58, + 183, 108, 176, 15, 38, 183, 87, 254, 34, 102, 195, 78, 166, 227, 96, 180, 137, 173, 131, + 178, 179, 25, 89, 159, 5, 73, 125, 24, 25, 86, 227, 19, 184, 117, 228, 173, 150, 1, 82, + 142, 48, 251, 236, 132, 73, 79, 201, 165, 192, 191, 195, 60, 100, 198, 251, 187, 161, 220, + 63, 143, 38, 21, 189, 219, 194, 100, 64, 186, 102, 7, 186, 213, 227, 92, 228, 52, 181, 171, + 223, 222, 218, 206, 221, 22, 15, 46, 77, 175, 34, 43, 221, 110, 21, 89, 149, 213, 68, 242, + 140, 185, 176, 73, 88, 216, 75, 237, 209, 10, 75, 251, 152, 101, 15, 146, 168, 27, 81, 8, + 61, 76, 103, 230, 171, 23, 144, 171, 6, 118, 157, 233, 234, 214, 132, 106, 30, 171, 121, + 77, 147, 175, 170, 62, 48, 251, 12, 221, 202, 109, 80, 97, 180, 27, 45, 87, 162, 19, 168, + 152, 27, 205, 113, 91, 83, 52, 99, 109, 17, 149, 189, 244, 174, 164, 192, 79, 133, 111, + 195, 215, 232, 129, 166, 204, 3, 169, 248, 49, 18, 190, 198, 145, 177, 169, 10, 4, 66, 134, + 46, 11, 163, 170, 94, 230, 234, 234, 43, 122, 51, 230, 100, 106, 149, 228, 208, 217, 87, + 231, 125, 170, 47, 143, 151, 45, 208, 64, 91, 10, 188, 136, 15, 155, 131, 200, 141, 243, + 200, 5, 109, 22, 98, 189, 193, 44, 40, 95, 126, 145, 234, 190, 205, 179, 172, 224, 147, + 253, 238, 162, 157, 60, 126, 9, 174, 34, 16, 161, 197, 60, 243, 211, 241, 78, 114, 51, 167, + 214, 53, 149, 172, 56, 149, 32, 66, 123, 48, 240, 179, 53, 154, 29, 134, 34, 141, 204, 168, + 184, 158, 165, 115, 241, 119, 228, 11, 35, 82, 186, 132, 103, 65, 243, 215, 31, 105, 201, + 191, 155, 210, 53, 194, 76, 63, 199, 181, 28, 138, 181, 181, 211, 145, 15, 139, 244, 38, + 56, 159, 161, 95, 46, 147, 141, 163, 221, 88, 167, 134, 73, 45, 70, 98, 98, 167, 55, 52, + 234, 110, 150, 79, 248, 157, 167, 84, 210, 89, 10, 193, 169, 32, 40, 218, 7, 236, 206, 85, + 178, 174, 157, 132, 181, 192, 119, 60, 205, 46, 217, 120, 97, 59, 82, 121, 11, 189, 21, + 213, 176, 255, 225, 57, 76, 239, 38, 99, 226, 55, 98, 227, 10, 45, 193, 69, 255, 247, 39, + 121, 86, 150, 6, 220, 98, 41, 132, 237, 189, 169, 110, 213, 115, 33, 228, 197, 61, 219, + 202, 58, 54, 70, 223, 179, 208, 139, 232, 103, 76, 165, 169, 68, 6, 148, 47, 244, 26, 203, + 186, 110, 69, 44, 175, 128, 119, 212, 188, 167, 223, 87, 119, 238, 199, 201, 61, 78, 96, + 175, 0, 156, 145, 196, 253, 162, 175, 172, 227, 80, 251, 96, 61, 189, 35, 13, 97, 22, 157, + 86, 249, 128, 148, 172, 66, 80, 172, 208, 222, 131, 0, 207, 80, 163, 27, 155, 113, 57, 186, + 246, 139, 111, 71, 117, 152, 184, 60, 1, 230, 44, 169, 213, 88, 82, 156, 194, 234, 41, 183, + 87, 36, 175, 154, 156, 128, 59, 187, 208, 101, 9, 51, 205, 42, 174, 29, 215, 43, 150, 183, + 129, 125, 2, 84, 210, 149, 245, 126, 140, 166, 255, 134, 116, 162, 107, 82, 178, 158, 38, + 11, 135, 91, 224, 157, 112, 189, 164, 250, 1, 215, 49, 21, 214, 211, 73, 243, 251, 58, 198, + 1, 165, 196, 122, 13, 238, 252, 227, 229, 149, 47, 13, 173, 171, 176, 185, 220, 82, 96, + 163, 4, 36, 199, 152, 88, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, + 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + + // ***** Test deserialization and reconstruction of vk ***** + // let start_key_recons = Instant::now(); + // println!("Start verification key reconstruction"); + + // alpha_g1 + let mut vec_alpha_g1 = bytes[0..48].to_vec(); + let r_alpha_g1 = deserialize_g1_wasm(&mut vec_alpha_g1); + + // beta_g1 + let mut vec_beta_g1 = bytes[48..96].to_vec(); + let r_beta_g1 = deserialize_g1_wasm(&mut vec_beta_g1); + + // beta_g2 + let mut vec_beta_g2 = bytes[96..192].to_vec(); + let r_beta_g2 = deserialize_g2_wasm(&mut vec_beta_g2); + + // gamma_g2 + let mut vec_gamma_g2 = bytes[192..288].to_vec(); + let r_gamma_g2 = deserialize_g2_wasm(&mut vec_gamma_g2); + + // delta_g1 + let mut vec_delta_g1 = bytes[288..336].to_vec(); + let r_delta_g1 = deserialize_g1_wasm(&mut vec_delta_g1); + + // delta_g2 + let mut vec_delta_g2 = bytes[336..432].to_vec(); + let r_delta_g2 = deserialize_g2_wasm(&mut vec_delta_g2); + + // ic + let vec_ic = bytes[432..576].to_vec(); + // println!("\nic vector: {:?}", vec_ic); + let mut r_ic: Vec = Vec::new(); + let mut vec_ic_de = vec_ic[0..48].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + vec_ic_de = vec_ic[48..96].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + vec_ic_de = vec_ic[96..144].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + + // Reconstruct vk + // replace following if using bellman::{groth16, groth16::Proof}; + // let deserialized_vk = groth16::VerifyingKey:: { + let deserialized_vk = VerifyingKey { + alpha_g1: r_alpha_g1, + beta_g1: r_beta_g1, + beta_g2: r_beta_g2, + gamma_g2: r_gamma_g2, + delta_g1: r_delta_g1, + delta_g2: r_delta_g2, + ic: r_ic, + }; + + // Uncomment following if using bellman::{groth16, groth16::Proof}; + // let pvk = groth16::prepare_verifying_key(&deserialized_vk); + // println!("Key reconstruction time: {:?}", start_key_recons.elapsed()); + + // ***** Reconstruct proof ***** + // let start_proof_recons = Instant::now(); + + // proof.g1 + let r_a = G1Affine::from_compressed(&bytes[576..624].try_into().unwrap()) + .expect("Failed to deserialize a"); + // proof.g2 + let r_b = G2Affine::from_compressed(&bytes[624..720].try_into().unwrap()) + .expect("Failed to deserialize b"); + // proof.g1 + let r_c = G1Affine::from_compressed(&bytes[720..768].try_into().unwrap()) + .expect("Failed to deserialize c"); + + // Replace following if using bellman::{groth16, groth16::Proof}; + // let r_proof: Proof = Proof{a: r_a, b: r_b, c: r_c}; + let r_proof: Proof = Proof { + a: r_a, + b: r_b, + c: r_c, + }; + // println!("Proof reconstruction time: {:?}", start_proof_recons.elapsed()); + + // ***** Reconstruct input ***** + // let start_input_recons = Instant::now(); + + let last_64_bytes = &bytes[bytes.len() - 64..]; + + let r_inputs: Vec = last_64_bytes + .chunks(32) // Each Scalar in bls12_381 uses 32 bytes + .map(|chunk| { + Scalar::from_bytes(chunk.try_into().unwrap()).expect("Invalid bytes for Scalar") + }) + .collect(); + + // println!("Input reconstruction time: {:?}", start_input_recons.elapsed()); + + /***** proof verification *****/ + // uncomment following if bellman groth16 is used + // assert!(groth16::verify_proof(&pvk, &r_proof, &r_inputs).is_ok()); + // let start_verify = Instant::now(); + + // Ensure the number of inputs matches the vk.ic length minus 1 (for IC[0]) + if (r_inputs.len() + 1) != deserialized_vk.ic.len() { + return false; + } + + /***** Compute linear combination: input_acc = IC[0] + sum(input[i] * IC[i+1]) *****/ + let mut acc = deserialized_vk.ic[0].to_curve(); // Convert G1Affine to G1Projective + + // Computes multi-scalar multiplication, + // which is a weighted sum of elliptic curve points. + // In Groth16, this builds the point: + // acc = IC₀ + input₁ × IC₁ + input₂ × IC₂ + ... + inputₙ × ICₙ + // Where: ICᵢ are fixed elliptic curve points (from the verifying key). + // inputᵢ are the public inputs to the circuit. + // Example: public_inputs = [x₁, x₂], vk.ic = [IC₀, IC₁, IC₂], acc = IC₀ + x₁ * IC₁ + x₂ * IC₂ + // This binds the public inputs to the proof + for (input, ic_point) in r_inputs.iter().zip(&deserialized_vk.ic[1..]) { + acc += ic_point.to_curve() * input; + } + + let acc_affine = acc.to_affine(); // converts the point acc from projective form back to affine form. + + // Preparing G2 elements for pairing by converting them into G2Prepared format. + let proof_b_prepared = G2Prepared::from(r_proof.b); + let gamma_g2_prepared = G2Prepared::from(deserialized_vk.gamma_g2); + let delta_g2_prepared = G2Prepared::from(deserialized_vk.delta_g2); + let beta_g2_prepared = G2Prepared::from(deserialized_vk.beta_g2); + + // Compute required product of pairings in their Miller loop form + // Groth16 verifier checks if e(A, B) * e(acc, γ)⁻¹ * e(C, δ)⁻¹ * e(α, β)⁻¹ == 1 + // which boils down to + // let start_miller = Instant::now(); + let ml_result = multi_miller_loop(&[ + (&r_proof.a, &proof_b_prepared), // e(A,B) + (&(-acc_affine), &gamma_g2_prepared), // e(acc, γ)⁻¹ + (&(-r_proof.c), &delta_g2_prepared), // e(C, δ)⁻¹ + (&(-deserialized_vk.alpha_g1), &beta_g2_prepared), //e(α, β)⁻¹ + ]); + // println!("Miller time: {:?}", start_miller.elapsed()); + + // let start_final = Instant::now(); + let result = ml_result.final_exponentiation(); + // println!("Final time: {:?}", start_final.elapsed()); + // println!("Proof verification time: {:?}", start_verify.elapsed()); + + // true + result == bls12_381::Gt::identity() +} diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index d7cf9aa78da..413240559b8 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -131,7 +131,7 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else - auto j = jlog.error(); + auto j = jlog.warn(); #endif wasm_byte_vec_t error_message WASM_EMPTY_VEC; diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 335d406254f..6ea15f42abf 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -58,7 +58,6 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); From dd30d811e61eb57168642c1a1a4728129b4045b4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 15 Aug 2025 16:51:30 -0400 Subject: [PATCH 56/73] feat: last set of host functions (#5674) --- src/test/app/Escrow_test.cpp | 26 +- src/test/app/HostFuncImpl_test.cpp | 270 ++++-- src/test/app/TestHostFunctions.h | 41 + src/test/app/Wasm_test.cpp | 16 +- .../app/wasm_fixtures/all_keylets/Cargo.lock | 2 +- .../app/wasm_fixtures/all_keylets/src/lib.rs | 67 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 2 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 1 - .../codecov_tests/src/host_bindings_loose.rs | 9 + .../wasm_fixtures/codecov_tests/src/lib.rs | 293 +++++- src/test/app/wasm_fixtures/fixtures.cpp | 880 ++++++++++-------- src/xrpld/app/wasm/HostFunc.h | 43 + src/xrpld/app/wasm/HostFuncImpl.h | 23 + src/xrpld/app/wasm/HostFuncWrapper.h | 66 ++ src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 99 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 267 +++++- src/xrpld/app/wasm/detail/WasmVM.cpp | 12 + 17 files changed, 1600 insertions(+), 517 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index c74b98e8c7c..a6861a252c6 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2347,6 +2347,7 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2); // set up a bunch of objects to check their keylets + AMM amm(env, carol, XRP(10), carol["USD"](1000)); env(check::create(alice, carol, XRP(100))); env(credentials::create(alice, alice, "termsandconditions")); env(delegate::set(alice, carol, {"TrustSet"})); @@ -2354,17 +2355,26 @@ struct Escrow_test : public beast::unit_test::suite env(did::set(alice), did::data("alice_did")); env(escrow::create(alice, carol, XRP(100)), escrow::finish_time(env.now() + 100s)); + MPTTester mptTester{env, alice, {.fund = false}}; + mptTester.create(); + mptTester.authorize({.account = carol}); env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); - env(offer(alice, carol["USD"](0.1), XRP(100))); + env(offer(alice, carol["GBP"](0.1), XRP(100))); env(create(alice, carol, XRP(1000), 100s, alice.pk())); + pdomain::Credentials credentials{{alice, "first credential"}}; + env(pdomain::setTx(alice, credentials)); env(signers(alice, 1, {{carol, 1}})); env(ticket::create(alice, 1)); + Vault vault{env}; + auto [tx, _keylet] = + vault.create({.owner = alice, .asset = xrpIssue()}); + env(tx); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); if (BEAST_EXPECTS( - env.seq(alice) == 17, std::to_string(env.seq(alice)))) + env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); XRPAmount txnFees = env.current()->fees().base + 1000; @@ -2377,7 +2387,7 @@ struct Escrow_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 99'596; + auto const allowance = 137'596; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), @@ -2386,8 +2396,12 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); + { + auto const gasUsed = txMeta->getFieldU32(sfGasUsed); + BEAST_EXPECTS( + gasUsed == allowance, std::to_string(gasUsed)); + } + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); } } } diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index dea7ce4d510..38d1cd0237a 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -24,6 +24,12 @@ namespace ripple { namespace test { +static Bytes +toBytes(std::uint8_t value) +{ + return {value}; +} + static Bytes toBytes(std::uint16_t value) { @@ -201,6 +207,31 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.getBaseFee(); if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(result.value() == env.current()->fees().base.drops()); + + { + Env env2( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.reference_fee = + static_cast( + std::numeric_limits::max()) + + 1; + return cfg; + }), + testable_amendments()); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + OpenView ov2{*env2.current()}; + ApplyContext ac2 = createApplyContext(env2, ov2); + WasmHostFunctionsImpl hfs2(ac2, dummyEscrow); + auto const result2 = hfs2.getBaseFee(); + if (BEAST_EXPECT(!result2.has_value())) + BEAST_EXPECT(result2.error() == HostFunctionError::INTERNAL); + } } void @@ -402,6 +433,23 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(*asset2 == toBytes(Asset(mptId))); } } + + { + std::uint8_t const expectedScale = 8; + STTx const stx2 = STTx(ttMPTOKEN_ISSUANCE_CREATE, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldU8(sfAssetScale, expectedScale); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const actualScale = hfs.getTxField(sfAssetScale); + if (BEAST_EXPECT(actualScale.has_value())) + { + BEAST_EXPECT( + std::ranges::equal(*actualScale, toBytes(expectedScale))); + } + } } void @@ -1442,31 +1490,38 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ } \ } -#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ - { \ - auto actual = hfs.hfsFunc(__VA_ARGS__); \ - if (BEAST_EXPECT(!actual.has_value())) \ - { \ - BEAST_EXPECTS( \ - actual.error() == expected, \ - std::to_string(HfErrorToInt(actual.error()))); \ - } \ +#define COMPARE_KEYLET_FAIL(hfsFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(HfErrorToInt(actual.error()))); \ + } \ } - // accountKeylet COMPARE_KEYLET(accountKeylet, keylet::account, env.master.id()); COMPARE_KEYLET_FAIL( - accountKeylet, - keylet::account, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount()); + accountKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET( + ammKeylet, keylet::amm, xrpIssue(), env.master["USD"].issue()); + COMPARE_KEYLET_FAIL( + ammKeylet, + HostFunctionError::INVALID_PARAMS, + xrpIssue(), + xrpIssue()); + COMPARE_KEYLET_FAIL( + ammKeylet, + HostFunctionError::INVALID_PARAMS, + makeMptID(1, env.master.id()), + xrpIssue()); + COMPARE_KEYLET(checkKeylet, keylet::check, env.master.id(), 1); COMPARE_KEYLET_FAIL( - checkKeylet, - keylet::check, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + checkKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + std::string const credType = "test"; COMPARE_KEYLET( credentialKeylet, @@ -1482,21 +1537,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite static_assert(longCredType.size() > maxCredentialTypeLength); COMPARE_KEYLET_FAIL( credentialKeylet, - keylet::credential, HostFunctionError::INVALID_PARAMS, env.master.id(), alice.id(), Slice(longCredType.data(), longCredType.size())); COMPARE_KEYLET_FAIL( credentialKeylet, - keylet::credential, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), alice.id(), Slice(credType.data(), credType.size())); COMPARE_KEYLET_FAIL( credentialKeylet, - keylet::credential, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), @@ -1504,27 +1556,22 @@ struct HostFuncImpl_test : public beast::unit_test::suite COMPARE_KEYLET(didKeylet, keylet::did, env.master.id()); COMPARE_KEYLET_FAIL( - didKeylet, - keylet::did, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount()); + didKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + COMPARE_KEYLET( delegateKeylet, keylet::delegate, env.master.id(), alice.id()); COMPARE_KEYLET_FAIL( delegateKeylet, - keylet::delegate, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id()); COMPARE_KEYLET_FAIL( delegateKeylet, - keylet::delegate, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount()); COMPARE_KEYLET_FAIL( delegateKeylet, - keylet::delegate, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id()); @@ -1536,123 +1583,138 @@ struct HostFuncImpl_test : public beast::unit_test::suite alice.id()); COMPARE_KEYLET_FAIL( depositPreauthKeylet, - keylet::depositPreauth, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id()); COMPARE_KEYLET_FAIL( depositPreauthKeylet, - keylet::depositPreauth, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount()); COMPARE_KEYLET_FAIL( depositPreauthKeylet, - keylet::depositPreauth, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id()); - // escrowKeylet COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); COMPARE_KEYLET_FAIL( - escrowKeylet, - keylet::escrow, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + escrowKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); - // lineKeylet Currency usd = to_currency("USD"); COMPARE_KEYLET( lineKeylet, keylet::line, env.master.id(), alice.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_PARAMS, env.master.id(), alice.id(), to_currency("")); + { + auto actual = hfs.mptIssuanceKeylet(env.master.id(), 1); + auto expected = keylet::mptIssuance(1, env.master.id()); + if (BEAST_EXPECT(actual.has_value())) + { + BEAST_EXPECT(compareKeylet(actual.value(), expected)); + } + } + { + auto actual = hfs.mptIssuanceKeylet(xrpAccount(), 1); + if (BEAST_EXPECT(!actual.has_value())) + BEAST_EXPECT( + actual.error() == HostFunctionError::INVALID_ACCOUNT); + } + + auto const sampleMPTID = makeMptID(1, env.master.id()); + COMPARE_KEYLET(mptokenKeylet, keylet::mptoken, sampleMPTID, alice.id()); + COMPARE_KEYLET_FAIL( + mptokenKeylet, + HostFunctionError::INVALID_PARAMS, + MPTID{}, + alice.id()); + COMPARE_KEYLET_FAIL( + mptokenKeylet, + HostFunctionError::INVALID_ACCOUNT, + sampleMPTID, + xrpAccount()); + COMPARE_KEYLET(nftOfferKeylet, keylet::nftoffer, env.master.id(), 1); COMPARE_KEYLET_FAIL( nftOfferKeylet, - keylet::nftoffer, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET(offerKeylet, keylet::offer, env.master.id(), 1); COMPARE_KEYLET_FAIL( - offerKeylet, - keylet::offer, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + offerKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET(oracleKeylet, keylet::oracle, env.master.id(), 1); COMPARE_KEYLET_FAIL( - oracleKeylet, - keylet::oracle, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + oracleKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET( paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); COMPARE_KEYLET_FAIL( paychanKeylet, - keylet::payChan, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), 1); COMPARE_KEYLET_FAIL( paychanKeylet, - keylet::payChan, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), 1); COMPARE_KEYLET_FAIL( paychanKeylet, - keylet::payChan, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id(), 1); - COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); - COMPARE_KEYLET_FAIL( - signersKeylet, - keylet::signers, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount()); - COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET( + permissionedDomainKeylet, + keylet::permissionedDomain, + env.master.id(), + 1); COMPARE_KEYLET_FAIL( - ticketKeylet, - keylet::ticket, + permissionedDomainKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); + COMPARE_KEYLET_FAIL( + signersKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + ticketKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET(vaultKeylet, keylet::vault, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + vaultKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); } void @@ -1936,6 +1998,80 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); } + void + testTraceAccount() + { + testcase("traceAccount"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace account"; + // Valid account + { + auto const result = hfs.traceAccount(msg, env.master.id()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + toBase58(env.master.id()).size()); + } + } + + void + testTraceAmount() + { + testcase("traceAmount"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace amount"; + STAmount amount = XRP(12345); + { + auto const result = hfs.traceAmount(msg, amount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == msg.size() + amount.getFullText().size()); + } + + // IOU amount + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + STAmount iouAmount = env.master["USD"](100); + { + auto const result = hfs.traceAmount(msg, iouAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + iouAmount.getFullText().size()); + } + + // MPT amount + { + auto const mptId = makeMptID(42, env.master.id()); + Asset mptAsset = Asset(mptId); + STAmount mptAmount(mptAsset, 123456); + auto const result = hfs.traceAmount(msg, mptAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + mptAmount.getFullText().size()); + } + } + // clang-format off int const normalExp = 15; @@ -2818,6 +2954,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite testGetNFTSerial(); testTrace(); testTraceNum(); + testTraceAccount(); + testTraceAmount(); testFloats(); } }; diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 2d7793463fd..9cacaa4c8c2 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -331,6 +331,17 @@ struct TestHostFunctions : public HostFunctions return Bytes{keylet.key.begin(), keylet.key.end()}; } + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override + { + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + Expected credentialKeylet( AccountID const& subject, @@ -450,6 +461,23 @@ struct TestHostFunctions : public HostFunctions return msg.size() + sizeof(data); } + Expected + traceAccount(std::string_view const& msg, AccountID const& account) override + { +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const accountStr = toBase58(account); + + j << "WAMR TRACE ACCOUNT: " << msg << " " << accountStr; + return msg.size() + accountStr.size(); + } + Expected traceFloat(std::string_view const& msg, Slice const& data) override { @@ -467,6 +495,19 @@ struct TestHostFunctions : public HostFunctions return msg.size() + s.size(); } + Expected + traceAmount(std::string_view const& msg, STAmount const& amount) override + { +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "WAMR TRACE AMOUNT: " << msg << " " << amountStr; + return msg.size() + amountStr.size(); + } + Expected floatFromInt(int64_t x, int32_t mode) override { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 46c116637a9..c09b366b7f4 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -645,26 +645,20 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; - // Env env{ - // *this, - // envconfig(), - // testable_amendments(), - // nullptr, - // beast::severities::kTrace}; Env env{*this}; auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); Bytes const wasm(wasmStr.begin(), wasmStr.end()); - std::string const funcName("finish"); TestHostFunctions hfs(env, 0); - auto re = - runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + auto const allowance = 119'883; + auto re = runEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 100'784, std::to_string(re->cost)); + BEAST_EXPECT(re->result); + BEAST_EXPECTS(re->cost == allowance, std::to_string(re->cost)); } } diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index cc667d4d346..83078812d35 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -11,5 +11,5 @@ dependencies = [ [[package]] name = "xrpl-std" -version = "0.0.1" +version = "0.5.1-devnet5" source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs index 167541eae63..970db7bd50b 100644 --- a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -3,15 +3,17 @@ #[cfg(not(target_arch = "wasm32"))] extern crate std; -use crate::host::{Result, Result::Err, Result::Ok}; -use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use crate::host::{Error, Result, Result::Err, Result::Ok}; use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; +use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; use xrpl_std::core::ledger_objects::ledger_object; use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; +use xrpl_std::core::types::amount::asset::{Asset, IouAsset, XrpAsset}; use xrpl_std::core::types::amount::currency_code::CurrencyCode; +use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; -use xrpl_std::host::trace::{trace, trace_data, trace_num, DataRepr}; +use xrpl_std::host::trace::{DataRepr, trace, trace_account, trace_data, trace_num}; use xrpl_std::sfield; #[unsafe(no_mangle)] @@ -27,7 +29,7 @@ pub fn object_exists( let slot = unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }; if slot <= 0 { let _ = trace_num("Error: ", slot.into()); - return Err(host::Error::NoFreeSlots); + return Err(Error::from_code(slot)); } if field == 0 { let new_field = sfield::PreviousTxnID; @@ -70,29 +72,27 @@ pub extern "C" fn finish() -> i32 { let escrow: CurrentEscrow = get_current_escrow(); let account = escrow.get_account().unwrap_or_panic(); - let _ = trace_data(" Account:", &account.0, DataRepr::AsHex); + let _ = trace_account("Account:", &account); let destination = escrow.get_destination().unwrap_or_panic(); - let _ = trace_data(" Destination:", &destination.0, DataRepr::AsHex); + let _ = trace_account("Destination:", &destination); + + let mut seq = 5; macro_rules! check_object_exists { ($keylet:expr, $type:expr, $field:expr) => { match object_exists($keylet, $type, $field) { - Ok(exists) => { - if exists { - let _ = trace(concat!( - $type, - " object exists, proceeding with escrow finish." - )); - } else { - let _ = trace(concat!( - $type, - " object does not exist, aborting escrow finish." - )); - return 0; - } + Ok(_exists) => { + // false isn't returned + let _ = trace(concat!( + $type, + " object exists, proceeding with escrow finish." + )); + } + Err(error) => { + let _ = trace_num("Current seq value:", seq.try_into().unwrap()); + return error.code(); } - Err(error) => return error.code(), } }; } @@ -100,13 +100,20 @@ pub extern "C" fn finish() -> i32 { let account_keylet = keylets::account_keylet(&account); check_object_exists!(account_keylet, "Account", sfield::Account); - let mut seq = 5; let currency_code: &[u8; 3] = b"USD"; let currency: CurrencyCode = CurrencyCode::from(*currency_code); let line_keylet = keylets::line_keylet(&account, &destination, ¤cy); check_object_exists!(line_keylet, "Trustline", sfield::Generic); seq += 1; + let asset1 = Asset::XRP(XrpAsset {}); + let asset2 = Asset::IOU(IouAsset::new(destination, currency)); + check_object_exists!( + keylets::amm_keylet(&asset1, &asset2), + "AMM", + sfield::Account + ); + let check_keylet = keylets::check_keylet(&account, seq); check_object_exists!(check_keylet, "Check", sfield::Account); seq += 1; @@ -132,7 +139,15 @@ pub extern "C" fn finish() -> i32 { check_object_exists!(escrow_keylet, "Escrow", sfield::Account); seq += 1; - let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 4); + let mpt_issuance_keylet = keylets::mpt_issuance_keylet(&account, seq); + let mpt_id = MptId::new(seq.try_into().unwrap(), account); + check_object_exists!(mpt_issuance_keylet, "MPTIssuance", sfield::Issuer); + seq += 1; + + let mptoken_keylet = keylets::mptoken_keylet(&mpt_id, &destination); + check_object_exists!(mptoken_keylet, "MPToken", sfield::Account); + + let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 6); check_object_exists!(nft_offer_keylet, "NFTokenOffer", sfield::Owner); let offer_keylet = keylets::offer_keylet(&account, seq); @@ -143,6 +158,10 @@ pub extern "C" fn finish() -> i32 { check_object_exists!(paychan_keylet, "PayChannel", sfield::Account); seq += 1; + let pd_keylet = keylets::permissioned_domain_keylet(&account, seq); + check_object_exists!(pd_keylet, "PermissionedDomain", sfield::Owner); + seq += 1; + let signers_keylet = keylets::signers_keylet(&account); check_object_exists!(signers_keylet, "SignerList", sfield::Generic); seq += 1; @@ -150,6 +169,10 @@ pub extern "C" fn finish() -> i32 { seq += 1; // ticket sequence number is one greater let ticket_keylet = keylets::ticket_keylet(&account, seq); check_object_exists!(ticket_keylet, "Ticket", sfield::Account); + seq += 1; + + let vault_keylet = keylets::vault_keylet(&account, seq); + check_object_exists!(vault_keylet, "Vault", sfield::Account); // seq += 1; 1 // All keylets exist, finish the escrow. diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 00b548911b4..f6b293d40dd 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -11,5 +11,5 @@ dependencies = [ [[package]] name = "xrpl-std" -version = "0.0.1" +version = "0.5.1-devnet5" source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index e379fe9790c..33ae5b78d71 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -16,4 +16,3 @@ panic = "abort" [dependencies] xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } - diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs index 0e8a1ecee08..1d3d04e74f5 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -32,6 +32,15 @@ unsafe extern "C" { out_buff_len: usize, ) -> i32; + pub fn amm_keylet( + issue1_ptr: *const u8, + issue1_len: usize, + issue2_ptr: i32, + issue2_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + pub fn line_keylet( account1_ptr: *const u8, account1_len: usize, diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 1323068b397..1b1f5f7b2d0 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -8,6 +8,9 @@ use xrpl_std::core::current_tx::escrow_finish::{EscrowFinish, get_current_escrow use xrpl_std::core::current_tx::traits::TransactionCommonFields; use xrpl_std::core::error_codes; use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::amount::asset::Asset; +use xrpl_std::core::types::amount::asset::XrpAsset; +use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; use xrpl_std::host::trace::{trace, trace_num as trace_number}; @@ -27,6 +30,7 @@ fn check_result(result: i32, expected: i32, test_name: &'static str) { panic!("Unexpected success code: {}", code); } code => { + let _ = trace(test_name); let _ = trace_number("TEST FAILED", code.into()); panic!("Error code: {}", code); } @@ -285,6 +289,32 @@ pub extern "C" fn finish() -> i32 { "get_ledger_sqn_len_too_long", ) }); + let message = "testing trace"; + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 47, + "trace_account", + ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 19, + "trace_amount", + ); // ######################################## // Step #3: Test getData[Type] edge cases @@ -359,7 +389,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "account_keylet_len_too_long", + "account_keylet_len_oob", ) }); with_buffer::<32, _, _>(|ptr, len| { @@ -393,7 +423,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "line_keylet_len_too_long_currency", + "line_keylet_len_oob_currency", ) }); with_buffer::<32, _, _>(|ptr, len| { @@ -415,6 +445,75 @@ pub extern "C" fn finish() -> i32 { ) }); + // Asset + let asset1_bytes = Asset::XRP(XrpAsset {}).as_bytes(); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "amm_keylet_len_oob_asset2", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_len_asset2", + ) + }); + let currency: &[u8] = b"USD00000000000000000"; // 20 bytes + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + currency.as_ptr() as i32, + currency.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_non_xrp_currency_len", + ) + }); + let mptid = MptId::new(1, account); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + mptid.as_ptr(), + mptid.len(), + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_mpt", + ) + }); + // string check_result( unsafe { @@ -425,7 +524,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "trace_num_wrong_len_str", + "trace_num_oob_str", ); // ######################################## @@ -476,7 +575,12 @@ pub extern "C" fn finish() -> i32 { check_result( unsafe { host::amendment_enabled(amendment_name.as_ptr(), long_len) }, error_codes::DATA_FIELD_TOO_LARGE, - "amendment_enabled", + "amendment_enabled_too_big_slice", + ); + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), 65) }, + error_codes::DATA_FIELD_TOO_LARGE, + "amendment_enabled_too_long", ); with_buffer::<2, _, _>(|ptr, len| { check_result( @@ -570,6 +674,22 @@ pub extern "C" fn finish() -> i32 { "compute_sha512_half_too_big_slice", ); }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + asset1_bytes.as_ptr(), + long_len, + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "amm_keylet_too_big_slice", + ) + }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { @@ -588,11 +708,27 @@ pub extern "C" fn finish() -> i32 { "credential_keylet_too_big_slice", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + mptid.as_ptr(), + long_len, + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "mptoken_keylet_too_big_slice_mptid", + ) + }); check_result( unsafe { host::trace( - locator.as_ptr(), - locator.len(), + message.as_ptr(), + message.len(), locator.as_ptr().wrapping_add(1_000_000_000), locator.len(), 0, @@ -601,6 +737,18 @@ pub extern "C" fn finish() -> i32 { error_codes::POINTER_OUT_OF_BOUNDS, "trace_oob_slice", ); + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_amount_oob_slice", + ); // invalid UInt256 @@ -787,7 +935,6 @@ pub extern "C" fn finish() -> i32 { "escrow_keylet_wrong_size_accountid", ) }); - let currency: &[u8] = b"USD00000000000000000"; // 20 bytes with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { @@ -824,6 +971,29 @@ pub extern "C" fn finish() -> i32 { "line_keylet_wrong_size_accountid2", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::mpt_issuance_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "mpt_issuance_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + mptid.as_ptr(), + mptid.len(), + locator.as_ptr(), + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mptoken_keylet_wrong_size_accountid", + ) + }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { host::nft_offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, @@ -879,6 +1049,15 @@ pub extern "C" fn finish() -> i32 { "paychan_keylet_wrong_size_accountid2", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::permissioned_domain_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) + }, + error_codes::INVALID_PARAMS, + "permissioned_domain_keylet_wrong_size_accountid", + ) + }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { host::signers_keylet(locator.as_ptr(), locator.len(), ptr, len) }, @@ -893,6 +1072,13 @@ pub extern "C" fn finish() -> i32 { "ticket_keylet_wrong_size_accountid", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::vault_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "vault_keylet_wrong_size_accountid", + ) + }); let uint256: &[u8] = b"00000000000000000000000000000001"; with_buffer::<2, _, _>(|ptr, len| { check_result( @@ -910,6 +1096,18 @@ pub extern "C" fn finish() -> i32 { "get_nft_wrong_size_accountid", ) }); + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + ) + }, + error_codes::INVALID_PARAMS, + "trace_account_wrong_size_accountid", + ); // invalid Currency was already tested above // invalid string @@ -917,15 +1115,39 @@ pub extern "C" fn finish() -> i32 { check_result( unsafe { host::trace( - locator.as_ptr().wrapping_add(1_000_000_000), - locator.len(), + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), uint256.as_ptr(), uint256.len(), 0, ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "get_nft_wrong_size_string", + "trace_oob_string", + ); + check_result( + unsafe { + host::trace_account( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_account_oob_string", + ); + check_result( + unsafe { + host::trace_amount( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_amount_oob_string", ); // trace too large @@ -948,6 +1170,57 @@ pub extern "C" fn finish() -> i32 { error_codes::DATA_FIELD_TOO_LARGE, "trace_num_too_long", ); + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + long_len, + account.0.as_ptr(), + account.0.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_account_too_long", + ); + check_result( + unsafe { host::trace_amount(message.as_ptr(), long_len, amount.as_ptr(), amount.len()) }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_account_too_long", + ); + + // trace amount errors + + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + ) + }, + error_codes::INVALID_PARAMS, + "trace_amount_wrong_length", + ); + + // other misc errors + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + locator.as_ptr(), + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mptoken_keylet_mptid_wrong_length", + ) + }); 1 // <-- If we get here, finish the escrow. } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 9e530997a0e..a0d8d4efaa3 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9669,205 +9669,264 @@ extern std::string const hfPerfTest = "6572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const allKeyletsWasmHex = - "0061736d01000000014d0960057f7f7f7f7f017f60047f7f7f7f017f60037f7f7f017f6008" - "7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f02de031208686f73745f6c6962057472616365000008686f" - "73745f6c69621063616368655f6c65646765725f6f626a000208686f73745f6c6962097472" - "6163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f626a5f666965" - "6c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f" - "6669656c64000208686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73" - "745f6c69620b6c696e655f6b65796c6574000308686f73745f6c69620c636865636b5f6b65" - "796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c657400030868" - "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" - "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" - "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" - "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" - "725f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000608" + "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" + "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" + "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" + "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" + "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" + "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" + "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" + "6c696e655f6b65796c6574000408686f73745f6c69620a616d6d5f6b65796c657400020868" + "6f73745f6c69620c636865636b5f6b65796c6574000008686f73745f6c6962116372656465" + "6e7469616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c" + "6574000208686f73745f6c6962166465706f7369745f707265617574685f6b65796c657400" + "0208686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" + "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b6579" + "6c6574000008686f73745f6c69620e6d70746f6b656e5f6b65796c6574000208686f73745f" + "6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f66666572" + "5f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c657400060868" + "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" - "636b65745f6b65796c65740000030302070805030100110619037f01418080c0000b7f0041" - "f48bc0000b7f0041808cc0000b073e05066d656d6f727902000d6f626a6563745f65786973" - "747300120666696e69736800130a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020ab82202b50502057f037e230041f0006b220524000240024020012d000045044020" - "0541186a200141196a290000370300200541106a200141116a290000370300200541086a20" - "0141096a290000370300200520012900013703002002200320054120410110001a20054120" - "41001001220141004c0d010240024002402004450440418b80c000410f4285801410021a20" - "0541e8006a4200370300200541e0006a4200370300200541d8006a42003703002005420037" - "0350200141858014200541d0006a22064120100322014120470d01200541286a200541df00" - "6a2201290000220a370300200541306a200541e7006a2202290000220b370300200541386a" - "200541ef006a22032d000022043a000020052005290057220c37032020052f015021072005" - "280152210820052d005621092001200a3700002002200b370000200320043a000020052009" - "3a005620052008360152200520073b01502005200c370057419a80c000410c200641204101" - "10001a0c030b418b80c000410f2004ac10021a200541e0006a4100360200200541d8006a42" - "003703002005420037035020012004200541d0006a4114100322014114460d0141a680c000" - "4115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c050b41a6" - "80c0004115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c04" - "0b200541226a20052d00523a0000200520052900573703402005200541dc006a2900003700" - "452005412c6a2005290045370000200520052f01503b012020052005280053360023200520" - "05290340370027419a80c000410c200541206a4114410110001a0b20004180023b01000c02" - "0b41c280c000411620012802042201ac10021a200041013a0000200020013602040c010b41" - "bb80c00041072001ac10021a200041013a0000200041783602040b200541f0006a24000bfe" - "1c01077f230041c0046b2200240041d880c000412341004100410010001a200041b0046a22" - "014100360200200041a8046a22024200370300200042003703a00402402000027f02404181" - "8020200041a0046a220541141004220341144604402000410e6a20002d00a2043a00002000" - "20002900a7043703582000200041ac046a220429000037005d200041186a200029005d3700" - "00200020002f01a0043b010c200020002800a30436000f2000200029035837001341fb80c0" - "00410a2000410c6a22064114410110001a2001410036020020024200370300200042003703" - "a0044183802020054114100422034114470d03200041226a20002d00a2043a000020002000" - "2900a7043703582000200429000037005d2000412c6a200029005d370000200020002f01a0" - "043b0120200020002800a30436002320002000290358370027418581c000410e200041206a" - "4114410110001a200041b8046a220442003703002001420037030020024200370300200042" - "003703a0042006411420054120100522034120460d01024020034100480440200020033602" - "380c010b2000417f3602380b41010c020b0c020b200041cd006a2004290300370000200041" - "c5006a20012903003700002000413d6a2002290300370000200020002903a0043700354100" - "0b3a0034200041a0046a200041346a419381c0004107418180201012027f024020002d00a0" - "040d0020002d00a104450440419a81c000413641004100410010001a0c010b4100210341d0" - "81c000413541004100410010001a200041e6006a41c4003a0000200041e0006a4100360200" - "200041eb006a41003a0000200041d5a6013b01642000420037035820004100360067200041" - "b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037030020" - "0042003703a00402402000410c6a4114200041206a4114200041d8006a4114200041a0046a" - "4120100622014120470440024020014100480440200020013602740c010b2000417f360274" - "0b410121030c010b20004189016a200229030037000020004181016a200529030037000020" - "0041f9006a2004290300370000200020002903a0043700710b200020033a0070200041a004" - "6a200041f0006a418582c00041094100101220002d00a0040d0020002d00a104450440418e" - "82c000413a41004100410010001a0c010b4100210341c882c000413941004100410010001a" - "200041b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037" - "0300200042003703a00402402000410c6a41144106200041a0046a41201007220141204704" - "4002402001410048044020002001360298010c010b2000417f360298010b410121030c010b" - "200041ad016a2002290300370000200041a5016a20052903003700002000419d016a200429" - "0300370000200020002903a004370095010b200020033a009401200041a0046a2000419401" - "6a418183c000410541818020101220002d00a0040d0020002d00a104450440419a81c00041" - "3641004100410010001a0c010b41d081c000413541004100410010001a230041206b220124" - "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" - "20014200370300200041b8016a2202027f2000410c6a2203411420034114418683c0004112" - "20014120100822034120470440024020034100480440200220033602040c010b2002417f36" - "02040b41010c010b20022001290300370001200241196a2005290300370000200241116a20" - "04290300370000200241096a200629030037000041000b3a0000200141206a2400200041a0" - "046a2002419883c000410a41988020101220002d00a0040d0020002d00a10445044041a283" - "c000413b41004100410010001a0c010b41dd83c000413a41004100410010001a230041206b" - "22012400200141186a22054200370300200141106a22044200370300200141086a22064200" - "37030020014200370300200041dc016a2202027f2000410c6a4114200041206a4114200141" - "20100922034120470440024020034100480440200220033602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" - "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" - "02419784c000410841818020101220002d00a0040d0020002d00a104450440419f84c00041" - "3941004100410010001a0c010b41d884c000413841004100410010001a230041206b220124" - "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" - "2001420037030020004180026a2202027f2000410c6a4114200041206a411420014120100a" - "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" - "010b20022001290300370001200241196a2005290300370000200241116a20042903003700" - "00200241096a200629030037000041000b3a0000200141206a2400200041a0046a20024190" - "85c000410e41818020101220002d00a0040d0020002d00a104450440419e85c000413f4100" - "4100410010001a0c010b41dd85c000413e41004100410010001a230041206b220124002001" - "41186a22054200370300200141106a22044200370300200141086a22064200370300200142" - "00370300200041a4026a2202027f2000410c6a411420014120100b22034120470440024020" - "034100480440200220033602040c010b2002417f3602040b41010c010b2002200129030037" - "0001200241196a2005290300370000200241116a2004290300370000200241096a20062903" - "0037000041000b3a0000200141206a2400200041a0046a2002419381c00041074181802010" - "1220002d00a0040d0020002d00a104450440419a81c000413641004100410010001a0c010b" - "41d081c000413541004100410010001a230041206b22012400200141186a22054200370300" - "200141106a22044200370300200141086a2206420037030020014200370300200041c8026a" - "2202027f2000410c6a4114410b20014120100c220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041a0046a2002419b86c000410641818020101220002d00a0040d" - "0020002d00a10445044041a186c000413741004100410010001a0c010b41d886c000413641" - "004100410010001a230041206b22012400200141186a22054200370300200141106a220442" - "00370300200141086a2206420037030020014200370300200041ec026a2202027f20004120" - "6a4114410420014120100d22034120470440024020034100480440200220033602040c010b" - "2002417f3602040b41010c010b20022001290300370001200241196a200529030037000020" - "0241116a2004290300370000200241096a200629030037000041000b3a0000200141206a24" - "00200041a0046a2002418e87c000410c41828020101220002d00a0040d0020002d00a10445" - "0440419a87c000413d41004100410010001a0c010b41d787c000413c41004100410010001a" - "230041206b22012400200141186a22054200370300200141106a2204420037030020014108" - "6a220642003703002001420037030020004190036a2202027f2000410c6a4114410c200141" - "20100e22034120470440024020034100480440200220033602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" - "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" - "02419388c000410541818020101220002d00a0040d0020002d00a104450440419888c00041" - "3641004100410010001a0c010b41ce88c000413541004100410010001a230041206b220124" - "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" - "20014200370300200041b4036a2202027f2000410c6a4114200041206a4114410d20014120" - "100f22034120470440024020034100480440200220033602040c010b2002417f3602040b41" - "010c010b20022001290300370001200241196a2005290300370000200241116a2004290300" - "370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a2002" - "418389c000410a41818020101220002d00a0040d0020002d00a104450440418d89c000413b" - "41004100410010001a0c010b41c889c000413a41004100410010001a230041206b22012400" - "200141186a22054200370300200141106a22044200370300200141086a2206420037030020" - "014200370300200041d8036a2202027f2000410c6a41142001412010102203412047044002" - "4020034100480440200220033602040c010b2002417f3602040b41010c010b200220012903" - "00370001200241196a2005290300370000200241116a2004290300370000200241096a2006" - "29030037000041000b3a0000200141206a2400200041a0046a200241828ac000410a410010" - "1220002d00a0040d0020002d00a104450440418c8ac000413b41004100410010001a0c010b" - "41c78ac000413a41004100410010001a230041206b22012400200141186a22054200370300" - "200141106a22044200370300200141086a2206420037030020014200370300200041fc036a" - "2202027f2000410c6a41144110200141201011220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041a0046a200241818bc000410641818020101220002d00a0040d" - "0020002d00a10445044041878bc000413741004100410010001a0c010b41be8bc000413641" - "004100410010001a41010c010b41000b200041c0046a24000f0b418080c000410b417f2003" - "2003417f4e1bac1002000b0bfe0b0100418080c0000bf40b6572726f725f636f64653d4765" - "7474696e67206669656c643a204669656c6420646174613a204572726f722067657474696e" - "67206669656c643a204572726f723a204572726f722067657474696e67206b65796c65743a" - "202424242424205354415254494e47205741534d20455845435554494f4e20242424242420" - "204163636f756e743a202044657374696e6174696f6e3a4163636f756e742020436865636b" - "206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065736372" - "6f772066696e6973682e2020436865636b206f626a656374206578697374732c2070726f63" - "656564696e67207769746820657363726f772066696e6973682e54727573746c696e652020" - "54727573746c696e65206f626a65637420646f6573206e6f742065786973742c2061626f72" - "74696e6720657363726f772066696e6973682e202054727573746c696e65206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e436865636b7465726d73616e64636f6e646974696f6e7343726564656e7469616c2020" - "43726564656e7469616c206f626a65637420646f6573206e6f742065786973742c2061626f" - "7274696e6720657363726f772066696e6973682e202043726564656e7469616c206f626a65" + "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" + "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" + "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" + "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8d33038d0602057f" + "037e230041f0006b220524000240024020012d0000450440200541186a200141196a290000" + "370300200541106a200141116a290000370300200541086a200141096a2900003703002005" + "20012900013703002002200320054120410110001a2005412041001001220141004c0d0102" + "4002400240024002402004450440418b80c000410f4285801410021a200541d8006a420037" + "0300200541d0006a4200370300200541c8006a420037030020054200370340200141858014" + "200541406b22064120100322014120470d01200541286a200541cf006a2201290000220a37" + "0300200541306a200541d7006a2202290000220b370300200541386a200541df006a22032d" + "000022043a000020052005290047220c37032020052f014021072005280142210820052d00" + "4621092001200a3700002002200b370000200320043a0000200520093a0046200520083601" + "42200520073b01402005200c370047419a80c000410c20064120410110001a0c030b418b80" + "c000410f2004ac10021a200541d0006a4100360200200541c8006a42003703002005420037" + "034020012004200541406b411410032201417e47044020014114460d02200141004e0d0441" + "998ac00041172001ac10021a0c050b417e21010c040b41a680c0004115417f20012001417f" + "4e1b2201ac10021a200041013a0000200020013602040c060b200520052900473703602005" + "200541cc006a2201290000370065200520052f014022023b016e2005200529036037032020" + "05200529006537002520052800432103200520052d00423a0042200520023b014020052003" + "3600432001200529002537000020052005290320370047419a80c000410c200541406b4114" + "410110001a0b20004180023b01000c040b41b08ac0004131421410021a41e18ac000412020" + "01ad10021a417321010b41a680c00041152001ac10021a200041013a000020002001360204" + "0c020b41c280c000411620012802042201ac10021a200041013a0000200020013602040c01" + "0b41bb80c00041072001ac10021a200041013a0000200020013602040b200541f0006a2400" + "0bfc27020a7f027e23004180076b2200240041d880c000412341004100410010001a200041" + "98016a2204410036020020004190016a22034200370300200042003703880102402000027f" + "02404181802020004188016a22024114100422014114460440200041066a20002d008a013a" + "00002000200029008f013703e001200020004194016a22052900003700e501200041106a20" + "002900e501370000200020002f0188013b01042000200028008b01360007200020002903e0" + "0137000b41fb80c0004108200041046a2208411410051a2004410036020020034200370300" + "20004200370388014183802020024114100422014114470d032000411a6a20002d008a013a" + "00002000200029008f013703e001200020052900003700e501200041246a20002900e50137" + "0000200020002f0188013b01182000200028008b0136001b200020002903e00137001f4183" + "81c000410c200041186a411410051a200041a0016a22054200370300200442003703002003" + "420037030020004200370388012008411420024120100622014120460d0102402001410048" + "0440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a200529" + "03003700002000413d6a2004290300370000200041356a2003290300370000200020002903" + "880137002d41000b3a002c20004188016a22042000412c6a418f81c0004107418180201018" + "0240024020002d00880145044041002101419681c000413541004100410010001a200041de" + "006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a6013b" + "015c200042003703502000410036005f200041a0016a2203420037030020004198016a2202" + "420037030020004190016a220542003703002000420037038801200041046a411420004118" + "6a4114200041d0006a41142004412010072204412047044002402004410048044020002004" + "3602680c010b2000417f3602680b410121010c020b200041fd006a20032903003700002000" + "41f5006a2002290300370000200041ed006a20052903003700002000200029038801370065" + "0c010b200028028c01210141878ac0004112420510021a0c010b200020013a006420004188" + "016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c0004137" + "41004100410010001a200041f0016a200041286a2201280100360200200041e8016a200041" + "206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a20" + "0041e0006a2802002203360200200020002901183703e00120002000290350220b3702f401" + "200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d806200041" + "f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec0620" + "004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a200041" + "0136028801200041f0066a2202420037030020044200370300200342003703002000420037" + "03d80641818bc0004114200041b4016a412820014120100822014120470440024020014100" + "480440200020013602e4010c010b2000417f3602e4010b410121010c020b200041f9016a20" + "02290300370000200041f1016a2004290300370000200041e9016a20032903003700002000" + "20002903d8063700e101410021010c010b200028028c01210141878ac0004112420510021a" + "0c010b200020013a00e001200041b4026a200041e0016a2204418b82c00041034181802010" + "18024020002d00b40245044041002101418e82c000413141004100410010001a200041f801" + "6a22034200370300200041f0016a22024200370300200041e8016a22054200370300200042" + "003703e001200041046a411441062004412010092204412047044002402004410048044020" + "0020043602c0020c010b2000417f3602c0020b410121010c020b200041d5026a2003290300" + "370000200041cd026a2002290300370000200041c5026a2005290300370000200020002903" + "e0013700bd020c010b20002802b802210141878ac0004112420610021a0c010b200020013a" + "00bc02200041e0016a2204200041bc026a41bf82c0004105418180201018024020002d00e0" + "014504404100210141c482c000413341004100410010001a200041f8016a22034200370300" + "200041f0016a22024200370300200041e8016a22054200370300200042003703e001200041" + "046a220841142008411441f782c000411220044120100a2204412047044002402004410048" + "0440200020043602e4020c010b2000417f3602e4020b410121010c020b200041f9026a2003" + "290300370000200041f1026a2002290300370000200041e9026a2005290300370000200020" + "002903e0013700e1020c010b20002802e401210141878ac0004112420610021a0c010b2000" + "20013a00e002200041e0016a2204200041e0026a418983c000410a41988020101802402000" + "2d00e00145044041002101419383c000413841004100410010001a200041f8016a22034200" + "370300200041f0016a22024200370300200041e8016a22054200370300200042003703e001" + "200041046a4114200041186a411420044120100b2204412047044002402004410048044020" + "002004360288030c010b2000417f360288030b410121010c020b2000419d036a2003290300" + "37000020004195036a20022903003700002000418d036a2005290300370000200020002903" + "e001370085030c010b20002802e401210141878ac0004112420710021a0c010b200020013a" + "008403200041e0016a220520004184036a41cb83c000410841818020101802400240024002" + "40024002400240024002400240024020002d00e00145044041d383c0004136410041004100" + "10001a230041206b22032400200341186a22064200370300200341106a2207420037030020" + "0341086a2209420037030020034200370300200041a8036a2201027f200041046a22044114" + "200041186a2208411420034120100c22024120470440024020024100480440200120023602" + "040c010b2001417f3602040b41010c010b20012003290300370001200141196a2006290300" + "370000200141116a2007290300370000200141096a200929030037000041000b3a00002003" + "41206a240020052001418984c000410e41818020101820002d00e0010d01419784c000413c" + "41004100410010001a230041206b22032400200341186a22064200370300200341106a2207" + "4200370300200341086a2209420037030020034200370300200041cc036a2201027f200441" + "1420034120100d22024120470440024020024100480440200120023602040c010b2001417f" + "3602040b41010c010b20012003290300370001200141196a2006290300370000200141116a" + "2007290300370000200141096a200929030037000041000b3a0000200341206a2400200520" + "0141d384c000410341818020101820002d00e0010d0241d684c00041314100410041001000" + "1a230041206b22032400200341186a22064200370300200341106a22074200370300200341" + "086a2209420037030020034200370300200041f0036a2201027f20044114410b2003412010" + "0e22024120470440024020024100480440200120023602040c010b2001417f3602040b4101" + "0c010b20012003290300370001200141196a2006290300370000200141116a200729030037" + "0000200141096a200929030037000041000b3a0000200341206a240020052001418785c000" + "410641818020101820002d00e0010d03418d85c000413441004100410010001a230041206b" + "22032400200341186a22064200370300200341106a22074200370300200341086a22094200" + "3703002003420037030020004194046a2201027f20044114410c20034120100f2202412047" + "0440024020024100480440200120023602040c010b2001417f3602040b41010c010b200120" + "03290300370001200141196a2006290300370000200141116a200729030037000020014109" + "6a200929030037000041000b3a0000200341206a2400200041f4016a200041146a28010036" + "0200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0" + "003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d0441" + "cc85c000413941004100410010001a230041206b22012400200141186a2206420037030020" + "0141106a22074200370300200141086a2209420037030020014200370300200041b8046a22" + "02027f20054118200841142001412010102205412047044002402005410048044020022005" + "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200629" + "0300370000200241116a2007290300370000200241096a200929030037000041000b3a0000" + "200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c000" + "413541004100410010001a230041206b22012400200141186a22064200370300200141106a" + "22074200370300200141086a2209420037030020014200370300200041dc046a2202027f20" + "084114410620014120101122054120470440024020054100480440200220053602040c010b" + "2002417f3602040b41010c010b20022001290300370001200241196a200629030037000020" + "0241116a2007290300370000200241096a200929030037000041000b3a0000200141206a24" + "002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a41004100" + "410010001a230041206b22012400200141186a22064200370300200141106a220742003703" + "00200141086a220942003703002001420037030020004180056a2202027f20044114410d20" + "014120101222054120470440024020054100480440200220053602040c010b2002417f3602" + "040b41010c010b20022001290300370001200241196a2006290300370000200241116a2007" + "290300370000200241096a200929030037000041000b3a0000200141206a24002003200241" + "8787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a23" + "0041206b22012400200141186a22064200370300200141106a22074200370300200141086a" + "2209420037030020014200370300200041a4056a2202027f2004411420084114410e200141" + "20101322054120470440024020054100480440200220053602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2006290300370000200241116a20072903" + "00370000200241096a200929030037000041000b3a0000200141206a24002003200241bf87" + "c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a230041" + "206b22012400200141186a22084200370300200141106a22064200370300200141086a2207" + "420037030020014200370300200041c8056a2202027f20044114410f200141201014220541" + "20470440024020054100480440200220053602040c010b2002417f3602040b41010c010b20" + "022001290300370001200241196a2008290300370000200241116a20062903003700002002" + "41096a200729030037000041000b3a0000200141206a240020032002418188c00041124182" + "8020101820002d00d8060d09419388c00041c00041004100410010001a230041206b220124" + "00200141186a22084200370300200141106a22064200370300200141086a22074200370300" + "20014200370300200041ec056a2202027f2004411420014120101522054120470440024020" + "054100480440200220053602040c010b2002417f3602040b41010c010b2002200129030037" + "0001200241196a2008290300370000200241116a2006290300370000200241096a20072903" + "0037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00d8" + "060d0a41dd88c000413841004100410010001a230041206b22012400200141186a22084200" + "370300200141106a22064200370300200141086a2207420037030020014200370300200041" + "90066a2202027f200441144112200141201016220541204704400240200541004804402002" + "20053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "08290300370000200241116a2006290300370000200241096a200729030037000041000b3a" + "0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b89" + "c000413441004100410010001a230041206b22012400200141186a22054200370300200141" + "106a22084200370300200141086a2206420037030020014200370300200041b4066a220202" + "7f20044114411320014120101722044120470440024020044100480440200220043602040c" + "010b2002417f3602040b41010c010b20022001290300370001200241196a20052903003700" + "00200241116a2008290300370000200241096a200629030037000041000b3a000020014120" + "6a24002003200241cf89c000410541818020101820002d00d80645044041d489c000413341" + "004100410010001a410121010c0d0b20002802dc06210141878ac0004112421310021a0c0c" + "0b20002802e401210141878ac0004112420810021a0c0b0b20002802e401210141878ac000" + "4112420910021a0c0a0b20002802e401210141878ac0004112420a10021a0c090b20002802" + "e401210141878ac0004112420b10021a0c080b20002802dc06210141878ac0004112420c10" + "021a0c070b20002802dc06210141878ac0004112420d10021a0c060b20002802dc06210141" + "878ac0004112420d10021a0c050b20002802dc06210141878ac0004112420d10021a0c040b" + "20002802dc06210141878ac0004112420e10021a0c030b20002802dc06210141878ac00041" + "12420f10021a0c020b20002802dc06210141878ac0004112421010021a0c010b20002802dc" + "06210141878ac0004112421210021a0b20004180076a240020010f0b418080c000410b417f" + "20012001417f4e1bac1002000bfd0401067f200241104f044002402000410020006b410371" + "22056a220420004d0d002001210320050440200521060340200020032d00003a0000200341" + "016a2103200041016a2100200641016b22060d000b0b200541016b4107490d000340200020" + "032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a" + "0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041" + "056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a200341" + "076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b22" + "07417c7122086a21000240200120056a2206410371450440200020044d0d01200621010340" + "20042001280200360200200141046a2101200441046a22042000490d000b0c010b20002004" + "4d0d002006410374220541187121032006417c71220241046a2101410020056b4118712105" + "200228020021020340200420022003762001280200220220057472360200200141046a2101" + "200441046a22042000490d000b0b20074103712102200620086a21010b0240200020002002" + "6a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041" + "016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a0000" + "200041016a200141016a2d00003a0000200041026a200141026a2d00003a0000200041036a" + "200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a" + "2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a00" + "00200141086a2101200041086a22002006470d000b0b0b0b8b0b0100418080c0000b810b65" + "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" + "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" + "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" + "5554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e" + "744163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f6365656469" + "6e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a65" "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" - "6973682e44656c6567617465202044656c6567617465206f626a65637420646f6573206e6f" - "742065786973742c2061626f7274696e6720657363726f772066696e6973682e202044656c" - "6567617465206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e4465706f7369745072656175746820204465706f736974" - "50726561757468206f626a65637420646f6573206e6f742065786973742c2061626f727469" - "6e6720657363726f772066696e6973682e20204465706f73697450726561757468206f626a" - "656374206578697374732c2070726f63656564696e67207769746820657363726f77206669" - "6e6973682e457363726f772020457363726f77206f626a65637420646f6573206e6f742065" - "786973742c2061626f7274696e6720657363726f772066696e6973682e2020457363726f77" + "6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c4372656465" + "6e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e44656c656761746544656c6567617465206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e4465706f736974507265617574684465706f73697450726561757468206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e444944444944206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b" + "656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e" + "4f66666572206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e4f666665724f66666572206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e50617943" + "68616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564" + "446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e" + "65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574" "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" - "772066696e6973682e4e46546f6b656e4f6666657220204e46546f6b656e4f66666572206f" - "626a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f77" - "2066696e6973682e20204e46546f6b656e4f66666572206f626a656374206578697374732c" - "2070726f63656564696e67207769746820657363726f772066696e6973682e4f6666657220" - "204f66666572206f626a65637420646f6573206e6f742065786973742c2061626f7274696e" - "6720657363726f772066696e6973682e20204f66666572206f626a65637420657869737473" - "2c2070726f63656564696e67207769746820657363726f772066696e6973682e5061794368" - "616e6e656c20205061794368616e6e656c206f626a65637420646f6573206e6f7420657869" - "73742c2061626f7274696e6720657363726f772066696e6973682e20205061794368616e6e" - "656c206f626a656374206578697374732c2070726f63656564696e67207769746820657363" - "726f772066696e6973682e5369676e65724c69737420205369676e65724c697374206f626a" - "65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f772066" - "696e6973682e20205369676e65724c697374206f626a656374206578697374732c2070726f" - "63656564696e67207769746820657363726f772066696e6973682e5469636b657420205469" - "636b6574206f626a65637420646f6573206e6f742065786973742c2061626f7274696e6720" - "657363726f772066696e6973682e20205469636b6574206f626a656374206578697374732c" - "2070726f63656564696e67207769746820657363726f772066696e6973682e004d0970726f" - "64756365727302086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d30332d31352900" - "490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b08" - "7369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c756" - "5"; + "772066696e6973682e5661756c745661756c74206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e43757272656e742073" + "65712076616c75653a456e636f756e7465726564206572726f725f636f64653a4279746520" + "61727261792077617320657870656374656420746f20686176652074686973206d616e7920" + "62797465733a2042797465206172726179206861642074686973206d616e79206279746573" + "3a20004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; extern std::string const codecovTestsWasmHex = - "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60037f" - "7f7f017f60067f7f7f7f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" - "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002a90a2d08686f73745f6c696209" - "74726163655f6e756d000808686f73745f6c6962057472616365000208686f73745f6c6962" + "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60067f" + "7f7f7f7f7f017f60037f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" + "7472616365000208686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" "0e6765745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e74" "5f6c65646765725f74696d65000008686f73745f6c6962166765745f706172656e745f6c65" "646765725f68617368000008686f73745f6c6962176765745f6c65646765725f6163636f75" "6e745f68617368000008686f73745f6c6962126765745f6c65646765725f74785f68617368" "000008686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" "6d656e646d656e745f656e61626c6564000008686f73745f6c69620c6765745f74785f6669" - "656c64000308686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" - "6c69621063616368655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765" + "656c64000408686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" + "6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000408686f73745f6c6962146765" "745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f" "6e65737465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c" "65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621b676574" @@ -9878,211 +9937,254 @@ extern std::string const codecovTestsWasmHex = "74785f6e65737465645f61727261795f6c656e000008686f73745f6c6962276765745f6375" "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00000868" "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000308686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" + "656e000408686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" "636f6d707574655f7368613531325f68616c66000108686f73745f6c696209636865636b5f" - "736967000408686f73745f6c6962076765745f6e6674000408686f73745f6c69620e676574" + "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" "5f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e00" "0108686f73745f6c69620d6765745f6e66745f666c616773000008686f73745f6c69621467" "65745f6e66745f7472616e736665725f666565000008686f73745f6c69620e6765745f6e66" - "745f73657269616c000108686f73745f6c69620b6c696e655f6b65796c6574000708686f73" - "745f6c69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620c6368" - "65636b5f6b65796c6574000208686f73745f6c69620f64656c65676174655f6b65796c6574" - "000408686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000408" - "686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d657363726f77" - "5f6b65796c6574000208686f73745f6c6962106e66745f6f666665725f6b65796c65740002" - "08686f73745f6c69620c6f666665725f6b65796c6574000208686f73745f6c69620d6f7261" - "636c655f6b65796c6574000208686f73745f6c69620e7061796368616e5f6b65796c657400" - "0908686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d" - "7469636b65745f6b65796c657400020303020a0505030100110619037f01418080c0000b7f" - "00419895c0000b7f0041a095c0000b072e04066d656d6f727902000666696e697368002e0a" - "5f5f646174615f656e6403010b5f5f686561705f6261736503020ab21f0239000240200020" - "0147044020004100480d01418b80c000410b2000ad1000000b200220032000ac10001a0f0b" - "418b80c000410b2000ac1000000bf51e02087f027e230041e0016b22002400419680c00041" - "2341004100410010011a20004100360258200041d8006a220141041002410441ca88c00041" - "0e102d20004100360258200141041003410441d888c0004116102d200041f0006a22044200" - "370300200041e8006a22034200370300200041e0006a220242003703002000420037035820" - "0141201004412041ee88c0004116102d200442003703002003420037030020024200370300" - "200042003703582001412010054120418489c0004117102d20044200370300200342003703" - "0020024200370300200042003703582001412010064120419b89c0004112102d1007410a41" - "b980c000410c102d200041186a428182848890a0c08001370300200041106a428182848890" - "a0c08001370300200041086a428182848890a0c080013703002000428182848890a0c08001" - "37030041c580c000410e1008410141d380c0004111102d200041201008410141d380c00041" - "11102d20034100360200200242003703002000420037035802404181802020014114100922" - "064114460440200041266a20002d005a3a00002000200029005f3703c0012000200041e400" - "6a2900003700c501200041306a20002900c501370000200020002f01583b01242000200028" - "005b360027200020002903c00137002b200442003703002003420037030020024200370300" - "20004200370358200041246a411420014120100a22044120470d012000413a6a20002d005a" - "3a0000200041c8016a200041e7006a2900002208370300200041d0016a200041ef006a2900" - "002209370300200041c7006a2008370000200041cf006a2009370000200041d7006a200041" - "f7006a2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37" - "003f200041386a41204100100b410141e480c0004110102d20034100360200200242003703" - "00200042003703584181802020014114100c411441ad89c000411c102d2003410036020020" - "0242003703002000420037035841014181802020014114100d411441c989c0004114102d02" - "402001410020016b41037122036a220220014d0d0020030440200321040340200141003a00" - "00200141016a2101200441016b22040d000b0b200341016b4107490d000340200141003a00" - "00200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a41" - "003a0000200141036a41003a0000200141026a41003a0000200141016a41003a0000200141" - "086a22012002470d000b0b200241c40020036b2203417c716a220120024b04400340200241" - "00360200200241046a22022001490d000b0b024020012003410371220320016a22044f0d00" - "2003220204400340200141003a0000200141016a2101200241016b22020d000b0b20034101" - "6b4107490d000340200141003a0000200141076a41003a0000200141066a41003a00002001" - "41056a41003a0000200141046a41003a0000200141036a41003a0000200141026a41003a00" - "00200141016a41003a0000200141086a22012004470d000b0b2000418180203602c0014100" - "21010340200541c000490440200041d8006a20056a200041c0016a20016a2d00003a000020" - "0020002802980141016a220536029801200141016a22014104470d010b0b200041d0016a22" - "044100360200200041c8016a22064200370300200042003703c001200041d8006a22012005" - "200041c0016a22024114100e411441dd89c0004113102d2004410036020020064200370300" - "200042003703c001200120002802980120024114100f411441f089c0004123102d20044100" - "36020020064200370300200042003703c00141012001200028029801200241141010411441" - "938ac000411b102d4189803c1011412041f480c0004110102d4189803c10124120418481c0" - "004120102d41014189803c1013412041a481c0004118102d20012000280298011014412041" - "bc81c0004117102d20012000280298011015412041d381c0004127102d4101200120002802" - "98011016412041fa81c000411f102d200041246a2203411410174100419982c000410b102d" - "200041d8016a220742003703002004420037030020064200370300200042003703c0012001" - "200028029801200241201018412041ae8ac0004113102d41a482c000410c41b082c000410b" - "41bb82c000410e1019410141c982c0004109102d200041b8016a200041186a290300370300" - "200041b0016a200041106a290300370300200041a8016a200041086a290300370300200020" - "002903003703a001200441003b010020064200370300200042003703c00120034114200041" - "a0016a2205412020024112101a411241c18ac0004107102d20044100360200200642003703" - "00200042003703c0012005412020024114101b411441c88ac000410e102d200041003602c0" - "012005412020024104101c410441d68ac000410d102d20054120101d410841d282c000410d" - "102d20054120101e410a41df82c0004114102d200041003602c0012005412020024104101f" - "410441e38ac000410e102d417f41041002417141f382c0004116102d200041003602c00120" - "02417f1002417141f18ac0004116102d200041c2016a41003a0000200041003b01c0012002" - "41031002417d41878bc000411c102d200041003602c0012002418094ebdc031002417341a3" - "8bc000411b102d41021011416f418983c000411f102d417f2000280298011014417141a883" - "c000411f102d2001417f1014417141c783c000411f102d20014181201014417441e683c000" - "4120102d200041d894ebdc036a220520002802980110144173418684c000411f102d200520" - "00280298014101100b417341a584c0004118102d20012000280298014101100b417141bd84" - "c000411a102d200742003703002004420037030020064200370300200042003703c0012005" - "20002802980120024120100a417341be8bc000411b102d2007420037030020044200370300" - "20064200370300200042003703c001200120002802980120024120100a417141d98bc00041" - "18102d200742003703002004420037030020064200370300200042003703c0012003411420" - "0341142005200028029801200241201020417341f18bc0004121102d200742003703002004" - "420037030020064200370300200042003703c0012003411420034114200120002802980120" - "0241201020417141928cc000411e102d2005200028029801422a1000417341d784c0004117" - "102d200041003b01c0014102200241021009416f41b08cc000411b102d200041003b01c001" - "410220024102100c416f41cb8cc000412b102d200041003b01c0014101410220024102100d" - "416f41f68cc0004123102d41021011416f418983c000411f102d41021012416f41ee84c000" - "412f102d410141021013416f419d85c0004127102d41c580c0004181201008417441d380c0" - "004111102d200041003b01c001200141812020024102100e417441998dc0004121102d2000" - "41003b01c001200141812020024102100f417441ba8dc0004131102d200041003b01c00141" - "012001418120200241021010417441eb8dc0004129102d20014181201014417441c485c000" - "4125102d20014181201015417441e985c0004135102d4101200141812010164174419e86c0" - "00412d102d20014181201017417441cb86c0004119102d41a482c00041812041b082c00041" - "0b41bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c00041812041" - "bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c000410b41bb82c0" - "004181201019417441c982c0004109102d200041003b01c001200141812020024102101841" - "7441948ec0004121102d200041003b01c00120034114200341142001418120200241021021" - "417441b58ec000411f102d200120002802980122042005200441001001417341e486c00041" - "0f102d20012000280298014100100b417141f386c0004123102d200041003b01c001200341" - "14200120002802980120024102101a417141d48ec000411a102d200041003b01c001200120" - "002802980120024102101b417141ee8ec0004121102d200041003b01c00120012000280298" - "0120024102101c4171418f8fc0004120102d2001200028029801101d4171419687c0004120" - "102d2001200028029801101e417141b687c0004127102d200041003602c001200120002802" - "980120024104101f417141af8fc0004121102d200041003b01c00120012000280298012002" - "4102100a417141d08fc0004123102d200041003b01c0012001200028029801410120024102" - "1022417141f38fc0004121102d200041003b01c00120012000280298012204200341142001" - "20042002410210214171419490c0004127102d200041003b01c00120034114200120002802" - "9801220420012004200241021021417141bb90c0004127102d200041003b01c00120012000" - "2802980120034114200241021023417141e290c0004125102d200041003b01c00120034114" - "20012000280298012002410210234171418791c0004125102d200041003b01c00120012000" - "2802980120034114200241021024417141ac91c000412c102d200041003b01c00120034114" - "2001200028029801200241021024417141d891c000412c102d200041003b01c00120012000" - "280298012002410210254171418492c000411f102d200041003b01c0012001200028029801" - "4101200241021026417141a392c0004122102d200041003b01c00120012000280298012003" - "411441dd87c0004114200241021020417141c592c0004121102d200041003b01c001200341" - "14200120002802980141dd87c0004114200241021020417141e692c0004121102d20004100" - "3b01c001200120002802980141012002410210274171418793c0004125102d200041003b01" - "c00120012000280298014101200241021028417141ac93c0004121102d200041003b01c001" - "20012000280298014101200241021029417141cd93c0004122102d200041003b01c0012001" - "20002802980120034114410120024102102a417141ef93c0004124102d200041003b01c001" - "200341142001200028029801410120024102102a4171419394c0004124102d200041003b01" - "c001200120002802980120024102102b417141b794c0004123102d200041003b01c0012001" - "200028029801410120024102102c417141da94c0004122102d200041003b01c00120012000" - "2802980141f187c000412020024102101a417141fc94c000411c102d200520002802980141" - "f187c0004120410010014173419188c0004119102d20012000280298012001418120410010" - "01417441aa88c000410e102d200141812042011000417441b888c0004112102d200041e001" - "6a240041010f0b418080c000410b417f20062006417f4e1bac1000000b418080c000410b41" - "7f20042004417f4e1bac1000000b0ba2150100418080c0000b98156572726f725f636f6465" - "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" - "54494f4e2024242424246765745f626173655f666565746573745f616d656e646d656e7461" - "6d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f74" - "785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f617272" - "61795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f" - "6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e657374" - "65645f61727261795f6c656e7570646174655f6461746174657374206d6573736167657465" - "7374207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e" - "66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c65646765" - "725f73716e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c6964" - "5f736669656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074" - "726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74" - "785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e6573" - "7465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a" - "5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e747261" - "63655f6e756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765" - "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c6564" - "6765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74" - "785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63" - "757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" - "6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269" - "675f736c69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f62" - "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" - "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" - "726f6e675f73697a655f75696e743235365553443030303030303030303030303030303030" - "30303030303030303030303030303030303030303030303030303030303030316765745f6e" - "66745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e67747261" - "63655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f70617265" - "6e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f6861736867" - "65745f6c65646765725f6163636f756e745f686173686765745f6c65646765725f74785f68" - "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" - "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" - "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" - "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" - "6765745f6e66745f73657269616c6765745f6c65646765725f73716e5f6e65675f6c656e67" - "65745f6c65646765725f73716e5f6275665f746f6f5f736d616c6c6765745f6c6564676572" - "5f73716e5f6c656e5f746f6f5f6c6f6e676163636f756e745f6b65796c65745f6c656e5f74" - "6f6f5f6c6f6e676163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b" - "65796c65745f6c656e5f746f6f5f6c6f6e675f63757272656e63796c696e655f6b65796c65" - "745f77726f6e675f6c656e5f63757272656e63796765745f74785f6669656c645f696e7661" - "6c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c" - "645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f" - "696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f" - "5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e657374" - "65645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f" - "6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f736861" - "3531325f68616c665f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c" - "65745f746f6f5f6269675f736c6963656765745f6e66745f77726f6e675f73697a655f7569" - "6e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235" - "366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f" - "6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072" - "65617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e74696431646570" - "6f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646573" - "63726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469" - "64004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d6279010572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c" - "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c" - "746976616c7565"; + "745f73657269616c000108686f73745f6c69620d74726163655f6163636f756e7400010868" + "6f73745f6c69620c74726163655f616d6f756e74000108686f73745f6c69620b6c696e655f" + "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" + "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" + "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400020868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" + "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000208686f7374" + "5f6c6962136d70745f69737375616e63655f6b65796c6574000208686f73745f6c6962106e" + "66745f6f666665725f6b65796c6574000208686f73745f6c69620c6f666665725f6b65796c" + "6574000208686f73745f6c69620d6f7261636c655f6b65796c6574000208686f73745f6c69" + "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" + "6e65645f646f6d61696e5f6b65796c6574000208686f73745f6c69620e7369676e6572735f" + "6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574000208686f73" + "745f6c69620c7661756c745f6b65796c657400020303020a0505030100110619037f014180" + "80c0000b7f0041f599c0000b7f0041809ac0000b072e04066d656d6f727902000666696e69" + "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020adf25024600" + "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" + "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b952502087f" + "027e230041f0016b22002400419680c000412341004100410010001a200041003602602000" + "41e0006a220141041002410441b88ac000410e103420004100360260200141041003410441" + "c68ac00041161034200041f8006a22044200370300200041f0006a22034200370300200041" + "e8006a2202420037030020004200370360200141201004412041dc8ac00041161034200442" + "00370300200342003703002002420037030020004200370360200141201005412041f28ac0" + "00411710342004420037030020034200370300200242003703002000420037036020014120" + "1006412041898bc000411210341007410a41b980c000410c1034200041206a428182848890" + "a0c08001370300200041186a428182848890a0c08001370300200041106a428182848890a0" + "c080013703002000428182848890a0c0800137030841c580c000410e1008410141d380c000" + "41111034200041086a41201008410141d380c0004111103420034100360200200242003703" + "0020004200370360024041818020200141141009220541144604402000412e6a20002d0062" + "3a0000200020002900673703c8012000200041ec006a2900003700cd01200041386a200029" + "00cd01370000200020002f01603b012c2000200028006336002f200020002903c801370033" + "200442003703002003420037030020024200370300200042003703602000412c6a41142001" + "4120100a22044120470d01200041c2006a20002d00623a0000200041d0016a200041ef006a" + "2900002208370300200041d8016a200041f7006a2900002209370300200041cf006a200837" + "0000200041d7006a2009370000200041df006a200041ff006a2d00003a0000200020002f01" + "603b01402000200028006336004320002000290067370047200041406b41204100100b4101" + "41e480c0004110103420034100360200200242003703002000420037036041818020200141" + "14100c4114419b8bc000411c10342003410036020020024200370300200042003703604101" + "4181802020014114100d411441b78bc0004114103402402001410020016b41037122036a22" + "0220014d0d0020030440200321040340200141003a0000200141016a2101200441016b2204" + "0d000b0b200341016b4107490d000340200141003a0000200141076a41003a000020014106" + "6a41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a000020" + "0141026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c4" + "0020036b2203417c716a220120024b0440034020024100360200200241046a22022001490d" + "000b0b024020012003410371220320016a22044f0d002003220204400340200141003a0000" + "200141016a2101200241016b22020d000b0b200341016b4107490d000340200141003a0000" + "200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a4100" + "3a0000200141036a41003a0000200141026a41003a0000200141016a41003a000020014108" + "6a22012004470d000b0b2000418180203602c801410021010340200741c000490440200041" + "e0006a20076a200041c8016a20016a2d00003a0000200020002802a00141016a22073602a0" + "01200141016a22014104470d010b0b200041d8016a22024100360200200041d0016a220542" + "00370300200042003703c801200041e0006a22012007200041c8016a22044114100e411441" + "cb8bc000411310342002410036020020054200370300200042003703c801200120002802a0" + "0120044114100f411441de8bc0004123103420024100360200200542003703002000420037" + "03c8014101200120002802a001200441141010411441818cc000411b10344189803c101141" + "2041f480c000411010344189803c10124120418481c0004120103441014189803c10134120" + "41a481c00041181034200120002802a0011014412041bc81c00041171034200120002802a0" + "011015412041d381c000412710344101200120002802a0011016412041fa81c000411f1034" + "2000412c6a2203411410174100419982c000410b1034200041e0016a220742003703002002" + "420037030020054200370300200042003703c801200120002802a001200441201018412041" + "9c8cc0004113103441a482c000410c41b082c000410b41bb82c000410e1019410141c982c0" + "0041091034200041c0016a200041206a290300370300200041b8016a200041186a29030037" + "0300200041b0016a200041106a290300370300200020002903083703a801200241003b0100" + "20054200370300200042003703c80120034114200041a8016a2206412020044112101a4112" + "41af8cc000410710342002410036020020054200370300200042003703c801200641202004" + "4114101b411441b68cc000410e1034200041003602c8012006412020044104101c410441c4" + "8cc000410d103420064120101d410841d282c000410d103420064120101e410a41df82c000" + "41141034200041003602c8012006412020044104101f410441d18cc000410e1034417f4104" + "1002417141f382c00041161034200041003602c8012004417f1002417141df8cc000411610" + "34200041ca016a41003a0000200041003b01c801200441031002417d41f58cc000411c1034" + "200041003602c8012004418094ebdc031002417341918dc000411b1034418983c000410d20" + "0341141020412f419683c000410d1034418983c000410d41a383c00041081021411341ab83" + "c000410c103441021011416f41b783c000411f1034417f20002802a0011014417141d683c0" + "00411f10342001417f1014417141f583c000411f1034200141812010144174419484c00041" + "201034200041e094ebdc036a220620002802a0011014417341b484c000411f103420062000" + "2802a0014101100b417341d384c00041181034200120002802a0014101100b417141eb84c0" + "00411a1034200742003703002002420037030020054200370300200042003703c801200620" + "002802a00120044120100a417341ac8dc00041161034200742003703002002420037030020" + "054200370300200042003703c801200120002802a00120044120100a417141c28dc0004118" + "1034200742003703002002420037030020054200370300200042003703c801200341142003" + "4114200620002802a001200441201022417341da8dc000411c103420074200370300200242" + "0037030020054200370300200042003703c8012003411420034114200120002802a0012004" + "41201022417141f68dc000411e103420074200370300200242003703002005420037030020" + "0042003703c80141e199c0004114200620002802a001200441201023417341948ec0004119" + "1034200742003703002002420037030020054200370300200042003703c80141e199c00041" + "14200120002802a001200441201023417141ad8ec000411f10342007420037030020024200" + "37030020054200370300200042003703c80141e199c0004114418585c00041142004412010" + "23417141cc8ec00041291034200041dc016a2000413c6a280100360200200041d4016a2000" + "41346a2901003702002000200029012c3702cc01200041808080083602c801200041003b01" + "ec012004411841e199c0004114200041ec016a220241021023417141f58ec000410e103420" + "0620002802a001422a10014173419985c00041111034200041003b01ec0141022002410210" + "09416f41838fc000411b1034200041003b01ec01410220024102100c416f419e8fc000412b" + "1034200041003b01ec014101410220024102100d416f41c98fc0004123103441021011416f" + "41b783c000411f103441021012416f41aa85c000412f1034410141021013416f41d985c000" + "4127103441c580c00041812010084174418086c000411f103441c580c00041c10010084174" + "419f86c000411a1034200041003b01ec01200141812020024102100e417441ec8fc0004121" + "1034200041003b01ec01200141812020024102100f4174418d90c00041311034200041003b" + "01ec0141012001418120200241021010417441be90c0004129103420014181201014417441" + "b986c0004125103420014181201015417441de86c000413510344101200141812010164174" + "419387c000412d103420014181201017417441c087c00041191034418983c00041812041b0" + "82c000410b41bb82c000410e1019417441c982c00041091034418983c000410d41b082c000" + "41812041bb82c000410e1019417441c982c00041091034418983c000410d41b082c000410b" + "41bb82c0004181201019417441c982c00041091034200041003b01ec012001418120200241" + "021018417441e790c00041211034200041003b01ec0141e199c00041812041e199c0004114" + "2002410210234174418891c00041181034200041003b01ec01200341142003411420014181" + "20200241021024417441a091c000411f1034200041003b01ec012004418120200341142002" + "41021025417441bf91c00041221034418983c000410d200620002802a00141001000417341" + "d987c000410f1034418983c000410d200620002802a0011021417341e887c0004116103420" + "0120002802a0014100100b417141fe87c00041231034200041003b01ec0120034114200120" + "002802a00120024102101a417141e191c000411a1034200041003b01ec01200120002802a0" + "0120024102101b417141fb91c00041211034200041003b01ec01200120002802a001200241" + "02101c4171419c92c00041201034200120002802a001101d417141a188c000412010342001" + "20002802a001101e417141c188c00041271034200041003602ec01200120002802a0012002" + "4104101f417141bc92c00041211034200041003b01ec01200120002802a00120024102100a" + "417141dd92c00041231034200041003b01ec01200120002802a00141012002410210264171" + "418093c00041211034200041003b01ec01200120002802a001220520034114200120052002" + "41021024417141a193c00041271034200041003b01ec0120034114200120002802a0012205" + "20012005200241021024417141c893c00041271034200041003b01ec01200120002802a001" + "20034114200241021027417141ef93c00041251034200041003b01ec012003411420012000" + "2802a0012002410210274171419494c00041251034200041003b01ec01200120002802a001" + "20034114200241021028417141b994c000412c1034200041003b01ec012003411420012000" + "2802a001200241021028417141e594c000412c1034200041003b01ec01200120002802a001" + "2002410210294171419195c000411f1034200041003b01ec01200120002802a00141012002" + "4102102a417141b095c00041221034200041003b01ec01200120002802a001200341144185" + "85c0004114200241021022417141d295c00041211034200041003b01ec0120034114200120" + "002802a001418585c0004114200241021022417141f395c00041211034200041003b01ec01" + "200120002802a001410120024102102b4171419496c00041281034200041003b01ec012004" + "4118200120002802a001200241021025417141bc96c00041231034200041003b01ec012001" + "20002802a001410120024102102c417141df96c00041251034200041003b01ec0120012000" + "2802a001410120024102102d4171418497c00041211034200041003b01ec01200120002802" + "a001410120024102102e417141a597c00041221034200041003b01ec01200120002802a001" + "20034114410120024102102f417141c797c00041241034200041003b01ec01200341142001" + "20002802a001410120024102102f417141eb97c00041241034200041003b01ec0120012000" + "2802a00141012002410210304171418f98c000412f1034200041003b01ec01200120002802" + "a001200241021031417141be98c00041231034200041003b01ec01200120002802a0014101" + "200241021032417141e198c00041221034200041003b01ec01200120002802a00141012002" + "410210334171418399c00041211034200041003b01ec01200120002802a00141e888c00041" + "2020024102101a417141a499c000411c1034418983c000410d200120002802a00110204171" + "418889c00041221034418997abdd03410d41e888c000412041001000417341aa89c0004110" + "1034418997abdd03410d200341141020417341ba89c00041181034418997abdd03410d41a3" + "83c00041081021417341d289c00041171034200120002802a0012001418120410010004174" + "41e989c000410e1034200141812042011001417441f789c00041121034418983c000418120" + "200341141020417441898ac00041161034418983c00041812041a383c00041081021417441" + "898ac00041161034418983c000410d200120002802a00110214171419f8ac0004119103420" + "0041003b01ec01200120002802a00120034114200241021025417141c099c0004121103420" + "0041f0016a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c0" + "00410b417f20042004417f4e1bac1001000b0beb190100418080c0000be1196572726f725f" + "636f64653d54455354204641494c45442424242424205354415254494e47205741534d2045" + "5845435554494f4e2024242424246765745f626173655f666565746573745f616d656e646d" + "656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a67" + "65745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" + "5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e676574" + "5f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f" + "6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65737361" + "676574657374207075626b657974657374207369676e6174757265636865636b5f73696767" + "65745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c" + "65646765725f73716e5f6e65675f70747274657374696e6720747261636574726163655f61" + "63636f756e74400000000000005f74726163655f616d6f756e746765745f74785f61727261" + "795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f617272" + "61795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e" + "5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c" + "6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62636163" + "68655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a" + "5f77726f6e675f6c656e555344303030303030303030303030303030303074726163655f6e" + "756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61727261" + "795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6172" + "7261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c" + "65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f746f6f" + "5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f" + "736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6172" + "7261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174655f64" + "6174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472616365" + "5f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f77726f" + "6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e675f7369" + "7a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f6e675f" + "73697a655f75696e7432353630303030303030303030303030303030303030303030303030" + "3030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f75" + "6e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f6f6f62" + "5f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f74" + "6f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6163636f756e" + "745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774686765" + "745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d65676574" + "5f706172656e745f6c65646765725f686173686765745f6c65646765725f6163636f756e74" + "5f686173686765745f6c65646765725f74785f686173686765745f63757272656e745f6c65" + "646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c64676574" + "5f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f66" + "69656c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e6674" + "5f6973737565726765745f6e66745f7461786f6e6765745f6e66745f73657269616c676574" + "5f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f627566" + "5f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e67" + "6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f" + "77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e6379" + "6c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b6579" + "6c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e" + "675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f" + "7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f" + "6669656c645f696e76616c69645f736669656c646765745f63757272656e745f6c65646765" + "725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f" + "6f626a5f6669656c645f696e76616c69645f736669656c646765745f74785f6e6573746564" + "5f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c" + "65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c69636563" + "6f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b" + "65796c65745f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f" + "746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f73" + "6c6963655f6d707469646765745f6e66745f77726f6e675f73697a655f75696e7432353667" + "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" + "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" + "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" + "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" + "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" + "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" + "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" + "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index d1552df5a50..08058e45c5a 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -268,6 +269,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + ammKeylet(Asset const& issue1, Asset const& issue2) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected checkKeylet(AccountID const& account, std::uint32_t seq) { @@ -316,6 +323,18 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected nftOfferKeylet(AccountID const& account, std::uint32_t seq) { @@ -343,6 +362,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected signersKeylet(AccountID const& account) { @@ -355,6 +380,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected getNFT(AccountID const& account, uint256 const& nftId) { @@ -403,12 +434,24 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + traceAccount(std::string_view const& msg, AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected traceFloat(std::string_view const& msg, Slice const& data) { return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + traceAmount(std::string_view const& msg, STAmount const& amount) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected floatFromInt(int64_t x, int32_t mode) { diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 4067afccb47..78fcde3f577 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -160,6 +160,9 @@ class WasmHostFunctionsImpl : public HostFunctions Expected accountKeylet(AccountID const& account) override; + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override; + Expected checkKeylet(AccountID const& account, std::uint32_t seq) override; @@ -189,6 +192,12 @@ class WasmHostFunctionsImpl : public HostFunctions AccountID const& account2, Currency const& currency) override; + Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override; + + Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) override; + Expected nftOfferKeylet(AccountID const& account, std::uint32_t seq) override; @@ -204,12 +213,19 @@ class WasmHostFunctionsImpl : public HostFunctions AccountID const& destination, std::uint32_t seq) override; + Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + override; + Expected signersKeylet(AccountID const& account) override; Expected ticketKeylet(AccountID const& account, std::uint32_t seq) override; + Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) override; + Expected getNFT(AccountID const& account, uint256 const& nftId) override; @@ -234,9 +250,16 @@ class WasmHostFunctionsImpl : public HostFunctions Expected traceNum(std::string_view const& msg, int64_t data) override; + Expected + traceAccount(std::string_view const& msg, AccountID const& account) + override; + Expected traceFloat(std::string_view const& msg, Slice const& data) override; + Expected + traceAmount(std::string_view const& msg, STAmount const& amount) override; + Expected floatFromInt(int64_t x, int32_t mode) override; diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index a6cbd91b188..b7d10026357 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -203,6 +203,19 @@ accountKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using ammKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +ammKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using checkKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -282,6 +295,27 @@ lineKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using mptIssuanceKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +mptIssuanceKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using mptokenKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +mptokenKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using nftOfferKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -320,6 +354,14 @@ paychanKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using permissionedDomainKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +permissionedDomainKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* signersKeylet_wrap( @@ -335,6 +377,14 @@ ticketKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using vaultKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +vaultKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using getNFT_proto = int32_t( uint8_t const*, int32_t, @@ -389,6 +439,14 @@ using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +using traceAccount_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceAccount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using traceFloat_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* @@ -397,6 +455,14 @@ traceFloat_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using traceAmount_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceAmount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using floatFromInt_proto = int32_t(int64_t, uint8_t*, int32_t, int32_t); wasm_trap_t* floatFromInt_wrap( diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 441caddd77b..050bf643145 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -185,12 +185,6 @@ getAnyFieldData(STBase const* obj) return Bytes{b, e}; } break; - case STI_UINT256: { - auto const* num(static_cast const*>(obj)); - auto const& data = num->value(); - return Bytes{data.begin(), data.end()}; - } - break; default: break; // default to serializer } @@ -486,6 +480,20 @@ WasmHostFunctionsImpl::accountKeylet(AccountID const& account) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) +{ + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + // note: this should be removed with the MPT DEX amendment + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) { @@ -574,6 +582,32 @@ WasmHostFunctionsImpl::lineKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::mptIssuanceKeylet( + AccountID const& issuer, + std::uint32_t seq) +{ + if (!issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptIssuance(seq, issuer); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::mptokenKeylet( + MPTID const& mptid, + AccountID const& holder) +{ + if (!mptid) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!holder) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptoken(mptid, holder); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::nftOfferKeylet( AccountID const& account, @@ -619,6 +653,17 @@ WasmHostFunctionsImpl::paychanKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::permissionedDomainKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::permissionedDomain(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::signersKeylet(AccountID const& account) { @@ -637,6 +682,15 @@ WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::vault(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { @@ -733,6 +787,24 @@ WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) return msg.size() + sizeof(data); } +Expected +WasmHostFunctionsImpl::traceAccount( + std::string_view const& msg, + AccountID const& account) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + + auto const accountStr = toBase58(account); + + j << "WAMR TRACE ACCOUNT(" << leKey.key << "): " << msg << " " + << accountStr; + return msg.size() + accountStr.size(); +} + Expected WasmHostFunctionsImpl::traceFloat( std::string_view const& msg, @@ -748,6 +820,21 @@ WasmHostFunctionsImpl::traceFloat( return msg.size() + s.size(); } +Expected +WasmHostFunctionsImpl::traceAmount( + std::string_view const& msg, + STAmount const& amount) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "WAMR TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; + return msg.size() + amountStr.size(); +} + Expected WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) { diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 75f072be2a1..1bd9622a4c3 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -79,7 +80,7 @@ getDataInt64(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataUint64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { auto const r = getDataSlice(runtime, params, i); if (!r) @@ -186,6 +187,45 @@ getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) return Currency::fromVoid(slice->data()); } +template +static Expected +getDataAsset(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() == MPTID::bytes) + { + auto const mptid = MPTID::fromVoid(slice->data()); + return Asset{mptid}; + } + + if (slice->size() == Currency::bytes) + { + auto const currency = Currency::fromVoid(slice->data()); + auto const issue = Issue{currency, xrpAccount()}; + if (!issue.native()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + return Asset{issue}; + } + + if (slice->size() == (AccountID::bytes + Currency::bytes)) + { + auto const issue = Issue( + Currency::fromVoid(slice->data()), + AccountID::fromVoid(slice->data() + Currency::bytes)); + + if (issue.native()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + return Asset{issue}; + } + + return Unexpected(HostFunctionError::INVALID_PARAMS); +} + template Expected getDataString(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) @@ -796,6 +836,33 @@ accountKeylet_wrap( runtime, params, results, hf->accountKeylet(*acc), index); } +wasm_trap_t* +ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const issue1 = getDataAsset(runtime, params, index); + if (!issue1) + { + return hfResult(results, issue1.error()); + } + + auto const issue2 = getDataAsset(runtime, params, index); + if (!issue2) + { + return hfResult(results, issue2.error()); + } + + return returnResult( + runtime, + params, + results, + hf->ammKeylet(issue1.value(), issue2.value()), + index); +} + wasm_trap_t* checkKeylet_wrap( void* env, @@ -997,6 +1064,72 @@ lineKeylet_wrap( index); } +wasm_trap_t* +mptIssuanceKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->mptIssuanceKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +mptokenKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const slice = getDataSlice(runtime, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + if (slice->size() != MPTID::bytes) + { + return hfResult(results, HostFunctionError::INVALID_PARAMS); + } + auto const mptid = MPTID::fromVoid(slice->data()); + + auto const holder = getDataAccountID(runtime, params, index); + if (!holder) + { + return hfResult(results, holder.error()); + } + + return returnResult( + runtime, + params, + results, + hf->mptokenKeylet(mptid, holder.value()), + index); +} + wasm_trap_t* nftOfferKeylet_wrap( void* env, @@ -1118,6 +1251,36 @@ paychanKeylet_wrap( index); } +wasm_trap_t* +permissionedDomainKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->permissionedDomainKeylet(acc.value(), seq.value()), + index); +} + wasm_trap_t* signersKeylet_wrap( void* env, @@ -1168,6 +1331,36 @@ ticketKeylet_wrap( index); } +wasm_trap_t* +vaultKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->vaultKeylet(acc.value(), seq.value()), + index); +} + wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { @@ -1352,6 +1545,31 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->traceNum(*msg, *number), index); } +wasm_trap_t* +traceAccount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const account = getDataAccountID(runtime, params, i); + if (!account) + return hfResult(results, account.error()); + + return returnResult( + runtime, params, results, hf->traceAccount(*msg, *account), i); +} + wasm_trap_t* traceFloat_wrap( void* env, @@ -1377,6 +1595,46 @@ traceFloat_wrap( runtime, params, results, hf->traceFloat(*msg, *number), i); } +wasm_trap_t* +traceAmount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const amountSliceOpt = getDataSlice(runtime, params, i); + if (!amountSliceOpt) + return hfResult(results, amountSliceOpt.error()); + + auto const amountSlice = amountSliceOpt.value(); + auto serialIter = SerialIter(amountSlice); + + std::optional amount; + try + { + amount = STAmount(serialIter, sfGeneric); + } + catch (std::exception const&) + { + amount = std::nullopt; + } + if (!amount || !amount.value()) + return hfResult(results, HostFunctionError::INVALID_PARAMS); + + return returnResult( + runtime, params, results, hf->traceAmount(*msg, *amount), i); +} + wasm_trap_t* floatFromInt_wrap( void* env, @@ -1411,7 +1669,7 @@ floatFromUint_wrap( auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; - auto const x = getDataUint64(runtime, params, i); + auto const x = getDataUInt64(runtime, params, i); if (!x) return hfResult(results, x.error()); @@ -1654,6 +1912,7 @@ floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->floatLog(*x, *rounding), i); } +// LCOV_EXCL_START namespace test { class MockInstanceWrapper @@ -1673,7 +1932,6 @@ class MockInstanceWrapper } }; -// LCOV_EXCL_START bool testGetDataIncrement() { @@ -1800,7 +2058,8 @@ testGetDataIncrement() return true; } -// LCOV_EXCL_STOP } // namespace test +// LCOV_EXCL_STOP + } // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 6ea15f42abf..d9dd67860d8 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -45,6 +45,7 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); @@ -58,9 +59,12 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ammKeylet, "amm_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); @@ -68,21 +72,29 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptIssuanceKeylet, "mpt_issuance_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptokenKeylet, "mptoken_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, permissionedDomainKeylet, "permissioned_domain_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, vaultKeylet, "vault_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); + WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceAccount, "trace_account", hfs, 500); WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + WASM_IMPORT_FUNC2(i, traceAmount, "trace_amount", hfs, 500); WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); From 8c38ef726b8d00a40fc71106376e84b41ff4be00 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 26 Aug 2025 15:04:27 -0400 Subject: [PATCH 57/73] chore: exclude a bunch of code that doesn't need to be tested from codecov (#5721) * exclude the bulk of HostFunc.h from codecov * fix codecov (maybe) * adjust * more codecov excl --- src/xrpld/app/wasm/HostFunc.h | 2 ++ src/xrpld/app/wasm/detail/WamrVM.cpp | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 08058e45c5a..56ce33e69d3 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -99,6 +99,7 @@ floatLogImpl(Slice const& x, int32_t mode); struct HostFunctions { + // LCOV_EXCL_START virtual void setRT(void const*) { @@ -519,6 +520,7 @@ struct HostFunctions } virtual ~HostFunctions() = default; + // LCOV_EXCL_STOP }; } // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index 413240559b8..e47a618f12a 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -35,6 +35,7 @@ namespace ripple { namespace { +// LCOV_EXCL_START static log_level_t getLogLevel(beast::severities::Severity severity) { @@ -155,6 +156,7 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) j << std::endl; #endif } +// LCOV_EXCL_STOP } // namespace @@ -525,14 +527,20 @@ ModuleWrapper::buildImports( imp.udata, nullptr); if (!func) + { + // LCOV_EXCL_START throw std::runtime_error( - "can't create import function " + - imp.name); // LCOV_EXCL_LINE + "can't create import function " + imp.name); + // LCOV_EXCL_STOP + } if (imp.gas && !wasm_func_set_gas(func, imp.gas)) + { + // LCOV_EXCL_START throw std::runtime_error( - "can't set gas for import function " + - imp.name); // LCOV_EXCL_LINE + "can't set gas for import function " + imp.name); + // LCOV_EXCL_STOP + } wimports.data[i] = wasm_func_as_extern(func); ++impCnt; From 697d1470f4a8972e84cacb9b8483ae9a16a63b4f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 27 Aug 2025 13:58:27 -0400 Subject: [PATCH 58/73] change: adjust the function signatures for `get_ledger_sqn` and `get_parent_ledger_time` (#5733) --- src/test/app/Escrow_test.cpp | 41 +- src/test/app/HostFuncImpl_test.cpp | 33 +- src/test/app/TestHostFunctions.h | 13 +- src/test/app/Wasm_test.cpp | 428 ++++--- .../all_host_functions/Cargo.lock | 4 +- .../all_host_functions/Cargo.toml | 2 +- .../all_host_functions/src/lib.rs | 174 +-- .../app/wasm_fixtures/all_keylets/Cargo.lock | 2 +- .../app/wasm_fixtures/all_keylets/Cargo.toml | 2 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 2 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- .../codecov_tests/src/host_bindings_loose.rs | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 64 +- src/test/app/wasm_fixtures/copyFixtures.py | 6 +- src/test/app/wasm_fixtures/fixtures.cpp | 1052 ++++++++--------- src/test/app/wasm_fixtures/ledgerSqn.c | 14 +- src/xrpld/app/wasm/HostFunc.h | 4 +- src/xrpld/app/wasm/HostFuncImpl.h | 4 +- src/xrpld/app/wasm/HostFuncWrapper.h | 4 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 14 +- 20 files changed, 904 insertions(+), 963 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index a6861a252c6..6721eed12f9 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2006,7 +2006,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 71; + std::uint32_t const allowance = 66; { // basic FinishFunction situation @@ -2053,8 +2053,9 @@ struct Escrow_test : public beast::unit_test::suite { auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT( - txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); } env(escrow::finish(alice, alice, seq), @@ -2064,9 +2065,13 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 5, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2109,8 +2114,9 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECT( - env.meta()->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); env.close(); // no fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), @@ -2136,7 +2142,9 @@ struct Escrow_test : public beast::unit_test::suite if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2187,7 +2195,9 @@ struct Escrow_test : public beast::unit_test::suite if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 13, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2227,8 +2237,9 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECT( - env.meta()->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); env.close(); // finish time has passed, function succeeds, tx succeeds env(escrow::finish(carol, alice, seq), @@ -2240,7 +2251,9 @@ struct Escrow_test : public beast::unit_test::suite if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2306,7 +2319,9 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 39'596); + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == 38'571, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 38d1cd0237a..a198ba4af44 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -119,18 +119,35 @@ struct HostFuncImpl_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + { + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + env.current() + ->parentCloseTime() + .time_since_epoch() + .count()); + } - auto const result = hfs.getParentLedgerTime(); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - env.current()->parentCloseTime().time_since_epoch().count()); + env.close( + env.now() + + std::chrono::seconds(std::numeric_limits::max() - 1)); + { + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECTS( + !result.has_value(), std::to_string(result.value()))) + BEAST_EXPECT(result.error() == HostFunctionError::INTERNAL); + } } void diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 9cacaa4c8c2..ae4db59b0d0 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -52,10 +52,10 @@ struct TestLedgerDataProvider : public HostFunctions return rt_; } - Expected + Expected getLedgerSqn() override { - return static_cast(env_->current()->seq()); + return env_->current()->seq(); } }; @@ -94,17 +94,16 @@ struct TestHostFunctions : public HostFunctions return env_.journal; } - Expected + Expected getLedgerSqn() override { - return static_cast(env_.current()->seq()); + return 12345; } - Expected + Expected getParentLedgerTime() override { - return env_.current()->parentCloseTime().time_since_epoch().count() + - clock_drift_; + return 67890; } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c09b366b7f4..a48e16f1eb0 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -52,6 +52,160 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(testGetDataIncrement()); } + void + testWasmLib() + { + testcase("wasmtime lib test"); + // clang-format off + /* The WASM module buffer. */ + Bytes const wasm = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + auto& vm = WasmEngine::instance(); + + std::vector imports; + WasmImpFunc( + imports, "func-add", reinterpret_cast(&Add)); + + auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); + + // if (res) printf("invokeAdd get the result: %d\n", res.value()); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); + } + } + + void + testBadWasm() + { + testcase("bad wasm test"); + + using namespace test::jtx; + + Env env{*this}; + HostFunctions hfs; + + { + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); + BEAST_EXPECT(!re); + } + + { + auto wasmHex = "00112233445566778899AA"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + + { + // FinishFunction wrong function name + // pub fn bad() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" + "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" + "100041044a0b004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + auto const re = preflightEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + } + + void + testWasmLedgerSqn() + { + testcase("Wasm get ledger sequence"); + + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider hf(&env); + + std::vector imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &hf, + 1'000'000, + env.journal); + + // code takes 11 gas + 1 getLedgerSqn call + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 39, std::to_string(re->cost)); + } + + env.close(); + env.close(); + + // empty module - run the same instance + re = engine.run( + {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); + + // code takes 22 gas + 2 getLedgerSqn calls + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 78, std::to_string(re->cost)); + } + } + void testWasmFib() { @@ -109,7 +263,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 3'066'129, std::to_string(re->cost)); } } @@ -126,7 +280,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS( re->cost == 4'191'711'969ll, std::to_string(re->cost)); } @@ -144,164 +298,81 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 332'205'984, std::to_string(re->cost)); } } void - testWasmLedgerSqn() + testHFCost() { - testcase("Wasm get ledger sequence"); - - auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + testcase("wasm test host functions cost"); using namespace test::jtx; - Env env{*this}; - TestLedgerDataProvider hf(&env); + Env env(*this); + { + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); - std::vector imports; - WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); - auto& engine = WasmEngine::instance(); + auto& engine = WasmEngine::instance(); - auto re = engine.run( - wasm, - ESCROW_FUNCTION_NAME, - {}, - imports, - &hf, - 1'000'000, - env.journal); + TestHostFunctions hfs(env, 0); + std::vector imp = createWasmImport(&hfs); + for (auto& i : imp) + i.gas = 0; - // code takes 11 gas + 1 getLedgerSqn call - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(!re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 44, std::to_string(re->cost)); + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 847, std::to_string(re->cost)); + } + + env.close(); } env.close(); env.close(); env.close(); env.close(); - - // empty module - run the same instance - re = engine.run( - {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); - - // code takes 22 gas + 2 getLedgerSqn calls - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 88, std::to_string(re->cost)); - } - } - - void - testWasmLib() - { - testcase("wasmtime lib test"); - // clang-format off - /* The WASM module buffer. */ - Bytes const wasm = {/* WASM header */ - 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, - /* Type section */ - 0x01, 0x07, 0x01, - /* function type {i32, i32} -> {i32} */ - 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, - /* Import section */ - 0x02, 0x13, 0x01, - /* module name: "extern" */ - 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, - /* extern name: "func-add" */ - 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, - /* import desc: func 0 */ - 0x00, 0x00, - /* Function section */ - 0x03, 0x02, 0x01, 0x00, - /* Export section */ - 0x07, 0x0A, 0x01, - /* export name: "addTwo" */ - 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, - /* export desc: func 0 */ - 0x00, 0x01, - /* Code section */ - 0x0A, 0x0A, 0x01, - /* code body */ - 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; - // clang-format on - auto& vm = WasmEngine::instance(); - - std::vector imports; - WasmImpFunc( - imports, "func-add", reinterpret_cast(&Add)); - - auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); - - // if (res) printf("invokeAdd get the result: %d\n", res.value()); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); - } - } - - void - testBadWasm() - { - testcase("bad wasm test"); - - using namespace test::jtx; - - Env env{*this}; - HostFunctions hfs; + env.close(); { - auto wasmHex = "00000000"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); - auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); - BEAST_EXPECT(!re); - } + auto& engine = WasmEngine::instance(); - { - auto wasmHex = "00112233445566778899AA"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); + TestHostFunctions hfs(env, 0); + std::vector const imp = createWasmImport(&hfs); - auto const re = - preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); - BEAST_EXPECT(!isTesSuccess(re)); - } + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); - { - // FinishFunction wrong function name - // pub fn bad() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5 } - // } - auto const badWasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" - "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" - "100041044a0b004d0970726f64756365727302086c616e67756167650104" - "52757374000c70726f6365737365642d6279010572757374631d312e3835" - "2e31202834656231363132353020323032352d30332d31352900490f7461" - "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" - "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); + } - auto const re = preflightEscrowWasm( - wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); - BEAST_EXPECT(!isTesSuccess(re)); + env.close(); } } @@ -322,8 +393,8 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); } } @@ -345,7 +416,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); } } @@ -367,7 +438,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); } } @@ -428,79 +499,6 @@ struct Wasm_test : public beast::unit_test::suite } } - void - testHFCost() - { - testcase("wasm test host functions cost"); - - using namespace test::jtx; - - Env env(*this); - { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - auto& engine = WasmEngine::instance(); - - TestHostFunctions hfs(env, 0); - std::vector imp = createWasmImport(&hfs); - for (auto& i : imp) - i.gas = 0; - - auto re = engine.run( - wasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - &hfs, - 1'000'000, - env.journal); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 872, std::to_string(re->cost)); - } - - env.close(); - } - - env.close(); - env.close(); - env.close(); - env.close(); - env.close(); - - { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - auto& engine = WasmEngine::instance(); - - TestHostFunctions hfs(env, 0); - std::vector const imp = createWasmImport(&hfs); - - auto re = engine.run( - wasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - &hfs, - 1'000'000, - env.journal); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); - } - - env.close(); - } - } - void testFloat() { @@ -520,7 +518,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 91'412, std::to_string(re->cost)); } env.close(); @@ -535,7 +533,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 6'533, std::to_string(re->cost)); } env.close(); @@ -651,7 +649,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 119'883; + auto const allowance = 121'895; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock index 13931f02298..7f6a6bc7175 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -11,5 +11,5 @@ dependencies = [ [[package]] name = "xrpl-std" -version = "0.0.1" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +version = "0.5.1-devnet5" +source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml index 4c3455b3ca8..959056f374e 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -10,7 +10,7 @@ edition = "2024" crate-type = ["cdylib"] [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs index b685de59dac..c8a27aed876 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -27,14 +27,14 @@ extern crate std; use xrpl_std::core::current_tx::escrow_finish::EscrowFinish; use xrpl_std::core::current_tx::traits::TransactionCommonFields; -use xrpl_std::host::trace::{DataRepr, trace_data, trace_num}; -use xrpl_std::host::*; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_account_buf, trace_data, trace_num, DataRepr}; use xrpl_std::sfield; #[unsafe(no_mangle)] pub extern "C" fn finish() -> i32 { - let _ = trace_data("=== HOST FUNCTIONS TEST ===", &[], DataRepr::AsHex); - let _ = trace_data("Testing 26 host functions", &[], DataRepr::AsHex); + let _ = trace("=== HOST FUNCTIONS TEST ==="); + let _ = trace("Testing 26 host functions"); // Category 1: Ledger Header Data Functions (3 functions) // Error range: -100 to -199 @@ -85,11 +85,7 @@ pub extern "C" fn finish() -> i32 { err => return err, } - let _ = trace_data( - "SUCCESS: All host function tests passed!", - &[], - DataRepr::AsHex, - ); + let _ = trace("SUCCESS: All host function tests passed!"); 1 // Success return code for WASM finish function } @@ -98,48 +94,30 @@ pub extern "C" fn finish() -> i32 { /// - get_parent_ledger_time() - Get parent ledger timestamp /// - get_parent_ledger_hash() - Get parent ledger hash fn test_ledger_header_functions() -> i32 { - let _ = trace_data( - "--- Category 1: Ledger Header Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 1: Ledger Header Functions ---"); // Test 1.1: get_ledger_sqn() - should return current ledger sequence number - let mut ledger_sqn_buffer = [0u8; 8]; - let sqn_result = - unsafe { get_ledger_sqn(ledger_sqn_buffer.as_mut_ptr(), ledger_sqn_buffer.len()) }; + let sqn_result = unsafe { host::get_ledger_sqn() }; if sqn_result <= 0 { let _ = trace_num("ERROR: get_ledger_sqn failed:", sqn_result as i64); return -101; // Ledger sequence number test failed } - let _ = trace_num("Ledger sequence number bytes:", sqn_result as i64); - let _ = trace_data( - "Ledger sqn data:", - &ledger_sqn_buffer[..sqn_result as usize], - DataRepr::AsHex, - ); + let _ = trace_num("Ledger sequence number:", sqn_result as i64); // Test 1.2: get_parent_ledger_time() - should return parent ledger timestamp - let mut time_buffer = [0u8; 8]; - let time_result = - unsafe { get_parent_ledger_time(time_buffer.as_mut_ptr(), time_buffer.len()) }; + let time_result = unsafe { host::get_parent_ledger_time() }; if time_result <= 0 { let _ = trace_num("ERROR: get_parent_ledger_time failed:", time_result as i64); return -102; // Parent ledger time test failed } - let _ = trace_num("Parent ledger time bytes:", time_result as i64); - let _ = trace_data( - "Parent time data:", - &time_buffer[..time_result as usize], - DataRepr::AsHex, - ); + let _ = trace_num("Parent ledger time:", time_result as i64); // Test 1.3: get_parent_ledger_hash() - should return parent ledger hash (32 bytes) let mut hash_buffer = [0u8; 32]; let hash_result = - unsafe { get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; + unsafe { host::get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; if hash_result != 32 { let _ = trace_num( @@ -150,24 +128,20 @@ fn test_ledger_header_functions() -> i32 { } let _ = trace_data("Parent ledger hash:", &hash_buffer, DataRepr::AsHex); - let _ = trace_data("SUCCESS: Ledger header functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Ledger header functions"); 0 } /// Test Category 2: Transaction Data Functions (5 functions) /// Tests all functions for accessing current transaction data fn test_transaction_data_functions() -> i32 { - let _ = trace_data( - "--- Category 2: Transaction Data Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 2: Transaction Data Functions ---"); // Test 2.1: get_tx_field() - Basic transaction field access // Test with Account field (required, 20 bytes) let mut account_buffer = [0u8; 20]; let account_len = unsafe { - get_tx_field( + host::get_tx_field( sfield::Account, account_buffer.as_mut_ptr(), account_buffer.len(), @@ -181,12 +155,13 @@ fn test_transaction_data_functions() -> i32 { ); return -201; // Basic transaction field test failed } - let _ = trace_data("Transaction Account:", &account_buffer, DataRepr::AsHex); + let _ = trace_account_buf("Transaction Account:", &account_buffer); // Test with Fee field (XRP amount - 8 bytes in new serialized format) // New format: XRP amounts are always 8 bytes (positive: value | cPositive flag, negative: just value) let mut fee_buffer = [0u8; 8]; - let fee_len = unsafe { get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; + let fee_len = + unsafe { host::get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; if fee_len != 8 { let _ = trace_num( @@ -205,7 +180,7 @@ fn test_transaction_data_functions() -> i32 { // Test with Sequence field (required, 4 bytes uint32) let mut seq_buffer = [0u8; 4]; let seq_len = - unsafe { get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; + unsafe { host::get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; if seq_len != 4 { let _ = trace_num( @@ -223,7 +198,7 @@ fn test_transaction_data_functions() -> i32 { let locator = [0x01, 0x00]; // Simple locator for first element let mut nested_buffer = [0u8; 32]; let nested_result = unsafe { - get_tx_nested_field( + host::get_tx_nested_field( locator.as_ptr(), locator.len(), nested_buffer.as_mut_ptr(), @@ -247,14 +222,15 @@ fn test_transaction_data_functions() -> i32 { } // Test 2.3: get_tx_array_len() - Get array length - let signers_len = unsafe { get_tx_array_len(sfield::Signers) }; + let signers_len = unsafe { host::get_tx_array_len(sfield::Signers) }; let _ = trace_num("Signers array length:", signers_len as i64); - let memos_len = unsafe { get_tx_array_len(sfield::Memos) }; + let memos_len = unsafe { host::get_tx_array_len(sfield::Memos) }; let _ = trace_num("Memos array length:", memos_len as i64); // Test 2.4: get_tx_nested_array_len() - Get nested array length with locator - let nested_array_len = unsafe { get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; + let nested_array_len = + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; if nested_array_len < 0 { let _ = trace_num( @@ -265,24 +241,20 @@ fn test_transaction_data_functions() -> i32 { let _ = trace_num("Nested array length:", nested_array_len as i64); } - let _ = trace_data("SUCCESS: Transaction data functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Transaction data functions"); 0 } /// Test Category 3: Current Ledger Object Functions (4 functions) /// Tests functions that access the current ledger object being processed fn test_current_ledger_object_functions() -> i32 { - let _ = trace_data( - "--- Category 3: Current Ledger Object Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 3: Current Ledger Object Functions ---"); // Test 3.1: get_current_ledger_obj_field() - Access field from current ledger object // Test with Balance field (XRP amount - 8 bytes in new serialized format) let mut balance_buffer = [0u8; 8]; let balance_result = unsafe { - get_current_ledger_obj_field( + host::get_current_ledger_obj_field( sfield::Balance, balance_buffer.as_mut_ptr(), balance_buffer.len(), @@ -320,7 +292,7 @@ fn test_current_ledger_object_functions() -> i32 { // Test with Account field let mut current_account_buffer = [0u8; 20]; let current_account_result = unsafe { - get_current_ledger_obj_field( + host::get_current_ledger_obj_field( sfield::Account, current_account_buffer.as_mut_ptr(), current_account_buffer.len(), @@ -333,18 +305,14 @@ fn test_current_ledger_object_functions() -> i32 { current_account_result as i64, ); } else { - let _ = trace_data( - "Current ledger object account:", - ¤t_account_buffer[..current_account_result as usize], - DataRepr::AsHex, - ); + let _ = trace_account_buf("Current ledger object account:", ¤t_account_buffer); } // Test 3.2: get_current_ledger_obj_nested_field() - Nested field access let locator = [0x01, 0x00]; // Simple locator let mut current_nested_buffer = [0u8; 32]; let current_nested_result = unsafe { - get_current_ledger_obj_nested_field( + host::get_current_ledger_obj_nested_field( locator.as_ptr(), locator.len(), current_nested_buffer.as_mut_ptr(), @@ -367,7 +335,7 @@ fn test_current_ledger_object_functions() -> i32 { } // Test 3.3: get_current_ledger_obj_array_len() - Array length in current object - let current_array_len = unsafe { get_current_ledger_obj_array_len(sfield::Signers) }; + let current_array_len = unsafe { host::get_current_ledger_obj_array_len(sfield::Signers) }; let _ = trace_num( "Current object Signers array length:", current_array_len as i64, @@ -375,7 +343,7 @@ fn test_current_ledger_object_functions() -> i32 { // Test 3.4: get_current_ledger_obj_nested_array_len() - Nested array length let current_nested_array_len = - unsafe { get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; if current_nested_array_len < 0 { let _ = trace_num( @@ -389,22 +357,14 @@ fn test_current_ledger_object_functions() -> i32 { ); } - let _ = trace_data( - "SUCCESS: Current ledger object functions", - &[], - DataRepr::AsHex, - ); + let _ = trace("SUCCESS: Current ledger object functions"); 0 } /// Test Category 4: Any Ledger Object Functions (5 functions) /// Tests functions that work with cached ledger objects fn test_any_ledger_object_functions() -> i32 { - let _ = trace_data( - "--- Category 4: Any Ledger Object Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 4: Any Ledger Object Functions ---"); // First we need to cache a ledger object to test the other functions // Get the account from transaction and generate its keylet @@ -414,7 +374,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test 4.1: cache_ledger_obj() - Cache a ledger object let mut keylet_buffer = [0u8; 32]; let keylet_result = unsafe { - account_keylet( + host::account_keylet( account_id.0.as_ptr(), account_id.0.len(), keylet_buffer.as_mut_ptr(), @@ -431,7 +391,7 @@ fn test_any_ledger_object_functions() -> i32 { } let cache_result = - unsafe { cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; + unsafe { host::cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; if cache_result <= 0 { let _ = trace_num( @@ -446,7 +406,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test get_ledger_obj_field with invalid slot let field_result = unsafe { - get_ledger_obj_field( + host::get_ledger_obj_field( 1, sfield::Balance, test_buffer.as_mut_ptr(), @@ -463,7 +423,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test get_ledger_obj_nested_field with invalid slot let locator = [0x01, 0x00]; let nested_result = unsafe { - get_ledger_obj_nested_field( + host::get_ledger_obj_nested_field( 1, locator.as_ptr(), locator.len(), @@ -479,7 +439,7 @@ fn test_any_ledger_object_functions() -> i32 { } // Test get_ledger_obj_array_len with invalid slot - let array_result = unsafe { get_ledger_obj_array_len(1, sfield::Signers) }; + let array_result = unsafe { host::get_ledger_obj_array_len(1, sfield::Signers) }; if array_result < 0 { let _ = trace_num( "INFO: get_ledger_obj_array_len failed as expected:", @@ -489,7 +449,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test get_ledger_obj_nested_array_len with invalid slot let nested_array_result = - unsafe { get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; if nested_array_result < 0 { let _ = trace_num( "INFO: get_ledger_obj_nested_array_len failed as expected:", @@ -497,11 +457,7 @@ fn test_any_ledger_object_functions() -> i32 { ); } - let _ = trace_data( - "SUCCESS: Any ledger object functions (interface tested)", - &[], - DataRepr::AsHex, - ); + let _ = trace("SUCCESS: Any ledger object functions (interface tested)"); return 0; } @@ -512,7 +468,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test 4.2: get_ledger_obj_field() - Access field from cached object let mut cached_balance_buffer = [0u8; 8]; let cached_balance_result = unsafe { - get_ledger_obj_field( + host::get_ledger_obj_field( slot, sfield::Balance, cached_balance_buffer.as_mut_ptr(), @@ -551,7 +507,7 @@ fn test_any_ledger_object_functions() -> i32 { let locator = [0x01, 0x00]; let mut cached_nested_buffer = [0u8; 32]; let cached_nested_result = unsafe { - get_ledger_obj_nested_field( + host::get_ledger_obj_nested_field( slot, locator.as_ptr(), locator.len(), @@ -575,7 +531,7 @@ fn test_any_ledger_object_functions() -> i32 { } // Test 4.4: get_ledger_obj_array_len() - Array length from cached object - let cached_array_len = unsafe { get_ledger_obj_array_len(slot, sfield::Signers) }; + let cached_array_len = unsafe { host::get_ledger_obj_array_len(slot, sfield::Signers) }; let _ = trace_num( "Cached object Signers array length:", cached_array_len as i64, @@ -583,7 +539,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test 4.5: get_ledger_obj_nested_array_len() - Nested array length from cached object let cached_nested_array_len = - unsafe { get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; + unsafe { host::get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; if cached_nested_array_len < 0 { let _ = trace_num( @@ -597,18 +553,14 @@ fn test_any_ledger_object_functions() -> i32 { ); } - let _ = trace_data("SUCCESS: Any ledger object functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Any ledger object functions"); 0 } /// Test Category 5: Keylet Generation Functions (4 functions) /// Tests keylet generation functions for different ledger entry types fn test_keylet_generation_functions() -> i32 { - let _ = trace_data( - "--- Category 5: Keylet Generation Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 5: Keylet Generation Functions ---"); let escrow_finish = EscrowFinish; let account_id = escrow_finish.get_account().unwrap(); @@ -616,7 +568,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.1: account_keylet() - Generate keylet for account let mut account_keylet_buffer = [0u8; 32]; let account_keylet_result = unsafe { - account_keylet( + host::account_keylet( account_id.0.as_ptr(), account_id.0.len(), account_keylet_buffer.as_mut_ptr(), @@ -636,7 +588,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.2: credential_keylet() - Generate keylet for credential let mut credential_keylet_buffer = [0u8; 32]; let credential_keylet_result = unsafe { - credential_keylet( + host::credential_keylet( account_id.0.as_ptr(), // Subject account_id.0.len(), account_id.0.as_ptr(), // Issuer - same account for test @@ -665,7 +617,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.3: escrow_keylet() - Generate keylet for escrow let mut escrow_keylet_buffer = [0u8; 32]; let escrow_keylet_result = unsafe { - escrow_keylet( + host::escrow_keylet( account_id.0.as_ptr(), account_id.0.len(), 1000, // Sequence number @@ -683,7 +635,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.4: oracle_keylet() - Generate keylet for oracle let mut oracle_keylet_buffer = [0u8; 32]; let oracle_keylet_result = unsafe { - oracle_keylet( + host::oracle_keylet( account_id.0.as_ptr(), account_id.0.len(), 42, // Document ID @@ -698,24 +650,20 @@ fn test_keylet_generation_functions() -> i32 { } let _ = trace_data("Oracle keylet:", &oracle_keylet_buffer, DataRepr::AsHex); - let _ = trace_data("SUCCESS: Keylet generation functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Keylet generation functions"); 0 } /// Test Category 6: Utility Functions (4 functions) /// Tests utility functions for hashing, NFT access, and tracing fn test_utility_functions() -> i32 { - let _ = trace_data( - "--- Category 6: Utility Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 6: Utility Functions ---"); // Test 6.1: compute_sha512_half() - SHA512 hash computation (first 32 bytes) let test_data = b"Hello, XRPL WASM world!"; let mut hash_output = [0u8; 32]; let hash_result = unsafe { - compute_sha512_half( + host::compute_sha512_half( test_data.as_ptr(), test_data.len(), hash_output.as_mut_ptr(), @@ -736,7 +684,7 @@ fn test_utility_functions() -> i32 { let nft_id = [0u8; 32]; // Dummy NFT ID for testing let mut nft_buffer = [0u8; 256]; let nft_result = unsafe { - get_nft( + host::get_nft( account_id.0.as_ptr(), account_id.0.len(), nft_id.as_ptr(), @@ -765,7 +713,7 @@ fn test_utility_functions() -> i32 { let trace_message = b"Test trace message"; let trace_data_payload = b"payload"; let trace_result = unsafe { - trace( + host::trace( trace_message.as_ptr(), trace_message.len(), trace_data_payload.as_ptr(), @@ -795,23 +743,19 @@ fn test_utility_functions() -> i32 { } } - let _ = trace_data("SUCCESS: Utility functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Utility functions"); 0 } /// Test Category 7: Data Update Functions (1 function) /// Tests the function for modifying the current ledger entry fn test_data_update_functions() -> i32 { - let _ = trace_data( - "--- Category 7: Data Update Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 7: Data Update Functions ---"); // Test 7.1: update_data() - Update current ledger entry data let update_payload = b"Updated ledger entry data from WASM test"; - let update_result = unsafe { update_data(update_payload.as_ptr(), update_payload.len()) }; + let update_result = unsafe { host::update_data(update_payload.as_ptr(), update_payload.len()) }; if update_result != 0 { let _ = trace_num("ERROR: update_data failed:", update_result as i64); @@ -823,6 +767,6 @@ fn test_data_update_functions() -> i32 { update_payload, DataRepr::AsHex, ); - let _ = trace_data("SUCCESS: Data update functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Data update functions"); 0 } diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index 83078812d35..3491dc00fa4 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -12,4 +12,4 @@ dependencies = [ [[package]] name = "xrpl-std" version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +source = "git+https://github.com/ripple/craft.git?branch=lastdevnet#c3a92273195a211ac9b41d641b0d20f60f982bb2" diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml index e1fd222bebe..620e28fceb1 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "lastdevnet", package = "xrpl-std" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index f6b293d40dd..704846d35a6 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -12,4 +12,4 @@ dependencies = [ [[package]] name = "xrpl-std" version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index 33ae5b78d71..52ca804bc0f 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs index 1d3d04e74f5..706add2ed78 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -19,7 +19,7 @@ pub const FLOAT_ROUNDING_MODES_UPWARD: i32 = 3; #[allow(unused)] #[link(wasm_import_module = "host_lib")] unsafe extern "C" { - pub fn get_ledger_sqn(out_buff_ptr: i32, out_buff_len: i32) -> i32; + pub fn get_parent_ledger_hash(out_buff_ptr: i32, out_buff_len: i32) -> i32; pub fn cache_ledger_obj(keylet_ptr: i32, keylet_len: i32, cache_num: i32) -> i32; diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 1b1f5f7b2d0..36c61fe439d 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -4,7 +4,7 @@ extern crate std; use core::panic; -use xrpl_std::core::current_tx::escrow_finish::{EscrowFinish, get_current_escrow_finish}; +use xrpl_std::core::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish}; use xrpl_std::core::current_tx::traits::TransactionCommonFields; use xrpl_std::core::error_codes; use xrpl_std::core::locator::Locator; @@ -54,20 +54,12 @@ pub extern "C" fn finish() -> i32 { // Note: not testing all the keylet functions, // that's in a separate test file. // ######################################## - with_buffer::<4, _, _>(|ptr, len| { - check_result( - unsafe { host::get_ledger_sqn(ptr, len) }, - 4, - "get_ledger_sqn", - ) - }); - with_buffer::<4, _, _>(|ptr, len| { - check_result( - unsafe { host::get_parent_ledger_time(ptr, len) }, - 4, - "get_parent_ledger_time", - ); - }); + check_result(unsafe { host::get_ledger_sqn() }, 12345, "get_ledger_sqn"); + check_result( + unsafe { host::get_parent_ledger_time() }, + 67890, + "get_parent_ledger_time", + ); with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { host::get_parent_ledger_hash(ptr, len) }, @@ -259,34 +251,60 @@ pub extern "C" fn finish() -> i32 { "get_nft_serial", ) }); + let message = "testing trace"; + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 47, + "trace_account", + ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 19, + "trace_amount", + ); // ######################################## // Step #2: Test set_data edge cases // ######################################## check_result( - unsafe { host_bindings_loose::get_ledger_sqn(-1, 4) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(-1, 4) }, error_codes::INVALID_PARAMS, - "get_ledger_sqn_neg_ptr", + "get_parent_ledger_hash_neg_ptr", ); with_buffer::<4, _, _>(|ptr, _len| { check_result( - unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, -1) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, -1) }, error_codes::INVALID_PARAMS, - "get_ledger_sqn_neg_len", + "get_parent_ledger_hash_neg_len", ) }); with_buffer::<3, _, _>(|ptr, len| { check_result( - unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, len as i32) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, len as i32) }, error_codes::BUFFER_TOO_SMALL, - "get_ledger_sqn_buf_too_small", + "get_parent_ledger_hash_buf_too_small", ) }); with_buffer::<4, _, _>(|ptr, _len| { check_result( - unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, 1_000_000_000) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, 1_000_000_000) }, error_codes::POINTER_OUT_OF_BOUNDS, - "get_ledger_sqn_len_too_long", + "get_parent_ledger_hash_len_too_long", ) }); let message = "testing trace"; diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index 1198946eb50..eb1b6d0f9ec 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -115,7 +115,11 @@ def process_c(project_name): print("Usage: python copyFixtures.py []") sys.exit(1) if len(sys.argv) == 2: - process_rust(sys.argv[1]) + if os.path.isdir(os.path.join(os.path.dirname(__file__), sys.argv[1])): + process_rust(sys.argv[1]) + else: + process_c(sys.argv[1]) + print("Fixture has been processed.") else: dirs = [ d diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index a0d8d4efaa3..ec91496428c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8614,304 +8614,243 @@ extern std::string const sp1WasmHex = "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" "756c746976616c7565"; -std::string const ledgerSqnWasmHex = - "0061736d01000000010e0360027f7f017f6000006000017f02160103656e" - "760e6765745f6c65646765725f73716e000003030201020503010002063e" - "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" - "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" - "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" - "6f727300010666696e69736800020362756603000c5f5f64736f5f68616e" - "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" - "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" - "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" - "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" - "090a2b0202000b2601017f41800841041000220041800828020020004100" - "481b2200200041044a20004100481b0b007f0970726f647563657273010c" - "70726f6365737365642d62790105636c616e675f31392e312e352d776173" - "692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d" - "2f6c6c766d2d70726f6a6563742061623462356132646235383239353861" - "6631656533303861373930636664623432626432343732302900490f7461" - "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" - "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; +extern std::string const ledgerSqnWasmHex = + "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" + "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" + "004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b" + "7f0041010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300" + "010666696e69736800020362756603000c5f5f64736f5f68616e646c6503010a5f5f646174" + "615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d" + "5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" + "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a" + "150202000b1001017f100022004100200041044b1b0b007f0970726f647563657273010c70" + "726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868" + "747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061" + "62346235613264623538323935386166316565333038613739306366646234326264323437" + "32302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; -std::string const allHostFunctionsWasmHex = - "0061736d0100000001540c60027f7f017f60047f7f7f7f017f60037f7f7f" - "017f60057f7f7f7f7f017f60017f017f60037f7f7f0060037f7f7e017f60" - "087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60017f0060027f7f00" - "6000017f0295061908686f73745f6c69620c6765745f74785f6669656c64" - "000208686f73745f6c69620974726163655f6e756d000608686f73745f6c" - "6962057472616365000308686f73745f6c69620e6765745f6c6564676572" - "5f73716e000008686f73745f6c6962166765745f706172656e745f6c6564" - "6765725f74696d65000008686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f68617368000008686f73745f6c6962136765745f7478" - "5f6e65737465645f6669656c64000108686f73745f6c6962106765745f74" - "785f61727261795f6c656e000408686f73745f6c6962176765745f74785f" - "6e65737465645f61727261795f6c656e000008686f73745f6c69621c6765" - "745f63757272656e745f6c65646765725f6f626a5f6669656c6400020868" - "6f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a" - "5f6e65737465645f6669656c64000108686f73745f6c6962206765745f63" - "757272656e745f6c65646765725f6f626a5f61727261795f6c656e000408" - "686f73745f6c6962276765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e000008686f73745f6c69620e" - "6163636f756e745f6b65796c6574000108686f73745f6c69621063616368" - "655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c65" - "646765725f6f626a5f6669656c64000108686f73745f6c69621b6765745f" - "6c65646765725f6f626a5f6e65737465645f6669656c64000308686f7374" - "5f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e00" - "0008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e657374" - "65645f61727261795f6c656e000208686f73745f6c69621163726564656e" - "7469616c5f6b65796c6574000708686f73745f6c69620d657363726f775f" - "6b65796c6574000308686f73745f6c69620d6f7261636c655f6b65796c65" - "74000308686f73745f6c696213636f6d707574655f7368613531325f6861" - "6c66000108686f73745f6c6962076765745f6e6674000808686f73745f6c" - "69620b7570646174655f6461746100000306050505090a0b050301001106" - "19037f01418080c0000b7f0041eb99c0000b7f0041f099c0000b072e0406" - "6d656d6f727902000666696e697368001d0a5f5f646174615f656e640301" - "0b5f5f686561705f6261736503020a951d051900200241214f0440000b20" - "002002360204200020013602000b1900200241094f0440000b2000200236" - "0204200020013602000b970101057f230041206b22012400200141186a22" - "044100360200200141106a22054200370300200142003703080240418180" - "20200141086a411410002203411447044002402003410048044020002003" - "3602040c010b2000417f3602040b410121020c010b200020012903083700" - "01200041116a2004280200360000200041096a20052903003700000b2000" - "20023a0000200141206a24000b450020012d000045044020002001290001" - "370000200041106a200141116a280000360000200041086a200141096a29" - "00003700000f0b418080c000410b20013402041001000bff1a01097f2300" - "41c0036b22002400418b80c000411b41014100410110021a41a680c00041" - "2841014100410110021a41f680c000412b41014100410110021a20004200" - "370380010240024002400240024002400240024020004180016a22064108" - "1003220141004a044041a181c000411d2001ad10011a200041406b200620" - "01101a41be81c000411020002802402000280244410110021a2000420037" - "03a001200041a0016a220341081004220141004c0d0141ce81c000411920" - "01ad10011a200041386a20032001101a41e781c000411120002802382000" - "28023c410110021a200041d8016a22024200370300200041d0016a220542" - "00370300200041c8016a22044200370300200042003703c001200041c001" - "6a22074120100522014120470d0241f881c000411320074120410110021a" - "418b82c000412041014100410110021a419883c000412e41014100410110" - "021a200041b0016a4100360200200041a8016a4200370300200042003703" - "a0014181802020034114100022014114470d0341c683c000411420034114" - "410110021a20004200370380014188801820064108100022014108470d04" - "41da83c0004117420810011a41f183c000412820064108410110021a2000" - "410036026041848008200041e0006a22034104100022014104470d054199" - "84c000411520034104410110021a200041013b004c200242003703002005" - "420037030020044200370300200042003703c0010240200041cc006a4102" - "200741201006220141004e044041ae84c00041142001ad10011a20004130" - "6a20072001101941c284c000410d20002802302000280234410110021a0c" - "010b41cf84c00041292001ac10011a0b41f884c00041154183803c1007ac" - "10011a418d85c00041134189803c1007ac10011a0240200041cc006a4102" - "1008220141004e044041a085c00041142001ad10011a0c010b41b485c000" - "412d2001ac10011a0b41e185c000412341014100410110021a419a87c000" - "413341014100410110021a20004200370380014182801820004180016a22" - "0141081009220341004c0d062003410846044041cd87c000412b42081001" - "1a41f887c000412f20014108410110021a0c080b41a788c000412f2003ad" - "10011a200041286a20004180016a2003101a41d688c00041172000280228" - "200028022c410110021a0c070b41fb82c000411d2001ac10011a419b7f21" - "020c070b41d682c00041252001ac10011a419a7f21020c060b41ab82c000" - "412b2001ac10011a41997f21020c050b41f086c000412a2001ac10011a41" - "b77e21020c040b41af86c00041c1002001ac10011a41b67e21020c030b41" - "8486c000412b2001ac10011a41b57e21020c020b41ed88c00041c5002003" - "ac10011a0b200041b0016a4100360200200041a8016a4200370300200042" - "003703a0010240024002400240024002400240024041818020200041a001" - "6a220141141009220341004a0440200341154f0d0241b289c000411e2001" - "2003410110021a0c010b41d089c00041332003ac10011a0b200041013b00" - "60200041d8016a4200370300200041d0016a4200370300200041c8016a42" - "00370300200042003703c0010240200041e0006a4102200041c0016a2201" - "4120100a220341004e044041838ac000411c2003ad10011a200041206a20" - "0120031019419f8ac000411520002802202000280224410110021a0c010b" - "41b48ac00041392003ac10011a0b41ed8ac00041244183803c100bac1001" - "1a0240200041e0006a4102100c220141004e044041918bc000411c2001ad" - "10011a0c010b41ad8bc000413d2001ac10011a0b41ea8bc0004128410141" - "00410110021a41928cc000412f41014100410110021a200041c0016a2203" - "101b20004180016a22012003101c200041b8016a4200370300200041b001" - "6a4200370300200041a8016a4200370300200042003703a0012001411420" - "0041a0016a22034120100d22014120470d01200341204100100e22044100" - "4a044041c18cc00041232004ad10011a2000420037036020044182801820" - "0041e0006a22014108100f220341004c0d032003410846044041e48cc000" - "412a420810011a418e8dc000412e20014108410110021a0c070b41bc8dc0" - "00412e2003ad10011a200041186a200041e0006a2003101a41ea8dc00041" - "162000280218200028021c410110021a0c060b41a290c000413c2004ac10" - "011a200041d8016a4200370300200041d0016a4200370300200041c8016a" - "4200370300200042003703c001410141828018200041c0016a4120100f22" - "014100480d030c040b000b41f692c000412e2001ac10011a41ef7c21020c" - "050b41808ec000412b2003ac10011a0c020b41de90c00041c1002001ac10" - "011a0b200041013b00604101200041e0006a4102200041c0016a41201010" - "22014100480440419f91c00041352001ac10011a0b41014183803c101122" - "01410048044041d491c00041322001ac10011a0b4101200041e0006a4102" - "101222014100480440418692c00041392001ac10011a0b41bf92c0004137" - "41014100410110021a0c010b200041013b004c200041d8016a4200370300" - "200041d0016a4200370300200041c8016a4200370300200042003703c001" - "02402004200041cc006a4102200041c0016a220141201010220341004e04" - "4041ab8ec000411b2003ad10011a200041106a20012003101941c68ec000" - "411420002802102000280214410110021a0c010b41da8ec00041312003ac" - "10011a0b418b8fc000412320044183803c1011ac10011a02402004200041" - "cc006a41021012220141004e044041ae8fc000411b2001ad10011a0c010b" - "41c98fc00041352001ac10011a0b41fe8fc000412441014100410110021a" - "0b41a493c000412f41014100410110021a200041c0016a2201101b200041" - "cc006a22042001101c200041f8006a4200370300200041f0006a42003703" - "00200041e8006a4200370300200042003703600240024002400240024002" - "4020044114200041e0006a22034120100d2201412046044041d393c00041" - "0f20034120410110021a20004198016a420037030020004190016a420037" - "030020004188016a42003703002000420037038001024020044114200441" - "1441e293c000410920004180016a220141201013220341004a0440200041" - "086a20012003101941ea93c00041122000280208200028020c410110021a" - "0c010b41fc93c000413c2003ac10011a0b200041b8016a22064200370300" - "200041b0016a22024200370300200041a8016a2205420037030020004200" - "3703a001200041cc006a2203411441e807200041a0016a22084120101422" - "014120470d0141b894c000410e20084120410110021a200041d8016a4200" - "370300200041d0016a4200370300200041c8016a42003703002000420037" - "03c00120034114412a200041c0016a22044120101522014120470d0241c6" - "94c000410e20044120410110021a41d494c000412441014100410110021a" - "41cd95c000412541014100410110021a20004198016a4200370300200041" - "90016a420037030020004188016a4200370300200042003703800141f295" - "c000411720004180016a22034120101622014120470d03418996c000410b" - "41f295c0004117410110021a419496c000411120034120410110021a2004" - "101b200041e0006a22072004101c20064200370300200242003703002005" - "4200370300200042003703a0010240200422022002410020026b41037122" - "036a22054f0d0020030440200321010340200241003a0000200241016a21" - "02200141016b22010d000b0b200341016b4107490d000340200241003a00" - "00200241076a41003a0000200241066a41003a0000200241056a41003a00" - "00200241046a41003a0000200241036a41003a0000200241026a41003a00" - "00200241016a41003a0000200241086a22022005470d000b0b2005418002" - "20036b2201417c716a220220054b0440034020054100360200200541046a" - "22052002490d000b0b024020022001410371220120026a22034f0d002001" - "220504400340200241003a0000200241016a2102200541016b22050d000b" - "0b200141016b4107490d000340200241003a0000200241076a41003a0000" - "200241066a41003a0000200241056a41003a0000200241046a41003a0000" - "200241036a41003a0000200241026a41003a0000200241016a41003a0000" - "200241086a22022003470d000b0b02402007411420084120200441800210" - "17220141004a044041a596c00041102001ad10011a20014181024f0d0641" - "b596c000410920042001410110021a0c010b41be96c000412e2001ac1001" - "1a0b41ec96c000411241fe96c00041074101100222014100480d05418597" - "c000411d2001ad10011a41a297c0004111422a10014100480d0641b397c0" - "00411c420010011a4101210241cf97c000411a41014100410110021a41bb" - "98c000412941014100410110021a41e498c000412810182201450440418c" - "99c000412741e498c0004128410110021a41b399c000411e410141004101" - "10021a41ce80c000412841014100410110021a0c080b41d199c000411a20" - "01ac10011a41c37a21020c070b41b095c000411d2001ac10011a418b7c21" - "020c060b419495c000411c2001ac10011a41897c21020c050b41f894c000" - "411c2001ac10011a41887c21020c040b419998c00041222001ac10011a41" - "a77b21020c030b000b418398c00041162001ac10011a41a57b21020c010b" - "41e997c000411a42a47b10011a41a47b21020b200041c0036a240020020b" - "0bf5190100418080c0000beb196572726f725f636f64653d3d3d3d20484f" - "53542046554e4354494f4e532054455354203d3d3d54657374696e672032" - "3620686f73742066756e6374696f6e732028372063617465676f72696573" - "29535543434553533a20416c6c20686f73742066756e6374696f6e207465" - "73747320706173736564212d2d2d2043617465676f727920313a204c6564" - "676572204865616465722046756e6374696f6e73202d2d2d4c6564676572" - "2073657175656e6365206e756d6265722062797465733a4c656467657220" - "73716e20646174613a506172656e74206c65646765722074696d65206279" - "7465733a506172656e742074696d6520646174613a506172656e74206c65" - "6467657220686173683a535543434553533a204c65646765722068656164" - "65722066756e6374696f6e734552524f523a206765745f706172656e745f" - "6c65646765725f686173682077726f6e67206c656e6774683a4552524f52" - "3a206765745f706172656e745f6c65646765725f74696d65206661696c65" - "643a4552524f523a206765745f6c65646765725f73716e206661696c6564" - "3a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" - "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e2041" - "63636f756e743a5472616e73616374696f6e20466565206c656e6774683a" - "5472616e73616374696f6e20466565202873657269616c697a6564205852" - "5020616d6f756e74293a5472616e73616374696f6e2053657175656e6365" - "3a4e6573746564206669656c64206c656e6774683a4e6573746564206669" - "656c643a494e464f3a206765745f74785f6e65737465645f6669656c6420" - "6e6f74206170706c696361626c653a5369676e657273206172726179206c" - "656e6774683a4d656d6f73206172726179206c656e6774683a4e65737465" - "64206172726179206c656e6774683a494e464f3a206765745f74785f6e65" - "737465645f61727261795f6c656e206e6f74206170706c696361626c653a" - "535543434553533a205472616e73616374696f6e20646174612066756e63" - "74696f6e734552524f523a206765745f74785f6669656c64285365717565" - "6e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" - "785f6669656c6428466565292077726f6e67206c656e6774682028657870" - "6563746564203820627974657320666f7220585250293a4552524f523a20" - "6765745f74785f6669656c64284163636f756e74292077726f6e67206c65" - "6e6774683a2d2d2d2043617465676f727920333a2043757272656e74204c" - "6564676572204f626a6563742046756e6374696f6e73202d2d2d43757272" - "656e74206f626a6563742062616c616e6365206c656e6774682028585250" - "20616d6f756e74293a43757272656e74206f626a6563742062616c616e63" - "65202873657269616c697a65642058525020616d6f756e74293a43757272" - "656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e" - "2d58525020616d6f756e74293a43757272656e74206f626a656374206261" - "6c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" - "5f6f626a5f6669656c642842616c616e636529206661696c656420286d61" - "79206265206578706563746564293a43757272656e74206c656467657220" - "6f626a656374206163636f756e743a494e464f3a206765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c64284163636f756e74292066" - "61696c65643a43757272656e74206e6573746564206669656c64206c656e" - "6774683a43757272656e74206e6573746564206669656c643a494e464f3a" - "206765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f6669656c64206e6f74206170706c696361626c653a43757272656e7420" - "6f626a656374205369676e657273206172726179206c656e6774683a4375" - "7272656e74206e6573746564206172726179206c656e6774683a494e464f" - "3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465" - "645f61727261795f6c656e206e6f74206170706c696361626c653a535543" - "434553533a2043757272656e74206c6564676572206f626a656374206675" - "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564" - "676572204f626a6563742046756e6374696f6e73202d2d2d537563636573" - "7366756c6c7920636163686564206f626a65637420696e20736c6f743a43" - "6163686564206f626a6563742062616c616e6365206c656e677468202858" - "525020616d6f756e74293a436163686564206f626a6563742062616c616e" - "6365202873657269616c697a65642058525020616d6f756e74293a436163" - "686564206f626a6563742062616c616e6365206c656e67746820286e6f6e" - "2d58525020616d6f756e74293a436163686564206f626a6563742062616c" - "616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c" - "642842616c616e636529206661696c65643a436163686564206e65737465" - "64206669656c64206c656e6774683a436163686564206e65737465642066" - "69656c643a494e464f3a206765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64206e6f74206170706c696361626c653a436163686564" - "206f626a656374205369676e657273206172726179206c656e6774683a43" - "6163686564206e6573746564206172726179206c656e6774683a494e464f" - "3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" - "6c656e206e6f74206170706c696361626c653a535543434553533a20416e" - "79206c6564676572206f626a6563742066756e6374696f6e73494e464f3a" - "2063616368655f6c65646765725f6f626a206661696c6564202865787065" - "6374656420776974682074657374206669787475726573293a494e464f3a" - "206765745f6c65646765725f6f626a5f6669656c64206661696c65642061" - "7320657870656374656420286e6f20636163686564206f626a656374293a" - "494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669" - "656c64206661696c65642061732065787065637465643a494e464f3a2067" - "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c6564" - "2061732065787065637465643a494e464f3a206765745f6c65646765725f" - "6f626a5f6e65737465645f61727261795f6c656e206661696c6564206173" - "2065787065637465643a535543434553533a20416e79206c656467657220" - "6f626a6563742066756e6374696f6e732028696e74657266616365207465" - "73746564294552524f523a206163636f756e745f6b65796c657420666169" - "6c656420666f722063616368696e6720746573743a2d2d2d204361746567" - "6f727920353a204b65796c65742047656e65726174696f6e2046756e6374" - "696f6e73202d2d2d4163636f756e74206b65796c65743a54657374547970" - "6543726564656e7469616c206b65796c65743a494e464f3a206372656465" - "6e7469616c5f6b65796c6574206661696c65642028657870656374656420" - "2d20696e74657266616365206973737565293a457363726f77206b65796c" - "65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" - "65742067656e65726174696f6e2066756e6374696f6e734552524f523a20" - "6f7261636c655f6b65796c6574206661696c65643a4552524f523a206573" - "63726f775f6b65796c6574206661696c65643a4552524f523a206163636f" - "756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f7279" - "20363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f" - "2c205852504c205741534d20776f726c6421496e70757420646174613a53" - "48413531322068616c6620686173683a4e46542064617461206c656e6774" - "683a4e465420646174613a494e464f3a206765745f6e6674206661696c65" - "6420286578706563746564202d206e6f2073756368204e4654293a546573" - "74207472616365206d6573736167657061796c6f61645472616365206675" - "6e6374696f6e206279746573207772697474656e3a54657374206e756d62" - "657220747261636554726163655f6e756d2066756e6374696f6e20737563" - "636565646564535543434553533a205574696c6974792066756e6374696f" - "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552" - "524f523a2074726163652829206661696c65643a4552524f523a20636f6d" - "707574655f7368613531325f68616c66206661696c65643a2d2d2d204361" - "7465676f727920373a2044617461205570646174652046756e6374696f6e" - "73202d2d2d55706461746564206c656467657220656e7472792064617461" - "2066726f6d205741534d20746573745375636365737366756c6c79207570" - "6461746564206c656467657220656e74727920776974683a535543434553" - "533a2044617461207570646174652066756e6374696f6e734552524f523a" - "207570646174655f64617461206661696c65643a00550970726f64756365" - "727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38362e302d6e696768746c79202862336233" - "363861313820323032352d30312d30352900490f7461726765745f666561" - "7475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c" - "7565"; +extern std::string const allHostFunctionsWasmHex = + "0061736d0100000001540c60047f7f7f7f017f60027f7f017f60037f7f7f017f60057f7f7f" + "7f7f017f6000017f60017f017f60037f7f7f0060037f7f7e017f60087f7f7f7f7f7f7f7f01" + "7f60067f7f7f7f7f7f017f60017f0060027f7f0002ae061a08686f73745f6c69620c676574" + "5f74785f6669656c64000208686f73745f6c69620974726163655f6e756d000708686f7374" + "5f6c6962057472616365000308686f73745f6c69620e6765745f6c65646765725f73716e00" + "0408686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500040868" + "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000108686f7374" + "5f6c69620d74726163655f6163636f756e74000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61727261795f" + "6c656e000508686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" + "6e000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f66" + "69656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c64000008686f73745f6c6962206765745f63757272656e74" + "5f6c65646765725f6f626a5f61727261795f6c656e000508686f73745f6c6962276765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e0001" + "08686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f6c69621063" + "616368655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c6564676572" + "5f6f626a5f6669656c64000008686f73745f6c69621b6765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c64000308686f73745f6c6962186765745f6c65646765725f6f62" + "6a5f61727261795f6c656e000108686f73745f6c69621f6765745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e000208686f73745f6c69621163726564656e7469" + "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" + "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" + "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" + "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" + "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" + "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a801c051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" + "6a22044100360200200141106a220542003703002001420037030802404181802020014108" + "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" + "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bea1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c00041281019220145044041d098c000412741a898c000412841" + "0110021a41f798c000411e41004100410010021a41bf80c000412841004100410010021a41" + "010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac10011a41" + "8b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10011a" + "41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c00041162001ac" + "10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b0bb9" + "190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e435449" + "4f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e73" + "535543434553533a20416c6c20686f73742066756e6374696f6e2074657374732070617373" + "6564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e63" + "74696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e" + "74206c65646765722074696d653a506172656e74206c656467657220686173683a53554343" + "4553533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765" + "745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a455252" + "4f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a455252" + "4f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f72" + "7920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472" + "616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e" + "6774683a5472616e73616374696f6e20466565202873657269616c697a6564205852502061" + "6d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e6573746564206669" + "656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f" + "6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e6572732061" + "72726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e6573746564" + "206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e7361" + "6374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f666965" + "6c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f" + "74785f6669656c6428466565292077726f6e67206c656e6774682028657870656374656420" + "3820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" + "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a" + "2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43" + "757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f" + "756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a" + "65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a65" + "63742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f" + "626a5f6669656c642842616c616e636529206661696c656420286d61792062652065787065" + "63746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a49" + "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c6428416363" + "6f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e" + "6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f7420617070" + "6c696361626c653a43757272656e74206f626a656374205369676e65727320617272617920" + "6c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e" + "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e" + "74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f7279" + "20343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d5375" + "636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a43616368" + "6564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e7429" + "3a436163686564206f626a6563742062616c616e6365202873657269616c697a6564205852" + "5020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e6774" + "6820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c61" + "6e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e63" + "6529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a" + "436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a4361636865" + "64206f626a656374205369676e657273206172726179206c656e6774683a43616368656420" + "6e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53" + "5543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e" + "464f3a2063616368655f6c65646765725f6f626a206661696c656420286578706563746564" + "20776974682074657374206669787475726573293a494e464f3a206765745f6c6564676572" + "5f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163" + "686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64206661696c65642061732065787065637465643a494e464f3a20676574" + "5f6c65646765725f6f626a5f61727261795f6c656e206661696c6564206173206578706563" + "7465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e206661696c65642061732065787065637465643a535543434553533a20416e7920" + "6c6564676572206f626a6563742066756e6374696f6e732028696e74657266616365207465" + "73746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f72" + "2063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c657420" + "47656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65" + "743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a20637265" + "64656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e74" + "657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b65" + "796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374" + "696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f52" + "3a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e74" + "5f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c6974" + "792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" + "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461" + "206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c6564" + "20286578706563746564202d206e6f2073756368204e4654293a5465737420747261636520" + "6d6573736167657061796c6f616454726163652066756e6374696f6e206279746573207772" + "697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" + "74696f6e20737563636565646564535543434553533a205574696c6974792066756e637469" + "6f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a2074" + "726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68" + "616c66206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174" + "652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064" + "6174612066726f6d205741534d20746573745375636365737366756c6c7920757064617465" + "64206c656467657220656e74727920776974683a535543434553533a204461746120757064" + "6174652066756e6374696f6e734552524f523a207570646174655f64617461206661696c65" + "643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; -std::string const deepRecursionHex = +extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" @@ -9914,277 +9853,278 @@ extern std::string const allKeyletsWasmHex = "6c746976616c7565"; extern std::string const codecovTestsWasmHex = - "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60067f" - "7f7f7f7f7f017f60037f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" + "7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f6003" "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" - "7472616365000208686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" - "0e6765745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000008686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000008686f73745f6c6962176765745f6c65646765725f6163636f75" - "6e745f68617368000008686f73745f6c6962126765745f6c65646765725f74785f68617368" - "000008686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" - "6d656e646d656e745f656e61626c6564000008686f73745f6c69620c6765745f74785f6669" - "656c64000408686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" - "6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000408686f73745f6c6962146765" - "745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f" - "6e65737465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621b676574" - "5f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c69621067" + "7472616365000108686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" + "0e6765745f6c65646765725f73716e000408686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000408686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" + "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" + "000208686f73745f6c69620c6765745f626173655f666565000408686f73745f6c69621161" + "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" + "656c64000508686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" + "6c69621063616368655f6c65646765725f6f626a000508686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000508686f73745f6c6962146765" + "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" + "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" - "5f6c65646765725f6f626a5f61727261795f6c656e000008686f73745f6c6962176765745f" - "74785f6e65737465645f61727261795f6c656e000008686f73745f6c6962276765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00000868" + "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" + "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000408686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" - "636f6d707574655f7368613531325f68616c66000108686f73745f6c696209636865636b5f" + "656e000508686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" + "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" - "5f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e00" - "0108686f73745f6c69620d6765745f6e66745f666c616773000008686f73745f6c69621467" - "65745f6e66745f7472616e736665725f666565000008686f73745f6c69620e6765745f6e66" - "745f73657269616c000108686f73745f6c69620d74726163655f6163636f756e7400010868" - "6f73745f6c69620c74726163655f616d6f756e74000108686f73745f6c69620b6c696e655f" + "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" + "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" + "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" + "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" + "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620b6c696e655f" "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" - "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400020868" + "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400010868" "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" - "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000208686f7374" - "5f6c6962136d70745f69737375616e63655f6b65796c6574000208686f73745f6c6962106e" - "66745f6f666665725f6b65796c6574000208686f73745f6c69620c6f666665725f6b65796c" - "6574000208686f73745f6c69620d6f7261636c655f6b65796c6574000208686f73745f6c69" + "65796c6574000008686f73745f6c69620d657363726f775f6b65796c6574000108686f7374" + "5f6c6962136d70745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e" + "66745f6f666665725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c" + "6574000108686f73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69" "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" - "6e65645f646f6d61696e5f6b65796c6574000208686f73745f6c69620e7369676e6572735f" - "6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574000208686f73" - "745f6c69620c7661756c745f6b65796c657400020303020a0505030100110619037f014180" - "80c0000b7f0041f599c0000b7f0041809ac0000b072e04066d656d6f727902000666696e69" - "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020adf25024600" + "6e65645f646f6d61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f" + "6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73" + "745f6c69620c7661756c745f6b65796c657400010303020a0405030100110619037f014180" + "80c0000b7f0041959ac0000b7f0041a09ac0000b072e04066d656d6f727902000666696e69" + "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8026024600" "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" - "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b952502087f" - "027e230041f0016b22002400419680c000412341004100410010001a200041003602602000" - "41e0006a220141041002410441b88ac000410e103420004100360260200141041003410441" - "c68ac00041161034200041f8006a22044200370300200041f0006a22034200370300200041" - "e8006a2202420037030020004200370360200141201004412041dc8ac00041161034200442" - "00370300200342003703002002420037030020004200370360200141201005412041f28ac0" - "00411710342004420037030020034200370300200242003703002000420037036020014120" - "1006412041898bc000411210341007410a41b980c000410c1034200041206a428182848890" - "a0c08001370300200041186a428182848890a0c08001370300200041106a428182848890a0" - "c080013703002000428182848890a0c0800137030841c580c000410e1008410141d380c000" - "41111034200041086a41201008410141d380c0004111103420034100360200200242003703" - "0020004200370360024041818020200141141009220541144604402000412e6a20002d0062" - "3a0000200020002900673703c8012000200041ec006a2900003700cd01200041386a200029" - "00cd01370000200020002f01603b012c2000200028006336002f200020002903c801370033" - "200442003703002003420037030020024200370300200042003703602000412c6a41142001" - "4120100a22044120470d01200041c2006a20002d00623a0000200041d0016a200041ef006a" - "2900002208370300200041d8016a200041f7006a2900002209370300200041cf006a200837" - "0000200041d7006a2009370000200041df006a200041ff006a2d00003a0000200020002f01" - "603b01402000200028006336004320002000290067370047200041406b41204100100b4101" - "41e480c0004110103420034100360200200242003703002000420037036041818020200141" - "14100c4114419b8bc000411c10342003410036020020024200370300200042003703604101" - "4181802020014114100d411441b78bc0004114103402402001410020016b41037122036a22" - "0220014d0d0020030440200321040340200141003a0000200141016a2101200441016b2204" - "0d000b0b200341016b4107490d000340200141003a0000200141076a41003a000020014106" - "6a41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a000020" - "0141026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c4" - "0020036b2203417c716a220120024b0440034020024100360200200241046a22022001490d" - "000b0b024020012003410371220320016a22044f0d002003220204400340200141003a0000" - "200141016a2101200241016b22020d000b0b200341016b4107490d000340200141003a0000" - "200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a4100" - "3a0000200141036a41003a0000200141026a41003a0000200141016a41003a000020014108" - "6a22012004470d000b0b2000418180203602c801410021010340200741c000490440200041" - "e0006a20076a200041c8016a20016a2d00003a0000200020002802a00141016a22073602a0" - "01200141016a22014104470d010b0b200041d8016a22024100360200200041d0016a220542" - "00370300200042003703c801200041e0006a22012007200041c8016a22044114100e411441" - "cb8bc000411310342002410036020020054200370300200042003703c801200120002802a0" - "0120044114100f411441de8bc0004123103420024100360200200542003703002000420037" - "03c8014101200120002802a001200441141010411441818cc000411b10344189803c101141" - "2041f480c000411010344189803c10124120418481c0004120103441014189803c10134120" - "41a481c00041181034200120002802a0011014412041bc81c00041171034200120002802a0" - "011015412041d381c000412710344101200120002802a0011016412041fa81c000411f1034" - "2000412c6a2203411410174100419982c000410b1034200041e0016a220742003703002002" - "420037030020054200370300200042003703c801200120002802a001200441201018412041" - "9c8cc0004113103441a482c000410c41b082c000410b41bb82c000410e1019410141c982c0" - "0041091034200041c0016a200041206a290300370300200041b8016a200041186a29030037" - "0300200041b0016a200041106a290300370300200020002903083703a801200241003b0100" - "20054200370300200042003703c80120034114200041a8016a2206412020044112101a4112" - "41af8cc000410710342002410036020020054200370300200042003703c801200641202004" - "4114101b411441b68cc000410e1034200041003602c8012006412020044104101c410441c4" - "8cc000410d103420064120101d410841d282c000410d103420064120101e410a41df82c000" - "41141034200041003602c8012006412020044104101f410441d18cc000410e1034417f4104" - "1002417141f382c00041161034200041003602c8012004417f1002417141df8cc000411610" - "34200041ca016a41003a0000200041003b01c801200441031002417d41f58cc000411c1034" - "200041003602c8012004418094ebdc031002417341918dc000411b1034418983c000410d20" - "0341141020412f419683c000410d1034418983c000410d41a383c00041081021411341ab83" - "c000410c103441021011416f41b783c000411f1034417f20002802a0011014417141d683c0" - "00411f10342001417f1014417141f583c000411f1034200141812010144174419484c00041" - "201034200041e094ebdc036a220620002802a0011014417341b484c000411f103420062000" - "2802a0014101100b417341d384c00041181034200120002802a0014101100b417141eb84c0" - "00411a1034200742003703002002420037030020054200370300200042003703c801200620" - "002802a00120044120100a417341ac8dc00041161034200742003703002002420037030020" - "054200370300200042003703c801200120002802a00120044120100a417141c28dc0004118" - "1034200742003703002002420037030020054200370300200042003703c801200341142003" - "4114200620002802a001200441201022417341da8dc000411c103420074200370300200242" - "0037030020054200370300200042003703c8012003411420034114200120002802a0012004" - "41201022417141f68dc000411e103420074200370300200242003703002005420037030020" - "0042003703c80141e199c0004114200620002802a001200441201023417341948ec0004119" - "1034200742003703002002420037030020054200370300200042003703c80141e199c00041" - "14200120002802a001200441201023417141ad8ec000411f10342007420037030020024200" - "37030020054200370300200042003703c80141e199c0004114418585c00041142004412010" - "23417141cc8ec00041291034200041dc016a2000413c6a280100360200200041d4016a2000" - "41346a2901003702002000200029012c3702cc01200041808080083602c801200041003b01" - "ec012004411841e199c0004114200041ec016a220241021023417141f58ec000410e103420" - "0620002802a001422a10014173419985c00041111034200041003b01ec0141022002410210" - "09416f41838fc000411b1034200041003b01ec01410220024102100c416f419e8fc000412b" - "1034200041003b01ec014101410220024102100d416f41c98fc0004123103441021011416f" - "41b783c000411f103441021012416f41aa85c000412f1034410141021013416f41d985c000" - "4127103441c580c00041812010084174418086c000411f103441c580c00041c10010084174" - "419f86c000411a1034200041003b01ec01200141812020024102100e417441ec8fc0004121" - "1034200041003b01ec01200141812020024102100f4174418d90c00041311034200041003b" - "01ec0141012001418120200241021010417441be90c0004129103420014181201014417441" - "b986c0004125103420014181201015417441de86c000413510344101200141812010164174" - "419387c000412d103420014181201017417441c087c00041191034418983c00041812041b0" - "82c000410b41bb82c000410e1019417441c982c00041091034418983c000410d41b082c000" - "41812041bb82c000410e1019417441c982c00041091034418983c000410d41b082c000410b" - "41bb82c0004181201019417441c982c00041091034200041003b01ec012001418120200241" - "021018417441e790c00041211034200041003b01ec0141e199c00041812041e199c0004114" - "2002410210234174418891c00041181034200041003b01ec01200341142003411420014181" - "20200241021024417441a091c000411f1034200041003b01ec012004418120200341142002" - "41021025417441bf91c00041221034418983c000410d200620002802a00141001000417341" - "d987c000410f1034418983c000410d200620002802a0011021417341e887c0004116103420" - "0120002802a0014100100b417141fe87c00041231034200041003b01ec0120034114200120" - "002802a00120024102101a417141e191c000411a1034200041003b01ec01200120002802a0" - "0120024102101b417141fb91c00041211034200041003b01ec01200120002802a001200241" - "02101c4171419c92c00041201034200120002802a001101d417141a188c000412010342001" - "20002802a001101e417141c188c00041271034200041003602ec01200120002802a0012002" - "4104101f417141bc92c00041211034200041003b01ec01200120002802a00120024102100a" - "417141dd92c00041231034200041003b01ec01200120002802a00141012002410210264171" - "418093c00041211034200041003b01ec01200120002802a001220520034114200120052002" - "41021024417141a193c00041271034200041003b01ec0120034114200120002802a0012205" - "20012005200241021024417141c893c00041271034200041003b01ec01200120002802a001" - "20034114200241021027417141ef93c00041251034200041003b01ec012003411420012000" - "2802a0012002410210274171419494c00041251034200041003b01ec01200120002802a001" - "20034114200241021028417141b994c000412c1034200041003b01ec012003411420012000" - "2802a001200241021028417141e594c000412c1034200041003b01ec01200120002802a001" - "2002410210294171419195c000411f1034200041003b01ec01200120002802a00141012002" - "4102102a417141b095c00041221034200041003b01ec01200120002802a001200341144185" - "85c0004114200241021022417141d295c00041211034200041003b01ec0120034114200120" - "002802a001418585c0004114200241021022417141f395c00041211034200041003b01ec01" - "200120002802a001410120024102102b4171419496c00041281034200041003b01ec012004" - "4118200120002802a001200241021025417141bc96c00041231034200041003b01ec012001" - "20002802a001410120024102102c417141df96c00041251034200041003b01ec0120012000" - "2802a001410120024102102d4171418497c00041211034200041003b01ec01200120002802" - "a001410120024102102e417141a597c00041221034200041003b01ec01200120002802a001" - "20034114410120024102102f417141c797c00041241034200041003b01ec01200341142001" - "20002802a001410120024102102f417141eb97c00041241034200041003b01ec0120012000" - "2802a00141012002410210304171418f98c000412f1034200041003b01ec01200120002802" - "a001200241021031417141be98c00041231034200041003b01ec01200120002802a0014101" - "200241021032417141e198c00041221034200041003b01ec01200120002802a00141012002" - "410210334171418399c00041211034200041003b01ec01200120002802a00141e888c00041" - "2020024102101a417141a499c000411c1034418983c000410d200120002802a00110204171" - "418889c00041221034418997abdd03410d41e888c000412041001000417341aa89c0004110" - "1034418997abdd03410d200341141020417341ba89c00041181034418997abdd03410d41a3" - "83c00041081021417341d289c00041171034200120002802a0012001418120410010004174" - "41e989c000410e1034200141812042011001417441f789c00041121034418983c000418120" - "200341141020417441898ac00041161034418983c00041812041a383c00041081021417441" - "898ac00041161034418983c000410d200120002802a00110214171419f8ac0004119103420" - "0041003b01ec01200120002802a00120034114200241021025417141c099c0004121103420" - "0041f0016a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c0" - "00410b417f20042004417f4e1bac1001000b0beb190100418080c0000be1196572726f725f" - "636f64653d54455354204641494c45442424242424205354415254494e47205741534d2045" - "5845435554494f4e2024242424246765745f626173655f666565746573745f616d656e646d" - "656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a67" - "65745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" - "5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e676574" - "5f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765" - "725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f" - "6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65737361" - "676574657374207075626b657974657374207369676e6174757265636865636b5f73696767" - "65745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c" - "65646765725f73716e5f6e65675f70747274657374696e6720747261636574726163655f61" - "63636f756e74400000000000005f74726163655f616d6f756e746765745f74785f61727261" - "795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f617272" - "61795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e" - "5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c" - "6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62636163" - "68655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a" - "5f77726f6e675f6c656e555344303030303030303030303030303030303074726163655f6e" - "756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61727261" - "795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6172" - "7261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c" - "65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f746f6f" - "5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f" - "736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6172" - "7261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e" - "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174655f64" - "6174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472616365" - "5f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f77726f" - "6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e675f7369" - "7a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f6e675f" - "73697a655f75696e7432353630303030303030303030303030303030303030303030303030" - "3030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f75" - "6e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f6f6f62" - "5f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f74" - "6f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6163636f756e" - "745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774686765" - "745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d65676574" - "5f706172656e745f6c65646765725f686173686765745f6c65646765725f6163636f756e74" - "5f686173686765745f6c65646765725f74785f686173686765745f63757272656e745f6c65" - "646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c64676574" - "5f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f66" - "69656c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e6674" - "5f6973737565726765745f6e66745f7461786f6e6765745f6e66745f73657269616c676574" - "5f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f627566" - "5f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e67" - "6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f" - "77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e6379" - "6c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b6579" - "6c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e" - "675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f" - "7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f" - "6669656c645f696e76616c69645f736669656c646765745f63757272656e745f6c65646765" - "725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f" - "6f626a5f6669656c645f696e76616c69645f736669656c646765745f74785f6e6573746564" - "5f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765" - "725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c" - "65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c69636563" - "6f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b" - "65796c65745f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f" - "746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f73" - "6c6963655f6d707469646765745f6e66745f77726f6e675f73697a655f75696e7432353667" - "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" - "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" - "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" - "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" - "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" - "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" - "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" - "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" - "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" - "616c7565"; + "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000bb62502087f" + "027e230041f0016b22002400419680c000412341004100410010001a100241b9e00041b980" + "c000410e1034100341b2920441c780c00041161034200041f8006a22044200370300200041" + "f0006a22034200370300200041e8006a2202420037030020004200370360200041e0006a22" + "0141201004412041e48ac00041161034200442003703002003420037030020024200370300" + "20004200370360200141201005412041fa8ac0004117103420044200370300200342003703" + "002002420037030020004200370360200141201006412041918bc000411210341007410a41" + "dd80c000410c1034200041206a428182848890a0c08001370300200041186a428182848890" + "a0c08001370300200041106a428182848890a0c080013703002000428182848890a0c08001" + "37030841e980c000410e1008410141f780c00041111034200041086a41201008410141f780" + "c0004111103420034100360200200242003703002000420037036002404181802020014114" + "1009220541144604402000412e6a20002d00623a0000200020002900673703c80120002000" + "41ec006a2900003700cd01200041386a20002900cd01370000200020002f01603b012c2000" + "200028006336002f200020002903c801370033200442003703002003420037030020024200" + "370300200042003703602000412c6a411420014120100a22044120470d01200041c2006a20" + "002d00623a0000200041d0016a200041ef006a2900002208370300200041d8016a200041f7" + "006a2900002209370300200041cf006a2008370000200041d7006a2009370000200041df00" + "6a200041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000" + "290067370047200041406b41204100100b4101418881c00041101034200341003602002002" + "4200370300200042003703604181802020014114100c411441a38bc000411c103420034100" + "360200200242003703002000420037036041014181802020014114100d411441bf8bc00041" + "14103402402001410020016b41037122036a220220014d0d00200304402003210403402001" + "41003a0000200141016a2101200441016b22040d000b0b200341016b4107490d0003402001" + "41003a0000200141076a41003a0000200141066a41003a0000200141056a41003a00002001" + "41046a41003a0000200141036a41003a0000200141026a41003a0000200141016a41003a00" + "00200141086a22012002470d000b0b200241c40020036b2203417c716a220120024b044003" + "4020024100360200200241046a22022001490d000b0b024020012003410371220320016a22" + "044f0d002003220204400340200141003a0000200141016a2101200241016b22020d000b0b" + "200341016b4107490d000340200141003a0000200141076a41003a0000200141066a41003a" + "0000200141056a41003a0000200141046a41003a0000200141036a41003a0000200141026a" + "41003a0000200141016a41003a0000200141086a22012004470d000b0b2000418180203602" + "c801410021010340200741c000490440200041e0006a20076a200041c8016a20016a2d0000" + "3a0000200020002802a00141016a22073602a001200141016a22014104470d010b0b200041" + "d8016a22024100360200200041d0016a22054200370300200042003703c801200041e0006a" + "22012007200041c8016a22044114100e411441d38bc0004113103420024100360200200542" + "00370300200042003703c801200120002802a00120044114100f411441e68bc00041231034" + "2002410036020020054200370300200042003703c8014101200120002802a0012004411410" + "10411441898cc000411b10344189803c10114120419881c000411010344189803c10124120" + "41a881c0004120103441014189803c1013412041c881c00041181034200120002802a00110" + "14412041e081c00041171034200120002802a0011015412041f781c0004127103441012001" + "20002802a00110164120419e82c000411f10342000412c6a220341141017410041bd82c000" + "410b1034200041e0016a220742003703002002420037030020054200370300200042003703" + "c801200120002802a001200441201018412041a48cc0004113103441c882c000410c41d482" + "c000410b41df82c000410e1019410141ed82c00041091034200041c0016a200041206a2903" + "00370300200041b8016a200041186a290300370300200041b0016a200041106a2903003703" + "00200020002903083703a801200241003b010020054200370300200042003703c801200341" + "14200041a8016a2206412020044112101a411241b78cc00041071034200241003602002005" + "4200370300200042003703c8012006412020044114101b411441be8cc000410e1034200041" + "003602c8012006412020044104101c410441cc8cc000410d103420064120101d410841f682" + "c000410d103420064120101e410a418383c00041141034200041003602c801200641202004" + "4104101f410441d98cc000410e1034419783c000410d200341141020412f41a483c000410d" + "1034419783c000410d41b183c00041081021411341b983c000410c1034417f410410044171" + "41c583c000411e1034200041003602c8012004417f1004417141e78cc000411e1034200041" + "ca016a41003a0000200041003b01c801200441031004417d41858dc0004124103420004100" + "3602c8012004418094ebdc031004417341a98dc00041231034419783c000410d2003411410" + "20412f41a483c000410d1034419783c000410d41b183c00041081021411341b983c000410c" + "103441021011416f41e383c000411f1034417f20002802a00110144171418284c000411f10" + "342001417f1014417141a184c000411f103420014181201014417441c084c0004120103420" + "0041e094ebdc036a220620002802a0011014417341e084c000411f1034200620002802a001" + "4101100b417341ff84c00041181034200120002802a0014101100b4171419785c000411a10" + "34200742003703002002420037030020054200370300200042003703c801200620002802a0" + "0120044120100a417341cc8dc0004116103420074200370300200242003703002005420037" + "0300200042003703c801200120002802a00120044120100a417141e28dc000411810342007" + "42003703002002420037030020054200370300200042003703c80120034114200341142006" + "20002802a001200441201022417341fa8dc000411c10342007420037030020024200370300" + "20054200370300200042003703c8012003411420034114200120002802a001200441201022" + "417141968ec000411e10342007420037030020024200370300200542003703002000420037" + "03c80141819ac0004114200620002802a001200441201023417341b48ec000411910342007" + "42003703002002420037030020054200370300200042003703c80141819ac0004114200120" + "002802a001200441201023417141cd8ec000411f1034200742003703002002420037030020" + "054200370300200042003703c80141819ac000411441b185c0004114200441201023417141" + "ec8ec00041291034200041dc016a2000413c6a280100360200200041d4016a200041346a29" + "01003702002000200029012c3702cc01200041808080083602c801200041003b01ec012004" + "411841819ac0004114200041ec016a220241021023417141958fc000410e10342006200028" + "02a001422a1001417341c585c00041111034200041003b01ec014102200241021009416f41" + "a38fc000411b1034200041003b01ec01410220024102100c416f41be8fc000412b10342000" + "41003b01ec014101410220024102100d416f41e98fc0004123103441021011416f41e383c0" + "00411f103441021012416f41d685c000412f1034410141021013416f418586c00041271034" + "41e980c0004181201008417441ac86c000411f103441e980c00041c1001008417441cb86c0" + "00411a1034200041003b01ec01200141812020024102100e4174418c90c000412110342000" + "41003b01ec01200141812020024102100f417441ad90c00041311034200041003b01ec0141" + "012001418120200241021010417441de90c0004129103420014181201014417441e586c000" + "41251034200141812010154174418a87c00041351034410120014181201016417441bf87c0" + "00412d103420014181201017417441ec87c00041191034419783c00041812041d482c00041" + "0b41df82c000410e1019417441ed82c00041091034419783c000410d41d482c00041812041" + "df82c000410e1019417441ed82c00041091034419783c000410d41d482c000410b41df82c0" + "004181201019417441ed82c00041091034200041003b01ec01200141812020024102101841" + "74418791c00041211034200041003b01ec0141819ac00041812041819ac000411420024102" + "1023417441a891c00041181034200041003b01ec0120034114200341142001418120200241" + "021024417441c091c000411f1034200041003b01ec01200441812020034114200241021025" + "417441df91c00041221034419783c000410d200620002802a001410010004173418588c000" + "410f1034419783c000410d200620002802a00110214173419488c000411610342001200028" + "02a0014100100b417141aa88c00041231034200041003b01ec0120034114200120002802a0" + "0120024102101a4171418192c000411a1034200041003b01ec01200120002802a001200241" + "02101b4171419b92c00041211034200041003b01ec01200120002802a00120024102101c41" + "7141bc92c00041201034200120002802a001101d417141cd88c00041201034200120002802" + "a001101e417141ed88c00041271034200041003602ec01200120002802a00120024104101f" + "417141dc92c00041211034200041003b01ec01200120002802a00120024102100a417141fd" + "92c00041231034200041003b01ec01200120002802a0014101200241021026417141a093c0" + "0041211034200041003b01ec01200120002802a00122052003411420012005200241021024" + "417141c193c00041271034200041003b01ec0120034114200120002802a001220520012005" + "200241021024417141e893c00041271034200041003b01ec01200120002802a00120034114" + "2002410210274171418f94c00041251034200041003b01ec0120034114200120002802a001" + "200241021027417141b494c00041251034200041003b01ec01200120002802a00120034114" + "200241021028417141d994c000412c1034200041003b01ec0120034114200120002802a001" + "2002410210284171418595c000412c1034200041003b01ec01200120002802a00120024102" + "1029417141b195c000411f1034200041003b01ec01200120002802a001410120024102102a" + "417141d095c00041221034200041003b01ec01200120002802a0012003411441b185c00041" + "14200241021022417141f295c00041211034200041003b01ec0120034114200120002802a0" + "0141b185c00041142002410210224171419396c00041211034200041003b01ec0120012000" + "2802a001410120024102102b417141b496c00041281034200041003b01ec01200441182001" + "20002802a001200241021025417141dc96c00041231034200041003b01ec01200120002802" + "a001410120024102102c417141ff96c00041251034200041003b01ec01200120002802a001" + "410120024102102d417141a497c00041211034200041003b01ec01200120002802a0014101" + "20024102102e417141c597c00041221034200041003b01ec01200120002802a00120034114" + "410120024102102f417141e797c00041241034200041003b01ec0120034114200120002802" + "a001410120024102102f4171418b98c00041241034200041003b01ec01200120002802a001" + "4101200241021030417141af98c000412f1034200041003b01ec01200120002802a0012002" + "41021031417141de98c00041231034200041003b01ec01200120002802a001410120024102" + "10324171418199c00041221034200041003b01ec01200120002802a0014101200241021033" + "417141a399c00041211034200041003b01ec01200120002802a001419489c0004120200241" + "02101a417141c499c000411c1034419783c000410d200120002802a0011020417141b489c0" + "0041221034419797abdd03410d419489c000412041001000417341d689c000411010344197" + "97abdd03410d200341141020417341e689c00041181034419797abdd03410d41b183c00041" + "081021417341fe89c00041171034200120002802a001200141812041001000417441958ac0" + "00410e1034200141812042011001417441a38ac00041121034419783c00041812020034114" + "1020417441b58ac00041161034419783c00041812041b183c00041081021417441b58ac000" + "41161034419783c000410d200120002802a0011021417141cb8ac00041191034200041003b" + "01ec01200120002802a00120034114200241021025417141e099c00041211034200041f001" + "6a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c000410b41" + "7f20042004417f4e1bac1001000b0b8b1a0100418080c0000b811a6572726f725f636f6465" + "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" + "54494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e745f6c65" + "646765725f74696d656765745f626173655f666565746573745f616d656e646d656e74616d" + "656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" + "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261" + "795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e" + "65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e7570646174655f6461746174657374206d657373616765746573" + "74207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66" + "745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67207472" + "61636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e7467" + "65745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f" + "61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f" + "6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f" + "6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62" + "63616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" + "6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303074726163" + "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" + "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" + "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" + "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" + "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" + "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" + "6163655f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e67" + "5f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f" + "6e675f73697a655f75696e7432353630303030303030303030303030303030303030303030" + "3030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163" + "636f756e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f" + "6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163" + "655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f616363" + "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774" + "686765745f706172656e745f6c65646765725f686173686765745f6c65646765725f616363" + "6f756e745f686173686765745f6c65646765725f74785f686173686765745f63757272656e" + "745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c" + "646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e6674676574" + "5f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e66745f7365726961" + "6c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f7061" + "72656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172" + "656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" + "65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e" + "6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c" + "65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f" + "6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373" + "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f6375727265" + "6e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76" + "616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f666965" + "6c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" + "5f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f" + "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573" + "7465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a" + "5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368" + "613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f" + "5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f73" + "6c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d707469" + "646765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973" + "737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e" + "675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" + "64317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" + "327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "69646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e" + "5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f6475636572" + "7302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374" + "631d312e38352e31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/test/app/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c index 66ed1d42c7d..3458b02872c 100644 --- a/src/test/app/wasm_fixtures/ledgerSqn.c +++ b/src/test/app/wasm_fixtures/ledgerSqn.c @@ -1,11 +1,11 @@ #include int32_t -get_ledger_sqn(uint8_t*, int32_t); +get_ledger_sqn(); // int32_t trace(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); // int32_t trace_num(uint8_t const*, int32_t, int64_t); -uint8_t buf[1024]; +// uint8_t buf[1024]; // char const test_res[] = "sqn: "; // char const test_name[] = "TEST get_ledger_sqn"; @@ -18,10 +18,10 @@ finish() // memset(buf, 0, sizeof(buf)); // for(int i = 0; i < sizeof(buf); ++i) buf[i] = 0; - int x = get_ledger_sqn(buf, sizeof(int32_t)); - if (x >= 0) - x = *((int32_t*)buf); - // trace_num((uint8_t const *)test_res, sizeof(test_res) - 1, x); + int x = get_ledger_sqn(); + // if (x >= 0) + // x = *((int32_t*)buf); + // trace_num((uint8_t const *)test`_res, sizeof(test_res) - 1, x); - return x < 0 ? x : (x >= 5 ? 1 : 0); + return x < 0 ? x : (x >= 5 ? x : 0); } diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 56ce33e69d3..f1332462a49 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -117,13 +117,13 @@ struct HostFunctions return beast::Journal{beast::Journal::getNullSink()}; } - virtual Expected + virtual Expected getLedgerSqn() { return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getParentLedgerTime() { return Unexpected(HostFunctionError::INTERNAL); diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 78fcde3f577..5539a5ef408 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -82,10 +82,10 @@ class WasmHostFunctionsImpl : public HostFunctions return data_; } - Expected + Expected getLedgerSqn() override; - Expected + Expected getParentLedgerTime() override; Expected diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index b7d10026357..dc0524d611a 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -23,14 +23,14 @@ namespace ripple { -using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); +using getLedgerSqn_proto = int32_t(); wasm_trap_t* getLedgerSqn_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getParentLedgerTime_proto = int32_t(uint8_t*, int32_t); +using getParentLedgerTime_proto = int32_t(); wasm_trap_t* getParentLedgerTime_wrap( void* env, diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 050bf643145..4b585acdcd4 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -31,16 +31,22 @@ namespace ripple { -Expected +Expected WasmHostFunctionsImpl::getLedgerSqn() { - return ctx.view().seq(); + auto seq = ctx.view().seq(); + if (seq > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE + return static_cast(seq); } -Expected +Expected WasmHostFunctionsImpl::getParentLedgerTime() { - return ctx.view().parentCloseTime().time_since_epoch().count(); + auto time = ctx.view().parentCloseTime().time_since_epoch().count(); + if (time > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(time); } Expected From 8ac514363d37481a094c97409d54fcba581a2f60 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 29 Aug 2025 10:58:52 -0400 Subject: [PATCH 59/73] get new fees and reserves working (#5714) --- src/test/app/Escrow_test.cpp | 128 ++++++++++++++++++----------- src/xrpld/app/tx/detail/Escrow.cpp | 49 ++++++----- 2 files changed, 108 insertions(+), 69 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6721eed12f9..2923ea84ca5 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1756,7 +1756,8 @@ struct Escrow_test : public beast::unit_test::suite return cfg; }), features); - XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; // create escrow env.fund(XRP(5000), alice, carol); @@ -1767,7 +1768,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 20s), fee(txnFees)); env.close(); } @@ -1775,7 +1776,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + Condition + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 30s), escrow::condition(escrow::cb1), fee(txnFees)); env.close(); @@ -1784,7 +1785,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + FinishAfter + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 40s), escrow::finish_time(env.now() + 2s), fee(txnFees)); env.close(); @@ -1793,7 +1794,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + FinishAfter + Condition + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 50s), escrow::condition(escrow::cb1), escrow::finish_time(env.now() + 2s), fee(txnFees)); @@ -1841,11 +1842,20 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction 0 length env(escrowCreate, escrow::finish_function(""), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 60s), fee(txnFees), ter(temMALFORMED)); env.close(); } + { + // Not enough fees + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 70s), + fee(txnFees - 1), + ter(telINSUF_FEE_P)); + env.close(); + } { // FinishFunction nonexistent host function @@ -1890,7 +1900,8 @@ struct Escrow_test : public beast::unit_test::suite // featureSmartEscrow disabled Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env(escrow::finish(carol, alice, 1), fee(txnFees), escrow::comp_allowance(4), @@ -1929,7 +1940,8 @@ struct Escrow_test : public beast::unit_test::suite for (auto i = env.current()->seq(); i <= 257; ++i) env.close(); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env.fund(XRP(5000), alice, carol); // create escrow @@ -1986,7 +1998,10 @@ struct Escrow_test : public beast::unit_test::suite auto const allowance = 100; env(escrow::finish(carol, alice, seq2), - fee(env.current()->fees().base + allowance), + fee(env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1), escrow::comp_allowance(allowance), ter(tefNO_WASM)); } @@ -2007,6 +2022,17 @@ struct Escrow_test : public beast::unit_test::suite // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; std::uint32_t const allowance = 66; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + auto [createFee, finishFee] = [&]() { + Env env(*this, features); + auto createFee = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + auto finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + return std::make_pair(createFee, finishFee); + }(); { // basic FinishFunction situation @@ -2015,38 +2041,36 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env.close(); @@ -2059,7 +2083,7 @@ struct Escrow_test : public beast::unit_test::suite } env(escrow::finish(alice, alice, seq), - fee(txnFees), + fee(finishFee), escrow::comp_allowance(allowance), ter(tesSUCCESS)); @@ -2084,34 +2108,31 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto const seq = env.seq(alice); // create escrow - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount const createFee = env.current()->fees().base + 1000; env(escrowCreate, escrow::finish_function(wasmHex), escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); + auto const conditionFinishFee = finishFee + + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); - XRPAmount const txnFees = - env.current()->fees().base * 34 + 1000; - // no fulfillment provided, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(escrow::finish(carol, alice, seq), escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb1), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( @@ -2121,21 +2142,21 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb2), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(escrow::finish(alice, alice, seq), escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb1), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2158,37 +2179,35 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; auto const ts = env.now() + 97s; env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(ts), escrow::cancel_time(env.now() + 1000s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); // finish time hasn't passed, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees + 1), + fee(finishFee + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees + 2), + fee(finishFee + 2), ter(tecNO_PERMISSION)); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees + 1), + fee(finishFee + 1), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2210,31 +2229,29 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 2s), escrow::cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); // Don't close the ledger here if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); // finish time hasn't passed, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( @@ -2244,7 +2261,7 @@ struct Escrow_test : public beast::unit_test::suite // finish time has passed, function succeeds, tx succeeds env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2282,7 +2299,8 @@ struct Escrow_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 11s), @@ -2291,17 +2309,23 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees)); env.close(); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT( + (*env.le(alice))[sfOwnerCount] == + (1 + wasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); auto const allowance = 1'000'000; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; // FinishAfter time hasn't passed env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecNO_PERMISSION)); env.close(); env.close(); @@ -2314,7 +2338,7 @@ struct Escrow_test : public beast::unit_test::suite env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2392,7 +2416,8 @@ struct Escrow_test : public beast::unit_test::suite env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env(escrow::create(alice, carol, XRP(1000)), escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 2s), @@ -2403,10 +2428,13 @@ struct Escrow_test : public beast::unit_test::suite env.close(); auto const allowance = 137'596; - + auto const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees)); + fee(finishFee)); env.close(); auto const txMeta = env.meta(); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 4b5a92e8c2b..d0b42e16158 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -127,8 +127,9 @@ EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) XRPAmount txnFees{Transactor::calculateBaseFee(view, tx)}; if (tx.isFieldPresent(sfFinishFunction)) { - // TODO: make this fee increase based on the extra compute run - txnFees += 1000; + // 10 base fees for the transaction (1 is in + // `Transactor::calculateBaseFee`), plus 5 drops per byte + txnFees += 9 * view.fees().base + 5 * tx[sfFinishFunction].size(); } return txnFees; } @@ -503,6 +504,17 @@ escrowLockApplyHelper( return tesSUCCESS; } +template +static uint32_t +calculateAdditionalReserve(T const& finishFunction) +{ + if (!finishFunction) + return 1; + // First 500 bytes included in the normal reserve + // Each additional 500 bytes requires an additional reserve + return 1 + (finishFunction->size() / 500); +} + TER EscrowCreate::doApply() { @@ -546,9 +558,11 @@ EscrowCreate::doApply() // Check reserve and funds availability STAmount const amount{ctx_.tx[sfAmount]}; + auto const reserveToAdd = + calculateAdditionalReserve(ctx_.tx[~sfFinishFunction]); auto const reserve = - ctx_.view().fees().accountReserve((*sle)[sfOwnerCount] + 1); + ctx_.view().fees().accountReserve((*sle)[sfOwnerCount] + reserveToAdd); if (mSourceBalance < reserve) return tecINSUFFICIENT_RESERVE; @@ -654,11 +668,7 @@ EscrowCreate::doApply() // increment owner count // TODO: determine actual reserve based on FinishFunction size - adjustOwnerCount( - ctx_.view(), - sle, - ctx_.tx.isFieldPresent(sfFinishFunction) ? 2 : 1, - ctx_.journal); + adjustOwnerCount(ctx_.view(), sle, reserveToAdd, ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; } @@ -773,7 +783,11 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) } if (auto const allowance = tx[~sfComputationAllowance]; allowance) { - extraFee += (*allowance) * view.fees().gasPrice / MICRO_DROPS_PER_DROP; + // The extra fee is the allowance in drops, rounded up to the nearest + // whole drop. + // Integer math rounds down by default, so we add 1 to round up. + extraFee += + ((*allowance) * view.fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; } return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -1375,13 +1389,12 @@ EscrowFinish::doApply() ctx_.view().update(sled); + auto const reserveToSubtract = + calculateAdditionalReserve((*slep)[~sfFinishFunction]); + // Adjust source owner count auto const sle = ctx_.view().peek(keylet::account(account)); - adjustOwnerCount( - ctx_.view(), - sle, - slep->isFieldPresent(sfFinishFunction) ? -2 : -1, - ctx_.journal); + adjustOwnerCount(ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger @@ -1592,11 +1605,9 @@ EscrowCancel::doApply() } } - adjustOwnerCount( - ctx_.view(), - sle, - slep->isFieldPresent(sfFinishFunction) ? -2 : -1, - ctx_.journal); + auto const reserveToSubtract = + calculateAdditionalReserve((*slep)[~sfFinishFunction]); + adjustOwnerCount(ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger From 5266f049707e4b5d0eecb8f0e397d2cae417f9f7 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 2 Sep 2025 18:26:01 -0400 Subject: [PATCH 60/73] chore: rollback unrelated changes (#5737) --- .../consensus/ByzantineFailureSim_test.cpp | 4 +- src/test/overlay/reduce_relay_test.cpp | 5 +- .../app/ledger/detail/TimeoutCounter.cpp | 4 +- src/xrpld/app/main/GRPCServer.cpp | 4 +- src/xrpld/app/misc/AMMHelpers.h | 6 +- src/xrpld/app/misc/detail/AMMUtils.cpp | 4 +- src/xrpld/app/misc/detail/TxQ.cpp | 10 +-- src/xrpld/app/paths/Pathfinder.cpp | 3 +- src/xrpld/app/paths/detail/BookStep.cpp | 3 +- src/xrpld/app/paths/detail/DirectStep.cpp | 3 +- .../app/paths/detail/XRPEndpointStep.cpp | 3 +- src/xrpld/app/rdb/RelationalDatabase.h | 4 +- src/xrpld/app/tx/detail/Batch.cpp | 87 +++++++++---------- src/xrpld/app/tx/detail/CancelOffer.cpp | 8 +- src/xrpld/consensus/Consensus.h | 14 +-- src/xrpld/ledger/detail/View.cpp | 6 +- src/xrpld/overlay/detail/PeerImp.cpp | 4 +- src/xrpld/peerfinder/detail/Logic.h | 6 +- 18 files changed, 92 insertions(+), 86 deletions(-) diff --git a/src/test/consensus/ByzantineFailureSim_test.cpp b/src/test/consensus/ByzantineFailureSim_test.cpp index b9799434776..887a060a5ba 100644 --- a/src/test/consensus/ByzantineFailureSim_test.cpp +++ b/src/test/consensus/ByzantineFailureSim_test.cpp @@ -68,8 +68,8 @@ class ByzantineFailureSim_test : public beast::unit_test::suite for (TrustGraph::ForkInfo const& fi : sim.trustGraph.forkablePairs(0.8)) { - std::cout << "Can fork " << PeerGroup{fi.unlA} << " " << " " - << PeerGroup{fi.unlB} << " overlap " << fi.overlap + std::cout << "Can fork " << PeerGroup{fi.unlA} << " " + << " " << PeerGroup{fi.unlB} << " overlap " << fi.overlap << " required " << fi.required << "\n"; }; diff --git a/src/test/overlay/reduce_relay_test.cpp b/src/test/overlay/reduce_relay_test.cpp index b7c55eafd3a..e53f53f2dbc 100644 --- a/src/test/overlay/reduce_relay_test.cpp +++ b/src/test/overlay/reduce_relay_test.cpp @@ -897,8 +897,9 @@ class reduce_relay_test : public beast::unit_test::suite printPeers(std::string const& msg, std::uint16_t validator = 0) { auto peers = network_.overlay().getPeers(network_.validator(validator)); - std::cout << msg << " " << "num peers " - << (int)network_.overlay().getNumPeers() << std::endl; + std::cout << msg << " " + << "num peers " << (int)network_.overlay().getNumPeers() + << std::endl; for (auto& [k, v] : peers) std::cout << k << ":" << (int)std::get(v) << " "; diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp index cdf659f5aa1..774b70e4d1e 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp @@ -100,8 +100,8 @@ TimeoutCounter::invokeOnTimer() if (!progress_) { ++timeouts_; - JLOG(journal_.debug()) - << "Timeout(" << timeouts_ << ") " << " acquiring " << hash_; + JLOG(journal_.debug()) << "Timeout(" << timeouts_ << ") " + << " acquiring " << hash_; onTimer(false, sl); } else diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index 2ee811dc19e..a4bbcda0a57 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -447,8 +447,8 @@ GRPCServerImpl::handleRpcs() if (!ok) { - JLOG(journal_.debug()) - << "Request listener cancelled. " << "Destroying object"; + JLOG(journal_.debug()) << "Request listener cancelled. " + << "Destroying object"; erase(ptr); } else diff --git a/src/xrpld/app/misc/AMMHelpers.h b/src/xrpld/app/misc/AMMHelpers.h index 0693973fe5f..8cc39468b10 100644 --- a/src/xrpld/app/misc/AMMHelpers.h +++ b/src/xrpld/app/misc/AMMHelpers.h @@ -384,9 +384,9 @@ changeSpotPriceQuality( { JLOG(j.error()) << "changeSpotPriceQuality failed: " << to_string(pool.in) - << " " << to_string(pool.out) << " " << " " << quality - << " " << tfee << " " << to_string(amounts.in) << " " - << to_string(amounts.out); + << " " << to_string(pool.out) << " " + << " " << quality << " " << tfee << " " + << to_string(amounts.in) << " " << to_string(amounts.out); Throw("changeSpotPriceQuality failed"); } else diff --git a/src/xrpld/app/misc/detail/AMMUtils.cpp b/src/xrpld/app/misc/detail/AMMUtils.cpp index 659219bb8ed..b56ce2748e8 100644 --- a/src/xrpld/app/misc/detail/AMMUtils.cpp +++ b/src/xrpld/app/misc/detail/AMMUtils.cpp @@ -151,8 +151,8 @@ ammLPHolds( } amount.setIssuer(ammAccount); - JLOG(j.trace()) << "ammLPHolds:" << " lpAccount=" - << to_string(lpAccount) + JLOG(j.trace()) << "ammLPHolds:" + << " lpAccount=" << to_string(lpAccount) << " amount=" << amount.getFullText(); } diff --git a/src/xrpld/app/misc/detail/TxQ.cpp b/src/xrpld/app/misc/detail/TxQ.cpp index caa4cba8bee..6924dae6c82 100644 --- a/src/xrpld/app/misc/detail/TxQ.cpp +++ b/src/xrpld/app/misc/detail/TxQ.cpp @@ -1504,11 +1504,11 @@ TxQ::accept(Application& app, OpenView& view) } else { - JLOG(j_.debug()) - << "Queued transaction " << candidateIter->txID - << " failed with " << transToken(txnResult) - << ". Leave in queue." << " Applied: " << didApply - << ". Flags: " << candidateIter->flags; + JLOG(j_.debug()) << "Queued transaction " << candidateIter->txID + << " failed with " << transToken(txnResult) + << ". Leave in queue." + << " Applied: " << didApply + << ". Flags: " << candidateIter->flags; if (account.retryPenalty && candidateIter->retriesRemaining > 2) candidateIter->retriesRemaining = 1; else diff --git a/src/xrpld/app/paths/Pathfinder.cpp b/src/xrpld/app/paths/Pathfinder.cpp index e8cef72d2b7..74a33ec917c 100644 --- a/src/xrpld/app/paths/Pathfinder.cpp +++ b/src/xrpld/app/paths/Pathfinder.cpp @@ -238,7 +238,8 @@ Pathfinder::findPaths( mSource = STPathElement(account, mSrcCurrency, issuer); auto issuerString = mSrcIssuer ? to_string(*mSrcIssuer) : std::string("none"); - JLOG(j_.trace()) << "findPaths>" << " mSrcAccount=" << mSrcAccount + JLOG(j_.trace()) << "findPaths>" + << " mSrcAccount=" << mSrcAccount << " mDstAccount=" << mDstAccount << " mDstAmount=" << mDstAmount.getFullText() << " mSrcCurrency=" << mSrcCurrency diff --git a/src/xrpld/app/paths/detail/BookStep.cpp b/src/xrpld/app/paths/detail/BookStep.cpp index 26d93629c98..554d2525f58 100644 --- a/src/xrpld/app/paths/detail/BookStep.cpp +++ b/src/xrpld/app/paths/detail/BookStep.cpp @@ -190,7 +190,8 @@ class BookStep : public StepImp> logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " << "\ninIss: " << book_.in.account + ostr << name << ": " + << "\ninIss: " << book_.in.account << "\noutIss: " << book_.out.account << "\ninCur: " << book_.in.currency << "\noutCur: " << book_.out.currency; diff --git a/src/xrpld/app/paths/detail/DirectStep.cpp b/src/xrpld/app/paths/detail/DirectStep.cpp index 1ff77c15012..5e62a289a3d 100644 --- a/src/xrpld/app/paths/detail/DirectStep.cpp +++ b/src/xrpld/app/paths/detail/DirectStep.cpp @@ -205,7 +205,8 @@ class DirectStepI : public StepImp> logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; + ostr << name << ": " + << "\nSrc: " << src_ << "\nDst: " << dst_; return ostr.str(); } diff --git a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp index 4f38a7b422e..7fdfb3749dd 100644 --- a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp +++ b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp @@ -132,7 +132,8 @@ class XRPEndpointStep logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " << "\nAcc: " << acc_; + ostr << name << ": " + << "\nAcc: " << acc_; return ostr.str(); } diff --git a/src/xrpld/app/rdb/RelationalDatabase.h b/src/xrpld/app/rdb/RelationalDatabase.h index 927b08d3853..25b16f04a1f 100644 --- a/src/xrpld/app/rdb/RelationalDatabase.h +++ b/src/xrpld/app/rdb/RelationalDatabase.h @@ -238,8 +238,8 @@ rangeCheckedCast(C c) /* This should never happen */ UNREACHABLE("ripple::rangeCheckedCast : domain error"); JLOG(debugLog().error()) - << "rangeCheckedCast domain error:" << " value = " << c - << " min = " << std::numeric_limits::lowest() + << "rangeCheckedCast domain error:" + << " value = " << c << " min = " << std::numeric_limits::lowest() << " max: " << std::numeric_limits::max(); } diff --git a/src/xrpld/app/tx/detail/Batch.cpp b/src/xrpld/app/tx/detail/Batch.cpp index 40e506566bb..40991ea99a3 100644 --- a/src/xrpld/app/tx/detail/Batch.cpp +++ b/src/xrpld/app/tx/detail/Batch.cpp @@ -212,8 +212,8 @@ Batch::preflight(PreflightContext const& ctx) if (flags & tfBatchMask) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId << "]:" << "invalid flags."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "invalid flags."; return temINVALID_FLAG; } @@ -221,24 +221,23 @@ Batch::preflight(PreflightContext const& ctx) flags & (tfAllOrNothing | tfOnlyOne | tfUntilFailure | tfIndependent)) != 1) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId << "]:" << "too many flags."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "too many flags."; return temINVALID_FLAG; } auto const& rawTxns = ctx.tx.getFieldArray(sfRawTransactions); if (rawTxns.size() <= 1) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]:" << "txns array must have at least 2 entries."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "txns array must have at least 2 entries."; return temARRAY_EMPTY; } if (rawTxns.size() > maxBatchTxCount) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]:" << "txns array exceeds 8 entries."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "txns array exceeds 8 entries."; return temARRAY_TOO_LARGE; } @@ -253,53 +252,50 @@ Batch::preflight(PreflightContext const& ctx) auto const hash = stx.getTransactionID(); if (!uniqueHashes.emplace(hash).second) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "duplicate Txn found. " << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "duplicate Txn found. " + << "txID: " << hash; return temREDUNDANT; } if (stx.getFieldU16(sfTransactionType) == ttBATCH) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "batch cannot have an inner batch txn. " - << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "batch cannot have an inner batch txn. " + << "txID: " << hash; return temINVALID; } if (!(stx.getFlags() & tfInnerBatchTxn)) { JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn must have the tfInnerBatchTxn flag. " + << "BatchTrace[" << parentBatchId << "]: " + << "inner txn must have the tfInnerBatchTxn flag. " << "txID: " << hash; return temINVALID_FLAG; } if (stx.isFieldPresent(sfTxnSignature)) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn cannot include TxnSignature. " - << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn cannot include TxnSignature. " + << "txID: " << hash; return temBAD_SIGNATURE; } if (stx.isFieldPresent(sfSigners)) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "inner txn cannot include Signers. " + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn cannot include Signers. " << "txID: " << hash; return temBAD_SIGNER; } if (!stx.getSigningPubKey().empty()) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn SigningPubKey must be empty. " - << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn SigningPubKey must be empty. " + << "txID: " << hash; return temBAD_REGKEY; } @@ -308,10 +304,10 @@ Batch::preflight(PreflightContext const& ctx) ctx.app, ctx.rules, parentBatchId, stx, tapBATCH, ctx.j); preflightResult.ter != tesSUCCESS) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn preflight failed: " - << transHuman(preflightResult.ter) << " " << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn preflight failed: " + << transHuman(preflightResult.ter) << " " + << "txID: " << hash; return temINVALID_INNER_BATCH; } @@ -319,8 +315,8 @@ Batch::preflight(PreflightContext const& ctx) if (auto const fee = stx.getFieldAmount(sfFee); !fee.native() || fee.xrp() != beast::zero) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "inner txn must have a fee of 0. " + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn must have a fee of 0. " << "txID: " << hash; return temBAD_FEE; } @@ -357,7 +353,8 @@ Batch::preflight(PreflightContext const& ctx) { JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " - << "duplicate sequence found: " << "txID: " << hash; + << "duplicate sequence found: " + << "txID: " << hash; return temREDUNDANT; } } @@ -369,7 +366,8 @@ Batch::preflight(PreflightContext const& ctx) { JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " - << "duplicate ticket found: " << "txID: " << hash; + << "duplicate ticket found: " + << "txID: " << hash; return temREDUNDANT; } } @@ -395,8 +393,8 @@ Batch::preflight(PreflightContext const& ctx) // Check that the batch signers array is not too large. if (signers.size() > maxBatchTxCount) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "signers array exceeds 8 entries."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "signers array exceeds 8 entries."; return temARRAY_TOO_LARGE; } @@ -419,8 +417,8 @@ Batch::preflight(PreflightContext const& ctx) if (!batchSigners.insert(signerAccount).second) { JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "duplicate signer found: " << signerAccount; + << "BatchTrace[" << parentBatchId << "]: " + << "duplicate signer found: " << signerAccount; return temREDUNDANT; } @@ -428,9 +426,8 @@ Batch::preflight(PreflightContext const& ctx) // Remove it if it does, as it can be crossed off the list. if (requiredSigners.erase(signerAccount) == 0) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "no account signature for inner txn."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "no account signature for inner txn."; return temBAD_SIGNER; } } @@ -450,8 +447,8 @@ Batch::preflight(PreflightContext const& ctx) if (!requiredSigners.empty()) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "invalid batch signers."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "invalid batch signers."; return temBAD_SIGNER; } return tesSUCCESS; diff --git a/src/xrpld/app/tx/detail/CancelOffer.cpp b/src/xrpld/app/tx/detail/CancelOffer.cpp index 6d8c077a621..004ae1e8b97 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.cpp +++ b/src/xrpld/app/tx/detail/CancelOffer.cpp @@ -35,8 +35,8 @@ CancelOffer::preflight(PreflightContext const& ctx) if (uTxFlags & tfUniversalMask) { - JLOG(ctx.j.trace()) - << "Malformed transaction: " << "Invalid flags set."; + JLOG(ctx.j.trace()) << "Malformed transaction: " + << "Invalid flags set."; return temINVALID_FLAG; } @@ -63,8 +63,8 @@ CancelOffer::preclaim(PreclaimContext const& ctx) if ((*sle)[sfSequence] <= offerSequence) { - JLOG(ctx.j.trace()) << "Malformed transaction: " << "Sequence " - << offerSequence << " is invalid."; + JLOG(ctx.j.trace()) << "Malformed transaction: " + << "Sequence " << offerSequence << " is invalid."; return temBAD_SEQUENCE; } diff --git a/src/xrpld/consensus/Consensus.h b/src/xrpld/consensus/Consensus.h index b548b45cc2c..df6cedccff1 100644 --- a/src/xrpld/consensus/Consensus.h +++ b/src/xrpld/consensus/Consensus.h @@ -1121,8 +1121,8 @@ Consensus::checkLedger(std::unique_ptr const& clog) auto netLgr = adaptor_.getPrevLedger(prevLedgerID_, previousLedger_, mode_.get()); - CLOG(clog) << "network ledgerid " << netLgr << ", " << "previous ledger " - << prevLedgerID_ << ". "; + CLOG(clog) << "network ledgerid " << netLgr << ", " + << "previous ledger " << prevLedgerID_ << ". "; if (netLgr != prevLedgerID_) { @@ -1213,7 +1213,8 @@ Consensus::phaseOpen(std::unique_ptr const& clog) adaptor_.parms().ledgerIDLE_INTERVAL, 2 * previousLedger_.closeTimeResolution()); CLOG(clog) << "idle interval set to " << idleInterval.count() - << "ms based on " << "ledgerIDLE_INTERVAL: " + << "ms based on " + << "ledgerIDLE_INTERVAL: " << adaptor_.parms().ledgerIDLE_INTERVAL.count() << ", previous ledger close time resolution: " << previousLedger_.closeTimeResolution().count() << "ms. "; @@ -1261,7 +1262,8 @@ Consensus::shouldPause( << "roundTime: " << result_->roundTime.read().count() << ", " << "max consensus time: " << parms.ledgerMAX_CONSENSUS.count() << ", " << "validators: " << totalValidators << ", " - << "laggards: " << laggards << ", " << "offline: " << offline << ", " + << "laggards: " << laggards << ", " + << "offline: " << offline << ", " << "quorum: " << quorum << ")"; if (!ahead || !laggards || !totalValidators || !adaptor_.validator() || @@ -1622,8 +1624,8 @@ Consensus::updateOurPositions( if (!haveCloseTimeConsensus_) { JLOG(j_.debug()) - << "No CT consensus:" << " Proposers:" - << currPeerPositions_.size() + << "No CT consensus:" + << " Proposers:" << currPeerPositions_.size() << " Mode:" << to_string(mode_.get()) << " Thresh:" << threshConsensus << " Pos:" << consensusCloseTime.time_since_epoch().count(); diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index 2ef40eeebd6..4f8a29d15c3 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -457,7 +457,8 @@ accountHolds( amount.clear(Issue{currency, issuer}); } - JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(account) + JLOG(j.trace()) << "accountHolds:" + << " account=" << to_string(account) << " amount=" << amount.getFullText(); return view.balanceHook(account, issuer, amount); @@ -638,7 +639,8 @@ xrpLiquid( STAmount const amount = (balance < reserve) ? STAmount{0} : balance - reserve; - JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(id) + JLOG(j.trace()) << "accountHolds:" + << " account=" << to_string(id) << " amount=" << amount.getFullText() << " fullBalance=" << fullBalance.getFullText() << " balance=" << balance.getFullText() diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 7c2499b97dd..69f25e1eb49 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -1286,8 +1286,8 @@ PeerImp::handleTransaction( { // If we've never been in synch, there's nothing we can do // with a transaction - JLOG(p_journal_.debug()) - << "Ignoring incoming transaction: " << "Need network ledger"; + JLOG(p_journal_.debug()) << "Ignoring incoming transaction: " + << "Need network ledger"; return; } diff --git a/src/xrpld/peerfinder/detail/Logic.h b/src/xrpld/peerfinder/detail/Logic.h index 9da2e55726a..4b92a1d1431 100644 --- a/src/xrpld/peerfinder/detail/Logic.h +++ b/src/xrpld/peerfinder/detail/Logic.h @@ -1132,9 +1132,9 @@ class Logic } else { - JLOG(m_journal.error()) - << beast::leftw(18) << "Logic failed " << "'" << source->name() - << "' fetch, " << results.error.message(); + JLOG(m_journal.error()) << beast::leftw(18) << "Logic failed " + << "'" << source->name() << "' fetch, " + << results.error.message(); } } From a46d772147d65ced864c6e780216bd142d29ab61 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 4 Sep 2025 17:05:39 -0400 Subject: [PATCH 61/73] fix build and tests (#5768) * fix conan.lock * add conan.lock to triggers * update on-trigger.yml too * fix tests * roll back unrelated changes --- .github/workflows/on-pr.yml | 1 + .github/workflows/on-trigger.yml | 1 + conan.lock | 3 ++- src/test/app/Escrow_test.cpp | 43 +++++++++++++++++--------------- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/.github/workflows/on-pr.yml b/.github/workflows/on-pr.yml index a4bbfd0997e..8008aebcbb9 100644 --- a/.github/workflows/on-pr.yml +++ b/.github/workflows/on-pr.yml @@ -75,6 +75,7 @@ jobs: tests/** CMakeLists.txt conanfile.py + conan.lock - name: Check whether to run # This step determines whether the rest of the workflow should # run. The rest of the workflow will run if this job runs AND at diff --git a/.github/workflows/on-trigger.yml b/.github/workflows/on-trigger.yml index 7732b814adf..dcd592a1f7e 100644 --- a/.github/workflows/on-trigger.yml +++ b/.github/workflows/on-trigger.yml @@ -32,6 +32,7 @@ on: - "tests/**" - "CMakeLists.txt" - "conanfile.py" + - "conan.lock" # Run at 06:32 UTC on every day of the week from Monday through Friday. This # will force all dependencies to be rebuilt, which is useful to verify that diff --git a/conan.lock b/conan.lock index 0f11f086b41..f30abd020de 100644 --- a/conan.lock +++ b/conan.lock @@ -3,6 +3,7 @@ "requires": [ "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", + "wamr/2.4.1#731b101bc8fa06d84e5c84edb4dc41a5%1755280063.774542", "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", @@ -53,4 +54,4 @@ ] }, "config_requires": [] -} \ No newline at end of file +} diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 2923ea84ca5..74babf797cc 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2040,14 +2040,14 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2097,7 +2097,7 @@ struct Escrow_test : public beast::unit_test::suite txMeta->getFieldI32(sfWasmReturnCode) == 5, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } @@ -2105,7 +2105,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + Condition Env env(*this, features); env.fund(XRP(5000), alice, carol); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); auto const seq = env.seq(alice); // create escrow env(escrowCreate, @@ -2117,7 +2117,7 @@ struct Escrow_test : public beast::unit_test::suite auto const conditionFinishFee = finishFee + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2168,7 +2168,7 @@ struct Escrow_test : public beast::unit_test::suite std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } @@ -2178,7 +2178,7 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); auto const ts = env.now() + 97s; env(escrowCreate, escrow::finish_function(wasmHex), @@ -2187,7 +2187,7 @@ struct Escrow_test : public beast::unit_test::suite fee(createFee)); env.close(); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2218,7 +2218,7 @@ struct Escrow_test : public beast::unit_test::suite txMeta->getFieldI32(sfWasmReturnCode) == 13, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } @@ -2228,7 +2228,7 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 2s), @@ -2236,7 +2236,7 @@ struct Escrow_test : public beast::unit_test::suite fee(createFee)); // Don't close the ledger here - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2273,7 +2273,7 @@ struct Escrow_test : public beast::unit_test::suite std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } } @@ -2297,7 +2297,7 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); XRPAmount txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; @@ -2310,8 +2310,7 @@ struct Escrow_test : public beast::unit_test::suite env.close(); if (BEAST_EXPECT( - (*env.le(alice))[sfOwnerCount] == - (1 + wasmHex.size() / 2 / 500))) + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); @@ -2350,7 +2349,7 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } } @@ -2374,7 +2373,7 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(10000), alice, carol); BEAST_EXPECT(env.seq(alice) == 4); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); // base objects that need to be created first auto const tokenId = @@ -2383,7 +2382,7 @@ struct Escrow_test : public beast::unit_test::suite env(trust(alice, carol["USD"](1'000'000))); env.close(); BEAST_EXPECT(env.seq(alice) == 6); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2); + BEAST_EXPECT(env.ownerCount(alice) == 2); // set up a bunch of objects to check their keylets AMM amm(env, carol, XRP(10), carol["USD"](1000)); @@ -2411,7 +2410,9 @@ struct Escrow_test : public beast::unit_test::suite env(tx); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); if (BEAST_EXPECTS( env.seq(alice) == 20, std::to_string(env.seq(alice)))) { @@ -2444,7 +2445,9 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECTS( gasUsed == allowance, std::to_string(gasUsed)); } - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); } } } From ffa21c27a7ad300420b23d42ddfad765762e1061 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 16:40:59 -0400 Subject: [PATCH 62/73] fix test --- src/test/app/HostFuncImpl_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index a198ba4af44..7ff06659c5b 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -264,8 +264,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); - // Use featureSmartEscrow for testing - auto const amendmentId = featureSmartEscrow; + // Use featureTokenEscrow for testing + auto const amendmentId = featureTokenEscrow; // Test by id { @@ -275,7 +275,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Test by name - std::string const amendmentName = "SmartEscrow"; + std::string const amendmentName = "TokenEscrow"; { auto const result = hfs.isAmendmentEnabled(amendmentName); BEAST_EXPECT(result.has_value()); From 8d266d39414c49fa7c95c3faf2fedd7cd291e50d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 29 Sep 2025 15:43:10 -0400 Subject: [PATCH 63/73] remove STInt64 (#5815) --- include/xrpl/protocol/SField.h | 1 - include/xrpl/protocol/STInteger.h | 1 - include/xrpl/protocol/STObject.h | 4 --- src/libxrpl/protocol/STInteger.cpp | 49 ----------------------------- src/libxrpl/protocol/STObject.cpp | 12 ------- src/libxrpl/protocol/STVar.cpp | 3 -- src/libxrpl/protocol/Serializer.cpp | 6 ---- 7 files changed, 76 deletions(-) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index b6ae98b48f5..e25447c3945 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -359,7 +359,6 @@ using SF_UINT384 = TypedField>; using SF_UINT512 = TypedField>; using SF_INT32 = TypedField>; -using SF_INT64 = TypedField>; using SF_ACCOUNT = TypedField; using SF_AMOUNT = TypedField; diff --git a/include/xrpl/protocol/STInteger.h b/include/xrpl/protocol/STInteger.h index f86d3023481..154ee7f2036 100644 --- a/include/xrpl/protocol/STInteger.h +++ b/include/xrpl/protocol/STInteger.h @@ -82,7 +82,6 @@ using STUInt32 = STInteger; using STUInt64 = STInteger; using STInt32 = STInteger; -using STInt64 = STInteger; template inline STInteger::STInteger(Integer v) : value_(v) diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 34f14254f83..1c22b08abaf 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -233,8 +233,6 @@ class STObject : public STBase, public CountedObject getFieldH256(SField const& field) const; std::int32_t getFieldI32(SField const& field) const; - std::int64_t - getFieldI64(SField const& field) const; AccountID getAccountID(SField const& field) const; @@ -371,8 +369,6 @@ class STObject : public STBase, public CountedObject void setFieldI32(SField const& field, std::int32_t); void - setFieldI64(SField const& field, std::int64_t); - void setFieldVL(SField const& field, Blob const&); void setFieldVL(SField const& field, Slice const&); diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index ca2e3b9c982..355fa4c113a 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -278,53 +278,4 @@ STInt32::getJson(JsonOptions) const return value_; } -//------------------------------------------------------------------------------ - -template <> -STInteger::STInteger(SerialIter& sit, SField const& name) - : STInteger(name, sit.get64()) -{ -} - -template <> -SerializedTypeID -STInt64::getSType() const -{ - return STI_INT64; -} - -template <> -std::string -STInt64::getText() const -{ - return std::to_string(value_); -} - -template <> -Json::Value -STInt64::getJson(JsonOptions) const -{ - auto convertToString = [](int64_t const value, int const base) { - XRPL_ASSERT( - base == 10 || base == 16, - "ripple::STInt64::getJson : base 10 or 16"); - std::string str( - base == 10 ? 20 : 16, 0); // Allocate space depending on base - auto ret = - std::to_chars(str.data(), str.data() + str.size(), value, base); - XRPL_ASSERT( - ret.ec == std::errc(), - "ripple::STInt64::getJson : to_chars succeeded"); - str.resize(std::distance(str.data(), ret.ptr)); - return str; - }; - - if (auto const& fName = getFName(); fName.shouldMeta(SField::sMD_BaseTen)) - { - return convertToString(value_, 10); // Convert to base 10 - } - - return convertToString(value_, 16); // Convert to base 16 -} - } // namespace ripple diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 384ab527701..77e5fd1ad95 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -653,12 +653,6 @@ STObject::getFieldI32(SField const& field) const return getFieldByValue(field); } -std::int64_t -STObject::getFieldI64(SField const& field) const -{ - return getFieldByValue(field); -} - AccountID STObject::getAccountID(SField const& field) const { @@ -779,12 +773,6 @@ STObject::setFieldI32(SField const& field, std::int32_t v) setFieldUsingSetValue(field, v); } -void -STObject::setFieldI64(SField const& field, std::int64_t v) -{ - setFieldUsingSetValue(field, v); -} - void STObject::setFieldV256(SField const& field, STVector256 const& v) { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index 72b348091c9..c46effb47ec 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -211,9 +211,6 @@ STVar::constructST(SerializedTypeID id, int depth, Args&&... args) case STI_INT32: construct(std::forward(args)...); return; - case STI_INT64: - construct(std::forward(args)...); - return; case STI_VECTOR256: construct(std::forward(args)...); return; diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index d85f25ec8b2..098e68d2b21 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -89,12 +89,6 @@ Serializer::addInteger(std::int32_t i) { return add32(i); } -template <> -int -Serializer::addInteger(std::int64_t i) -{ - return add64(i); -} int Serializer::addRaw(Blob const& vector) From 55772a0d07341c63182807e30c6e60d3c0b5bdcd Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 2 Oct 2025 17:50:43 -0400 Subject: [PATCH 64/73] add sfData preflight checks + tests (#5839) --- src/test/app/Escrow_test.cpp | 113 ++++++++++++++++++ .../app/wasm_fixtures/all_keylets/src/lib.rs | 4 +- src/test/app/wasm_fixtures/fixtures.cpp | 18 +++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/test/app/wasm_fixtures/updateData.c | 13 ++ src/xrpld/app/tx/detail/Escrow.cpp | 20 +++- 6 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 src/test/app/wasm_fixtures/updateData.c diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 13e7471d656..3d64e0783a5 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1730,6 +1730,14 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(temDISABLED)); env.close(); + + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + escrow::data("00112233"), + fee(txnFees), + ter(temDISABLED)); + env.close(); } { @@ -1757,6 +1765,44 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } + { + // Data without FinishFunction + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + std::string longData(4, 'A'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // Data > max length + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // string of length maxWasmDataLength * 2 + 2 + std::string longData(maxWasmDataLength * 2 + 2, 'B'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + Env env( *this, envconfig([](std::unique_ptr cfg) { @@ -2286,6 +2332,72 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testUpdateDataOnFailure(FeatureBitset features) + { + testcase("Update escrow data on failure"); + + using namespace jtx; + using namespace std::chrono; + + // wasm that always fails + static auto const wasmHex = updateDataWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto escrowCreate = escrow::create(alice, alice, XRP(1000)); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + { + env.require(balance(alice, XRP(4000) - txnFees)); + + auto const allowance = 1'015; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + + // FinishAfter time hasn't passed + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == -256, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + auto const sle = env.le(keylet::escrow(alice, seq)); + if (BEAST_EXPECT(sle && sle->isFieldPresent(sfData))) + BEAST_EXPECTS( + checkVL(sle, sfData, "Data"), + strHex(sle->getFieldVL(sfData))); + } + } + void testAllHostFunctions(FeatureBitset features) { @@ -2478,6 +2590,7 @@ struct Escrow_test : public beast::unit_test::suite testCreateFinishFunctionPreflight(features); testFinishWasmFailures(features); testFinishFunction(features); + testUpdateDataOnFailure(features); // TODO: Update module with new host functions testAllHostFunctions(features); diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs index 970db7bd50b..6171045522f 100644 --- a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -4,8 +4,8 @@ extern crate std; use crate::host::{Error, Result, Result::Err, Result::Ok}; -use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; use xrpl_std::core::ledger_objects::ledger_object; use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; use xrpl_std::core::types::amount::asset::{Asset, IouAsset, XrpAsset}; @@ -13,7 +13,7 @@ use xrpl_std::core::types::amount::currency_code::CurrencyCode; use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; -use xrpl_std::host::trace::{DataRepr, trace, trace_account, trace_data, trace_num}; +use xrpl_std::host::trace::{trace, trace_account, trace_data, trace_num, DataRepr}; use xrpl_std::sfield; #[unsafe(no_mangle)] diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 6ad3e336399..727ddeb4fe1 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -10330,3 +10330,21 @@ extern std::string const disabledFloatHex = "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" "090a150202000b100043000000c54300200045921a41010b"; + +extern std::string const updateDataWasmHex = + "0061736d01000000010e0360027f7f017f6000006000017f02130103656e760b7570646174" + "655f64617461000003030201020503010002063f0a7f01419088040b7f004180080b7f0041" + "85080b7f004190080b7f00419088040b7f004180080b7f00419088040b7f00418080080b7f" + "0041000b7f0041010b07aa010c066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300010666696e69736800020c5f5f64736f5f68616e646c6503010a5f5f646174615f" + "656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d5f5f" + "676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f656e" + "6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a3f02" + "02000b3a01017f230041106b220024002000410c6a4184082d00003a000020004180082800" + "00360208200041086a410410001a200041106a240041807e0b0b0b01004180080b04446174" + "61007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f3139" + "2e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c76" + "6d2f6c6c766d2d70726f6a6563742061623462356132646235383239353861663165653330" + "3861373930636664623432626432343732302900490f7461726765745f6665617475726573" + "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e" + "63652d74797065732b0a6d756c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 0e7e3785ea8..f10b493900a 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -50,3 +50,5 @@ extern std::string const floatTestsWasmHex; extern std::string const float0Hex; extern std::string const disabledFloatHex; + +extern std::string const updateDataWasmHex; diff --git a/src/test/app/wasm_fixtures/updateData.c b/src/test/app/wasm_fixtures/updateData.c new file mode 100644 index 00000000000..8436f1c3905 --- /dev/null +++ b/src/test/app/wasm_fixtures/updateData.c @@ -0,0 +1,13 @@ +#include + +int32_t +update_data(uint8_t const*, int32_t); + +int +finish() +{ + uint8_t buf[] = "Data"; + update_data(buf, sizeof(buf) - 1); + + return -256; +} diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 25dcc0415a0..6f73faa3233 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -137,7 +137,8 @@ EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) bool EscrowCreate::checkExtraFeatures(PreflightContext const& ctx) { - if (ctx.tx.isFieldPresent(sfFinishFunction) && + if ((ctx.tx.isFieldPresent(sfFinishFunction) || + ctx.tx.isFieldPresent(sfData)) && !ctx.rules.enabled(featureSmartEscrow)) return false; @@ -225,6 +226,22 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temDISABLED; } + if (ctx.tx.isFieldPresent(sfData)) + { + if (!ctx.tx.isFieldPresent(sfFinishFunction)) + { + JLOG(ctx.j.debug()) + << "EscrowCreate with Data requires FinishFunction"; + return temMALFORMED; + } + auto const data = ctx.tx.getFieldVL(sfData); + if (data.size() > maxWasmDataLength) + { + JLOG(ctx.j.debug()) << "EscrowCreate.Data bad size " << data.size(); + return temMALFORMED; + } + } + if (ctx.tx.isFieldPresent(sfFinishFunction)) { auto const code = ctx.tx.getFieldVL(sfFinishFunction); @@ -1317,6 +1334,7 @@ EscrowFinish::doApply() if (auto const& data = ledgerDataProvider.getData(); data.has_value()) { slep->setFieldVL(sfData, makeSlice(*data)); + ctx_.view().update(slep); } if (re.has_value()) From c41e52f57a30ba1257244f9a33602ecb927b7d4e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 6 Oct 2025 16:27:21 -0400 Subject: [PATCH 65/73] Move Smart Escrow tests to separate file (#5849) --- src/test/app/EscrowSmart_test.cpp | 935 ++++++++++++++++++++++++++++++ src/test/app/Escrow_test.cpp | 881 +--------------------------- 2 files changed, 937 insertions(+), 879 deletions(-) create mode 100644 src/test/app/EscrowSmart_test.cpp diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp new file mode 100644 index 00000000000..6eaed01e2cd --- /dev/null +++ b/src/test/app/EscrowSmart_test.cpp @@ -0,0 +1,935 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace ripple { +namespace test { + +struct EscrowSmart_test : public beast::unit_test::suite +{ + void + testCreateFinishFunctionPreflight(FeatureBitset features) + { + testcase("Test preflight checks involving FinishFunction"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + static auto wasmHex = ledgerSqnWasmHex; + + { + // featureSmartEscrow disabled + Env env(*this, features - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temDISABLED)); + env.close(); + + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + escrow::data("00112233"), + fee(txnFees), + ter(temDISABLED)); + env.close(); + } + + { + // FinishFunction > max length + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + }), + features); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // 11-byte string + std::string longWasmHex = "00112233445566778899AA"; + env(escrowCreate, + escrow::finish_function(longWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // Data without FinishFunction + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + std::string longData(4, 'A'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // Data > max length + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // string of length maxWasmDataLength * 2 + 2 + std::string longData(maxWasmDataLength * 2 + 2, 'B'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + }), + features); + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // Success situations + { + // FinishFunction + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 20s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + Condition + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 30s), + escrow::condition(escrow::cb1), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 40s), + escrow::finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 50s), + escrow::condition(escrow::cb1), + escrow::finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + + // Failure situations (i.e. all other combinations) + { + // only FinishFunction + env(escrowCreate, + escrow::finish_function(wasmHex), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + Condition + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::condition(escrow::cb1), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::condition(escrow::cb1), + escrow::finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction 0 length + env(escrowCreate, + escrow::finish_function(""), + escrow::cancel_time(env.now() + 60s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + { + // Not enough fees + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 70s), + fee(txnFees - 1), + ter(telINSUF_FEE_P)); + env.close(); + } + + { + // FinishFunction nonexistent host function + // pub fn finish() -> bool { + // unsafe { host_lib::bad() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02100108686f73745f6c696203626164" + "00000302010005030100100611027f00418080c0000b7f00418080c0000b07" + "2e04066d656d6f727902000666696e69736800010a5f5f646174615f656e64" + "03000b5f5f686561705f6261736503010a09010700100041044a0b004d0970" + "726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235" + "3020323032352d30332d31352900490f7461726765745f6665617475726573" + "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + env(escrowCreate, + escrow::finish_function(badWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temBAD_WASM)); + env.close(); + } + } + + void + testFinishWasmFailures(FeatureBitset features) + { + testcase("EscrowFinish Smart Escrow failures"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + static auto wasmHex = ledgerSqnWasmHex; + + { + // featureSmartEscrow disabled + Env env(*this, features - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrow::finish(carol, alice, 1), + fee(txnFees), + escrow::comp_allowance(4), + ter(temDISABLED)); + env.close(); + } + + { + // ComputationAllowance > max compute limit + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + }), + features); + env.fund(XRP(5000), alice, carol); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + auto const allowance = 1'001; + env(escrow::finish(carol, alice, 1), + fee(env.current()->fees().base + allowance), + escrow::comp_allowance(allowance), + ter(temBAD_LIMIT)); + } + + Env env(*this, features); + + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env.fund(XRP(5000), alice, carol); + + // create escrow + auto const seq = env.seq(alice); + env(escrow::create(alice, carol, XRP(500)), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + { + // no ComputationAllowance field + env(escrow::finish(carol, alice, seq), + ter(tefWASM_FIELD_NOT_INCLUDED)); + } + + { + // ComputationAllowance value of 0 + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(0), + ter(temBAD_LIMIT)); + } + + { + // not enough fees + // This function takes 4 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 3; + env(escrow::finish(carol, alice, seq), + fee(finishFee), + escrow::comp_allowance(4), + ter(telINSUF_FEE_P)); + } + + { + // not enough gas + // This function takes 4 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 4; + env(escrow::finish(carol, alice, seq), + fee(finishFee), + escrow::comp_allowance(2), + ter(tecFAILED_PROCESSING)); + } + + { + // ComputationAllowance field included w/no FinishFunction on + // escrow + auto const seq2 = env.seq(alice); + env(escrow::create(alice, carol, XRP(500)), + escrow::finish_time(env.now() + 10s), + escrow::cancel_time(env.now() + 100s)); + env.close(); + + auto const allowance = 100; + env(escrow::finish(carol, alice, seq2), + fee(env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1), + escrow::comp_allowance(allowance), + ter(tefNO_WASM)); + } + } + + void + testFinishFunction(FeatureBitset features) + { + testcase("Example escrow function"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + auto const& wasmHex = ledgerSqnWasmHex; + std::uint32_t const allowance = 66; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + auto [createFee, finishFee] = [&]() { + Env env(*this, features); + auto createFee = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + auto finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + return std::make_pair(createFee, finishFee); + }(); + + { + // basic FinishFunction situation + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env.close(); + + { + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); + } + + env(escrow::finish(alice, alice, seq), + fee(finishFee), + escrow::comp_allowance(allowance), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 5, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + + { + // FinishFunction + Condition + Env env(*this, features); + env.fund(XRP(5000), alice, carol); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto const seq = env.seq(alice); + // create escrow + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::condition(escrow::cb1), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + auto const conditionFinishFee = finishFee + + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + // no fulfillment provided, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function fails + env(escrow::finish(carol, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb1), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); + env.close(); + // no fulfillment provided, function succeeds + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tecCRYPTOCONDITION_ERROR)); + // wrong fulfillment provided, function succeeds + env(escrow::finish(alice, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb2), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function succeeds, tx succeeds + env(escrow::finish(alice, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb1), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + env.close(); + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + + { + // FinishFunction + FinishAfter + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto const ts = env.now() + 97s; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(ts), + escrow::cancel_time(env.now() + 1000s), + fee(createFee)); + env.close(); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee + 1), + ter(tecNO_PERMISSION)); + env.close(); + // finish time hasn't passed, function succeeds + for (; env.now() < ts; env.close()) + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee + 2), + ter(tecNO_PERMISSION)); + + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee + 1), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 13, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + + { + // FinishFunction + FinishAfter #2 + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + // Don't close the ledger here + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecNO_PERMISSION)); + env.close(); + + // finish time has passed, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); + env.close(); + // finish time has passed, function succeeds, tx succeeds + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + env.close(); + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + } + + void + testUpdateDataOnFailure(FeatureBitset features) + { + testcase("Update escrow data on failure"); + + using namespace jtx; + using namespace std::chrono; + + // wasm that always fails + static auto const wasmHex = updateDataWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto escrowCreate = escrow::create(alice, alice, XRP(1000)); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + { + env.require(balance(alice, XRP(4000) - txnFees)); + + auto const allowance = 1'015; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + + // FinishAfter time hasn't passed + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == -256, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + auto const sle = env.le(keylet::escrow(alice, seq)); + if (BEAST_EXPECT(sle && sle->isFieldPresent(sfData))) + BEAST_EXPECTS( + checkVL(sle, sfData, "Data"), + strHex(sle->getFieldVL(sfData))); + } + } + + void + testAllHostFunctions(FeatureBitset features) + { + testcase("Test all host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: create wasm module for all host functions + static auto wasmHex = allHostFunctionsWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 11s), + escrow::cancel_time(env.now() + 100s), + escrow::data("1000000000"), // 1000 XRP in drops + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + auto const allowance = 1'000'000; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + + // FinishAfter time hasn't passed + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecNO_PERMISSION)); + env.close(); + env.close(); + env.close(); + + // reduce the destination balance + env(pay(carol, alice, XRP(4500))); + env.close(); + env.close(); + + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == 38'571, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + + env.close(); + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + } + + void + testKeyletHostFunctions(FeatureBitset features) + { + testcase("Test all keylet host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: create wasm module for all host functions + static auto wasmHex = allKeyletsWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + Env env{*this}; + env.fund(XRP(10000), alice, carol); + + BEAST_EXPECT(env.seq(alice) == 4); + BEAST_EXPECT(env.ownerCount(alice) == 0); + + // base objects that need to be created first + auto const tokenId = + token::getNextID(env, alice, 0, tfTransferable); + env(token::mint(alice, 0u), txflags(tfTransferable)); + env(trust(alice, carol["USD"](1'000'000))); + env.close(); + BEAST_EXPECT(env.seq(alice) == 6); + BEAST_EXPECT(env.ownerCount(alice) == 2); + + // set up a bunch of objects to check their keylets + AMM amm(env, carol, XRP(10), carol["USD"](1000)); + env(check::create(alice, carol, XRP(100))); + env(credentials::create(alice, alice, "termsandconditions")); + env(delegate::set(alice, carol, {"TrustSet"})); + env(deposit::auth(alice, carol)); + env(did::set(alice), did::data("alice_did")); + env(escrow::create(alice, carol, XRP(100)), + escrow::finish_time(env.now() + 100s)); + MPTTester mptTester{env, alice, {.fund = false}}; + mptTester.create(); + mptTester.authorize({.account = carol}); + env(token::createOffer(carol, tokenId, XRP(100)), + token::owner(alice)); + env(offer(alice, carol["GBP"](0.1), XRP(100))); + env(create(alice, carol, XRP(1000), 100s, alice.pk())); + pdomain::Credentials credentials{{alice, "first credential"}}; + env(pdomain::setTx(alice, credentials)); + env(signers(alice, 1, {{carol, 1}})); + env(ticket::create(alice, 1)); + Vault vault{env}; + auto [tx, _keylet] = + vault.create({.owner = alice, .asset = xrpIssue()}); + env(tx); + env.close(); + + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); + if (BEAST_EXPECTS( + env.seq(alice) == 20, std::to_string(env.seq(alice)))) + { + auto const seq = env.seq(alice); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrow::create(alice, carol, XRP(1000)), + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + auto const allowance = 137'926; + auto const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee)); + env.close(); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + { + auto const gasUsed = txMeta->getFieldU32(sfGasUsed); + BEAST_EXPECTS( + gasUsed == allowance, std::to_string(gasUsed)); + } + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); + } + } + } + + void + testWithFeats(FeatureBitset features) + { + testCreateFinishFunctionPreflight(features); + testFinishWasmFailures(features); + testFinishFunction(features); + testUpdateDataOnFailure(features); + + // TODO: Update module with new host functions + testAllHostFunctions(features); + testKeyletHostFunctions(features); + } + +public: + void + run() override + { + using namespace test::jtx; + FeatureBitset const all{testable_amendments()}; + testWithFeats(all); + } +}; + +BEAST_DEFINE_TESTSUITE(EscrowSmart, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 3d64e0783a5..8b59b865361 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -17,11 +17,9 @@ */ //============================================================================== -#include #include #include -#include #include #include @@ -1703,875 +1701,6 @@ struct Escrow_test : public beast::unit_test::suite } } - void - testCreateFinishFunctionPreflight(FeatureBitset features) - { - testcase("Test preflight checks involving FinishFunction"); - - using namespace jtx; - using namespace std::chrono; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - // Tests whether the ledger index is >= 5 - // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnWasmHex; - - { - // featureSmartEscrow disabled - Env env(*this, features - featureSmartEscrow); - env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = env.current()->fees().base + 1000; - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temDISABLED)); - env.close(); - - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - escrow::data("00112233"), - fee(txnFees), - ter(temDISABLED)); - env.close(); - } - - { - // FinishFunction > max length - Env env( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_size_limit = 10; // 10 bytes - return cfg; - }), - features); - XRPAmount const txnFees = env.current()->fees().base + 1000; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - // 11-byte string - std::string longWasmHex = "00112233445566778899AA"; - env(escrowCreate, - escrow::finish_function(longWasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - - { - // Data without FinishFunction - Env env(*this, features); - XRPAmount const txnFees = env.current()->fees().base + 100000; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - std::string longData(4, 'A'); - env(escrowCreate, - escrow::data(longData), - escrow::finish_time(env.now() + 100s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - - { - // Data > max length - Env env(*this, features); - XRPAmount const txnFees = env.current()->fees().base + 100000; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - // string of length maxWasmDataLength * 2 + 2 - std::string longData(maxWasmDataLength * 2 + 2, 'B'); - env(escrowCreate, - escrow::data(longData), - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - - Env env( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->START_UP = Config::FRESH; - return cfg; - }), - features); - XRPAmount const txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - // Success situations - { - // FinishFunction + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 20s), - fee(txnFees)); - env.close(); - } - { - // FinishFunction + Condition + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 30s), - escrow::condition(escrow::cb1), - fee(txnFees)); - env.close(); - } - { - // FinishFunction + FinishAfter + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 40s), - escrow::finish_time(env.now() + 2s), - fee(txnFees)); - env.close(); - } - { - // FinishFunction + FinishAfter + Condition + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 50s), - escrow::condition(escrow::cb1), - escrow::finish_time(env.now() + 2s), - fee(txnFees)); - env.close(); - } - - // Failure situations (i.e. all other combinations) - { - // only FinishFunction - env(escrowCreate, - escrow::finish_function(wasmHex), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction + FinishAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction + Condition - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::condition(escrow::cb1), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction + FinishAfter + Condition - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::condition(escrow::cb1), - escrow::finish_time(env.now() + 2s), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction 0 length - env(escrowCreate, - escrow::finish_function(""), - escrow::cancel_time(env.now() + 60s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - { - // Not enough fees - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 70s), - fee(txnFees - 1), - ter(telINSUF_FEE_P)); - env.close(); - } - - { - // FinishFunction nonexistent host function - // pub fn finish() -> bool { - // unsafe { host_lib::bad() >= 5 } - // } - auto const badWasmHex = - "0061736d010000000105016000017f02100108686f73745f6c696203626164" - "00000302010005030100100611027f00418080c0000b7f00418080c0000b07" - "2e04066d656d6f727902000666696e69736800010a5f5f646174615f656e64" - "03000b5f5f686561705f6261736503010a09010700100041044a0b004d0970" - "726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235" - "3020323032352d30332d31352900490f7461726765745f6665617475726573" - "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" - "65666572656e63652d74797065732b0a6d756c746976616c7565"; - env(escrowCreate, - escrow::finish_function(badWasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temBAD_WASM)); - env.close(); - } - } - - void - testFinishWasmFailures(FeatureBitset features) - { - testcase("EscrowFinish Smart Escrow failures"); - - using namespace jtx; - using namespace std::chrono; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - // Tests whether the ledger index is >= 5 - // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnWasmHex; - - { - // featureSmartEscrow disabled - Env env(*this, features - featureSmartEscrow); - env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrow::finish(carol, alice, 1), - fee(txnFees), - escrow::comp_allowance(4), - ter(temDISABLED)); - env.close(); - } - - { - // ComputationAllowance > max compute limit - Env env( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_compute_limit = 1'000; // in gas - return cfg; - }), - features); - env.fund(XRP(5000), alice, carol); - // Run past the flag ledger so that a Fee change vote occurs and - // updates FeeSettings. (It also activates all supported - // amendments.) - for (auto i = env.current()->seq(); i <= 257; ++i) - env.close(); - - auto const allowance = 1'001; - env(escrow::finish(carol, alice, 1), - fee(env.current()->fees().base + allowance), - escrow::comp_allowance(allowance), - ter(temBAD_LIMIT)); - } - - Env env(*this, features); - - // Run past the flag ledger so that a Fee change vote occurs and - // updates FeeSettings. (It also activates all supported - // amendments.) - for (auto i = env.current()->seq(); i <= 257; ++i) - env.close(); - - XRPAmount const txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env.fund(XRP(5000), alice, carol); - - // create escrow - auto const seq = env.seq(alice); - env(escrow::create(alice, carol, XRP(500)), - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees)); - env.close(); - - { - // no ComputationAllowance field - env(escrow::finish(carol, alice, seq), - ter(tefWASM_FIELD_NOT_INCLUDED)); - } - - { - // ComputationAllowance value of 0 - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(0), - ter(temBAD_LIMIT)); - } - - { - // not enough fees - // This function takes 4 gas - // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 3; - env(escrow::finish(carol, alice, seq), - fee(finishFee), - escrow::comp_allowance(4), - ter(telINSUF_FEE_P)); - } - - { - // not enough gas - // This function takes 4 gas - // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 4; - env(escrow::finish(carol, alice, seq), - fee(finishFee), - escrow::comp_allowance(2), - ter(tecFAILED_PROCESSING)); - } - - { - // ComputationAllowance field included w/no FinishFunction on - // escrow - auto const seq2 = env.seq(alice); - env(escrow::create(alice, carol, XRP(500)), - escrow::finish_time(env.now() + 10s), - escrow::cancel_time(env.now() + 100s)); - env.close(); - - auto const allowance = 100; - env(escrow::finish(carol, alice, seq2), - fee(env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1), - escrow::comp_allowance(allowance), - ter(tefNO_WASM)); - } - } - - void - testFinishFunction(FeatureBitset features) - { - testcase("Example escrow function"); - - using namespace jtx; - using namespace std::chrono; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - // Tests whether the ledger index is >= 5 - // getLedgerSqn() >= 5} - auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 66; - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - auto [createFee, finishFee] = [&]() { - Env env(*this, features); - auto createFee = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - auto finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - return std::make_pair(createFee, finishFee); - }(); - - { - // basic FinishFunction situation - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - env.close(); - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env.close(); - - { - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - env.meta()->getFieldU32(sfGasUsed) == allowance, - std::to_string(env.meta()->getFieldU32(sfGasUsed))); - } - - env(escrow::finish(alice, alice, seq), - fee(finishFee), - escrow::comp_allowance(allowance), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, - std::to_string(txMeta->getFieldU32(sfGasUsed))); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 5, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - - { - // FinishFunction + Condition - Env env(*this, features); - env.fund(XRP(5000), alice, carol); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto const seq = env.seq(alice); - // create escrow - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::condition(escrow::cb1), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - env.close(); - auto const conditionFinishFee = finishFee + - env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - // no fulfillment provided, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecCRYPTOCONDITION_ERROR)); - // fulfillment provided, function fails - env(escrow::finish(carol, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb1), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tecWASM_REJECTED)); - if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - env.meta()->getFieldU32(sfGasUsed) == allowance, - std::to_string(env.meta()->getFieldU32(sfGasUsed))); - env.close(); - // no fulfillment provided, function succeeds - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tecCRYPTOCONDITION_ERROR)); - // wrong fulfillment provided, function succeeds - env(escrow::finish(alice, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb2), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tecCRYPTOCONDITION_ERROR)); - // fulfillment provided, function succeeds, tx succeeds - env(escrow::finish(alice, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb1), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 6, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - env.close(); - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - - { - // FinishFunction + FinishAfter - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto const ts = env.now() + 97s; - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(ts), - escrow::cancel_time(env.now() + 1000s), - fee(createFee)); - env.close(); - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - // finish time hasn't passed, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee + 1), - ter(tecNO_PERMISSION)); - env.close(); - // finish time hasn't passed, function succeeds - for (; env.now() < ts; env.close()) - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee + 2), - ter(tecNO_PERMISSION)); - - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee + 1), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 13, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - - { - // FinishFunction + FinishAfter #2 - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - // Don't close the ledger here - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - // finish time hasn't passed, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecNO_PERMISSION)); - env.close(); - - // finish time has passed, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - env.meta()->getFieldU32(sfGasUsed) == allowance, - std::to_string(env.meta()->getFieldU32(sfGasUsed))); - env.close(); - // finish time has passed, function succeeds, tx succeeds - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 6, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - env.close(); - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - } - - void - testUpdateDataOnFailure(FeatureBitset features) - { - testcase("Update escrow data on failure"); - - using namespace jtx; - using namespace std::chrono; - - // wasm that always fails - static auto const wasmHex = updateDataWasmHex; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto escrowCreate = escrow::create(alice, alice, XRP(1000)); - XRPAmount txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - escrow::cancel_time(env.now() + 100s), - fee(txnFees)); - env.close(); - env.close(); - env.close(); - - if (BEAST_EXPECT( - env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) - { - env.require(balance(alice, XRP(4000) - txnFees)); - - auto const allowance = 1'015; - XRPAmount const finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - - // FinishAfter time hasn't passed - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, - std::to_string(txMeta->getFieldU32(sfGasUsed))); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == -256, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - auto const sle = env.le(keylet::escrow(alice, seq)); - if (BEAST_EXPECT(sle && sle->isFieldPresent(sfData))) - BEAST_EXPECTS( - checkVL(sle, sfData, "Data"), - strHex(sle->getFieldVL(sfData))); - } - } - - void - testAllHostFunctions(FeatureBitset features) - { - testcase("Test all host functions"); - - using namespace jtx; - using namespace std::chrono; - - // TODO: create wasm module for all host functions - static auto wasmHex = allHostFunctionsWasmHex; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - { - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 11s), - escrow::cancel_time(env.now() + 100s), - escrow::data("1000000000"), // 1000 XRP in drops - fee(txnFees)); - env.close(); - - if (BEAST_EXPECT( - env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) - { - env.require(balance(alice, XRP(4000) - txnFees)); - env.require(balance(carol, XRP(5000))); - - auto const allowance = 1'000'000; - XRPAmount const finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - - // FinishAfter time hasn't passed - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecNO_PERMISSION)); - env.close(); - env.close(); - env.close(); - - // reduce the destination balance - env(pay(carol, alice, XRP(4500))); - env.close(); - env.close(); - - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 38'571, - std::to_string(txMeta->getFieldU32(sfGasUsed))); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); - - env.close(); - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - } - - void - testKeyletHostFunctions(FeatureBitset features) - { - testcase("Test all keylet host functions"); - - using namespace jtx; - using namespace std::chrono; - - // TODO: create wasm module for all host functions - static auto wasmHex = allKeyletsWasmHex; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - { - Env env{*this}; - env.fund(XRP(10000), alice, carol); - - BEAST_EXPECT(env.seq(alice) == 4); - BEAST_EXPECT(env.ownerCount(alice) == 0); - - // base objects that need to be created first - auto const tokenId = - token::getNextID(env, alice, 0, tfTransferable); - env(token::mint(alice, 0u), txflags(tfTransferable)); - env(trust(alice, carol["USD"](1'000'000))); - env.close(); - BEAST_EXPECT(env.seq(alice) == 6); - BEAST_EXPECT(env.ownerCount(alice) == 2); - - // set up a bunch of objects to check their keylets - AMM amm(env, carol, XRP(10), carol["USD"](1000)); - env(check::create(alice, carol, XRP(100))); - env(credentials::create(alice, alice, "termsandconditions")); - env(delegate::set(alice, carol, {"TrustSet"})); - env(deposit::auth(alice, carol)); - env(did::set(alice), did::data("alice_did")); - env(escrow::create(alice, carol, XRP(100)), - escrow::finish_time(env.now() + 100s)); - MPTTester mptTester{env, alice, {.fund = false}}; - mptTester.create(); - mptTester.authorize({.account = carol}); - env(token::createOffer(carol, tokenId, XRP(100)), - token::owner(alice)); - env(offer(alice, carol["GBP"](0.1), XRP(100))); - env(create(alice, carol, XRP(1000), 100s, alice.pk())); - pdomain::Credentials credentials{{alice, "first credential"}}; - env(pdomain::setTx(alice, credentials)); - env(signers(alice, 1, {{carol, 1}})); - env(ticket::create(alice, 1)); - Vault vault{env}; - auto [tx, _keylet] = - vault.create({.owner = alice, .asset = xrpIssue()}); - env(tx); - env.close(); - - BEAST_EXPECTS( - env.ownerCount(alice) == 16, - std::to_string(env.ownerCount(alice))); - if (BEAST_EXPECTS( - env.seq(alice) == 20, std::to_string(env.seq(alice)))) - { - auto const seq = env.seq(alice); - XRPAmount txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrow::create(alice, carol, XRP(1000)), - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - escrow::cancel_time(env.now() + 100s), - fee(txnFees)); - env.close(); - env.close(); - env.close(); - - auto const allowance = 137'926; - auto const finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee)); - env.close(); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - { - auto const gasUsed = txMeta->getFieldU32(sfGasUsed); - BEAST_EXPECTS( - gasUsed == allowance, std::to_string(gasUsed)); - } - BEAST_EXPECTS( - env.ownerCount(alice) == 16, - std::to_string(env.ownerCount(alice))); - } - } - } - void testWithFeats(FeatureBitset features) { @@ -2587,14 +1716,6 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(features); testEscrowWithTickets(features); testCredentials(features); - testCreateFinishFunctionPreflight(features); - testFinishWasmFailures(features); - testFinishFunction(features); - testUpdateDataOnFailure(features); - - // TODO: Update module with new host functions - testAllHostFunctions(features); - testKeyletHostFunctions(features); } public: @@ -2605,6 +1726,8 @@ struct Escrow_test : public beast::unit_test::suite FeatureBitset const all{testable_amendments()}; testWithFeats(all); testWithFeats(all - featureTokenEscrow); + testWithFeats(all - featureSmartEscrow); + testWithFeats(all - featureTokenEscrow - featureSmartEscrow); testTags(all - fixIncludeKeyletFields); } }; From 91455b6860d6fc62a9f1b868b1cf14315d3c67e4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 13 Oct 2025 15:20:03 -0400 Subject: [PATCH 66/73] respond to comments --- include/xrpl/protocol/TxMeta.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 6b1c24e9eb5..d4df384616e 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -152,7 +152,7 @@ class TxMeta } void - setGasUsed(std::uint32_t const& gasUsed) + setGasUsed(std::uint32_t const gasUsed) { gasUsed_ = gasUsed; } @@ -169,11 +169,11 @@ class TxMeta bool hasGasUsed() const { - return static_cast(gasUsed_); + return gasUsed_.has_value(); } void - setWasmReturnCode(std::int32_t const& wasmReturnCode) + setWasmReturnCode(std::int32_t const wasmReturnCode) { wasmReturnCode_ = wasmReturnCode; } @@ -190,7 +190,7 @@ class TxMeta bool hasWasmReturnCode() const { - return static_cast(wasmReturnCode_); + return wasmReturnCode_.has_value(); } private: From c6c54b3282e0cb70fe35fd96eb89b01677256925 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 17:54:54 -0400 Subject: [PATCH 67/73] resolve todos --- src/xrpld/app/tx/detail/Escrow.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 185b7c74135..b0b4bde58cc 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -695,7 +695,6 @@ EscrowCreate::doApply() } // increment owner count - // TODO: determine actual reserve based on FinishFunction size adjustOwnerCount(ctx_.view(), sle, reserveToAdd, ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; @@ -1345,12 +1344,17 @@ EscrowFinish::doApply() if (re.has_value()) { + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) + << ", cost: " << reCost; + auto reValue = re.value().result; ctx_.setWasmReturnCode(reValue); - // TODO: better error handling for this conversion - ctx_.setGasUsed(static_cast(re.value().cost)); - JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) - << ", cost: " << re.value().cost; + + auto reCost = re.value().cost; + if (reCost < 0 || reCost > std::numeric_limits::max()) + return tecINTERNAL; // LCOV_EXCL_LINE + ctx_.setGasUsed(static_cast(reCost)); + if (reValue <= 0) { return tecWASM_REJECTED; From 17f401f374740e6a655af0fda0a5f08efc17f15c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 17:58:41 -0400 Subject: [PATCH 68/73] reduce diff --- include/xrpl/protocol/SField.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index e25447c3945..b6ae98b48f5 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -359,6 +359,7 @@ using SF_UINT384 = TypedField>; using SF_UINT512 = TypedField>; using SF_INT32 = TypedField>; +using SF_INT64 = TypedField>; using SF_ACCOUNT = TypedField; using SF_AMOUNT = TypedField; From c9c35780d29733bd3a945bbb1766004bff0de82e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 18:00:58 -0400 Subject: [PATCH 69/73] reduce diff more --- include/xrpl/protocol/MPTAmount.h | 3 +-- include/xrpl/protocol/XRPAmount.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/include/xrpl/protocol/MPTAmount.h b/include/xrpl/protocol/MPTAmount.h index 7ece7cc3b51..419450eeb9e 100644 --- a/include/xrpl/protocol/MPTAmount.h +++ b/include/xrpl/protocol/MPTAmount.h @@ -149,12 +149,11 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; - using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128 const amt128(amt.value()); + int128_t const amt128(amt.value()); auto const neg = amt.value() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/include/xrpl/protocol/XRPAmount.h b/include/xrpl/protocol/XRPAmount.h index b595ec0bc76..a7a013d6256 100644 --- a/include/xrpl/protocol/XRPAmount.h +++ b/include/xrpl/protocol/XRPAmount.h @@ -286,12 +286,11 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; - using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128 const amt128(amt.drops()); + int128_t const amt128(amt.drops()); auto const neg = amt.drops() < 0; auto const m = amt128 * num; auto r = m / den; From 3b6cd22e325bada0cc9988b73c6e1d133d4cdaef Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 18:10:11 -0400 Subject: [PATCH 70/73] fix --- src/xrpld/app/tx/detail/Escrow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index b0b4bde58cc..d767ba80688 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1344,13 +1344,13 @@ EscrowFinish::doApply() if (re.has_value()) { + auto reValue = re.value().result; + auto reCost = re.value().cost; JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << reCost; - auto reValue = re.value().result; ctx_.setWasmReturnCode(reValue); - auto reCost = re.value().cost; if (reCost < 0 || reCost > std::numeric_limits::max()) return tecINTERNAL; // LCOV_EXCL_LINE ctx_.setGasUsed(static_cast(reCost)); From 9cfb7ac340e3f3b0a9dfef20750e477ed97ed2ef Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 20 Oct 2025 17:20:35 -0400 Subject: [PATCH 71/73] fix build issue --- src/test/app/EscrowSmart_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 6eaed01e2cd..f8f21c1cc01 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -853,7 +853,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); env(offer(alice, carol["GBP"](0.1), XRP(100))); - env(create(alice, carol, XRP(1000), 100s, alice.pk())); + env(paychan::create(alice, carol, XRP(1000), 100s, alice.pk())); pdomain::Credentials credentials{{alice, "first credential"}}; env(pdomain::setTx(alice, credentials)); env(signers(alice, 1, {{carol, 1}})); From 079e251aca3fc9e44eeaad38d3a5cc1545c35899 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 16:05:38 -0400 Subject: [PATCH 72/73] fix bug --- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index ca87b4fe307..b21a3d8b620 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -431,7 +431,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); } data_ = Bytes(data.begin(), data.end()); - return data_.size(); + return data_->size(); } Expected From fc6ff6975218ba2b3ac3fbfa820f480efd8cb372 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 17:14:46 -0400 Subject: [PATCH 73/73] fix tests --- .../all_host_functions/src/lib.rs | 2 +- src/test/app/wasm_fixtures/fixtures.cpp | 370 +++++++++--------- 2 files changed, 186 insertions(+), 186 deletions(-) diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs index c8a27aed876..942e1c67c6a 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -757,7 +757,7 @@ fn test_data_update_functions() -> i32 { let update_result = unsafe { host::update_data(update_payload.as_ptr(), update_payload.len()) }; - if update_result != 0 { + if update_result != update_payload.len() as i32 { let _ = trace_num("ERROR: update_data failed:", update_result as i64); return -701; // Data update failed } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index b11fc95adc9..5f845fbe785 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8659,195 +8659,195 @@ extern std::string const allHostFunctionsWasmHex = "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0aff1b051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0a821c051900200241094f0440000b20002002360204200020013602000b1900200241214f" "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" "6a22044100360200200141106a220542003703002001420037030802404181802020014108" "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" - "20052903003700000b200020023a0000200141206a24000b460020012d0000410146044041" - "8080c000410b20013402041001000b20002001290001370000200041106a200141116a2800" - "00360000200041086a200141096a2900003700000be81901097f230041b0036b2200240041" - "8b80c000411b41004100410010021a41a680c000411941004100410010021a41e780c00041" - "2b41004100410010021a027f02400240024002400240024002401003220141004a04404192" - "81c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c8" - "016a22034200370300200041c0016a22054200370300200041b8016a220442003703002000" - "42003703b001200041b0016a22064120100522014120470d0241bc81c00041132006412041" - "0110021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a20" - "0041a0016a410036020020004198016a420037030020004200370390014181802020004190" - "016a22024114100022014114470d03418a83c00041142002411410061a2000420037037041" - "888018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583" - "c000412820024108410110021a2000410036025041848008200041d0006a22024104100022" - "014104470d0541dd83c000411520024104410110021a200041013b003c2003420037030020" - "05420037030020044200370300200042003703b00102402000413c6a410220064120100722" - "0141004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d" - "20002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c000" - "41154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a41" - "021009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac10" - "011a0b41a585c000412341004100410010021a41de86c000413341004100410010021a2000" - "420037037041828018200041f0006a22014108100a220241004c0d06200241084604404191" - "87c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f20" - "02ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c" - "410110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac" - "10011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001" - "ac10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b" - "2001ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a41003602" - "0020004198016a4200370300200042003703900102404181802020004190016a2202411410" - "0a220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac1001" - "1a0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a" - "4200370300200042003703b0010240200041d0006a4102200041b0016a22014120100b2202" - "41004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c000411520" - "002802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac00041" - "244183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c" - "2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc000412841004100410010" - "021a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a220120" - "02101d200041a8016a4200370300200041a0016a420037030020004198016a420037030020" - "00420037039001024002400240024002402001411420004190016a22024120100e22014120" - "460440200241204100100f220441004a044041858cc00041232004ad10011a200042003703" - "50200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc0" - "00412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad" - "10011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c4101" - "10021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a42" - "00370300200041b8016a4200370300200042003703b001410141828018200041b0016a4120" - "101022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc00041" - "2b2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041" - "d0006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b41" - "014183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a41" - "0210132201410048044041ca91c00041392001ac10011a0b418392c0004137410041004100" - "10021a0c010b200041013b003c200041c8016a4200370300200041c0016a42003703002000" - "41b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a220141" - "201011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8e" - "c000411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41" - "cf8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e04" - "4041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc00041" - "2441004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c" - "2000413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d8" - "006a4200370300200042003703500240024002400240024020044114200041d0006a220241" - "20100e22014120460440419793c000410f20024120410110021a20004188016a4200370300" - "20004180016a4200370300200041f8006a4200370300200042003703700240200441142004" - "411441a693c0004109200041f0006a220141201014220241004a0440200041086a20012002" - "101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002ac" - "10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a22" - "05420037030020004200370390012000413c6a2202411441e80720004190016a2207412010" - "1522014120470d0141fc93c000410e20074120410110021a200041c8016a42003703002000" - "41c0016a4200370300200041b8016a4200370300200042003703b00120024114412a200041" - "b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c000" - "412441004100410010021a419195c000412541004100410010021a20004188016a42003703" - "0020004180016a4200370300200041f8006a42003703002000420037037041b695c0004117" - "200041f0006a22024120101722014120470d0341cd95c000410b41b695c000411741011002" - "1a41d895c000411120024120410110021a2004101c200041d0006a22062004101d20084200" - "3703002003420037030020054200370300200042003703900102404100200422036b410371" - "220220036a220520034d0d0020020440200221010340200341003a0000200341016a210320" - "0141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a41003a" - "0000200341066a41003a0000200341056a41003a0000200341046a41003a0000200341036a" - "41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d00" - "0b0b200541800220026b2201417c716a220320054b0440034020054100360200200541046a" - "22052003490d000b0b024020032001410371220120036a22024f0d00200122050440034020" - "0341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d00034020" - "0341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a000020" - "0341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a41003a" - "0000200341086a22032002470d000b0b024020064114200741202004418002101822014100" - "4a044041e995c00041102001ad10011a20014181024f0d0641f995c0004109200420014101" - "10021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c0004107410110" - "0222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480440" - "41ad97c000411a42a47b10011a41a47b0c070b41f796c000411c420010011a419397c00041" - "1a41004100410010021a41ff97c000412941004100410010021a41a898c000412810192201" - "45044041d098c000412741a898c0004128410110021a41f798c000411e4100410041001002" - "1a41bf80c000412841004100410010021a41010c070b419599c000411a2001ac10011a41c3" - "7a0c060b41f494c000411d2001ac10011a418b7c0c050b41d894c000411c2001ac10011a41" - "897c0c040b41bc94c000411c2001ac10011a41887c0c030b41dd97c00041222001ac10011a" - "41a77b0c020b000b41c797c00041162001ac10011a41a57b0b200041b0036a24000b0bb919" - "0100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e4354494f" - "4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e7353" - "5543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061737365" - "64212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e6374" - "696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e74" - "206c65646765722074696d653a506172656e74206c656467657220686173683a5355434345" - "53533a204c6564676572206865616465722066756e6374696f6e734552524f523a20676574" - "5f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a4552524f" - "523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a4552524f" - "523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f7279" - "20323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d547261" - "6e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e67" - "74683a5472616e73616374696f6e20466565202873657269616c697a65642058525020616d" - "6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420666965" - "6c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f6e" - "65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273206172" - "726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374656420" - "6172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61727261" - "795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e736163" - "74696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f6669656c" - "642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" - "785f6669656c6428466565292077726f6e67206c656e677468202865787065637465642038" - "20627974657320666f7220585250293a4552524f523a206765745f74785f6669656c642841" - "63636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a20" - "43757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d4375" - "7272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f75" - "6e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a65" - "642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e636520" - "6c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a6563" - "742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f62" - "6a5f6669656c642842616c616e636529206661696c656420286d6179206265206578706563" - "746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a494e" - "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c64284163636f" - "756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e67" - "74683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f637572" - "72656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c" - "696361626c653a43757272656e74206f626a656374205369676e657273206172726179206c" - "656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e46" - "4f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e74" - "206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f727920" - "343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d537563" - "6365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361636865" - "64206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e74293a" - "436163686564206f626a6563742062616c616e6365202873657269616c697a656420585250" - "20616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e677468" - "20286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c616e" - "63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e6365" - "29206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a43" - "6163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f6f" - "626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163686564" - "206f626a656374205369676e657273206172726179206c656e6774683a436163686564206e" - "6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a5355" - "43434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e46" - "4f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374656420" - "776974682074657374206669787475726573293a494e464f3a206765745f6c65646765725f" - "6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063616368" - "6564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65737465" - "645f6669656c64206661696c65642061732065787065637465643a494e464f3a206765745f" - "6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870656374" - "65643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" - "6c656e206661696c65642061732065787065637465643a535543434553533a20416e79206c" - "6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520746573" - "746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f7220" - "63616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65742047" - "656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c6574" - "3a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063726564" - "656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e7465" - "7266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b6579" - "6c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e637469" - "6f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f523a" - "20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e745f" - "6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c697479" - "2046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c6421" - "496e70757420646174613a5348413531322068616c6620686173683a4e4654206461746120" - "6c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c656420" - "286578706563746564202d206e6f2073756368204e4654293a54657374207472616365206d" - "6573736167657061796c6f616454726163652066756e6374696f6e20627974657320777269" - "7474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e6374" - "696f6e20737563636565646564535543434553533a205574696c6974792066756e6374696f" - "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a207472" - "6163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f6861" - "6c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064617465" - "2046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279206461" - "74612066726f6d205741534d20746573745375636365737366756c6c792075706461746564" - "206c656467657220656e74727920776974683a535543434553533a20446174612075706461" - "74652066756e6374696f6e734552524f523a207570646174655f64617461206661696c6564" - "3a004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d6279010572757374631d312e39302e30202831313539653738633420323032352d" - "30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c" - "6f62616c732b087369676e2d657874"; + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bec1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c000412810192201412846044041d098c000412741a898c00041" + "28410110021a41f798c000411e41004100410010021a41bf80c00041284100410041001002" + "1a41010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac1001" + "1a418b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10" + "011a41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c000411620" + "01ac10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b" + "0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e43" + "54494f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f" + "6e73535543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061" + "73736564212d2d2d2043617465676f727920313a204c656467657220486561646572204675" + "6e6374696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172" + "656e74206c65646765722074696d653a506172656e74206c656467657220686173683a5355" + "43434553533a204c6564676572206865616465722066756e6374696f6e734552524f523a20" + "6765745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a45" + "52524f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a45" + "52524f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d204361746567" + "6f727920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d" + "5472616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c" + "656e6774683a5472616e73616374696f6e20466565202873657269616c697a656420585250" + "20616d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420" + "6669656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74" + "785f6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273" + "206172726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374" + "6564206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61" + "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e" + "73616374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f66" + "69656c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765" + "745f74785f6669656c6428466565292077726f6e67206c656e677468202865787065637465" + "64203820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c" + "64284163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920" + "333a2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d" + "2d43757272656e74206f626a6563742062616c616e6365206c656e67746820285852502061" + "6d6f756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c" + "697a65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e" + "6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f62" + "6a6563742062616c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" + "5f6f626a5f6669656c642842616c616e636529206661696c656420286d6179206265206578" + "706563746564293a43757272656e74206c6564676572206f626a656374206163636f756e74" + "3a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c642841" + "63636f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c" + "656e6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f742061" + "70706c696361626c653a43757272656e74206f626a656374205369676e6572732061727261" + "79206c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a" + "494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61" + "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272" + "656e74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f" + "727920343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d" + "5375636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361" + "63686564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e" + "74293a436163686564206f626a6563742062616c616e6365202873657269616c697a656420" + "58525020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e" + "67746820286e6f6e2d58525020616d6f756e74293a436163686564206f626a656374206261" + "6c616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c61" + "6e636529206661696c65643a436163686564206e6573746564206669656c64206c656e6774" + "683a436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163" + "686564206f626a656374205369676e657273206172726179206c656e6774683a4361636865" + "64206e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c65" + "3a535543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73" + "494e464f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374" + "656420776974682074657374206669787475726573293a494e464f3a206765745f6c656467" + "65725f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063" + "6163686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65" + "737465645f6669656c64206661696c65642061732065787065637465643a494e464f3a2067" + "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870" + "65637465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206661696c65642061732065787065637465643a535543434553533a20416e" + "79206c6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520" + "746573746564294552524f523a206163636f756e745f6b65796c6574206661696c65642066" + "6f722063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65" + "742047656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b6579" + "6c65743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063" + "726564656e7469616c5f6b65796c6574206661696c656420286578706563746564202d2069" + "6e74657266616365206973737565293a457363726f77206b65796c65743a4f7261636c6520" + "6b65796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e" + "6374696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a455252" + "4f523a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f75" + "6e745f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c" + "6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f72" + "6c6421496e70757420646174613a5348413531322068616c6620686173683a4e4654206461" + "7461206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c" + "656420286578706563746564202d206e6f2073756368204e4654293a546573742074726163" + "65206d6573736167657061796c6f616454726163652066756e6374696f6e20627974657320" + "7772697474656e3a54657374206e756d62657220747261636554726163655f6e756d206675" + "6e6374696f6e20737563636565646564535543434553533a205574696c6974792066756e63" + "74696f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a" + "2074726163652829206661696c65643a4552524f523a20636f6d707574655f736861353132" + "5f68616c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064" + "6174652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279" + "20646174612066726f6d205741534d20746573745375636365737366756c6c792075706461" + "746564206c656467657220656e74727920776974683a535543434553533a20446174612075" + "70646174652066756e6374696f6e734552524f523a207570646174655f6461746120666169" + "6c65643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f" + "6365737365642d6279010572757374631d312e38352e312028346562313631323530203230" + "32352d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c65" + "2d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f"