diff --git a/README.md b/README.md index c5fc400c57..bb71157b19 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ # Leap + +1. [Branches](#branches) +2. [Supported Operating Systems](#supported-operating-systems) +3. [Binary Installation](#binary-installation) +4. [Build and Install from Source](#build-and-install-from-source) +5. [Bash Autocomplete](#bash-autocomplete) + Leap is a C++ implementation of the [Antelope](https://github.com/AntelopeIO) protocol. It contains blockchain node software and supporting tools for developers and node operators. ## Branches @@ -208,3 +215,10 @@ It is also possible to install using `make` instead: ```bash sudo make install ``` + +## Bash Autocomplete +`cleos` and `leap-util` offer a substantial amount of functionality. Consider using bash's autocompletion support which makes it easier to discover all their various options. + +For our provided `.deb` packages simply install Ubuntu's `bash-completion` package: `apt-get install bash-completion` (you may need to log out/in after installing). + +If building from source install the `build/programs/cleos/bash-completion/completions/cleos` and `build/programs/leap-util/bash-completion/completions/leap-util` files to your bash-completion directory. Refer to [bash-completion's documentation](https://github.com/scop/bash-completion#faq) on the possible install locations. diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 5c142c4162..a8ede0f68f 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -19,7 +19,7 @@ std::map> features { }; // values to control cout format -constexpr auto name_width = 28; +constexpr auto name_width = 40; constexpr auto runs_width = 5; constexpr auto time_width = 12; constexpr auto ns_width = 2; diff --git a/benchmark/bls.cpp b/benchmark/bls.cpp index e5b5ad3843..4c86e78ba1 100644 --- a/benchmark/bls.cpp +++ b/benchmark/bls.cpp @@ -107,52 +107,74 @@ std::array random_scalar() }; } +// utilility to create a random fp +fp random_fe() +{ + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution dis; + + return fp({ + dis(gen) % 0xb9feffffffffaaab, + dis(gen) % 0x1eabfffeb153ffff, + dis(gen) % 0x6730d2a0f6b0f624, + dis(gen) % 0x64774b84f38512bf, + dis(gen) % 0x4b1ba7b6434bacd7, + dis(gen) % 0x1a0111ea397fe69a + }); +} + +// utilility to create a random fp2 +fp2 random_fe2() +{ + return fp2({ + random_fe(), + random_fe() + }); +} + // utilility to create a random g1 bls12_381::g1 random_g1() { std::array k = random_scalar(); - return bls12_381::g1::one().mulScalar(k); + return bls12_381::g1::one().scale(k); } // utilility to create a random g2 bls12_381::g2 random_g2() { std::array k = random_scalar(); - return bls12_381::g2::one().mulScalar(k); + return bls12_381::g2::one().scale(k); } // bls_g1_add benchmarking void benchmark_bls_g1_add() { // prepare g1 operand in Jacobian LE format g1 p = random_g1(); - std::vector buf(144); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 144), true); - eosio::chain::span op1(buf.data(), buf.size()); + std::array op; + p.toAffineBytesLE(std::span((uint8_t*)op.data(), 96), false); // prepare result operand - std::vector result_buf(144); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g1_add to be benchmarked interface_in_benchmark interface; - auto g1_add_func = [&]() { - interface.interface->bls_g1_add(op1, op1, result); + auto benchmarked_func = [&]() { + interface.interface->bls_g1_add(op, op, result); }; - benchmarking("bls_g1_add", g1_add_func); + benchmarking("bls_g1_add", benchmarked_func); } // bls_g2_add benchmarking void benchmark_bls_g2_add() { // prepare g2 operand in Jacobian LE format g2 p = random_g2(); - std::vector buf(288); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 288), true); - eosio::chain::span op(buf.data(), buf.size()); + std::array op; + p.toAffineBytesLE(std::span((uint8_t*)op.data(), 192), false); // prepare result operand - std::vector result_buf(288); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g2_add to be benchmarked interface_in_benchmark interface; @@ -163,66 +185,13 @@ void benchmark_bls_g2_add() { benchmarking("bls_g2_add", benchmarked_func); } -// bls_g1_mul benchmarking -void benchmark_bls_g1_mul() { - // prepare g1 operand - g1 p = random_g1(); - std::vector buf(144); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 144), true); - eosio::chain::span point(buf.data(), buf.size()); - - // prepare scalar operand - std::array s = random_scalar(); - std::vector scalar_buf(32); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data(), 32)); - eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); - - // prepare result operand - std::vector result_buf(144); - eosio::chain::span result(result_buf.data(), result_buf.size()); - - // set up bls_g1_mul to be benchmarked - interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g1_mul(point, scalar, result); - }; - - benchmarking("bls_g1_mul", benchmarked_func); -} - -// bls_g2_mul benchmarking -void benchmark_bls_g2_mul() { - g2 p = random_g2(); - std::vector buf(288); - p.toJacobianBytesLE(std::span((uint8_t*)buf.data(), 288), true); - eosio::chain::span point(buf.data(), buf.size()); - - // prepare scalar operand - std::array s = random_scalar(); - std::vector scalar_buf(32); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data(), 32)); - eosio::chain::span scalar(scalar_buf.data(), scalar_buf.size()); - - // prepare result operand - std::vector result_buf(288); - eosio::chain::span result(result_buf.data(), result_buf.size()); - - // set up bls_g2_mul to be benchmarked - interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_mul(point, scalar, result); - }; - - benchmarking("bls_g2_mul", benchmarked_func); -} - -// bls_g1_exp benchmarking utility -void benchmark_bls_g1_exp(std::string test_name, uint32_t num_points) { +// bls_g1_weighted_sum benchmarking utility +void benchmark_bls_g1_weighted_sum_impl(const std::string& test_name, uint32_t num_points) { // prepare g1 points operand - std::vector g1_buf(144*num_points); + std::vector g1_buf(96*num_points); for (auto i=0u; i < num_points; ++i) { g1 p = random_g1(); - p.toJacobianBytesLE(std::span((uint8_t*)g1_buf.data() + i * 144, 144), true); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), false); } chain::span g1_points(g1_buf.data(), g1_buf.size()); @@ -235,35 +204,39 @@ void benchmark_bls_g1_exp(std::string test_name, uint32_t num_points) { chain::span scalars(scalars_buf.data(), scalars_buf.size()); // prepare result operand - std::vector result_buf(144); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; - // set up bls_g1_exp to be benchmarked + // set up bls_g1_weighted_sum to be benchmarked interface_in_benchmark interface; auto benchmarked_func = [&]() { - interface.interface->bls_g1_exp(g1_points, scalars, num_points, result); + interface.interface->bls_g1_weighted_sum(g1_points, scalars, num_points, result); }; benchmarking(test_name, benchmarked_func); } -// bls_g1_exp benchmarking with 1 input point -void benchmark_bls_g1_exp_one_point() { - benchmark_bls_g1_exp("bls_g1_exp 1 point", 1); +// bls_g1_weighted_sum benchmarking with 1 input point +void benchmark_bls_g1_weighted_sum_one_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 1 point", 1); } -// bls_g1_exp benchmarking with 3 input points -void benchmark_bls_g1_exp_three_point() { - benchmark_bls_g1_exp("bls_g1_exp 3 points", 3); +// bls_g1_weighted_sum benchmarking with 3 input points +void benchmark_bls_g1_weighted_sum_three_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 3 points", 3); } -// bls_g2_exp benchmarking utility -void benchmark_bls_g2_exp(std::string test_name, uint32_t num_points) { +// bls_g1_weighted_sum benchmarking with 5 input points +void benchmark_bls_g1_weighted_sum_five_point() { + benchmark_bls_g1_weighted_sum_impl("bls_g1_weighted_sum 5 points", 5); +} + +// bls_g2_weighted_sum benchmarking utility +void benchmark_bls_g2_weighted_sum_impl(const std::string& test_name, uint32_t num_points) { // prepare g2 points operand - std::vector g2_buf(288*num_points); + std::vector g2_buf(192*num_points); for (auto i=0u; i < num_points; ++i) { g2 p = random_g2(); - p.toJacobianBytesLE(std::span((uint8_t*)g2_buf.data() + i * 288, 288), true); + p.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, 192), false); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); @@ -276,54 +249,56 @@ void benchmark_bls_g2_exp(std::string test_name, uint32_t num_points) { eosio::chain::span scalars(scalars_buf.data(), scalars_buf.size()); // prepare result operand - std::vector result_buf(288); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; - // set up bls_g2_exp to be benchmarked + // set up bls_g2_weighted_sum to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { - interface.interface->bls_g2_exp(g2_points, scalars, num_points, result); + auto benchmarked_func = [&]() { + interface.interface->bls_g2_weighted_sum(g2_points, scalars, num_points, result); }; benchmarking(test_name, benchmarked_func); } -// bls_g2_exp benchmarking with 1 input point -void benchmark_bls_g2_exp_one_point() { - benchmark_bls_g2_exp("bls_g2_exp 1 point", 1); +// bls_g2_weighted_sum benchmarking with 1 input point +void benchmark_bls_g2_weighted_sum_one_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 1 point", 1); +} + +// bls_g2_weighted_sum benchmarking with 3 input points +void benchmark_bls_g2_weighted_sum_three_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 3 points", 3); } -// bls_g2_exp benchmarking with 3 input points -void benchmark_bls_g2_exp_three_point() { - benchmark_bls_g2_exp("bls_g2_exp 3 points", 3); +// bls_g2_weighted_sum benchmarking with 5 input points +void benchmark_bls_g2_weighted_sum_five_point() { + benchmark_bls_g2_weighted_sum_impl("bls_g2_weighted_sum 5 points", 5); } // bls_pairing benchmarking utility -void benchmark_bls_pairing(std::string test_name, uint32_t num_pairs) { +void benchmark_bls_pairing_impl(const std::string& test_name, uint32_t num_pairs) { // prepare g1 operand - std::vector g1_buf(144*num_pairs); - //g1_buf.reserve(144*num_pairs); + std::vector g1_buf(96*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g1 p = random_g1(); - p.toJacobianBytesLE(std::span((uint8_t*)g1_buf.data() + i * 144, 144), true); + p.toAffineBytesLE(std::span((uint8_t*)g1_buf.data() + i * 96, 96), false); } eosio::chain::span g1_points(g1_buf.data(), g1_buf.size()); // prepare g2 operand - std::vector g2_buf(288*num_pairs); + std::vector g2_buf(192*num_pairs); for (auto i=0u; i < num_pairs; ++i) { g2 p2 = random_g2(); - p2.toJacobianBytesLE(std::span((uint8_t*)g2_buf.data() + i * 288, (288)), true); + p2.toAffineBytesLE(std::span((uint8_t*)g2_buf.data() + i * 192, (192)), false); } eosio::chain::span g2_points(g2_buf.data(), g2_buf.size()); // prepare result operand - std::vector result_buf(576); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_pairing to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { + auto benchmarked_func = [&]() { interface.interface->bls_pairing(g1_points, g2_points, num_pairs, result); }; @@ -332,27 +307,27 @@ void benchmark_bls_pairing(std::string test_name, uint32_t num_pairs) { // bls_pairing benchmarking with 1 input pair void benchmark_bls_pairing_one_pair() { - benchmark_bls_pairing("bls_pairing 1 pair", 1); + benchmark_bls_pairing_impl("bls_pairing 1 pair", 1); } // bls_pairing benchmarking with 3 input pairs void benchmark_bls_pairing_three_pair() { - benchmark_bls_pairing("bls_pairing 3 pairs", 3); + benchmark_bls_pairing_impl("bls_pairing 3 pairs", 3); } // bls_g1_map benchmarking void benchmark_bls_g1_map() { // prepare e operand. Must be fp LE. - std::vector e_buf = {0xc9, 0x3f,0x81,0x7b, 0x15, 0x9b, 0xdf, 0x84, 0x04, 0xdc, 0x37, 0x85, 0x14, 0xf8, 0x45, 0x19, 0x2b, 0xba, 0xe4, 0xfa, 0xac, 0x7f, 0x4a, 0x56, 0x89, 0x24, 0xf2, 0xd9, 0x72, 0x51, 0x25, 0x00, 0x04, 0x89, 0x40, 0x8f, 0xd7, 0x96, 0x46, 0x1c, 0x28, 0x89, 0x00, 0xad, 0xd0, 0x0d, 0x46, 0x18}; - eosio::chain::span e((char*)e_buf.data(), e_buf.size()); + std::array e; + fp a = random_fe(); + a.toBytesLE(std::span((uint8_t*)e.data(), 48), false); // prepare result operand - std::vector result_buf(144); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g1_map to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { + auto benchmarked_func = [&]() { interface.interface->bls_g1_map(e, result); }; @@ -361,17 +336,16 @@ void benchmark_bls_g1_map() { // bls_g2_map benchmarking void benchmark_bls_g2_map() { - // prepare e operand. Must be fp2 LE. - std::vector e_buf = {0xd4, 0xf2, 0xcf, 0xec, 0x99, 0x38, 0x78, 0x09, 0x57, 0x4f, 0xcc, 0x2d, 0xba, 0x10, 0x56, 0x03, 0xd9, 0x50, 0xd4, 0x90, 0xe2, 0xbe, 0xbe, 0x0c, 0x21, 0x2c, 0x05, 0xe1, 0x6b, 0x78, 0x47, 0x45, 0xef, 0x4f, 0xe8, 0xe7, 0x0b, 0x55, 0x4d, 0x0a, 0x52, 0xfe, 0x0b, 0xed, 0x5e, 0xa6, 0x69, 0x0a, 0xde, 0x23, 0x48, 0xeb, 0x89, 0x72, 0xa9, 0x67, 0x40, 0xa4, 0x30, 0xdf, 0x16, 0x2d, 0x92, 0x0e, 0x17, 0x5f, 0x59, 0x23, 0xa7, 0x6d, 0x18, 0x65, 0x0e, 0xa2, 0x4a, 0x8e, 0xc0, 0x6d, 0x41, 0x4c, 0x6d, 0x1d, 0x21, 0x8d, 0x67, 0x3d, 0xac, 0x36, 0x19, 0xa1, 0xa5, 0xc1, 0x42, 0x78, 0x57, 0x08}; - eosio::chain::span e((char*)e_buf.data(), e_buf.size()); + std::array e; + fp2 a = random_fe2(); + a.toBytesLE(std::span((uint8_t*)e.data(), 96), false); // prepare result operand - std::vector result_buf(288); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_g2_map to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { + auto benchmarked_func = [&]() { interface.interface->bls_g2_map(e, result); }; @@ -381,41 +355,90 @@ void benchmark_bls_g2_map() { // bls_fp_mod benchmarking void benchmark_bls_fp_mod() { // prepare scalar operand - std::vector scalar_buf(64); + std::array scalar; // random_scalar returns 32 bytes. need to call it twice for (auto i=0u; i < 2; ++i) { std::array s = random_scalar(); - scalar::toBytesLE(s, std::span((uint8_t*)scalar_buf.data() + i*32, 32)); + scalar::toBytesLE(s, std::span((uint8_t*)scalar.data() + i*32, 32)); } - chain::span scalar(scalar_buf.data(), scalar_buf.size()); // prepare result operand - std::vector result_buf(48); - eosio::chain::span result(result_buf.data(), result_buf.size()); + std::array result; // set up bls_fp_mod to be benchmarked interface_in_benchmark interface; - auto benchmarked_func = [&]() { + auto benchmarked_func = [&]() { interface.interface->bls_fp_mod(scalar, result); }; benchmarking("bls_fp_mod", benchmarked_func); } +void benchmark_bls_fp_mul() { + // prepare op1 + std::array op1; + fp a = random_fe(); + a.toBytesLE(std::span((uint8_t*)op1.data(), 48), false); + + // prepare op2 + std::array op2; + fp b = random_fe(); + b.toBytesLE(std::span((uint8_t*)op2.data(), 48), false); + + // prepare result operand + std::array result; + + // set up bls_fp_mul to be benchmarked + interface_in_benchmark interface; + auto benchmarked_func = [&]() { + interface.interface->bls_fp_mul(op1, op2, result); + }; + + benchmarking("bls_fp_mul", benchmarked_func); +} + +void benchmark_bls_fp_exp() { + // prepare base + std::array base; + fp a = random_fe(); + a.toBytesLE(std::span((uint8_t*)base.data(), 48), false); + + // prepare exp operand + std::array exp; + // random_scalar returns 32 bytes. need to call it twice + for (auto i=0u; i < 2; ++i) { + std::array s = random_scalar(); + scalar::toBytesLE(s, std::span((uint8_t*)exp.data() + i*32, 32)); + } + + // prepare result operand + std::array result; + + // set up bls_fp_exp to be benchmarked + interface_in_benchmark interface; + auto benchmarked_func = [&]() { + interface.interface->bls_fp_exp(base, exp, result); + }; + + benchmarking("bls_fp_exp", benchmarked_func); +} + // register benchmarking functions void bls_benchmarking() { benchmark_bls_g1_add(); benchmark_bls_g2_add(); - benchmark_bls_g1_mul(); - benchmark_bls_g2_mul(); benchmark_bls_pairing_one_pair(); benchmark_bls_pairing_three_pair(); - benchmark_bls_g1_exp_one_point(); - benchmark_bls_g1_exp_three_point(); - benchmark_bls_g2_exp_one_point(); - benchmark_bls_g2_exp_three_point(); + benchmark_bls_g1_weighted_sum_one_point(); + benchmark_bls_g1_weighted_sum_three_point(); + benchmark_bls_g1_weighted_sum_five_point(); + benchmark_bls_g2_weighted_sum_one_point(); + benchmark_bls_g2_weighted_sum_three_point(); + benchmark_bls_g2_weighted_sum_five_point(); benchmark_bls_g1_map(); benchmark_bls_g2_map(); benchmark_bls_fp_mod(); + benchmark_bls_fp_mul(); + benchmark_bls_fp_exp(); } } // namespace benchmark diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 5e0b4b395e..8ba1bf6f01 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -82,6 +82,8 @@ set(CHAIN_WEBASSEMBLY_SOURCES set(CHAIN_HOTSTUFF_SOURCES hotstuff/chain_pacemaker.cpp hotstuff/qc_chain.cpp + hotstuff/finalizer_policy.cpp + hotstuff/hotstuff.cpp ) add_library(eosio_rapidjson INTERFACE) @@ -129,7 +131,6 @@ add_library( eosio_chain ${CHAIN_HOTSTUFF_SOURCES} authority.cpp - finalizer_set.cpp trace.cpp transaction_metadata.cpp protocol_state_object.cpp diff --git a/libraries/chain/abi_serializer.cpp b/libraries/chain/abi_serializer.cpp index ee539fe254..8a1f186026 100644 --- a/libraries/chain/abi_serializer.cpp +++ b/libraries/chain/abi_serializer.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -634,11 +634,11 @@ namespace eosio { namespace chain { _variant_to_binary(type, var, ds, ctx); } - void impl::abi_to_variant::add_block_header_finalizer_set_extension( mutable_variant_object& mvo, const flat_multimap& header_exts ) { - if (header_exts.count(hs_finalizer_set_extension::extension_id())) { - const auto& finalizer_set_extension = - std::get(header_exts.lower_bound(hs_finalizer_set_extension::extension_id())->second); - mvo("proposed_finalizer_set", finalizer_set_extension); + void impl::abi_to_variant::add_block_header_finalizer_policy_extension( mutable_variant_object& mvo, const flat_multimap& header_exts ) { + if (header_exts.count(finalizer_policy_extension::extension_id())) { + const auto& finalizer_policy = + std::get(header_exts.lower_bound(finalizer_policy_extension::extension_id())->second); + mvo("proposed_finalizer_policy", finalizer_policy); } } diff --git a/libraries/chain/block_header.cpp b/libraries/chain/block_header.cpp index 9a614173af..d02018a153 100644 --- a/libraries/chain/block_header.cpp +++ b/libraries/chain/block_header.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 99d428a2b4..e945bf4b26 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -26,8 +26,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -1920,15 +1920,15 @@ struct controller_impl { block_ptr->transactions = std::move( bb._pending_trx_receipts ); - if (bb._pending_block_header_state.proposed_finalizer_set) { - // proposed_finalizer_set can't be set until builtin_protocol_feature_t::instant_finality activated - finalizer_set& fin_set = *bb._pending_block_header_state.proposed_finalizer_set; - ++bb._pending_block_header_state.last_proposed_finalizer_set_generation; - fin_set.generation = bb._pending_block_header_state.last_proposed_finalizer_set_generation; + if (bb._pending_block_header_state.proposed_finalizer_policy) { + // proposed_finalizer_policy can't be set until builtin_protocol_feature_t::instant_finality activated + finalizer_policy& fin_pol = *bb._pending_block_header_state.proposed_finalizer_policy; + ++bb._pending_block_header_state.last_proposed_finalizer_policy_generation; + fin_pol.generation = bb._pending_block_header_state.last_proposed_finalizer_policy_generation; emplace_extension( block_ptr->header_extensions, - hs_finalizer_set_extension::extension_id(), - fc::raw::pack( hs_finalizer_set_extension{ std::move(fin_set) } ) + finalizer_policy_extension::extension_id(), + fc::raw::pack( finalizer_policy_extension{ std::move(fin_pol) } ) ); } @@ -2006,11 +2006,11 @@ struct controller_impl { pending->push(); } - void set_proposed_finalizers(const finalizer_set& fin_set) { + void set_proposed_finalizers(const finalizer_policy& fin_pol) { assert(pending); // has to exist and be building_block since called from host function auto& bb = std::get(pending->_block_stage); - bb._pending_block_header_state.proposed_finalizer_set.emplace(fin_set); + bb._pending_block_header_state.proposed_finalizer_policy.emplace(fin_pol); } /** @@ -3344,8 +3344,8 @@ void controller::register_pacemaker_warn_function(std::functionpacemaker->register_warn_function(std::move(warn_hs_message)); } -void controller::set_proposed_finalizers( const finalizer_set& fin_set ) { - my->set_proposed_finalizers(fin_set); +void controller::set_proposed_finalizers( const finalizer_policy& fin_pol ) { + my->set_proposed_finalizers(fin_pol); } void controller::get_finalizer_state( finalizer_state& fs ) const { @@ -3914,14 +3914,14 @@ void controller_impl::on_activation( db.modify( db.get(), [&]( auto& ps ) { add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_add" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_add" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_mul" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_mul" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_exp" ); - add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_exp" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_weighted_sum" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_weighted_sum" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_pairing" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g1_map" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_g2_map" ); add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mod" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_mul" ); + add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "bls_fp_exp" ); } ); } diff --git a/libraries/chain/finalizer_set.cpp b/libraries/chain/finalizer_set.cpp deleted file mode 100644 index 0e91c64930..0000000000 --- a/libraries/chain/finalizer_set.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include - -namespace eosio::chain { - - /** - * These definitions are all here to avoid including bls_public_key.hpp which includes - * and pulls in bls12-381 types. This keeps bls12-381 out of libtester. - */ - - finalizer_set::finalizer_set() = default; - finalizer_set::~finalizer_set() = default; - - finalizer_set::finalizer_set(const finalizer_set&) = default; - finalizer_set::finalizer_set(finalizer_set&&) noexcept = default; - - finalizer_set& finalizer_set::operator=(const finalizer_set&) = default; - finalizer_set& finalizer_set::operator=(finalizer_set&&) noexcept = default; - -} /// eosio::chain diff --git a/libraries/chain/hotstuff/chain_pacemaker.cpp b/libraries/chain/hotstuff/chain_pacemaker.cpp index a1b0b0b3f9..79c6638102 100644 --- a/libraries/chain/hotstuff/chain_pacemaker.cpp +++ b/libraries/chain/hotstuff/chain_pacemaker.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include // comment this out to remove the core profiler @@ -165,15 +165,15 @@ namespace eosio::chain { // called from main thread void chain_pacemaker::on_irreversible_block( const block_state_legacy_ptr& blk ) { if (!blk->block->header_extensions.empty()) { - std::optional ext = blk->block->extract_header_extension(hs_finalizer_set_extension::extension_id()); + std::optional ext = blk->block->extract_header_extension(finalizer_policy_extension::extension_id()); if (ext) { std::scoped_lock g( _chain_state_mutex ); - if (_active_finalizer_set.generation == 0) { + if (_active_finalizer_policy.generation == 0) { // switching from dpos to hotstuff, all nodes will switch at same block height // block header extension is set in finalize_block to value set by host function set_finalizers _chain->set_hs_irreversible_block_num(blk->block_num); // can be any value <= dpos lib } - _active_finalizer_set = std::move(std::get(*ext)); + _active_finalizer_policy = std::move(std::get(*ext)); } } } @@ -198,8 +198,8 @@ namespace eosio::chain { return p_auth.producer_name; } - const finalizer_set& chain_pacemaker::get_finalizer_set() { - return _active_finalizer_set; + const finalizer_policy& chain_pacemaker::get_finalizer_policy() { + return _active_finalizer_policy; } block_id_type chain_pacemaker::get_current_block_id() { diff --git a/libraries/chain/hotstuff/finalizer_policy.cpp b/libraries/chain/hotstuff/finalizer_policy.cpp new file mode 100644 index 0000000000..a2ae00082e --- /dev/null +++ b/libraries/chain/hotstuff/finalizer_policy.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +namespace eosio::chain { + + /** + * These definitions are all here to avoid including bls_public_key.hpp which includes + * and pulls in bls12-381 types. This keeps bls12-381 out of libtester. + */ + + finalizer_policy::finalizer_policy() = default; + finalizer_policy::~finalizer_policy() = default; + + finalizer_policy::finalizer_policy(const finalizer_policy&) = default; + finalizer_policy::finalizer_policy(finalizer_policy&&) noexcept = default; + + finalizer_policy& finalizer_policy::operator=(const finalizer_policy&) = default; + finalizer_policy& finalizer_policy::operator=(finalizer_policy&&) noexcept = default; + +} /// eosio::chain diff --git a/libraries/chain/hotstuff/hotstuff.cpp b/libraries/chain/hotstuff/hotstuff.cpp new file mode 100644 index 0000000000..91dc48ff67 --- /dev/null +++ b/libraries/chain/hotstuff/hotstuff.cpp @@ -0,0 +1,195 @@ +#include +#include + +namespace eosio::chain { + +inline std::string bitset_to_string(const hs_bitset& bs) { + std::string r; + boost::to_string(bs, r); + return r; +} + +inline hs_bitset vector_to_bitset(const std::vector& v) { + return {v.cbegin(), v.cend()}; +} + +inline std::vector bitset_to_vector(const hs_bitset& bs) { + std::vector r; + r.resize(bs.num_blocks()); + boost::to_block_range(bs, r.begin()); + return r; +} + +bool pending_quorum_certificate::votes_t::add_vote(const std::vector& proposal_digest, size_t index, + const bls_public_key& pubkey, const bls_signature& new_sig) { + if (_bitset[index]) + return false; // shouldn't be already present + if (!fc::crypto::blslib::verify(pubkey, proposal_digest, new_sig)) + return false; + _bitset.set(index); + _sig = fc::crypto::blslib::aggregate({_sig, new_sig}); // works even if _sig is default initialized (fp2::zero()) + return true; +} + +void pending_quorum_certificate::votes_t::reset(size_t num_finalizers) { + if (num_finalizers != _bitset.size()) + _bitset.resize(num_finalizers); + _bitset.reset(); + _sig = bls_signature(); +} + +pending_quorum_certificate::pending_quorum_certificate(size_t num_finalizers, size_t quorum) + : _num_finalizers(num_finalizers) + , _quorum(quorum) { + _weak_votes.resize(num_finalizers); + _strong_votes.resize(num_finalizers); +} + +pending_quorum_certificate::pending_quorum_certificate(const fc::sha256& proposal_id, + const digest_type& proposal_digest, size_t num_finalizers, + size_t quorum) + : pending_quorum_certificate(num_finalizers, quorum) { + _proposal_id = proposal_id; + _proposal_digest.assign(proposal_digest.data(), proposal_digest.data() + 32); +} + +bool pending_quorum_certificate::is_quorum_met() const { + return _state == state_t::weak_achieved || _state == state_t::weak_final || _state == state_t::strong; +} + +void pending_quorum_certificate::reset(const fc::sha256& proposal_id, const digest_type& proposal_digest, + size_t num_finalizers, size_t quorum) { + _proposal_id = proposal_id; + _proposal_digest.assign(proposal_digest.data(), proposal_digest.data() + 32); + _quorum = quorum; + _strong_votes.reset(num_finalizers); + _weak_votes.reset(num_finalizers); + _num_finalizers = num_finalizers; + _state = state_t::unrestricted; +} + +bool pending_quorum_certificate::add_strong_vote(const std::vector& proposal_digest, size_t index, + const bls_public_key& pubkey, const bls_signature& sig) { + assert(index < _num_finalizers); + if (!_strong_votes.add_vote(proposal_digest, index, pubkey, sig)) + return false; + size_t weak = num_weak(); + size_t strong = num_strong(); + + switch (_state) { + case state_t::unrestricted: + case state_t::restricted: + if (strong >= _quorum) { + assert(_state != state_t::restricted); + _state = state_t::strong; + } else if (weak + strong >= _quorum) + _state = (_state == state_t::restricted) ? state_t::weak_final : state_t::weak_achieved; + break; + + case state_t::weak_achieved: + if (strong >= _quorum) + _state = state_t::strong; + break; + + case state_t::weak_final: + case state_t::strong: + // getting another strong vote...nothing to do + break; + } + return true; +} + +bool pending_quorum_certificate::add_weak_vote(const std::vector& proposal_digest, size_t index, + const bls_public_key& pubkey, const bls_signature& sig) { + assert(index < _num_finalizers); + if (!_weak_votes.add_vote(proposal_digest, index, pubkey, sig)) + return false; + size_t weak = num_weak(); + size_t strong = num_strong(); + + switch (_state) { + case state_t::unrestricted: + case state_t::restricted: + if (weak + strong >= _quorum) + _state = state_t::weak_achieved; + + if (weak > (_num_finalizers - _quorum)) { + if (_state == state_t::weak_achieved) + _state = state_t::weak_final; + else if (_state == state_t::unrestricted) + _state = state_t::restricted; + } + break; + + case state_t::weak_achieved: + if (weak >= (_num_finalizers - _quorum)) + _state = state_t::weak_final; + break; + + case state_t::weak_final: + case state_t::strong: + // getting another weak vote... nothing to do + break; + } + return true; +} + +bool pending_quorum_certificate::add_vote(bool strong, const std::vector& proposal_digest, size_t index, + const bls_public_key& pubkey, const bls_signature& sig) { + return strong ? add_strong_vote(proposal_digest, index, pubkey, sig) + : add_weak_vote(proposal_digest, index, pubkey, sig); +} + +// ================== begin compatibility functions ======================= +// these are present just to make the tests still work. will be removed. +// these assume *only* strong votes. +quorum_certificate_message pending_quorum_certificate::to_msg() const { + return {.proposal_id = _proposal_id, + .strong_votes = bitset_to_vector(_strong_votes._bitset), + .active_agg_sig = _strong_votes._sig}; +} + +std::string pending_quorum_certificate::get_votes_string() const { + return std::string("strong(\"") + bitset_to_string(_strong_votes._bitset) + "\", weak(\"" + + bitset_to_string(_weak_votes._bitset) + "\""; +} +// ================== end compatibility functions ======================= + + +valid_quorum_certificate::valid_quorum_certificate(const pending_quorum_certificate& qc) + : _proposal_id(qc._proposal_id) + , _proposal_digest(qc._proposal_digest) { + if (qc._state == pending_quorum_certificate::state_t::strong) { + _strong_votes = qc._strong_votes._bitset; + _sig = qc._strong_votes._sig; + } else if (qc.is_quorum_met()) { + _strong_votes = qc._strong_votes._bitset; + _weak_votes = qc._weak_votes._bitset; + _sig = fc::crypto::blslib::aggregate({qc._strong_votes._sig, qc._weak_votes._sig}); + } else + assert(0); // this should be called only when we have a valid qc. +} + +valid_quorum_certificate::valid_quorum_certificate( + const fc::sha256& proposal_id, const std::vector& proposal_digest, + const std::vector& strong_votes, // bitset encoding, following canonical order + const std::vector& weak_votes, // bitset encoding, following canonical order + const bls_signature& sig) + : _proposal_id(proposal_id) + , _proposal_digest(proposal_digest) + , _sig(sig) { + if (!strong_votes.empty()) + _strong_votes = vector_to_bitset(strong_votes); + if (!weak_votes.empty()) + _weak_votes = vector_to_bitset(weak_votes); +} + +quorum_certificate_message valid_quorum_certificate::to_msg() const { + return { + .proposal_id = _proposal_id, + .strong_votes = _strong_votes ? bitset_to_vector(*_strong_votes) : std::vector{1, 0}, + .active_agg_sig = _sig + }; +} + +} // namespace eosio::chain \ No newline at end of file diff --git a/libraries/chain/hotstuff/qc_chain.cpp b/libraries/chain/hotstuff/qc_chain.cpp index c5ff49b6c6..f94242c056 100644 --- a/libraries/chain/hotstuff/qc_chain.cpp +++ b/libraries/chain/hotstuff/qc_chain.cpp @@ -49,11 +49,11 @@ namespace eosio::chain { return finalizers.count(); // the number of bits in this bitset that are set. } - hs_bitset qc_chain::update_bitset(const hs_bitset& finalizer_set, const bls_public_key& finalizer_key ) { + hs_bitset qc_chain::update_bitset(const hs_bitset& finalizer_policy, const bls_public_key& finalizer_key ) { - hs_bitset b(finalizer_set ); + hs_bitset b(finalizer_policy ); - const auto& finalizers = _pacemaker->get_finalizer_set().finalizers; + const auto& finalizers = _pacemaker->get_finalizer_policy().finalizers; for (size_t i = 0; i < finalizers.size();i++) { if (finalizers[i].public_key == finalizer_key) { @@ -126,7 +126,7 @@ namespace eosio::chain { void qc_chain::reset_qc(const hs_proposal_message& proposal) { fc_tlog(_logger, " === ${id} resetting qc : ${proposal_id}", ("proposal_id" , proposal.proposal_id)("id", _id)); - const auto& finalizers = _pacemaker->get_finalizer_set().finalizers; + const auto& finalizers = _pacemaker->get_finalizer_policy().finalizers; _current_qc.reset(proposal.proposal_id, proposal.get_proposal_digest(), finalizers.size(), _pacemaker->get_quorum_threshold()); } @@ -165,7 +165,7 @@ namespace eosio::chain { } bool qc_chain::am_i_finalizer() { - const auto& finalizers = _pacemaker->get_finalizer_set().finalizers; + const auto& finalizers = _pacemaker->get_finalizer_policy().finalizers; return !_my_finalizer_keys.empty() && std::any_of(finalizers.begin(), finalizers.end(), [&](const auto& fa) { return _my_finalizer_keys.contains(fa.public_key); }); } @@ -256,7 +256,7 @@ namespace eosio::chain { if (signature_required && !_my_finalizer_keys.empty()){ //iterate over all my finalizer keys and sign / broadcast for each that is in the schedule - const auto& finalizers = _pacemaker->get_finalizer_set().finalizers; + const auto& finalizers = _pacemaker->get_finalizer_policy().finalizers; for (const auto& i : finalizers) { auto mfk_itr = _my_finalizer_keys.find(i.public_key); @@ -355,7 +355,7 @@ namespace eosio::chain { // If quorum is already met, we don't need to do anything else. Otherwise, we aggregate the signature. if (!quorum_met) { - const auto& finalizers = _pacemaker->get_finalizer_set().finalizers; + const auto& finalizers = _pacemaker->get_finalizer_policy().finalizers; digest_type digest = p->get_proposal_digest(); for (size_t i=0; iget_proposal_digest(); - const auto& finalizers = _pacemaker->get_finalizer_set().finalizers; + const auto& finalizers = _pacemaker->get_finalizer_policy().finalizers; update_high_qc(valid_quorum_certificate(justify->proposal_id, std::vector(digest.data(), digest.data() + 32), proposal.justify.strong_votes, diff --git a/libraries/chain/hotstuff/test/test_hotstuff.cpp b/libraries/chain/hotstuff/test/test_hotstuff.cpp index d176cf24d4..ded03eac39 100644 --- a/libraries/chain/hotstuff/test/test_hotstuff.cpp +++ b/libraries/chain/hotstuff/test/test_hotstuff.cpp @@ -10,10 +10,9 @@ #include "test_pacemaker.hpp" #include -#include -#include +#include +#include -#include #include #include @@ -182,7 +181,7 @@ static std::vector map_to_sks(std::vector keys){ +static finalizer_policy create_fs(std::vector keys){ std::vector sks; std::vector f_auths; f_auths.reserve(keys.size()); @@ -192,7 +191,7 @@ static finalizer_set create_fs(std::vector keys){ sks.push_back(sk); f_auths.push_back(eosio::chain::finalizer_authority{"" , 1 , pk}); } - eosio::chain::finalizer_set fset; + eosio::chain::finalizer_policy fset; fset.fthreshold = 15; fset.finalizers = f_auths; return fset; @@ -205,13 +204,13 @@ BOOST_AUTO_TEST_CASE(hotstuff_1) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -325,13 +324,13 @@ BOOST_AUTO_TEST_CASE(hotstuff_2) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -415,13 +414,13 @@ BOOST_AUTO_TEST_CASE(hotstuff_2) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -536,13 +535,13 @@ BOOST_AUTO_TEST_CASE(hotstuff_4) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -760,8 +759,8 @@ BOOST_AUTO_TEST_CASE(hotstuff_5) try { std::vector sks_1 = map_to_sks(replica_set_1); std::vector sks_2 = map_to_sks(replica_set_2); - finalizer_set fset_1 = create_fs(replica_set_1); - finalizer_set fset_2 = create_fs(replica_set_2); + finalizer_policy fset_1 = create_fs(replica_set_1); + finalizer_policy fset_2 = create_fs(replica_set_2); //simulating a fork, where test_pacemaker tpm1; @@ -778,12 +777,12 @@ BOOST_AUTO_TEST_CASE(hotstuff_5) try { tpm1.set_proposer("bpe"_n); //honest leader tpm1.set_leader("bpe"_n); tpm1.set_next_leader("bpe"_n); - tpm1.set_finalizer_set(fset_1); + tpm1.set_finalizer_policy(fset_1); tpm2.set_proposer("bpf"_n); //byzantine leader tpm2.set_leader("bpf"_n); tpm2.set_next_leader("bpf"_n); - tpm2.set_finalizer_set(fset_2); + tpm2.set_finalizer_policy(fset_2); auto qcc_bpe = std::find_if(ht1._qc_chains.begin(), ht1._qc_chains.end(), [&](const auto& q){ return q.first == "bpe"_n; }); finalizer_state fs_bpe; @@ -909,13 +908,13 @@ BOOST_AUTO_TEST_CASE(hotstuff_7) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -1044,13 +1043,13 @@ BOOST_AUTO_TEST_CASE(hotstuff_8) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -1184,14 +1183,14 @@ BOOST_AUTO_TEST_CASE(hotstuff_9) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; @@ -1345,14 +1344,14 @@ BOOST_AUTO_TEST_CASE(hotstuff_10) try { hotstuff_test_handler ht; std::vector sks = map_to_sks(unique_replica_keys); - finalizer_set fset = create_fs(unique_replica_keys); + finalizer_policy fset = create_fs(unique_replica_keys); ht.initialize_qc_chains(tpm, unique_replicas, sks); tpm.set_proposer("bpa"_n); tpm.set_leader("bpa"_n); tpm.set_next_leader("bpa"_n); - tpm.set_finalizer_set(fset); + tpm.set_finalizer_policy(fset); auto qcc_bpa = std::find_if(ht._qc_chains.begin(), ht._qc_chains.end(), [&](const auto& q){ return q.first == "bpa"_n; }); finalizer_state fs_bpa; diff --git a/libraries/chain/hotstuff/test/test_pacemaker.cpp b/libraries/chain/hotstuff/test/test_pacemaker.cpp index 2f748c0b45..0590f05df8 100644 --- a/libraries/chain/hotstuff/test/test_pacemaker.cpp +++ b/libraries/chain/hotstuff/test/test_pacemaker.cpp @@ -15,8 +15,8 @@ namespace eosio::chain { _next_leader = next_leader; }; - void test_pacemaker::set_finalizer_set(const eosio::chain::finalizer_set& finalizer_set) { - _finalizer_set = finalizer_set; + void test_pacemaker::set_finalizer_policy(const eosio::chain::finalizer_policy& finalizer_policy) { + _finalizer_policy = finalizer_policy; }; void test_pacemaker::set_current_block_id(block_id_type id) { @@ -165,8 +165,8 @@ namespace eosio::chain { return _next_leader; }; - const finalizer_set& test_pacemaker::get_finalizer_set() { - return _finalizer_set; + const finalizer_policy& test_pacemaker::get_finalizer_policy() { + return _finalizer_policy; }; block_id_type test_pacemaker::get_current_block_id() { diff --git a/libraries/chain/hotstuff/test/test_pacemaker.hpp b/libraries/chain/hotstuff/test/test_pacemaker.hpp index 169bbcbc3c..b83889cf6d 100644 --- a/libraries/chain/hotstuff/test/test_pacemaker.hpp +++ b/libraries/chain/hotstuff/test/test_pacemaker.hpp @@ -2,7 +2,7 @@ #include #include -//#include +//#include namespace eosio::chain { @@ -28,7 +28,7 @@ namespace eosio::chain { void set_next_leader(name next_leader); - void set_finalizer_set(const eosio::chain::finalizer_set& finalizer_set); + void set_finalizer_policy(const eosio::chain::finalizer_policy& finalizer_policy); void set_current_block_id(block_id_type id); @@ -67,7 +67,7 @@ namespace eosio::chain { name get_proposer() override; name get_leader() override; name get_next_leader() override; - const finalizer_set& get_finalizer_set() override; + const finalizer_policy& get_finalizer_policy() override; block_id_type get_current_block_id() override; @@ -98,7 +98,7 @@ namespace eosio::chain { name _leader; name _next_leader; - finalizer_set _finalizer_set; + finalizer_policy _finalizer_policy; block_id_type _current_block_id; diff --git a/libraries/chain/include/eosio/chain/abi_serializer.hpp b/libraries/chain/include/eosio/chain/abi_serializer.hpp index d257ec725f..52b52844f1 100644 --- a/libraries/chain/include/eosio/chain/abi_serializer.hpp +++ b/libraries/chain/include/eosio/chain/abi_serializer.hpp @@ -636,7 +636,7 @@ namespace impl { out(name, std::move(mvo)); } - static void add_block_header_finalizer_set_extension( mutable_variant_object& mvo, const flat_multimap& header_exts ); + static void add_block_header_finalizer_policy_extension( mutable_variant_object& mvo, const flat_multimap& header_exts ); /** * overload of to_variant_object for signed_block @@ -678,7 +678,7 @@ namespace impl { std::get(header_exts.lower_bound(producer_schedule_change_extension::extension_id())->second); mvo("new_producer_schedule", new_producer_schedule); } - add_block_header_finalizer_set_extension(mvo, header_exts); + add_block_header_finalizer_policy_extension(mvo, header_exts); mvo("producer_signature", block.producer_signature); add(mvo, "transactions", block.transactions, resolver, ctx); diff --git a/libraries/chain/include/eosio/chain/block_header.hpp b/libraries/chain/include/eosio/chain/block_header.hpp index b6dac4e2b1..a7f20b7860 100644 --- a/libraries/chain/include/eosio/chain/block_header.hpp +++ b/libraries/chain/include/eosio/chain/block_header.hpp @@ -2,7 +2,8 @@ #include #include #include -#include +#include +#include #include #include @@ -20,7 +21,8 @@ namespace eosio { namespace chain { using block_header_extension_types = detail::block_header_extension_types< protocol_feature_activation, producer_schedule_change_extension, - hs_finalizer_set_extension + finalizer_policy_extension, + proposal_info_extension >; using block_header_extension = block_header_extension_types::block_header_extension_t; diff --git a/libraries/chain/include/eosio/chain/block_header_state.hpp b/libraries/chain/include/eosio/chain/block_header_state.hpp index b9b3a5d4fb..60472c53ca 100644 --- a/libraries/chain/include/eosio/chain/block_header_state.hpp +++ b/libraries/chain/include/eosio/chain/block_header_state.hpp @@ -31,3 +31,5 @@ struct block_header_state_core { bool is_last_qc_strong); }; } } /// namespace eosio::chain + + diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index cd1e386ff9..334fae1f6d 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -27,7 +27,7 @@ namespace eosio::chain { struct finalizer_state; enum class hs_message_warning; using bls_pub_priv_key_map_t = std::map; - struct finalizer_set; + struct finalizer_policy; class authorization_manager; @@ -304,7 +304,7 @@ namespace eosio::chain { void register_pacemaker_bcast_function(std::function&, const hs_message&)> bcast_hs_message); void register_pacemaker_warn_function(std::function warn_hs_message); // called by host function set_finalizers - void set_proposed_finalizers( const finalizer_set& fin_set ); + void set_proposed_finalizers( const finalizer_policy& fin_set ); void get_finalizer_state( finalizer_state& fs ) const; // called from net threads void notify_hs_message( const uint32_t connection_id, const hs_message& msg ); diff --git a/libraries/chain/include/eosio/chain/hotstuff/base_pacemaker.hpp b/libraries/chain/include/eosio/chain/hotstuff/base_pacemaker.hpp index 1e547da5da..28c6606af0 100644 --- a/libraries/chain/include/eosio/chain/hotstuff/base_pacemaker.hpp +++ b/libraries/chain/include/eosio/chain/hotstuff/base_pacemaker.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include namespace eosio::chain { @@ -26,7 +26,7 @@ namespace eosio::chain { virtual name get_proposer() = 0; virtual name get_leader() = 0; virtual name get_next_leader() = 0; - virtual const finalizer_set& get_finalizer_set() = 0; + virtual const finalizer_policy& get_finalizer_policy() = 0; //outbound communications; 'id' is the producer name (can be ignored if/when irrelevant to the implementer) virtual void send_hs_proposal_msg(const hs_proposal_message& msg, const std::string& id, const std::optional& exclude_peer = std::nullopt) = 0; diff --git a/libraries/chain/include/eosio/chain/hotstuff/chain_pacemaker.hpp b/libraries/chain/include/eosio/chain/hotstuff/chain_pacemaker.hpp index 0083655015..a0d33994c2 100644 --- a/libraries/chain/include/eosio/chain/hotstuff/chain_pacemaker.hpp +++ b/libraries/chain/include/eosio/chain/hotstuff/chain_pacemaker.hpp @@ -34,7 +34,7 @@ namespace eosio::chain { name get_proposer() final; name get_leader() final; name get_next_leader() final; - const finalizer_set& get_finalizer_set() final; + const finalizer_policy& get_finalizer_policy() final; block_id_type get_current_block_id() final; @@ -72,7 +72,7 @@ namespace eosio::chain { mutable std::mutex _chain_state_mutex; block_state_legacy_ptr _head_block_state; - finalizer_set _active_finalizer_set; + finalizer_policy _active_finalizer_policy; boost::signals2::scoped_connection _accepted_block_connection; boost::signals2::scoped_connection _irreversible_block_connection; diff --git a/libraries/chain/include/eosio/chain/finalizer_authority.hpp b/libraries/chain/include/eosio/chain/hotstuff/finalizer_authority.hpp similarity index 100% rename from libraries/chain/include/eosio/chain/finalizer_authority.hpp rename to libraries/chain/include/eosio/chain/hotstuff/finalizer_authority.hpp diff --git a/libraries/chain/include/eosio/chain/finalizer_set.hpp b/libraries/chain/include/eosio/chain/hotstuff/finalizer_policy.hpp similarity index 50% rename from libraries/chain/include/eosio/chain/finalizer_set.hpp rename to libraries/chain/include/eosio/chain/hotstuff/finalizer_policy.hpp index 1966eadd25..5e3fdbf0de 100644 --- a/libraries/chain/include/eosio/chain/finalizer_set.hpp +++ b/libraries/chain/include/eosio/chain/hotstuff/finalizer_policy.hpp @@ -6,32 +6,32 @@ namespace eosio::chain { struct finalizer_authority; - struct finalizer_set { - finalizer_set(); - ~finalizer_set(); + struct finalizer_policy { + finalizer_policy(); + ~finalizer_policy(); - finalizer_set(const finalizer_set&); - finalizer_set(finalizer_set&&) noexcept; + finalizer_policy(const finalizer_policy&); + finalizer_policy(finalizer_policy&&) noexcept; - finalizer_set& operator=(const finalizer_set&); - finalizer_set& operator=(finalizer_set&&) noexcept; + finalizer_policy& operator=(const finalizer_policy&); + finalizer_policy& operator=(finalizer_policy&&) noexcept; uint32_t generation = 0; ///< sequentially incrementing version number uint64_t fthreshold = 0; ///< vote fweight threshold to finalize blocks std::vector finalizers; ///< Instant Finality voter set }; - using finalizer_set_ptr = std::shared_ptr; + using finalizer_policy_ptr = std::shared_ptr; /** * Block Header Extension Compatibility */ - struct hs_finalizer_set_extension : finalizer_set { + struct finalizer_policy_extension : finalizer_policy { static constexpr uint16_t extension_id() { return 2; } // TODO 3 instead? static constexpr bool enforce_unique() { return true; } }; } /// eosio::chain -FC_REFLECT( eosio::chain::finalizer_set, (generation)(fthreshold)(finalizers) ) -FC_REFLECT_DERIVED( eosio::chain::hs_finalizer_set_extension, (eosio::chain::finalizer_set), ) \ No newline at end of file +FC_REFLECT( eosio::chain::finalizer_policy, (generation)(fthreshold)(finalizers) ) +FC_REFLECT_DERIVED( eosio::chain::finalizer_policy_extension, (eosio::chain::finalizer_policy), ) \ No newline at end of file diff --git a/libraries/chain/include/eosio/chain/hotstuff/hotstuff.hpp b/libraries/chain/include/eosio/chain/hotstuff/hotstuff.hpp index 577955e079..fb8456af9b 100644 --- a/libraries/chain/include/eosio/chain/hotstuff/hotstuff.hpp +++ b/libraries/chain/include/eosio/chain/hotstuff/hotstuff.hpp @@ -116,6 +116,122 @@ namespace eosio::chain { } }; + using bls_public_key = fc::crypto::blslib::bls_public_key; + using bls_signature = fc::crypto::blslib::bls_signature; + using bls_private_key = fc::crypto::blslib::bls_private_key; + + // -------------------- pending_quorum_certificate ------------------------------------------------- + class pending_quorum_certificate { + public: + enum class state_t { + unrestricted, // No quorum reached yet, still possible to achieve any state. + restricted, // Enough `weak` votes received to know it is impossible to reach the `strong` state. + weak_achieved, // Enough `weak` + `strong` votes for a valid `weak` QC, still possible to reach the `strong` state. + weak_final, // Enough `weak` + `strong` votes for a valid `weak` QC, `strong` not possible anymore. + strong // Enough `strong` votes to have a valid `strong` QC + }; + + struct votes_t { + hs_bitset _bitset; + bls_signature _sig; + + void resize(size_t num_finalizers) { _bitset.resize(num_finalizers); } + size_t count() const { return _bitset.count(); } + + bool add_vote(const std::vector& proposal_digest, size_t index, const bls_public_key& pubkey, + const bls_signature& new_sig); + + void reset(size_t num_finalizers); + }; + + pending_quorum_certificate() = default; + + explicit pending_quorum_certificate(size_t num_finalizers, size_t quorum); + + explicit pending_quorum_certificate(const fc::sha256& proposal_id, + const digest_type& proposal_digest, + size_t num_finalizers, + size_t quorum); + + size_t num_weak() const { return _weak_votes.count(); } + size_t num_strong() const { return _strong_votes.count(); } + + bool is_quorum_met() const; + + void reset(const fc::sha256& proposal_id, const digest_type& proposal_digest, size_t num_finalizers, size_t quorum); + + bool add_strong_vote(const std::vector& proposal_digest, + size_t index, + const bls_public_key& pubkey, + const bls_signature& sig); + + bool add_weak_vote(const std::vector& proposal_digest, + size_t index, + const bls_public_key& pubkey, + const bls_signature& sig); + + bool add_vote(bool strong, + const std::vector& proposal_digest, + size_t index, + const bls_public_key& pubkey, + const bls_signature& sig); + + // ================== begin compatibility functions ======================= + // these are present just to make the tests still work. will be removed. + // these assume *only* strong votes. + quorum_certificate_message to_msg() const; + const fc::sha256& get_proposal_id() const { return _proposal_id; } + std::string get_votes_string() const; + // ================== end compatibility functions ======================= + + friend struct fc::reflector; + fc::sha256 _proposal_id; // only used in to_msg(). Remove eventually + std::vector _proposal_digest; + state_t _state { state_t::unrestricted }; + size_t _num_finalizers {0}; + size_t _quorum {0}; + votes_t _weak_votes; + votes_t _strong_votes; + }; + + // -------------------- valid_quorum_certificate ------------------------------------------------- + class valid_quorum_certificate { + public: + valid_quorum_certificate(const pending_quorum_certificate& qc); + + valid_quorum_certificate(const fc::sha256& proposal_id, + const std::vector& proposal_digest, + const std::vector& strong_votes, //bitset encoding, following canonical order + const std::vector& weak_votes, //bitset encoding, following canonical order + const bls_signature& sig); + + valid_quorum_certificate() = default; + valid_quorum_certificate(const valid_quorum_certificate&) = default; + + bool is_weak() const { return !!_weak_votes; } + bool is_strong() const { return !_weak_votes; } + + // ================== begin compatibility functions ======================= + // these are present just to make the tests still work. will be removed. + // these assume *only* strong votes. + quorum_certificate_message to_msg() const; + const fc::sha256& get_proposal_id() const { return _proposal_id; } + // ================== end compatibility functions ======================= + + friend struct fc::reflector; + fc::sha256 _proposal_id; // [todo] remove + std::vector _proposal_digest; // [todo] remove + std::optional _strong_votes; + std::optional _weak_votes; + bls_signature _sig; + }; + + // -------------------- quorum_certificate ------------------------------------------------------- + struct quorum_certificate { + uint32_t block_height; + valid_quorum_certificate qc; + }; + } //eosio::chain diff --git a/libraries/chain/include/eosio/chain/hotstuff/proposal_info.hpp b/libraries/chain/include/eosio/chain/hotstuff/proposal_info.hpp new file mode 100644 index 0000000000..96e768f8c7 --- /dev/null +++ b/libraries/chain/include/eosio/chain/hotstuff/proposal_info.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace eosio::chain { + + struct proposal_info_t { + uint32_t last_qc_block_height {0}; ///< The block height of the most recent ancestor block that has a QC justification + bool is_last_qc_strong {false}; ///< whether the QC for the block referenced by last_qc_block_height is strong or weak. + }; + + using proposal_info_ptr = std::shared_ptr; + + /** + * Block Header Extension Compatibility + */ + struct proposal_info_extension : proposal_info_t { + static constexpr uint16_t extension_id() { return 3; } + static constexpr bool enforce_unique() { return true; } + }; + +} /// eosio::chain + +FC_REFLECT( eosio::chain::proposal_info_t, (last_qc_block_height)(is_last_qc_strong) ) +FC_REFLECT_DERIVED( eosio::chain::proposal_info_extension, (eosio::chain::proposal_info_t), ) \ No newline at end of file diff --git a/libraries/chain/include/eosio/chain/hotstuff/qc_chain.hpp b/libraries/chain/include/eosio/chain/hotstuff/qc_chain.hpp index 27af13341e..ca58ba6685 100644 --- a/libraries/chain/include/eosio/chain/hotstuff/qc_chain.hpp +++ b/libraries/chain/include/eosio/chain/hotstuff/qc_chain.hpp @@ -5,8 +5,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -74,259 +74,6 @@ namespace eosio::chain { using namespace boost::multi_index; using namespace eosio::chain; - using bls_public_key = fc::crypto::blslib::bls_public_key; - using bls_signature = fc::crypto::blslib::bls_signature; - using bls_private_key = fc::crypto::blslib::bls_private_key; - - inline std::string bitset_to_string(const hs_bitset& bs) { std::string r; boost::to_string(bs, r); return r; } - inline hs_bitset vector_to_bitset(const std::vector& v) { return { v.cbegin(), v.cend() }; } - inline std::vector bitset_to_vector(const hs_bitset& bs) { - std::vector r; - r.resize(bs.num_blocks()); - boost::to_block_range(bs, r.begin()); - return r; - } - - class pending_quorum_certificate { - public: - enum class state_t { - unrestricted, // No quorum reached yet, still possible to achieve any state. - restricted, // Enough `weak` votes received to know it is impossible to reach the `strong` state. - weak_achieved, // Enough `weak` + `strong` votes for a valid `weak` QC, still possible to reach the `strong` state. - weak_final, // Enough `weak` + `strong` votes for a valid `weak` QC, `strong` not possible anymore. - strong // Enough `strong` votes to have a valid `strong` QC - }; - - struct votes_t { - hs_bitset _bitset; - bls_signature _sig; - - void resize(size_t num_finalizers) { _bitset.resize(num_finalizers); } - size_t count() const { return _bitset.count(); } - - bool add_vote(const std::vector& proposal_digest, - size_t index, - const bls_public_key& pubkey, - const bls_signature& new_sig) { - if (_bitset[index]) - return false; // shouldn't be already present - if (!fc::crypto::blslib::verify(pubkey, proposal_digest, new_sig)) - return false; - _bitset.set(index); - _sig = fc::crypto::blslib::aggregate({ _sig, new_sig }); // works even if _sig is default initialized (fp2::zero()) - return true; - } - - void reset(size_t num_finalizers) { - if (num_finalizers != _bitset.size()) - _bitset.resize(num_finalizers); - _bitset.reset(); - _sig = bls_signature(); - } - }; - - pending_quorum_certificate() = default; - - explicit pending_quorum_certificate(size_t num_finalizers, size_t quorum) : - _num_finalizers(num_finalizers), - _quorum(quorum) { - _weak_votes.resize(num_finalizers); - _strong_votes.resize(num_finalizers); - } - - explicit pending_quorum_certificate(const fc::sha256& proposal_id, - const digest_type& proposal_digest, - size_t num_finalizers, - size_t quorum) : - pending_quorum_certificate(num_finalizers, quorum) { - _proposal_id = proposal_id; - _proposal_digest.assign(proposal_digest.data(), proposal_digest.data() + 32); - } - - size_t num_weak() const { return _weak_votes.count(); } - size_t num_strong() const { return _strong_votes.count(); } - - bool is_quorum_met() const { - return _state == state_t::weak_achieved || - _state == state_t::weak_final || - _state == state_t::strong; - } - - // ================== begin compatibility functions ======================= - // these assume *only* strong votes - - // this function is present just to make the tests still work - // it will be removed, as well as the _proposal_id member of this class - quorum_certificate_message to_msg() const { - return {.proposal_id = _proposal_id, - .strong_votes = bitset_to_vector(_strong_votes._bitset), - .active_agg_sig = _strong_votes._sig}; - } - - const fc::sha256& get_proposal_id() const { return _proposal_id; } - std::string get_votes_string() const { - return std::string("strong(\"") + bitset_to_string(_strong_votes._bitset) + "\", weak(\"" + - bitset_to_string(_weak_votes._bitset) + "\""; - } - // ================== end compatibility functions ======================= - - void reset(const fc::sha256& proposal_id, const digest_type& proposal_digest, size_t num_finalizers, size_t quorum) { - _proposal_id = proposal_id; - _proposal_digest.assign(proposal_digest.data(), proposal_digest.data() + 32); - _quorum = quorum; - _strong_votes.reset(num_finalizers); - _weak_votes.reset(num_finalizers); - _num_finalizers = num_finalizers; - _state = state_t::unrestricted; - } - - bool add_strong_vote(const std::vector& proposal_digest, - size_t index, - const bls_public_key& pubkey, - const bls_signature& sig) { - assert(index < _num_finalizers); - if (!_strong_votes.add_vote(proposal_digest, index, pubkey, sig)) - return false; - size_t weak = num_weak(); - size_t strong = num_strong(); - - switch(_state) { - case state_t::unrestricted: - case state_t::restricted: - if (strong >= _quorum) { - assert(_state != state_t::restricted); - _state = state_t::strong; - } else if (weak + strong >= _quorum) - _state = (_state == state_t::restricted) ? state_t::weak_final : state_t::weak_achieved; - break; - - case state_t::weak_achieved: - if (strong >= _quorum) - _state = state_t::strong; - break; - - case state_t::weak_final: - case state_t::strong: - // getting another strong vote...nothing to do - break; - } - return true; - } - - bool add_weak_vote(const std::vector& proposal_digest, - size_t index, - const bls_public_key& pubkey, - const bls_signature& sig) { - assert(index < _num_finalizers); - if (!_weak_votes.add_vote(proposal_digest, index, pubkey, sig)) - return false; - size_t weak = num_weak(); - size_t strong = num_strong(); - - switch(_state) { - case state_t::unrestricted: - case state_t::restricted: - if (weak + strong >= _quorum) - _state = state_t::weak_achieved; - - if (weak > (_num_finalizers - _quorum)) { - if (_state == state_t::weak_achieved) - _state = state_t::weak_final; - else if (_state == state_t::unrestricted) - _state = state_t::restricted; - } - break; - - case state_t::weak_achieved: - if (weak >= (_num_finalizers - _quorum)) - _state = state_t::weak_final; - break; - - case state_t::weak_final: - case state_t::strong: - // getting another weak vote... nothing to do - break; - } - return true; - } - - bool add_vote(bool strong, - const std::vector& proposal_digest, - size_t index, - const bls_public_key& pubkey, - const bls_signature& sig) { - return strong ? add_strong_vote(proposal_digest, index, pubkey, sig) : add_weak_vote(proposal_digest, index, pubkey, sig); - } - - friend struct fc::reflector; - fc::sha256 _proposal_id; // only used in to_msg(). Remove eventually - std::vector _proposal_digest; - state_t _state { state_t::unrestricted }; - size_t _num_finalizers {0}; - size_t _quorum {0}; - votes_t _weak_votes; - votes_t _strong_votes; - }; - - class valid_quorum_certificate { - public: - valid_quorum_certificate(const pending_quorum_certificate& qc) : - _proposal_id(qc._proposal_id), - _proposal_digest(qc._proposal_digest) { - if (qc._state == pending_quorum_certificate::state_t::strong) { - _strong_votes = qc._strong_votes._bitset; - _sig = qc._strong_votes._sig; - } else if (qc.is_quorum_met()) { - _strong_votes = qc._strong_votes._bitset; - _weak_votes = qc._weak_votes._bitset; - _sig = fc::crypto::blslib::aggregate({ qc._strong_votes._sig, qc._weak_votes._sig }); - } else - assert(0); // this should be called only when we have a valid qc. - } - - valid_quorum_certificate(const fc::sha256& proposal_id, - const std::vector& proposal_digest, - const std::vector& strong_votes, //bitset encoding, following canonical order - const std::vector& weak_votes, //bitset encoding, following canonical order - const bls_signature& sig) : - _proposal_id(proposal_id), - _proposal_digest(proposal_digest), - _sig(sig) - { - if (!strong_votes.empty()) - _strong_votes = vector_to_bitset(strong_votes); - if (!weak_votes.empty()) - _weak_votes = vector_to_bitset(weak_votes); - } - - valid_quorum_certificate() = default; - valid_quorum_certificate(const valid_quorum_certificate&) = default; - - bool is_weak() const { return !!_weak_votes; } - bool is_strong() const { return !_weak_votes; } - - // ================== begin compatibility functions ======================= - // these assume *only* strong votes - - // this function is present just to make the tests still work - // it will be removed, as well as the _proposal_id member of this class - quorum_certificate_message to_msg() const { - return {.proposal_id = _proposal_id, - .strong_votes = _strong_votes ? bitset_to_vector(*_strong_votes) : std::vector{1,0}, - .active_agg_sig = _sig}; - } - - const fc::sha256& get_proposal_id() const { return _proposal_id; } - // ================== end compatibility functions ======================= - - friend struct fc::reflector; - fc::sha256 _proposal_id; // [todo] remove - std::vector _proposal_digest; - std::optional _strong_votes; - std::optional _weak_votes; - bls_signature _sig; - }; - struct seen_votes { fc::sha256 proposal_id; // id of proposal being voted on uint64_t height; // height of the proposal (for GC) @@ -373,7 +120,7 @@ namespace eosio::chain { uint32_t positive_bits_count(const hs_bitset& finalizers); - hs_bitset update_bitset(const hs_bitset& finalizer_set, const bls_public_key& finalizer_key); + hs_bitset update_bitset(const hs_bitset& finalizer_policy, const bls_public_key& finalizer_key); void reset_qc(const hs_proposal_message& proposal); diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp index 6d8b9b5141..819a7f0c31 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm-oc/intrinsic_mapping.hpp @@ -270,14 +270,14 @@ inline constexpr auto get_intrinsic_table() { "env.get_block_num", "env.bls_g1_add", "env.bls_g2_add", - "env.bls_g1_mul", - "env.bls_g2_mul", - "env.bls_g1_exp", - "env.bls_g2_exp", + "env.bls_g1_weighted_sum", + "env.bls_g2_weighted_sum", "env.bls_pairing", "env.bls_g1_map", "env.bls_g2_map", "env.bls_fp_mod", + "env.bls_fp_mul", + "env.bls_fp_exp", "env.set_finalizers" ); } diff --git a/libraries/chain/include/eosio/chain/webassembly/interface.hpp b/libraries/chain/include/eosio/chain/webassembly/interface.hpp index f93225c5e2..c94a3aa0eb 100644 --- a/libraries/chain/include/eosio/chain/webassembly/interface.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/interface.hpp @@ -176,22 +176,22 @@ namespace webassembly { /** * Submits a finalizer set change to Hotstuff. * - * // format for packed finalizer_set + * // format for packed finalizer_policy * struct abi_finalizer_authority { * std::string description; * uint64_t fweight = 0; // weight that this finalizer's vote has for meeting fthreshold * std::array public_key_g1_affine_le; * }; - * struct abi_finalizer_set { + * struct abi_finalizer_policy { * uint64_t fthreshold = 0; * std::vector finalizers; * }; * * @ingroup privileged * - * @param packed_finalizer_set - a serialized finalizer_set object. + * @param packed_finalizer_policy - a serialized finalizer_policy object. */ - void set_finalizers(span packed_finalizer_set); + void set_finalizers(span packed_finalizer_policy); /** * Retrieve the blockchain config parameters. @@ -1727,7 +1727,7 @@ namespace webassembly { * @param op1 - a span containing the first operand G1 point. * @param op2 - a span containing the second operand G1 point. * @param[out] result - the result op1 + op2. - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t alt_bn128_add(span op1, span op2, span result) const; @@ -1738,7 +1738,7 @@ namespace webassembly { * @param g1_point - a span containing G1 point. * @param scalar - a span containing the scalar. * @param[out] result - g1 * scalar. - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t alt_bn128_mul(span g1_point, span scalar, span result) const; @@ -1762,7 +1762,7 @@ namespace webassembly { * @param exp - a span containing EXPONENT. * @param modulus - a span containing MODULUS. * @param[out] out - the result (BASE**EXPONENT) % MODULUS - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t mod_exp(span base, span exp, span modulus, span out) const; @@ -1779,7 +1779,7 @@ namespace webassembly { * @param t1_offset - offset counters - unsigned 64-bit little-endian word * @param final - the final block indicator flag - (1-true, all other values == false) * @param[out] result - the result - * @return -1 if there was an error 0 otherwise + * @return -1 if there was an error, 0 otherwise */ int32_t blake2_f( uint32_t rounds, span state, span message, span t0_offset, span t1_offset, int32_t final, span result) const; @@ -1801,7 +1801,7 @@ namespace webassembly { * @param digest - digest of the message that was signed. * @param[out] pub - output buffer for the public key result. * - * @return -1 if there was an error 0 otherwise. + * @return -1 if there was an error, 0 otherwise. */ int32_t k1_recover( span signature, span digest, span pub) const; @@ -1809,10 +1809,10 @@ namespace webassembly { * Host function for G1 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand G1 point. - * @param op2 - a span containing the second operand G1 point. - * @param[out] result - the result op1 + op2. - * @return -1 if there was an error 0 otherwise + * @param op1 - a span containing the affine coordinates of the first operand G1 point - 96 bytes little-endian. + * @param op2 - a span containing the affine coordinates of the second operand G1 point - 96 bytes little-endian. + * @param[out] result - the result op1 + op2 - affine coordinates 96 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g1_add(span op1, span op2, span result) const; @@ -1820,68 +1820,46 @@ namespace webassembly { * Host function for G2 addition on the elliptic curve bls12-381 * * @ingroup crypto - * @param op1 - a span containing the first operand G2 point. - * @param op2 - a span containing the second operand G2 point. - * @param[out] result - the result op1 + op2. - * @return -1 if there was an error 0 otherwise + * @param op1 - a span containing the affine coordinates of the first operand G2 point - 192 bytes little-endian. + * @param op2 - a span containing the affine coordinates of the second operand G2 point - 192 bytes little-endian. + * @param[out] result - the result op1 + op2 - affine coordinates 192 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g2_add(span op1, span op2, span result) const; /** - * Host function for G1 scalar multiplication on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param point - a span containing the G1 point operand. - * @param scalar - a span containing the scalar operand. - * @param[out] result - the result: scalar * point. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g1_mul(span point, span scalar, span result) const; - - /** - * Host function for G2 scalar multiplication on the elliptic curve bls12-381 - * - * @ingroup crypto - * @param point - a span containing the G2 point operand. - * @param scalar - a span containing the scalar operand. - * @param[out] result - the result op1 * op2. - * @return -1 if there was an error 0 otherwise - */ - int32_t bls_g2_mul(span point, span scalar, span result) const; - - /** - * Host function for G1 multi-exponentiation on the elliptic curve bls12-381 + * Host function for G1 weighted sum on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G1 points (P0, P1, P2... Pn). - * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). + * @param points - a span containing a list of G1 points (P0, P1, P2... Pn) - affine coordinates 96*n bytes little-endian. + * @param scalars - a span containing a list of 32 byte scalars (s0, s1, s2... sn) - 32*n bytes little-endian. * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. - * @return -1 if there was an error 0 otherwise + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. - affine coordinates 96 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ - int32_t bls_g1_exp(span points, span scalars, const uint32_t n, span result) const; + int32_t bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const; /** - * Host function for G2 multi-exponentiation on the elliptic curve bls12-381 + * Host function for G2 weighted sum on the elliptic curve bls12-381 * * @ingroup crypto - * @param points - a span containing a list of G2 points (P0, P1, P2... Pn). - * @param scalars - a span containing a list of scalars (s0, s1, s2... sn). + * @param points - a span containing a list of G2 points (P0, P1, P2... Pn) - affine coordinates 192*n bytes little-endian. + * @param scalars - a span containing a list of 32 byte scalars (s0, s1, s2... sn) - 32*n bytes little-endian. * @param n - the number of elements in the lists. - * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn. - * @return -1 if there was an error 0 otherwise + * @param[out] result - the result s0 * P0 + s1 * P1 + ... + sn * Pn - affine coordinates 192 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ - int32_t bls_g2_exp(span points, span scalars, const uint32_t n, span result) const; + int32_t bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const; /** * Host function to calculate the pairing of (G1, G2) pairs on the elliptic curve bls12-381 * * @ingroup crypto - * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn). - * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn). + * @param g1_points - a span containing a list of G1 points (P0, P1, P2... Pn) - affine coordinates 96*n bytes little-endian. + * @param g2_points - a span containing a list of G2 points (P0, P1, P2... Pn) - affine coordinates 192*n bytes little-endian.. * @param n - the number of elements in the lists. - * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) - * @return -1 if there was an error 0 otherwise + * @param[out] result - the result e(g1_0, g2_0) * e(g1_1, g2_1) * ... * e(g1_n, g2_n) - 576 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const; @@ -1889,9 +1867,9 @@ namespace webassembly { * Host function for mapping fp to G1 on the elliptic curve bls12-381 * * @ingroup crypto - * @param e - a span containing the field element fp to be mapped. - * @param[out] result - the resulting element in G1. - * @return -1 if there was an error 0 otherwise + * @param e - a span containing the field element fp to be mapped - 48 bytes little-endian. + * @param[out] result - the resulting element in G1 - affine coordinates 96 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g1_map(span e, span result) const; @@ -1899,23 +1877,44 @@ namespace webassembly { * Host function for mapping fp2 to G2 on the elliptic curve bls12-381 * * @ingroup crypto - * @param e - a span containing the field element fp2 to be mapped. - * @param[out] result - the resulting element in G2. - * @return -1 if there was an error 0 otherwise + * @param e - a span containing the field element fp2 to be mapped - 96 bytes little-endian. + * @param[out] result - the resulting element in G2 - affine coordinates 192 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_g2_map(span e, span result) const; /** * Host function for modular reduction of 64 bytes wide scalar to a field element (fp, 48 bytes) of the elliptic curve bls12-381 - * Involves Montgomery conversion on the resulting field element. * * @ingroup crypto - * @param s - a span containing the 64 bytes wide scalar to be reduced. - * @param[out] result - the resulting field element fp in Montogomery form. - * @return -1 if there was an error 0 otherwise + * @param s - a span containing the 64 bytes little-endian wide scalar to be reduced. + * @param[out] result - the resulting field element fp - 48 bytes little-endian. + * @return -1 if there was an error, 0 otherwise */ int32_t bls_fp_mod(span s, span result) const; + /** + * Host function for multiplication of field elements (fp, 48 bytes) of the elliptic curve bls12-381 + * + * @ingroup crypto + * @param op1 - a span containing the first operand fp point - 48 bytes little-endian. + * @param op2 - a span containing the second operand fp point - 48 bytes little-endian. + * @param[out] result - the result op1 * op2 - 48 bytes little-endian. + * @return -1 if there was an error, 0 otherwise + */ + int32_t bls_fp_mul(span op1, span op2, span result) const; + + /** + * Host function for exponentiation of field elements (fp, 48 bytes) of the elliptic curve bls12-381 + * + * @ingroup crypto + * @param base - a span containing the base fp point - 48 bytes little-endian. + * @param exp - a span containing the 64 bytes little-endian wide scalar as exponent. + * @param[out] result - the result of base to the power of exp - 48 bytes little-endian. + * @return -1 if there was an error, 0 otherwise + */ + int32_t bls_fp_exp(span base, span exp, span result) const; + // compiler builtins api void __ashlti3(legacy_ptr, uint64_t, uint64_t, uint32_t) const; void __ashrti3(legacy_ptr, uint64_t, uint64_t, uint32_t) const; diff --git a/libraries/chain/protocol_feature_manager.cpp b/libraries/chain/protocol_feature_manager.cpp index bc4b4cc2e5..19eb7ad8ca 100644 --- a/libraries/chain/protocol_feature_manager.cpp +++ b/libraries/chain/protocol_feature_manager.cpp @@ -262,13 +262,14 @@ Enables new `get_block_num` intrinsic which returns the current block number. {} } ) ( builtin_protocol_feature_t::bls_primitives, builtin_protocol_feature_spec{ - "BLS_PRIMITIVES", - fc::variant("01969c44de35999b924095ae7f50081a7f274409fdbccb9fc54fa7836c76089c").as(), + "BLS_PRIMITIVES2", + fc::variant("c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b").as(), // SHA256 hash of the raw message below within the comment delimiters (do not modify message below). /* -Builtin protocol feature: BLS_PRIMITIVES +Builtin protocol feature: BLS_PRIMITIVES2 + Adds new cryptographic host functions -- Add, multiply, multi-exponentiation and pairing functions for the bls12-381 elliptic curve. +- Add, weighted sum, map, and pairing functions for the bls12-381 elliptic curve. */ {} } ) diff --git a/libraries/chain/webassembly/crypto.cpp b/libraries/chain/webassembly/crypto.cpp index 606ca383e7..fb99fae07f 100644 --- a/libraries/chain/webassembly/crypto.cpp +++ b/libraries/chain/webassembly/crypto.cpp @@ -10,6 +10,7 @@ #include #include +// local helpers namespace { uint32_t ceil_log2(uint32_t n) { @@ -20,6 +21,12 @@ namespace { }; } +// bls implementation +namespace { + using eosio::chain::span; + using eosio::chain::webassembly::return_code; +} + namespace eosio { namespace chain { namespace webassembly { void interface::assert_recover_key( legacy_ptr digest, @@ -252,69 +259,52 @@ namespace eosio { namespace chain { namespace webassembly { return return_code::success; } - int32_t interface::bls_g1_add(span op1, span op2, span result) const - { - if(op1.size() != 144 || op2.size() != 144 || result.size() != 144) + int32_t interface::bls_g1_add(span op1, span op2, span result) const { + if(op1.size() != 96 || op2.size() != 96 || result.size() != 96) return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 144), false, true); - std::optional b = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 144), false, true); - if(!a.has_value() || !b.has_value()) + std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 96), true, false); + std::optional b = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 96), true, false); + if(!a || !b) return return_code::failure; - bls12_381::g1 c = a.value().add(b.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 c = a->add(*b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); return return_code::success; } - int32_t interface::bls_g2_add(span op1, span op2, span result) const - { - if(op1.size() != 288 || op2.size() != 288 || result.size() != 288) + int32_t interface::bls_g2_add(span op1, span op2, span result) const { + if(op1.size() != 192 || op2.size() != 192 || result.size() != 192) return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op1.data(), 288), false, true); - std::optional b = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)op2.data(), 288), false, true); - if(!a.has_value() || !b.has_value()) + std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op1.data(), 192), true, false); + std::optional b = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)op2.data(), 192), true, false); + if(!a || !b) return return_code::failure; - bls12_381::g2 c = a.value().add(b.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 c = a->add(*b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); return return_code::success; } - int32_t interface::bls_g1_mul(span point, span scalar, span result) const - { - if(point.size() != 144 || scalar.size() != 32 || result.size() != 144) - return return_code::failure; - std::optional a = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 144), false, true); - if(!a.has_value()) + int32_t interface::bls_g1_weighted_sum(span points, span scalars, const uint32_t n, span result) const { + if(points.size() != n*96 || scalars.size() != n*32 || result.size() != 96) return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalar.data(), 32)); - bls12_381::g1 c = a.value().mulScalar(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); - return return_code::success; - } - int32_t interface::bls_g2_mul(span point, span scalar, span result) const - { - if(point.size() != 288 || scalar.size() != 32 || result.size() != 288) - return return_code::failure; - std::optional a = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)point.data(), 288), false, true); - if(!a.has_value()) - return return_code::failure; - std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalar.data(), 32)); - bls12_381::g2 c = a.value().mulScalar(b); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); - return return_code::success; - } + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 96), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g1 c = a->scale(b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); + return return_code::success; + } - int32_t interface::bls_g1_exp(span points, span scalars, const uint32_t n, span result) const - { - if(points.size() != n*144 || scalars.size() != n*32 || result.size() != 144) - return return_code::failure; std::vector pv; std::vector> sv; pv.reserve(n); sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*144, 144), false, true); + std::optional p = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*96, 96), true, false); if(!p.has_value()) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); @@ -323,87 +313,120 @@ namespace eosio { namespace chain { namespace webassembly { if(i%10 == 0) context.trx_context.checktime(); } - bls12_381::g1 r = bls12_381::g1::multiExp(pv, sv, [this](){ context.trx_context.checktime(); }).value(); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 r = bls12_381::g1::weightedSum(pv, sv, [this](){ context.trx_context.checktime();}); // accessing value is safe + r.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); return return_code::success; } - int32_t interface::bls_g2_exp(span points, span scalars, const uint32_t n, span result) const - { - if(points.size() != n*288 || scalars.size() != n*32 || result.size() != 288) + int32_t interface::bls_g2_weighted_sum(span points, span scalars, const uint32_t n, span result) const { + if(points.size() != n*192 || scalars.size() != n*32 || result.size() != 192) return return_code::failure; + + // Use much efficient scale for the special case of n == 1. + if (1 == n) { + std::optional a = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data(), 192), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<4>(std::span((uint8_t*)scalars.data(), 32)); + bls12_381::g2 c = a->scale(b); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); + return return_code::success; + } + std::vector pv; std::vector> sv; pv.reserve(n); sv.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)points.data() + i*288, 288), false, true); - if(!p.has_value()) + std::optional p = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)points.data() + i*192, 192), true, false); + if(!p) return return_code::failure; std::array s = bls12_381::scalar::fromBytesLE<4>(std::span((const uint8_t*)scalars.data() + i*32, 32)); - pv.push_back(p.value()); + pv.push_back(*p); sv.push_back(s); if(i%6 == 0) context.trx_context.checktime(); } - bls12_381::g2 r = bls12_381::g2::multiExp(pv, sv, [this](){ context.trx_context.checktime(); }).value(); // accessing value is safe - r.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 r = bls12_381::g2::weightedSum(pv, sv, [this](){ context.trx_context.checktime();}); // accessing value is safe + r.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); return return_code::success; } - int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const - { - if(g1_points.size() != n*144 || g2_points.size() != n*288 || result.size() != 576) + int32_t interface::bls_pairing(span g1_points, span g2_points, const uint32_t n, span result) const { + if(g1_points.size() != n*96 || g2_points.size() != n*192 || result.size() != 576) return return_code::failure; std::vector> v; v.reserve(n); for(uint32_t i = 0; i < n; i++) { - std::optional p_g1 = bls12_381::g1::fromJacobianBytesLE(std::span((const uint8_t*)g1_points.data() + i*144, 144), true, true); - std::optional p_g2 = bls12_381::g2::fromJacobianBytesLE(std::span((const uint8_t*)g2_points.data() + i*288, 288), true, true); - if(!p_g1.has_value() || !p_g2.has_value()) + std::optional p_g1 = bls12_381::g1::fromAffineBytesLE(std::span((const uint8_t*)g1_points.data() + i*96, 96), true, false); + std::optional p_g2 = bls12_381::g2::fromAffineBytesLE(std::span((const uint8_t*)g2_points.data() + i*192, 192), true, false); + if(!p_g1 || !p_g2) return return_code::failure; - bls12_381::pairing::add_pair(v, p_g1.value(), p_g2.value()); + bls12_381::pairing::add_pair(v, *p_g1, *p_g2); if(i%4 == 0) context.trx_context.checktime(); } - bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime(); }); - r.toBytesLE(std::span((uint8_t*)result.data(), 576), true); + bls12_381::fp12 r = bls12_381::pairing::calculate(v, [this](){ context.trx_context.checktime();}); + r.toBytesLE(std::span((uint8_t*)result.data(), 576), false); return return_code::success; } - int32_t interface::bls_g1_map(span e, span result) const - { - if(e.size() != 48 || result.size() != 144) + int32_t interface::bls_g1_map(span e, span result) const { + if(e.size() != 48 || result.size() != 96) return return_code::failure; - std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, true); - if(!a.has_value()) + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)e.data(), 48), true, false); + if(!a) return return_code::failure; - bls12_381::g1 c = bls12_381::g1::mapToCurve(a.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 144), true); + bls12_381::g1 c = bls12_381::g1::mapToCurve(*a); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 96), false); return return_code::success; } - int32_t interface::bls_g2_map(span e, span result) const - { - if(e.size() != 96 || result.size() != 288) + int32_t interface::bls_g2_map(span e, span result) const { + if(e.size() != 96 || result.size() != 192) return return_code::failure; - std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, true); - if(!a.has_value()) + std::optional a = bls12_381::fp2::fromBytesLE(std::span((const uint8_t*)e.data(), 96), true, false); + if(!a) return return_code::failure; - bls12_381::g2 c = bls12_381::g2::mapToCurve(a.value()); - c.toJacobianBytesLE(std::span((uint8_t*)result.data(), 288), true); + bls12_381::g2 c = bls12_381::g2::mapToCurve(*a); + c.toAffineBytesLE(std::span((uint8_t*)result.data(), 192), false); return return_code::success; } - int32_t interface::bls_fp_mod(span s, span result) const - { + int32_t interface::bls_fp_mod(span s, span result) const { + // s is scalar. if(s.size() != 64 || result.size() != 48) - return return_code::failure; + return return_code::failure; std::array k = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)s.data(), 64)); bls12_381::fp e = bls12_381::fp::modPrime<8>(k); - e.toBytesLE(std::span((uint8_t*)result.data(), 48), true); + e.toBytesLE(std::span((uint8_t*)result.data(), 48), false); + return return_code::success; + } + + int32_t interface::bls_fp_mul(span op1, span op2, span result) const { + if(op1.size() != 48 || op2.size() != 48 || result.size() != 48) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op1.data(), 48), true, false); + std::optional b = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)op2.data(), 48), true, false); + if(!a || !b) + return return_code::failure; + bls12_381::fp c = a->multiply(*b); + c.toBytesLE(std::span((uint8_t*)result.data(), 48), false); + return return_code::success; + } + + int32_t interface::bls_fp_exp(span base, span exp, span result) const { + // exp is scalar. + if(base.size() != 48 || exp.size() != 64 || result.size() != 48) + return return_code::failure; + std::optional a = bls12_381::fp::fromBytesLE(std::span((const uint8_t*)base.data(), 48), true, false); + if(!a) + return return_code::failure; + std::array b = bls12_381::scalar::fromBytesLE<8>(std::span((const uint8_t*)exp.data(), 64)); + bls12_381::fp c = a->exp<8>(b); + c.toBytesLE(std::span((uint8_t*)result.data(), 48), false); return return_code::success; } diff --git a/libraries/chain/webassembly/privileged.cpp b/libraries/chain/webassembly/privileged.cpp index 431a3c7945..65d182d915 100644 --- a/libraries/chain/webassembly/privileged.cpp +++ b/libraries/chain/webassembly/privileged.cpp @@ -5,8 +5,8 @@ #include #include #include -#include -#include +#include +#include #include @@ -152,24 +152,24 @@ namespace eosio { namespace chain { namespace webassembly { } } - // format for packed_finalizer_set + // format for packed_finalizer_policy struct abi_finalizer_authority { std::string description; uint64_t fweight = 0; // weight that this finalizer's vote has for meeting fthreshold std::vector public_key_g1_affine_le; // size 96, cdt/abi_serializer has issues with std::array }; - struct abi_finalizer_set { + struct abi_finalizer_policy { uint64_t fthreshold = 0; std::vector finalizers; }; - void interface::set_finalizers(span packed_finalizer_set) { + void interface::set_finalizers(span packed_finalizer_policy) { EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_finalizers not allowed in a readonly transaction"); - fc::datastream ds( packed_finalizer_set.data(), packed_finalizer_set.size() ); - abi_finalizer_set abi_finset; - fc::raw::unpack(ds, abi_finset); + fc::datastream ds( packed_finalizer_policy.data(), packed_finalizer_policy.size() ); + abi_finalizer_policy abi_finpol; + fc::raw::unpack(ds, abi_finpol); - std::vector& finalizers = abi_finset.finalizers; + std::vector& finalizers = abi_finpol.finalizers; EOS_ASSERT( finalizers.size() <= config::max_finalizers, wasm_execution_error, "Finalizer set exceeds the maximum finalizer count for this chain" ); EOS_ASSERT( finalizers.size() > 0, wasm_execution_error, "Finalizer set cannot be empty" ); @@ -177,8 +177,8 @@ namespace eosio { namespace chain { namespace webassembly { std::set unique_finalizer_keys; uint64_t f_weight_sum = 0; - finalizer_set finset; - finset.fthreshold = abi_finset.fthreshold; + finalizer_policy finpol; + finpol.fthreshold = abi_finpol.fthreshold; for (auto& f: finalizers) { EOS_ASSERT( f.description.size() <= config::max_finalizer_description_size, wasm_execution_error, "Finalizer description greater than ${s}", ("s", config::max_finalizer_description_size) ); @@ -188,7 +188,7 @@ namespace eosio { namespace chain { namespace webassembly { EOS_ASSERT(f.public_key_g1_affine_le.size() == 96, wasm_execution_error, "Invalid bls public key length"); std::optional pk = bls12_381::g1::fromAffineBytesLE(std::span(f.public_key_g1_affine_le.data(), 96), check, raw); EOS_ASSERT( pk, wasm_execution_error, "Invalid public key for: ${d}", ("d", f.description) ); - finset.finalizers.push_back(finalizer_authority{.description = std::move(f.description), + finpol.finalizers.push_back(finalizer_authority{.description = std::move(f.description), .fweight = f.fweight, .public_key{fc::crypto::blslib::bls_public_key{*pk}}}); unique_finalizer_keys.insert(*pk); @@ -196,9 +196,9 @@ namespace eosio { namespace chain { namespace webassembly { // system contract should perform a duplicate check and fthreshold check before calling EOS_ASSERT( finalizers.size() == unique_finalizer_keys.size(), wasm_execution_error, "Duplicate finalizer bls key in finalizer set" ); - EOS_ASSERT( finset.fthreshold > f_weight_sum / 2, wasm_execution_error, "Finalizer set threshold cannot be met by finalizer weights" ); + EOS_ASSERT( finpol.fthreshold > f_weight_sum / 2, wasm_execution_error, "Finalizer set threshold cannot be met by finalizer weights" ); - context.control.set_proposed_finalizers( finset ); + context.control.set_proposed_finalizers( finpol ); } uint32_t interface::get_blockchain_parameters_packed( legacy_span packed_blockchain_parameters ) const { @@ -277,4 +277,4 @@ namespace eosio { namespace chain { namespace webassembly { }}} // ns eosio::chain::webassembly FC_REFLECT(eosio::chain::webassembly::abi_finalizer_authority, (description)(fweight)(public_key_g1_affine_le)); -FC_REFLECT(eosio::chain::webassembly::abi_finalizer_set, (fthreshold)(finalizers)); \ No newline at end of file +FC_REFLECT(eosio::chain::webassembly::abi_finalizer_policy, (fthreshold)(finalizers)); \ No newline at end of file diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index 95a090dbca..f3deb55286 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -641,14 +641,14 @@ REGISTER_CF_HOST_FUNCTION( k1_recover ); // bls_primitives protocol feature REGISTER_CF_HOST_FUNCTION( bls_g1_add ); REGISTER_CF_HOST_FUNCTION( bls_g2_add ); -REGISTER_CF_HOST_FUNCTION( bls_g1_mul ); -REGISTER_CF_HOST_FUNCTION( bls_g2_mul ); -REGISTER_CF_HOST_FUNCTION( bls_g1_exp ); -REGISTER_CF_HOST_FUNCTION( bls_g2_exp ); +REGISTER_CF_HOST_FUNCTION( bls_g1_weighted_sum ); +REGISTER_CF_HOST_FUNCTION( bls_g2_weighted_sum ); REGISTER_CF_HOST_FUNCTION( bls_pairing ); REGISTER_CF_HOST_FUNCTION( bls_g1_map ); REGISTER_CF_HOST_FUNCTION( bls_g2_map ); REGISTER_CF_HOST_FUNCTION( bls_fp_mod ); +REGISTER_CF_HOST_FUNCTION( bls_fp_mul ); +REGISTER_CF_HOST_FUNCTION( bls_fp_exp ); } // namespace webassembly } // namespace chain diff --git a/libraries/libfc/libraries/bls12-381 b/libraries/libfc/libraries/bls12-381 index 5b18ef4f8a..3391cbb801 160000 --- a/libraries/libfc/libraries/bls12-381 +++ b/libraries/libfc/libraries/bls12-381 @@ -1 +1 @@ -Subproject commit 5b18ef4f8add17d17aa8fe9233aa363829aca90a +Subproject commit 3391cbb8010584518129c2400354d29fe6bece7a diff --git a/libraries/libfc/test/crypto/test_bls.cpp b/libraries/libfc/test/crypto/test_bls.cpp index 569c2c4e91..f91118f6e2 100644 --- a/libraries/libfc/test/crypto/test_bls.cpp +++ b/libraries/libfc/test/crypto/test_bls.cpp @@ -54,9 +54,9 @@ BOOST_AUTO_TEST_CASE(bls_agg_sig_verify) try { g1 pk2 = public_key(sk2); g2 sig2 = sign(sk2, message_2); - g2 aggSig = aggregate_signatures({sig1, sig2}); + g2 aggSig = aggregate_signatures(vector {sig1, sig2}); - bool ok = aggregate_verify({pk1, pk2}, {message_1, message_2}, aggSig); + bool ok = aggregate_verify(vector{pk1, pk2}, vector>{message_1, message_2}, aggSig); BOOST_CHECK_EQUAL(ok, true); } FC_LOG_AND_RETHROW(); @@ -70,15 +70,15 @@ BOOST_AUTO_TEST_CASE(bls_agg_tree_verify) try { g1 pk2 = public_key(sk2); g2 sig2 = sign(sk2, message_2); - g2 aggSig = aggregate_signatures({sig1, sig2}); + g2 aggSig = aggregate_signatures(vector {sig1, sig2}); array sk3 = secret_key(seed_3); g1 pk3 = public_key(sk3); g2 sig3 = sign(sk3, message_3); - g2 aggSigFinal = aggregate_signatures({aggSig, sig3}); + g2 aggSigFinal = aggregate_signatures(vector {aggSig, sig3}); - bool ok = aggregate_verify({pk1, pk2, pk3}, {message_1, message_2, message_3}, aggSigFinal); + bool ok = aggregate_verify(vector{pk1, pk2, pk3}, vector>{message_1, message_2, message_3}, aggSigFinal); BOOST_CHECK_EQUAL(ok, true); } FC_LOG_AND_RETHROW(); @@ -96,8 +96,8 @@ BOOST_AUTO_TEST_CASE(bls_agg_pk_verify) try { g1 pk3 = public_key(sk3); g2 sig3 = sign(sk3, message_1); - g2 sigAgg = aggregate_signatures({sig1, sig2, sig3}); - g1 pkAgg = aggregate_public_keys({pk1, pk2, pk3}); + g2 sigAgg = aggregate_signatures(vector {sig1, sig2, sig3}); + g1 pkAgg = aggregate_public_keys(vector {pk1, pk2, pk3}); bool ok = verify(pkAgg, message_1, sigAgg); BOOST_CHECK_EQUAL(ok, true); @@ -128,92 +128,11 @@ BOOST_AUTO_TEST_CASE(bls_pop_verify) try { g1 pk2 = public_key(sk2); g2 sig2 = sign(sk2, message_1); - g2 aggsig = aggregate_signatures({sig1, sig2}); - bool ok = pop_fast_aggregate_verify({pk1, pk2}, message_1, aggsig); + g2 aggsig = aggregate_signatures(vector {sig1, sig2}); + bool ok = pop_fast_aggregate_verify(vector{pk1, pk2}, message_1, aggsig); BOOST_CHECK_EQUAL(ok, true); } FC_LOG_AND_RETHROW(); -BOOST_AUTO_TEST_CASE(g1_add_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g1 p({x, x, x}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - p = p.add(p); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g1 p_res = g1::fromJacobianBytesBE(hexToBytes<144>("0x16ebb8f4fc6d887a8de3892d7765b224e3be0f36357a686712241e5767c245ec7d9fc4130046ed883e31ec7d2400d69b02c2a8b22ceaac76c93d771a681011c66189e08d3a16e69aa7484528ffe9d89fbe1664fdff95578c830e0fbfc72447800ffc7c19987633398fa120983552fa3ecab80aa3bdcc0913014c80513279e56ce11624eaffddf5f82fa804b27016e591"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g2_add_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g2 p({fp2({x, x}), fp2({x, x}), fp2({x, x})}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - p = p.add(p); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g2 p_res = g2::fromJacobianBytesBE(hexToBytes<288>("0x121776a6107dd86184188133433092b521527d235a298207529d4ca1679f9794cd3cb7b659cdccbfea32ada2d46fdf3ef7f0b08b6d3cfbad209ba461e8bdc55aadc7da5ac22f4e67b5a88062646f2ece0934d01ca6485f299f47cd132da484600df7cabe551c79ec8622ec6c73e03e2635ee50e36584b13b7f371b634bc00910932bd543a35b45dc33d90bc36d38c88202988dd47f01acf772efd5446c81949ebdc19ca53273a1f07a449b084faf4c8c329179e392dd49ffd4d0c81ce02ae50b35ef56f72b6d4b067b495bc80cfce0eb0d3e6d9aebea696b61e198f9b8bb2394ae2049e1c3c7ebf2d5590964e030cb27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g1_mul_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g1 p({x, x, x}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = p.mulScalar(s); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g1 p_res = g1::fromJacobianBytesBE(hexToBytes<144>("0x0cf5e7694dd3cbfd944aa8a1412826451b247cc74148a1c289831a869c2bf644d8eacf23970af6d167fe0efe4e79b8b61183d39242b00320670c7474c28aeda64187e877d9972619702fc9459876563ea9f8054a4a22262a3566e3af5a4970510e9213062adcdd95878b09e3901d27f47b77a2dc03923eb313856cf2991eb7ec1f76d8da7a832bfc4db4735821ff9081"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g2_mul_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g2 p({fp2({x, x}), fp2({x, x}), fp2({x, x})}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = p.mulScalar(s); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g2 p_res = g2::fromJacobianBytesBE(hexToBytes<288>("0x1203754ff2c1cd33f92b7fbad909540237721c0311f3935762719feca1d4e8d5006824434283611b87fadcc93b41b79318f1bb3b6a6ce403bfac295e096ea17a61d553fbed89f453a78232e88eab2767907eb9f75e9e325db106abd65f5de13d013ed4f63b9142ecdaf225888e13285adb14384fb623ce33a640e04dadcb38090f60d99767be09abe35b3c2337819e50038f9df049cbf0ee1c481560d7fe03be89e3fa68a5f69aab20a40ac2c522ecd89e5e5859753dfa4ecbde951b2e5ae732146f8f94d30becf0c33b7833728f9a0e8292f574d85fd1bf82fef8cb79ff1b5e6bf15e3000027fa9e9e6f670f956220b02fb798444358ffed2efa8999e5ffc27a57a08c8cc44c02ee47cc2ee4e535c046217196095c26de1f4a5ba9866c15c93"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g1_exp_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g1 p({x, x, x}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = g1::multiExp({p}, {s}).value(); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g1 p_res = g1::fromJacobianBytesBE(hexToBytes<144>("0x181b676153b877407d2622e91af6057f5ff445f160c178517828841670debdd61957f8d5376ddeeb1ba0a204eb1eafb007f9d1417540591155acddd91f1fb9c97da24d6eecae002c50a779372dfc247efb1823e27abbdae09fb515f390e982311239b452c1ef85156c979f981ac69208f6fd0014fa9dd66a1999df7fa4a0a4234a4cc14ec62291fd3f924b8353b326b9"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); - -BOOST_AUTO_TEST_CASE(g2_exp_garbage) try { - fp x({0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}); - g2 p({fp2({x, x}), fp2({x, x}), fp2({x, x})}); - BOOST_CHECK_EQUAL(x.isValid(), false); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - array s = {0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}; - p = g2::multiExp({p}, {s}).value(); - BOOST_CHECK_EQUAL(p.isOnCurve(), false); - BOOST_CHECK_EQUAL(p.inCorrectSubgroup(), false); - g2 p_res = g2::fromJacobianBytesBE(hexToBytes<288>("0x158a2a1e3ce68c49f9795908aa3779c6919ed5de5cbcd1d2a331d0742d1eb3cb28014006b5f686204adb5fdca73aea570ee0f0d58880907c8de5867dd99b6b7306b2c3de4a1537e6d042f2b8e44c8086853728cc246726016b0fcf993db3d759005f8ac0cb55113c857c5cf3f83d9b624ce9a2a0a00a1206777cf935721c857b322a611ed0703cf3e922bfb8b19a1f5e10a341b2191ab5a15d35f69850d2adb633e5425eecb7f38dd486a95b3f74d60f3ee6cf692b3c76813407710630763f7605b3828c19203f661732a02f7f546ab354694128bbe5a792a9db4a443c0fe10af0df2bc1b8d07aee99bd6f8c6b26847011aa31634f42f722d52022c736369db470576687fdf819cf15a0db4c01a0bd7028ee17cefdf6d66557d47fb725b6d00f"), false, true).value(); - BOOST_CHECK_EQUAL(p.equal(p_res), true); -} FC_LOG_AND_RETHROW(); BOOST_AUTO_TEST_SUITE_END() diff --git a/unittests/api_tests.cpp b/unittests/api_tests.cpp index 7670003bdb..a08310ac3f 100644 --- a/unittests/api_tests.cpp +++ b/unittests/api_tests.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include @@ -3876,11 +3876,11 @@ BOOST_AUTO_TEST_CASE(set_finalizer_test) { try { t.set_finalizers(finalizers); auto block = t.produce_block(); // this block contains the header extension of the finalizer set - std::optional ext = block->extract_header_extension(hs_finalizer_set_extension::extension_id()); + std::optional ext = block->extract_header_extension(finalizer_policy_extension::extension_id()); BOOST_TEST(!!ext); - BOOST_TEST(std::get(*ext).finalizers.size() == finalizers.size()); - BOOST_TEST(std::get(*ext).generation == 1); - BOOST_TEST(std::get(*ext).fthreshold == finalizers.size() / 3 * 2 + 1); + BOOST_TEST(std::get(*ext).finalizers.size() == finalizers.size()); + BOOST_TEST(std::get(*ext).generation == 1); + BOOST_TEST(std::get(*ext).fthreshold == finalizers.size() / 3 * 2 + 1); // old dpos still in affect until block is irreversible BOOST_TEST(block->confirmed == 0); diff --git a/unittests/bls_primitives_tests.cpp b/unittests/bls_primitives_tests.cpp index 71cac24697..298e6d4fcd 100644 --- a/unittests/bls_primitives_tests.cpp +++ b/unittests/bls_primitives_tests.cpp @@ -45,21 +45,38 @@ BOOST_AUTO_TEST_CASE( bls_testg1add ) { try { using test_add = std::tuple; const std::vector tests = { - //test (2 valid points, both on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "2b90dabdf4613e10d269d70050e61bdc53c6d01ac517ad33cd8e82799d5515dfba05bc172fd280e2a73ff01aca77e30cbf82182b9005141106ef83a6d33dcda8bece738c9f9d6313f7e05945fd92c23a208efbe7a2048c6250f7f14df9f5c215e244ce19aa2759751dfb31f234c644189d4b0eae26beb2ba29a380a052b058a380b3005a7f18391cd44411a0f87d7817", - return_code::success - }, - - //test (2 invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "9bd600247dec313e88ed460013c49f7dec45c267571e241267687a35360fbee324b265772d89e38d7a886dfcf4b8eb16804724c7bf0f0e838c5795fffd6416be9fd8e9ff284548a79ae6163a8de08961c61110681a773dc976acea2cb2a8c20291e51670b204a82ff8f5ddffea2416e16ce5793251804c011309ccbda30ab8ca3efa52359820a18f39337698197cfc0f", - return_code::success - }, + { + // g1::zero() + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + // g1::one() + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "4e0fbf29558c9ac3427c1c8fbb758fe22aa658c30a2d90432501289130db21970c45a950ebc8088846674d90eacb7205289d7479198886ba1bbd16cdd4d9564c6ad75f1d02b93bf761e47086cb3eba22388e9d7773a6fd22a373c6ab8c9d6a16", + return_code::success + }, + { + "aa83970268d80b50a68535d920954bd993217b9114cbe255e5c0b64e748c5683b6518071552148ec555cdb8fed0f07001e76e62761e8d828a74b81f216a0c5ebeb923550cafd110512cec20e33ec9b272c0ff2b88215953945153fc926691506", + "e810c1d6ac7cbae0157a0fc958ef607c33e03dee20e72a97ae72de0dd9a0ef20d768ab4b659429255b87feda0be194062a77cd664976e6560b33c921d5968c19a5d5ae9e38c909690975c084c0a4e82481b01e4023b83d6a8ddcb9d38892f50f", + "145cae227562a69bbf270b8ec8d1783bed4ad0fd43e9c81ac5caa7d3e7feaa3acda07d6033ece1f7f0649d6b75009a03e83ab8f9b44f94c4ab762611266b7a530ce05092ad38b7554a95caa2b63ad0969a902d69f34531dbccf8a4f2e12cf60d", + return_code::success + }, + { + "0aef42fed4a4c2aac650065575458a38f884f7203b57e178c31aafd105a7367ffa2aac730e7563d862da2a749280fb0ff1a37400917e5b0856465cc5e6926733123f2cace3422a831a97ec670810f9197e55e139dc78353907d0cfe4d4824b09", + "81c5a2fc2944fd5c7ec72a46b042d91bb45066a7a05f32efe51131c0112223e2a5c3a96ee5a8599888c810c02c886c001aae129cb3169db130a1c1864e923543101d62fa6933bc5e54f6292642d043e1929ff4302b169e6f15fe311d603cb805", + "6fa0227ecedc07a9d3f28960fd541c8103e7dd21cb4c8849f4924b0f19a43a5a782265bc6c9244a2fb8b23bec0c90a0f32113894d8da9be312ad6dcdafb5792095b8a211ccdf6a6883cd0d5dae5310c31137b7839b46fa6e27a7e1a0933ed60b", + return_code::success + }, + { + "e4569c409a806b2756996f0fffbb1b02a5b3cfe9878137d8f2cc59c6fda0d18ece50880b898066d355d105ff0d2ab507d0ed061c2c52e469a97287e76e5838b3bec7ee4cbbf4d5b87bbb64fc37258e0e7840709fe7a38b778fdb096e1e8c1016", + "9480a24ea403efdfccdfbfbe1013cb4bd27dc0311d9f82b84915082c6daebc2e27366af4a8b401e55f90c95d5220710449efeca8b7275edbd62b0e8de5e298e0517ec40a4f89eec30a09bce22431734f1eab6d7d76a6528f01a538a3a64fcf04", + "2a9771a9656898d9862ea434b6cc6d1fb52bf6a6a7999389784f9186f9dd00177ad8998c429981055f5f4043de2d2402e3c182f21e3fb672e98a0636b8874d1cb127bd3f6f1cd99f29e8786ad113c48317de7d70e93c41dccbbc7dbc3bf86319", + return_code::success + }, }; for(const auto& test : tests) { @@ -98,21 +115,38 @@ BOOST_AUTO_TEST_CASE( bls_testg2add ) { try { using test_add = std::tuple; const std::vector tests = { - //test (2 valid points, both on curve) - { - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "1987cff592d8ae5c83ba9e9a1a016afd3a4e80d646e10a1274ba259b60a405c189945d07b3608d4d339a96429d60f80d8290d66f4e963c0e8c00e35db541ab46e93148fd7e41449f0be0a1883e36e4b56cf87121991d6d4778d499fdf1501c09a9220f11cdfe60560b15d7e6ec33825a8d9ce209fe8e20391d32210ba83dbd77ce4cd6019ca50465f8f5fed4a8a631048739c8d9b8fdc26a962b24f0306f8293a00d72d37fb2fb1b0643d9a8453cbf6a520463a54e25e8c42134d6798d7cce00949892c0f015e698b4386dbc3ef4f9b2b4c61454d90acdcfbf921adcd26bdf77454bdee1eb52a70fcab501fd1cfb0701ba60c9be25f9815bb9c32856144e543140d7c977d4585b0d75467b929db892f2da957948a1b02ecee537bcc742855716", - return_code::success - }, - - //test (2 invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "6084a42d13cd479f295f48a61cd03409ce2e6f646280a8b5674e2fc25adac7ad5ac5bde861a49b20adfb3c6d8bb0f0f73edf6fd4a2ad32eabfcccd59b6b73ccd94979f67a14c9d520782295a237d5221b59230433381188461d87d10a67617120be52ae01cc8d0d4ff49dd92e37991328c4caf4f089b447af0a17332a59cc1bd9e94816c44d5ef72f7ac017fd48d980282c8386dc30bd933dc455ba343d52b931009c04b631b377f3bb18465e350ee35263ee0736cec2286ec791c55becaf70d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027cb30e0640959d5f2ebc7c3e14920ae9423bbb8f998e1616b69eaeb9a6d3e0debe0fc0cc85b497b064b6d2bf756ef35", - return_code::success - }, + { + // g2::zero() + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + // g2::one() + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + "53a027b8caaa52c9781b61f30b4bf181aedb004d1e1eeae10e5e82b895b9c03b86d57ecc170f37d2a940d557395338167735c3478c2878612ac77eb5f686c8c672151e03d11481727410ba04a96206d74f120a73470e529f727fedc1f9de4e0a99984c1ed7959d99bdf34b76e9ec8de88aaa471e22bde6bf9c0091bf69da669a7856522bca8deb0a63b0820d44fb6804f3cc366e8bfddeac67899ca5a01a2e42f508c3137a3f009716416cc6d95332a43671883f5461b33826dd65fa52456d0f", + return_code::success + }, + { + "a75a447bc0dd806bcdaee2cb429498193e409a4d370dfe0e9605c5a9ec4a09c0314c0321f2f918b72e5f37cf10ea7e0b69ac1a7fb3200e63e5cef9929cd2d9afde2fb957989e610c5b44649af8649d968baa0424b873b501be32c66ef040240b469127753f17ca28a072c2151b69d51fecff1ed0f4786b4e6fd4e52ec72f95ef73cf19fc2d6a28267bdf11a262b403110c2e901fb32d0e900082e4934a20c1c06c262533488fd7f9f47e4e2fde102fe98fb48344de25712d5e2e2887bc04d207", + "11cc3115ad08c43ed0b7fc3945ca83c69d0a6663f05b25373ea3fdff14c722a7fddd7a1b4f1cf44290e1c480f50b6208419f6a208ea48a48cef5a345a35c052cf0db4a76c719eb90a5829a8f606e99c807a6ae71493f079c364d57f02cba7c124f344978bb539bea7c448eb96ccea9b6c7b7d2495212b88227fc269ac88391f4a6d23e2d47d4fe47e63f8e709b61450644ba13c08e29770bc397da41466cb26c9fa7a1ffd9b5dd5c51c3ddbfb88412998e41f72e63b7972dfd856b9f11530c01", + "d9458632a7cfcf59e72cf6d1ad70ec8d65d9e81edd0da77c2b10ec4d2a4169f1b0ac46419796d3ed6ef66b34eb76651288d916a5e5b44e75cc849ecd257a223398f92683f2318bf5fe7aa2b5d45e97dad6c415dac4b9cdc1c72071a4c9845c15096b203deb2e071d3856983cb26a101eb193cbfe914000ade94a62339b2e418c4a53578fb177af1986cc9dee3ce9ff0f9598925cb7e5a29af31404fa8cd9c22e17eb1a44b6b461dd9b7dc4d384ad60b82d94e431a389a244b1724a5441ac6009", + return_code::success + }, + { + "21a061f3593c8ed7a9b5e6f4c251bc48a20c7aacd0bd815108463f0a93c09a87c0eebfc1cc10e0b660baf855a3eb2803f0509a61c459389d5c298b4b444ea5330bf3d9e5149bc36a39bc058fa5b1e334372bc04faf088285267fc539e3b5c402bf80f038cc61d6828907276dbcd83ef8259e4d0d574ffaa59791454e4ad96449973b6c69a21cf8e0e615f7071e081213fc06c24053503baa50244faaa25fff561097667d75620539398e8d4cb394bae1b053526f5128c92615e554ed04047b0d", + "1a1185c9b721b3ae9960f12be618bfc3affe0421ea220baab68924acc836704d221e36ab6a5b64d6ba40b549b90ff406d6e5a12ae715d4866759546c02d01f0b62580f5ca883a7e0ec8d8990f0a0e05c8db323a70be785dfb5fd8a34f40826117ff499ef7f3a8eee70ede67813f4464228bfcaf6293984ef627d13d48c30676a402fbf9758592093241e8824b5f062162e93ba61d98c99270abf2545ee00dc69e88c0dcde99b9cd167a3550f05d42ac61d472cf33e890d812b59d2858b6d2113", + "15baed9fe2557619878ed9948544f92cbe15f4d3f337e9e360fc568cef53e4494e9c00e3d7618e79e34224b9aba36d0d03dbc351031e98fcc2167f228fe6759c48f434af22a0bffc027d4a6039a3d509ce9617b993ab3ea0bb71ee22623a4a083847dc6ba8494551aa67cf4cfe18cc85ba6ce94ae9812eb53a74dcd1714c5b76808f6800ea451dea77bac81deb84a002ea45661acd250ae001a31305c33ab5e965cc41d2a52a78e86b2ef75789585bc7e5fb3cca22427c1e3ef32bcb21733c17", + return_code::success + }, + { + "cfb89cdb92a23df51ab91c1cc3579a1adaa518e8509d542321ede6ba0bd85bf6d6c6906d87284cda86433e47220c87117c9f113cb8b52420230fcc7a49b407ccccc666806c40037d931479ddb9e0d1d52fc069d44f4fb92dfc9d5bd5a1390518bb29ad17c7232c4937f27125e31da044b35a0516624f9ea5c756d447202439d69489605025e6aa33ec789adc3b611100205fa8163bcf7050e92362613fd6f5fa55e03aabf49fb6e57b27b2b1fa1703a189d5c643fe2355b19226c0562d643e0e", + "9158359e8b6fc258137f6bd55f89d7c358e7b356f624b9f2571d843cf859f38e60cf50d8f3c4e3e4f787a028ea983d198aa5a6e0756692b7b07ce2cab3cb197a04bdea66a429fe328f18c081f8daac5458ae88c92464225cc3a760ed3f209506e5868b9d083c653d136c2b3ad81764ca721b31582d5accac8793c74f46551b07ba54e8d415fa6569d5b0a985f6bdc40d225dcfa2490201041a2eb04955109258a8fb538c47f16e4b5f07fe6c7b3aa3ad285b0bd4ed42863abb37c94844894b10", + "156337c65f642da937b7792093b419e1bb06bccc9c9f77f8e1809f573e6df6718751bc831b6b53cf4813a3e066f54f188c01ca463034a0a6fb2ba18bd5b951e1c4d4875dd1dbb36fcfb2837bc8f0f441b287505421f0a715e786ebf24a62af0fddff6849aab4f3895a183b4574dd636c4a765fa83d4b17b30ea43607631961964c645a49720166bbc1ff5ad6944f20026d3e7c5358175a8892623c5ddec28c12962033673a1c1b68d951fc57a07594a6ae1ce27cdeae3e86266254516301de13", + return_code::success + }, }; for(const auto& test : tests) { @@ -131,113 +165,7 @@ BOOST_AUTO_TEST_CASE( bls_testg2add ) { try { } FC_LOG_AND_RETHROW() } -BOOST_AUTO_TEST_CASE( bls_testg1mul ) { try { - tester c( setup_policy::preactivate_feature_and_new_bios ); - - const auto& tester1_account = account_name("tester1"); - c.create_accounts( {tester1_account} ); - c.produce_block(); - - const auto& pfm = c.control->get_protocol_feature_manager(); - const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); - BOOST_REQUIRE( d ); - - c.preactivate_protocol_features( {*d} ); - c.produce_block(); - - c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); - c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); - c.produce_block(); - - using test_add = std::tuple; - const std::vector tests = { - //test (valid point, on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "de3e7eeee055abe12a480e58411508d51a356ff6692b14b43426d22cc354cd5d7469c41e0f1f5e40503c91e11419a30285cb057a62c93e2caaaff6c9c1dbc8f88c0a122157f51a617ce0e2890442cd9ce004a8ba972442e61bce9dabf1c6780c191984ae3c11ef21884a536f0d3450974df37295e9579d16cdb8dfdf9252091ca3cd9d05f4c6e645535add05ac197b08", - return_code::success - }, - - //test (invalid point, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "759c3833cb6907e6f1a7fdd6a9c748957498bb8d0282cc641e6020bb18e070170140a4206477882e42a8b551dafe5d11a7e67cff45922bf2a49eea6d64fc5fecb26445170a6ec62233235cc2ac22bbecbf3271cf44f7a59ea0861376b7fe3f130b1865a3ee0d7f5a4bf360b6135c227f46644421caefe01ba82390a8756b7248e24ac4f89c94de92c385abfd6e8fbb11", - return_code::success - }, - }; - - for(const auto& test : tests) { - auto point = hex2bin(std::get<0>(test)); - auto scalar = hex2bin(std::get<1>(test)); - auto expected_result = hex2bin(std::get<2>(test)); - auto expected_error = std::get<3>(test); - - c.push_action( tester1_account, "testg1mul"_n, tester1_account, mutable_variant_object() - ("point", point) - ("scalar", scalar) - ("res", expected_result) - ("expected_error", expected_error) - ); - } - -} FC_LOG_AND_RETHROW() } - -BOOST_AUTO_TEST_CASE( bls_testg2mul ) { try { - tester c( setup_policy::preactivate_feature_and_new_bios ); - - const auto& tester1_account = account_name("tester1"); - c.create_accounts( {tester1_account} ); - c.produce_block(); - - const auto& pfm = c.control->get_protocol_feature_manager(); - const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); - BOOST_REQUIRE( d ); - - c.preactivate_protocol_features( {*d} ); - c.produce_block(); - - c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); - c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); - c.produce_block(); - - using test_add = std::tuple; - const std::vector tests = { - //test (valid point, on curve) - { - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "aa25f3f539b6f3215318d81b22d14bf9108294790e8a50545a404ae2057278304d8c3b5844271202b757767d1555a106ede90a9967cdc27b527d4a5720efda79a68b17072ad9402ed373ce9a2d28f5496106fc4cd23234b083181e8325734417f8330d2ced14040b815a006f7f905361f654d483c45abb90b4a958b4ca20ee2bb97cc1c9b6ff45644539abb32149610f33858c88450dad3d2adb82df72f9ed9c42dc2ef78e17f5a2a1abd0468853d55f05f6458179fdf5671db784795a686c0ffae139afaed0212d18d615b0ff90a9deba090f723190521dc8c822621b0a7e70a03b9f3faaeb862846dccd418855d70406fc57e73783c2da92433c1a3873640217539ec7c01f3d354506d86db49fddad225e82421506d99c19b749170aa4f805", - return_code::success - }, - - //test (invalid point, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a00000000000000", - "50b11bda450431471dc45148066c514489bdc886a8353f382ea4992279d5f01ecec4b1b2782cdc2546cbf6bc070e3701123658149032e1f3af1e63a5ad402549900a42698de7064c9eb7a1b9a344b709073cf033649c01ac6249ab26909b1d194a8d4379563b2ed355b4b63047fc6c0ea9e9b99f75f474db88cee948733dbfd7ddf175d3e67badbce68e3b8515b8e504e666696422b760a10821a881e01d9249ba388eb86f5e8698ebf5cef4454c39144d89b050611a94685ce4505a19422009ef420ad74837caee3ad9a0128c8969e30c130ecbe76ca7157cb12fe59979b777a4df8411519e3137269a05866bd12b1964cc1e6474ea7555e03215a61b2997af51847b27c00fcda059b18be464d51ad8866ce243ca826a184ea25b03d0f9c10b", - return_code::success - }, - }; - - for(const auto& test : tests) { - auto point = hex2bin(std::get<0>(test)); - auto scalar = hex2bin(std::get<1>(test)); - auto expected_result = hex2bin(std::get<2>(test)); - auto expected_error = std::get<3>(test); - - c.push_action( tester1_account, "testg2mul"_n, tester1_account, mutable_variant_object() - ("point", point) - ("scalar", scalar) - ("res", expected_result) - ("expected_error", expected_error) - ); - } - -} FC_LOG_AND_RETHROW() } - -BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { +BOOST_AUTO_TEST_CASE( bls_testg1weightedsum ) { try { tester c( setup_policy::preactivate_feature_and_new_bios ); const auto& tester1_account = account_name("tester1"); @@ -257,23 +185,76 @@ BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { using test_add = std::tuple; const std::vector tests = { - //test (two valid points, on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "9e80ed609e62978a3a7f0d6bf57e1df4070725c1bf4dab43a6b710adef7450fb41f0cf14a7895ec26fd8c830c327cc0e2c8fe7687d23ff84647b47bbad04cf77625dee1049e53ad5162fe772278e5fe3ceb0bdc472f31952343da7b75532f7016613af892092131ad77d13afc8c9192487ac19f8454ad932653145f06e25790d26b23ac6b83025326f3397efbd845511", - return_code::success - }, - - //test (two invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "a4a01d651d82bd2e4f6f0df09b5f57254f2fb3294a83dddda170312f752c6107511739d935d6e5cf9f5ab245ff29b3057c41e220165e0a104493ead21fa8fee939026a77c031ba9f27edeb233375a2172f8cb0fae434365f6a65e1677ef72f00018da74a79be5f8e856f58b7b57f01cce6e1c082309a00612992714c5aed692dd8dba9061dfd04fb8e9dd61acaf3620f", - return_code::success - }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + return_code::success + }, + { + "9a2b8be9aa85b21fc3e57d951f82c725468b3d4896f559270f836a4ae233d0d61e31201df60459b4a8d7e64333fe00163c4c764f7fdbe3e03443155d8ebf4115bd46bfeb0385cd5e6834ee267b578a6064c82a061444d4c93a5af5064186f816", + "94772651ebddc40c83063785c6051b1a04db86716740f608a19e9ac083dfdf34", + 1, + "213f55cf8287927bb4d6859b8e3785728975b4c6c2b1b85786ad8326dcaf1c7124522571feea1cc12e54c18fe9680d0628e254af0a07e90f0d5e8294032c7db51df0fdebbb9b970246e8d8fb2b6b5481b7238ca95880c1acfc6f96b47e148707", + return_code::success + }, + { + "079a4445f4e88d61f591dd1d1f9d6745eb12573b423d38e0ec71ed3c99c82ea3ded755ddd27715201209a9c51fdbd21479f4b92a76f8e840eb7b962e17a9d0b142ebaa7d3fca74a6adbd4fcd38cfb7dc117eb17a5e9bebc2b68adc2376297a0a", + "f69ed20461fa76cfccb98fb2d1220311cc289ef6db6c902ea930fa3ef5992c04", + 1, + "7ef366ab891b0538c30715606e1cda283ff62838f633255abacd0b7d1f4e97d0c580298f390ab147b4c2e3395c6cb107cc63ef2c65383b5898210fde2a300d6838c849f9c18efc3a7bf5d2f1987bb68497f722cffd896e548a26cf69511f6e0b", + return_code::success + }, + { + "663560433bf70503eed31386bc989364d9a75b4853b13c039c5e06b3edb4c80fa23b79484955733427cdf158ea364c0e50bf708a7d05fad908c44983dcda3154378d203e016853eb9edee9f780ca9e87e8a1ab67a696101611075961d02a7f01", + "b9287625a97d175735428a6ab5588425601dc2b8a4bcd71e67f41caba0c6be1e", + 1, + "8490a58c9a4c5ac0228c7df29ab1a5c77e27853ee226dec3d8aec1dc8d51f4fc0cd0071b6bfb43cabd76ff52e6734c195edb5b2c80e8835fc03ec20a428154410f92f3075546af65c012417d114733ab3e3db45d23e7281b4f3117e44663f417", + return_code::success + }, + { + "7a63674c35f9f2be4f0ec092110b82fad24a283316a846d960843b9a6a8a98bfdabd7e897b7da774fbbb05d7ad95fb18940a5f7a7345e1821e0203e156d677e88445385bc0779d25f51b772be3c3a6ba0b09b2533a8ee66053b2f3c853994112e74a97324685e515c86d44ff5a3ef5218e53c6f29e7df49a546c79cd1fb9d14e63f68aaf6b2df1f6f56e6250fdd6f20dcc36499a5aea69f4c77a18774eccf8460e77ab6b0236ce2d85083faeacf0f3378a3dcc95e1d3b0ae282b9bbec1ecee1793e63ca4730ec63df496546c07094e848625610a514d99dd0a6dd9f58d15c4e4ed5aca65025562177ebd0a4c2c3ae8139d24be936dd5dbec6a54897ba2a98a68a9c43ea3199695896789c958bc289a7275550b5670a351b262c10166a48baa161f841df4255408abb7186f78647422313fbe3a0a35699a487dd71482b76b8adc20622f44bb32e04a78b98e4f2cd42f16a6d35ec2463a484906dbb655969b900a15cc8a47694b1961bd4b2e9f074afd79e4c04344d31dd8fcd56d5147a9a47712", + "2be3984dc7a5c9e6172df42c905be929ce5bb29d9aa31a03f3ed8816e7d1265a0669a674fef9254f0efffd3e89c30f1f05587472251d362e1acea03a76918d137b322778b8188c1bf68c36ef8e0ce933290c67f981611c13a286e42235f89855e49966a4e9ad8c64122f4f5e720986193e59771fa91aef113d8739642bdd6613", + 4, + "25038aea2d2d1c15dad2fa4c6e31162d1b79ca1b1bca608190a05dea451701e9fc95a8c441a25083df7fa56d54eae51241a8c9489719b9cc35852ce3d7e04b5ada5c65f45d1818f80ea161264b70ab6fa86e694691281b8110000d209aea5c17", + return_code::success + }, + { + "72a2fe9201ac05c9cfd84d73f9045aec6f22300453e659909d4490f59d598a0bd29d220246a97de00f87c34f05628803383cd31591c16396db11fc9b1f814fefce8427e85789919cfd27654be1c6801feb0b9c9e6550d516fd6e9622764a240ccf149d86a1be65215b8b1a5fd165841fa1cb34c0e5b2781bda44125d1d2890818ce6454f5108beaf395b138a7dd7ac0e41182171d01c3d8e234f5620415c3bc4a120ae317f514ad29f87a3a47e8b4649a0e39ffc25111f998ab8dcb9d149c50219f30b8ad6a3758bd2c60166d1adecb4ac4e2b7bd041a2583b035087b0fc5348096e333cc88668d690a4810c3692e212e8b83d3664fc6587d6794aef2e1cb2ee13cc38060999aa4f9dd40c1754ce98d2b4fd1d2970abfa88c0d416c4c3b2070ae2a9a928bb3be3854b702136c1b69c10dd4af529e8e2d1d97c00f0530eafbebb2de6ece8fad2c4c72d4db2bb0001ee087c30d7527955b23ecebb35106b2e169d25d6e1874db74a02f9729b8f1c7bccbd2d6784617b149ae2a452b77ae0707d15", + "d40ea97ac1a692e96eca089d05111707219729b00e9a2a02998c4f7b0c670d17d3508ec831bfb5f9af0fca2f5d22631333fbadaa002922059850bc641a2ff50eb65d787c1df7a1bef08b783af42a37034b2af4e0ba75f414b0c7a2df113b0a47d1a722acf33058e810b6cc81a59cac3033067cacb776041f157f3e578a241718", + 4, + "f2a68d18e246502e2f8183536f3a932f0f8475f82603159acaa54a958a2bb04c8e3a16c696d180a3309fb508fc659b05d6a167c5181a7dd85f80475f771569facd2f7b5741c0bb13b68574dead93767d67fdd9bba78165351fa1d608379a1801", + return_code::success + }, + { + "72dc1fb76885d993cb0bcf66538aa3b47f607e02bd7d569626cc400787ea1feb7b4b6e9651a263cf120b469d95b12618260335dfc6661f6000b22b3d80d9993226add9060f55f4584aac66541f2d2a7d9d75ffe16f4fab73354134712f90d00f4cbf334117969df79d5783bcce974b81aa61bb6e0093cee480dd66425e8543c106ab6f049f0a49807ea6a51f7850e40d56566492cb66dd99f1a3dcb4932a32720013864e4c8e1a8d6c46d9a8bbb9c2123e6a58bbbc0f4edd6e6e5f25feee4417b340dae988300a5169377a700ba91afeee4cfb762184335a963b69c430c08f985144a0ef76c516b11d58241b8d70210b7a753c067af7f40a1f4d7a19e1283837d0a1bb38b4facbf2e8eb25c3da1654590d5cfca695375d41f292dd83a55284063780992ae2a8abed14205664f0fe69491f41bdbd76322fe8f3f8f660dc53c7b34244cc3d40067b9560fc3d3ae8cb4408144b5ad3859f6f6b18139e6efba950d38beb2135419780add1207f37f529dd8980c60357c81e04bcc701f2ae0385f502", + "06f44a41cf494066febcb41b85afe01021202502a3129110fc116d3a978d662dd98e962ade1024c145473e545b117033bb7029d75263c60f367ef014693a6e30353e2ca706338280750107fd080c272e018af21d1d020f164e2160fde20a1540bff01005ac6c4af5b045cb88980ce049d39174ba095386312622d9b475ccdb35", + 4, + "dd16d75b3de65d6cbf265575e33f4ecede22f03dfd72bd7c3e295b71fbc43ff2e6d9035fa5161450025074bbb498e309468e0c256ce5b44e441a7192b99bdff67c7c9bd7ba927629a68f93b3bc8d40cdada4480c0d4045d4b7e09bed42aa9807", + return_code::success + }, }; for(const auto& test : tests) { @@ -283,7 +264,7 @@ BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { auto expected_result = hex2bin(std::get<3>(test)); auto expected_error = std::get<4>(test); - c.push_action( tester1_account, "testg1exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg1wsum"_n, tester1_account, mutable_variant_object() ("points", points) ("scalars", scalars) ("num", num) @@ -294,7 +275,7 @@ BOOST_AUTO_TEST_CASE( bls_testg1exp ) { try { } FC_LOG_AND_RETHROW() } -BOOST_AUTO_TEST_CASE( bls_testg2exp ) { try { +BOOST_AUTO_TEST_CASE( bls_testg2weightedsum ) { try { tester c( setup_policy::preactivate_feature_and_new_bios ); const auto& tester1_account = account_name("tester1"); @@ -314,23 +295,76 @@ BOOST_AUTO_TEST_CASE( bls_testg2exp ) { try { using test_add = std::tuple; const std::vector tests = { - //test (two valid points, on curve) - { - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "595a2cbaa4315ecc0dd9838a81712e0cfb88cb2c4468640ff382abb321b3a9bedebb0aad985a9057f664fc52eb52cd194b1c9611b25ef4281e439a52d1832813decd66c22440821f0288dcb7a82151386aa0240e943b6905e61619be2e11c208fa03df16e11a1b1368abac90598bb237f785701d5d1d5cb0af6934ed633d366de28703431b8d70899d92797689207c0cd35c345460f971dff5d648d9ddec8f5fabef99b15ea7c4440ac1564d6e0326076f32a4ec9cf0d10059593d64afd35c03d10f16794821628b565c9319f4af3c96b98c4fb11bc0c04172bb57372531f6e76798142d4b00488adbea850a2649a305b71fa389c3c226f2df4a58c8bce5d90698452f4126046be0c82d8817b64162a53787f1cb73af27d969adc626c1392716", - return_code::success - }, - - //test (two invalid points, garbage output) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "2a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a000000000000002a00000000000000", - 2, - "71aa03189998d6bec41f070fe01d38efc3b60e77b6dd7a7676b3f0b8939e2fda916c4609b5d3313e04c382107aac7f014f65cf46d614729fc4255e6e045a1a13e851a81a2f03036973b211ac18152231e24d93805f4b64792d573f490791c20d451af61e3081a4b8f40919969a87bd015363da93d1b7f1ff4c625dae5fa6c95492fefb689e66a10a8d5e9f3d0190e9119e6c11550ac6a09c6ded21e9d67c0ba1e71bcc4ef28879a4d3af1beaf0a9394b7a01c28bd01d0b09818bb8274a275e11d0a3859c637c455a28eef74d4ba33e7a9f0550ef58e5f0e960a4c29b2800ed1697408c7331b198efcd5eda01705640118ef8a64c4e8eb7c5397b9d6e0d8799935be4e973ada583bddf13f2c17129f6ae60f0ec4f39971af53bc154c953312419", - return_code::success - }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + "0000000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + "0100000000000000000000000000000000000000000000000000000000000000", + 1, + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + return_code::success + }, + { + "8d0b9de21f956cc86123edc8610324754dbef1a95b81f457185428a77d7a609926870d9bfc823e072e625d54ff321c110ee726c8af6c06224a87ee4a8a051e3cf1fc3dec26368929582998941a322e6bb06fd86b288c7b4f6836dd1f5a9d4b11c983773bf970bb5bde020860f4686bdab904becd067b48cf8cbbcd4b2931335215ebb1860aafbc43fd1677c7f727810678f000303226d1238666615c1cc89965d73173971882beff2b41a3ee632401b97b159d91be8da485c5f325496308f716", + "4c89b1c20cbb9dbc094eae3b5aea8c0725ebcd60af55421d9389197f2c30432b", + 1, + "7653c096a4ca440098f02b03b973a56dad8c33b2df9ce1676f79e07f858565415630326cd64b4b2702335aafeb37ca12fa8543a0db009a583e9122361ce052f7eaa4cf95671bc69265b3f2364952e0e8af89085d6bfb8751911643ff2b4b000959a5540acfc626325d9497bdc281436716fac51ed88537fde12554cf735d09dca909cf92751f0cbeb89c88fdd9660d0b42e6217cd362bb73d9837229b1a9489298bb912ee0055ed9463465b22c9949481cf27ffa1f4063097b4abfa63d2b0312", + return_code::success + }, + { + "d9105749dc7865ce0769f93864a1872fd8d9c9ada8458ced60ca5ff85ed69bc3f5e2f9ee8905d440db47de5603e05605a3825f9d129cef67e303c7c659c8658ab51ab1a1605fd42b72ea72f4f910f4e9328599db02db3e9c11b6e01e61b8e50118bcbf5c47e0f677aee55f05364f015d8522a59cecdd7823799321a4ffaf33de2841ebf81395e6cd40c0f2c8c2dd65069aec3c985eb24a62537d5eb53268d3efb5b8a19393ed32203f7f4c09c45b3f3a5f72b39a30a1348dd01e3bc0291d6e15", + "1c9380bd8909ae27ddda81d2dfc60b026a57cb0f7acdb81529ff2d3d4bcb8f1a", + 1, + "5461397d46d903f3323bff6ca21a126972081cc5cd48d7bde89b213617baf1332d569044b1a011bdeecb9c3e0281e00016e1c75621fbd582a2be1e05fb8daddcde21b176f27be73062ca7a88f1cf261aead14c5ca2e30313dc7fe79ae63521088805d8cd435d7d2137010226215698f05932c43c0a5e6cf0bcab335453151a2be3ef098f31707a71380f0908d5d08c066cea9b27c98190a563ac810fb1f7f1349c0af6e93d132b267a8ad5b609e81a85e635b6e34409935084a50f294afa9c01", + return_code::success + }, + { + "cea074de7522910e8009b69c3ce1d2cb804304785bca15ed28050aab01d20fb2d69fece1b42708fdfb9412719c27fc00170001c15670fb55a90b9c835b125116748097154afb3a24d66c2d5750ce539fee5f0ebd79e3505be1efa38ff6663005dbd34666a804e2a854e3f29700946af83b987c278d083a16d46d2f5f82e0bbe9e8d88c47d1580b3f82d9b5e521074a13100ff61f6c78b84bc6e2b1a7b8b1f589451b822e6557cbc7133ce3a5d39b4c3764abecee70229b49383c5625066bd00f", + "36403d3257657c772d483746bb7b6a10d63f40a66da0b22f8365a8e26c09ce51", + 1, + "e50e935d79a4d6a6c1e2eb2f29cff5fa160f047e0b20bce65d3ce99063031f11bc8890d21433fe4e51ad6515d4c2b901ffac8f33f4a43739accf8631bc1fee7dd54bee170d532028135b52b261da128c6283e2ae1dcd9ad31c2fd3875f37c3152b7cacf00ac70c66514a7fa5a3f58a3d91073ed345e354698fe0b8a503b9143f6e56e90893f0dbaac02e999f75f7e30615406f28d46ee50a16e510584de37f43352974b8c19486a66450934caa2ee0f59fb0daf78ce9f6db268f586b5e5fe305", + return_code::success + }, + { + "556524e3e80fcf448c0befd659ad744c409cdd1111291a81949324a02688999ab88e6ccb3e9dcecf57ccfe9aa7ada21540ba5407c0700ce81578bcee892ed385dd1ed476c465fe48cea2dd7e37784d8ae795fba842ce0f88baa76857ec1c7c137163beed84ff2c6a159d486d10c7128b2cbb6f10c547d202d0f6e68fb43a9a6a18a01823c4e70b5dc25d38b9c33d4916510de467f10922f3b284855c4accc816f542fe74fd0b331b1884dac6918d3c38860b0725809a19b6101e5d3942b9f40eee6901e17a0c50187e6385767b7d1e54eaacbb3c1939e2e995ec79569dd0200583a937891035475e1e5a733a0446f7063e77f9d564c60dfc6dc25572369bf7fe51b2607f73fd0fa9eee9d27b127a81c63bbd7f08dd64237d082e9735018d96024c56d32b55e991e84f39c6ffc0d56ef17307e82fc200df9259f83b7bdae719124f7151d855b8f51f703e087ea1540900c4eba1592de051db895689aeb5233dec52ccb74f93acc8fc14bcde4413a14dceb0ec386623021ddf9ad1fce429e1780c5a6877b00b17af384fd49b7077434387672218967f4a7647174162c07e99d9007380be10a7bef367181ba886a0e40c160a4b36548826c30710ea8238b0c37ec06e331fe1d3aaf1b5a73ae0880794d0c0a9623b8498d9bbd4754e1a8c1e2346091fec42aaeddc40f2ae06456e8ad9059c61db437089a855af3d1bc2a6d68e9c01474bdbaabfa185a58dba9808f8e0b20a3c51c51c5bca629aa061dfa5ff238a43e1e90242df403635869743c723276c0eca711c6c91b94a65310b6b869ee556179ed113a2b406a52de2fe54f61f4589f510924b2e3f8b14ead1541af2e1cc9dd35a91f6cd4bbc02c58a844d9e4906a106197b8ab39a539561aeecd265762bcf5106344ae2fe0a62c7af1bbc846e9b39ebe38a046461d7c0c4901caddb0fd7c70b86246d53bf3124af629596f6367e86f3456cc954e3581bfea600b6d2818259332fedeb88ece673626ffd4d5935d0310e5cf2462055d5fa4b6cc4531f11cf0722c8647dbfc7364c9b2e24e0066ef5b0e3497ce38537a7230e02f7edc2f53e980f", + "e5a6afde5d144ed43bd1742b7ec7f5385a7d392f65465927e37afe7b9f0a9e368449cf52e36ca432b096f8562c98f318216d21a426b2d51f0a4db8fcafcd687326b548cd973f30d4fc47d79d853ec94239c620229ea0632b2570a1f8df08fe1ce323ef2cad610917a13d1157e25fac05ef6bafaa68e8ce265594d207a5d13c1e", + 4, + "889d8b750987cbce4aa4b872b29f22011752354e672b24ad4b229ca575ce14a8c081366db5cfd0f7a85ff68559bd4216b3cecfb6a2618a29c6c95b17147d083f28cc1fae5959fd7de74d986e7fd543ce1060cbdd8d4ae136910d8a15a1b3ee16d955657630d5f50aae107d13aa0c46040616e2d3018e5d07f9551e2a4c34565c9b59b8fd7751e025f473772120b4a511946e09fc93dcf9732399244c1fbb864fa09c2dd5d29543e794e64b6e1a2df39289245ff4b65dff0357a6621d151e4514", + return_code::success + }, + { + "3540d57f375cc54311317a2667ca62928a2cbffa3c1ef6a8227786b7c7c798b35a49ebfd7e29a92fd708ebcfcf34b90dbab296700beb73def3519258330910d131274149db20d2e90b0f088062c46fc0283eafce98c613ec797295cd1a2ea402c7ab724bd078bf98def513700a93a1525e8649adf9ade01f5929158f663a06bc899dde984b7469b9f3e4ef244561bb03d3764a30cd681216a6ccee7445032f8e4e562f2648c4f5aebbf8922c78f798c416af6a623da07dce71919ca56f906e19cbf8f05bce6dd49b34b038806af234c1d96269bb9043599049f0e582e8c94172682a326cf23df050f557ca0ec478c21038dfcf2f4785e4a4972a2b42b4e22ebec4a967adec4d5fa620c1afc9f3b2b8688a3b38ff3f51655b1aed776dd386b20aa2644a64366fb2f105efc45f1f552cbbc8ba6bc81b79314390fb246bff3f1f72a949127693d994e36d57df66141e0c1345ea0537c47cdc3b06253f69da0e77eddd96a0c0a1a51396cfdb85322a1d300cb673c4199989572d50d248924fad7d099d599360321906891e1b8ba1d417c791d42a01ce84ce390d46458346bf52587814f7530269244a7a8a74a95bb603da0ab8079f78631414763d5ed174dddcc63e141ffbdecf006648e3891bf96be79e9f977165b0c930547042c2e61cf3edde01159e83b909d75fc40409ea85f1941f0970d18074f2254668ca7f4ec7a3db06478985e95e410babe7166bd56beedd7f153298e6d8472d7188c8c280bfc091c131ea531d5c6b90bea9af1dd7167eaad78211d48f38d6be7543c60869fda5d9210c54200ce434988ce1362f33fec2f5fe787df83e127d26444a10a38c25ee3b8d93b32513d5d74d9d9b5788bdd9b268f20ec190280559e67a1a4e542b13281eb60e20725aa8b4abb5fc0b42589998a16850facb763b786736de04c7f9dbf2dbcf138cc21ffc339fd4b7f581757d6cfd42a392fca13b9d1b89419a68e4ad10aa9dbb3826849292d7c1b5f1d8750102056701dc89f6587f969e3cff756d706ecbb3044bd90af7b8eab6ee83592f26a930beccfa662b5135a70ac65a96c87a4e095c0a", + "d967d13a0bb8346d92f94c3f91f6b2040d736a0ffe01c11e0ee08891934d3a21e0598fdcb1f3bd5ddd88dddb9a41af4ff8aa8e47a0e992068b0d60c75bbc0d450ad8b46a274c18303e69e4e8dc4df5518166abaccbe2a80539389bcf53d033159aa7b0bb79d32a24e835cf7075bb96154656f7122216970081f533a1971cbf50", + 4, + "cabfc22b5e8228db0e18a378ece2e370d7aaf6c8c458feed8aeb64bf994a0b01aee824d99af50a8c67f9a170e70f7e12de79a98715e7a4a06d5b239ef0130b7fb183b36dc36458866d784c93cf6a7a33cfdf9e2584a353c5989b8775445e2c0bf45ce53bcb070562198a62cfa45d71f00705327ad1ab3e225bda5bf959c2714c96da0e99a3e2f8ccf54548f3f9bf56056d6fd87885684cf9d51bf305a9230cbf5712f72704f58e60e4c66c62fb2c7b3c559c5588c296b445bdab40ad0d0ac313", + return_code::success + }, + { + "8fa138fb8d71f2baec299c896318eba0bb29eb5403f83ddba8b53550dac08fc4bccb2a21a7dd515e68ba2f0b7cc3e00bfaa38105cc84bc067185d9738c8e49f70ab5c101c6d582d90ffe819d71d72d6970081625966d0e022147fa0117c02e1929c7106d8860a5ab8f91afee930ee07cfbba1fc39e40a31fccc0413e3ee697f3397838975de2f618725b022bbfde9d18edaaaa5d2520bbb5d4fc35d9e0044e6def35e654663ec291a5402bef11afb06922f14ee586b7f01f4fdd68e723c7f20ba29d733ca6ef99feb281b7ba3ad4de179b02a4ce2ea5d16de687ebbb06ca5c653cd29e9225b257885a95d884d6db2014416a9e2a07381ba189bce0cdee2eb5a4ed0c357f72e3d7b053dfa8a27af3a4f69c69a4a8e6c94e856121453bbb46da0356557508a870145a80cab307a1fda298cb3719155109511aeb5446a2337353e49dc768f654883e919a17a21b1f8168098ed4bc817cadf2a51c5c1ca04b6692cbb1f492deecc9a84011619cddedaefe3ae0ad63678e081450047e4f7566326309cf6cef7fa32b46b8831a083c3c0dc124932a816dda7fd2c21f820b062f99243a9657979dda129e45c28e2ec56d6e48142f8156220b9a84d5832d796fa53a516194d74f6e06d197c763aac10f192f1e1e0771a287dfbd8f97ad1158426181be18766625778c862ff15b685eff2e64a7deafdc2368160a7c49107720a93024676d617a17c85a11dd298c608f717b4a3910101ef4d7711390ba30bc6010417a679b51a1bbc7ff82c7f7965d252a5b86bc731a162e07e54057ad5df805da25ab3d0370865000ebe59b18c26ed2bce5c5ae0542a596bbdbf76059efc13fb259ad286d97e3eb2e85dc089312b07125e5fe2a0fb8607aa566f6da9ad0e617fbf99cd5cbfedf5f0a894c80197ab32035cc3312e422c1c2513ca867add0861b4de4b0060263df6d82d9f43733961700970ea943dbf58cea1655bc800c3447d539568023ff91cf86ec09cee91de450f8c9114c4f1181e77e03bda275ff1ed367dffcc6db31ac55c855edd418ea8adf79fb97d5fce565597821082e2fec7d54e978544d9712", + "3d7af1a45d973d872e4472fac861b931adeaebe2c3b2a114a7726bb9db4cec6dd4e86dd4d674dc07fb8b96fbc5eb6b208374020c06cd751a74f0909e95c07844f3751cfdb402c4e3561f8211cfdfb4359f7346a6df61181eb149d35be87b2b169dade9c3fd4eba680d0689737beb2023db34560ecae6a521e474c16170629762", + 4, + "9f599083020c7d2ebbaad85d4ab32fa09002b0eea60790d08cb8658180e3da5cac00a162e30f5bfa74a4f0ad54211111e5ceff16c896a18bd984de8d2f14b9a2645c9afc4f0db8f9d7a5ebbfc041e8c88b2d30507f566527233ed157b184bc0a05dd624cdc0bc714dbc658f2316c9b56e66a48cf3cae2b5ff6138fa8264c6ca727d882976300e09962eaffccd7259e19f04fa19ce0a657ffb68b66f494db4fc7bf824263749e8b1a188937d02fc2efc07c489f3c69f12b4ba8ca54a2dd495414", + return_code::success + }, }; for(const auto& test : tests) { @@ -340,7 +374,7 @@ BOOST_AUTO_TEST_CASE( bls_testg2exp ) { try { auto expected_result = hex2bin(std::get<3>(test)); auto expected_error = std::get<4>(test); - c.push_action( tester1_account, "testg2exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg2wsum"_n, tester1_account, mutable_variant_object() ("points", points) ("scalars", scalars) ("num", num) @@ -371,19 +405,41 @@ BOOST_AUTO_TEST_CASE( bls_testpairing ) { try { using test_add = std::tuple; const std::vector tests = { - //test (three valid g1 and g2 points, on curve) - { - "160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615160c53fd9087b35cf5ff769967fc1778c1a13b14c7954f1547e7d0f3cd6aaef040f4db21cc6eceed75fb0b9e417701127122e70cd593acba8efd18791a63228cce250757135f59dd945140502958ac51c05900ad3f8c1c0e6aa20850fc3ebc0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615", - "100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100a9402a28ff2f51a96b48726fbf5b380e52a3eb593a8a1e9ae3c1a9d9994986b36631863b7676fd7bc50439291810506f6239e75c0a9a5c360cdbc9dc5a0aa067886e2187eb13b67b34185ccb61a1b478515f20eedb6c2f3ed6073092a92114a4c4960f80a734c5a9c365e1ffa7c595a630aaa6c85e6e75f490d6ee9b5efbba225eff075a9d307e5da807e8efd83005db064df92fcc0addc61142b0a27aa18a0ebe43b6aacad863aa33dc94e5c4979edca3ca4505817e7f21bde63a1c22b0bfdff02000000097602000cc40b00f4ebba58c7535798485f455752705358ce776dec56a2971a075c93e480fac35ef615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - 3, - "af587ca8f5f0760b888e4ec66748623d1b13986547b5de2042ce89233c2c837bbb080329a505285c948d8bb4c88a5914ae216a64db582ba084178db4364a7b3843ef7fb9056a90526d27dc9e252b38600fc54ce7a5ec15771c555816edc26d0166e75d3315789c846387c8c234b1c98b50baf233b7312aa317ae56a2bfa170b1bc43f0e046b4a1f45cb7aacea7d0ae0320496e3960d4dbc2039027ba8cfe1ca120ea98fa94cf25034ccb5e74033f447b837a78b03affd44b87f865f3d713000de78ab5629dbde8d0c8b7a28941717be3ebd23924cf16897144bb69730f68bff5a109fc2e6d563b15e2eb883cf4becd11edcbc2ec4402c93249389ed612fa0396ed6eadcbe4d703667d46b0150ee3a5158caef956791e4f527e1312c8402f8509acf7001dc0dc311549d76398c247e79b737b614d0a6663f7dbdb314e5b51eace14457ee7b1f3f54d5987c16c8f89d1022d91d4649f5f6a204047077e5791a654cd2277506cd0af77f9ea789278b364c115ec07ba14390a9c22d59aa9c97a9c09ce025b5e14443f3c4e4cd602ef34105fadd82837fc5ce60a461e6ea11b13ae67b82e3366a2b2d1bbe78b2579173b3c0c5aed88b2949403060c3e065782bcb742c55c559e75e373293d80dec54120773d80144b21b353ead58dc8427e5b9cbd0c1431f1a74caf5f57c4b55b89810029cdd24ef4a029797ced68ff882492a8f55f31fe52217356366983e35d2a5640e818cc8bddf9274de0100e624a6bf03e2b9ff22f8dda09a46b50b1b305cb6adfa2ae775febbce4a2b507cd2390db968ceb13", + // g1::one, g2::one + { + "bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f117e1e7c5462923aa0ce48a88a244c73cd0edb3042ccb18db00f60ad0d595e0f5fce48a1d74ed309ea0f1a0aae381f4b308", + "b8bd21c1c85680d4efbb05a82603ac0b77d1e37a640b51b4023b40fad47ae4c65110c52d27050826910a8ff0b2a24a027e2b045d057dace5575d941312f14c3349507fdcbb61dab51ab62099d0d06b59654f2788a0d3ac7d609f7152602be0130128b808865493e189a2ac3bccc93a922cd16051699a426da7d3bd8caa9bfdad1a352edac6cdc98c116e7d7227d5e50cbe795ff05f07a9aaa11dec5c270d373fab992e57ab927426af63a7857e283ecb998bc22bb0d2ac32cc34a72ea0c40606", + 1, + "b68917caaa0543a808c53908f694d1b6e7b38de90ce9d83d505ca1ef1b442d2727d7d06831d8b2a7920afc71d8eb50120f17a0ea982a88591d9f43503e94a8f1abaf2e4589f65aafb7923c484540a868883432a5c60e75860b11e5465b1c9a08873ec29e844c1c888cb396933057ffdd541b03a5220eda16b2b3a6728ea678034ce39c6839f20397202d7c5c44bb68134f93193cec215031b17399577a1de5ff1f5b0666bdd8907c61a7651e4e79e0372951505a07fa73c25788db6eb8023519a5aa97b51f1cad1d43d8aabbff4dc319c79a58cafc035218747c2f75daf8f2fb7c00c44da85b129113173d4722f5b201b6b4454062e9ea8ba78c5ca3cadaf7238b47bace5ce561804ae16b8f4b63da4645b8457a93793cbd64a7254f150781019de87ee42682940f3e70a88683d512bb2c3fb7b2434da5dedbb2d0b3fb8487c84da0d5c315bdd69c46fb05d23763f2191aabd5d5c2e12a10b8f002ff681bfd1b2ee0bf619d80d2a795eb22f2aa7b85d5ffb671a70c94809f0dafc5b73ea2fb0657bae23373b4931bc9fa321e8848ef78894e987bff150d7d671aee30b3931ac8c50e0b3b0868effc38bf48cd24b4b811a2995ac2a09122bed9fd9fa0c510a87b10290836ad06c8203397b56a78e9a0c61c77e56ccb4f1bc3d3fcaea7550f3503efe30f2d24f00891cb45620605fcfaa4292687b3a7db7c1c0554a93579e889a121fd8f72649b2402996a084d2381c5043166673b3849e4fd1e7ee4af24aa8ed443f56dfd6b68ffde4435a92cd7a4ac3bc77e1ad0cb728606cf08bf6386e5410f", return_code::success - }, + }, + + { + "9242b29b93c61f033f960880f1f1fd98ab7a0973f4af51e116ccf7fddef30e969f81171672612d1b9e17506df16d94152f8ee0d5dd3659c8411d717dd03d0d9600597470cfe1d8acc3772d8ffad57152e78cd05ec59b3d5c8e0b1c8c89ede40a1c3ba9cddda02dd8bbc15562bdcaf2f1216c3c3763cf2578b2fb1dbd473b15e464c1e5060c1ce1985af46393c896c90f53593395b3830e85f203e559c191bbeda8e67b263cb1b0d2a9fe8232e2d513b25c90d42fff59770583546adb2f6de8133d2570b6ce051e42cef043f59838540ddd57d825d6b31bf85852059e0027f3cde7acd48d01ab7ff6a243a73046098702fe0ea3661ebd03aba475f8305bc40e2334e1affbba4fe683d9d86a82fbee2415899ef14edb8831393ba0dcc3bd496e12f6e44ef94f44de4fa3586008125e3f351c54e5c106339f26db74b4d5c675fce7471f9bb6ce6249d59b2b98dcd5b0e60135c42c797b19115242f897977e1980f1ee5f9687af05223da07d5a6012730ff07c735c3995e842bc09cbd4ff535cfe0d", + "e3e8508bf6727b1b0999f8b65ffbfd71ad2ecb67b9bee6c57467e97b1769d22d89f821fa9233a93f87c991e6f1671214abd95421f0ec7a3a805e890b204e78d9344121045507a28684b93993d223b7d977a318613be2dcf326353d067fed1f09bec07dfab6eebf20e14af2d2fc7935b4779e85dc255d9f87a4e7732767803abde70a794154a8eaa69ff36ac04db6f70ba27c17660b56b15a6f0b42e5b9e2a0031e371827a41be40416818490eae20ac3402387c543e456272bf477b4e6646c13fc29abad46163be661b80d8a99f8243c946702131a32695d0bebbf26ba23bae9e9cb6926544ac895e0ecf9e2ff9e1207e743434a148da90f6163bdcb0eaf78a877d2ded8445ad37f88428ace820a0e300ea8653a3dabdb402f3c1438a7549c097436783a40f6177716f0561785b1edd02a83b43d04a4b3858b158de8b74d334421dc9b2d8873b22ec51797142b6c9104948fa5c4746251791febf4cc62ed7afed4d4d5301168e0b5d5b7ada253f3f18988c3c8d3d4e06d1b819120068b2d59131e8e77e518d8cb791e3c022d88d3f8a6a78b7f6b31b54bad80ca6d5c74a24e2fc2514581bcaa06b4a4ce38f9aa3906173a1557bb089dcc5f4a0bb739610fbe5cf247dfe4eda2fede230efa823e772483cc4c1a1161ec617876db25a37e156002e8cb0b3dc76313c84429621452fe30b3dd1b160e7dd4f477ff8bea01d86786831f95d1c3d40e40cb0acddcdfcb9d39121af50414e4ac7a4d148c641c13d620c08b139b33d31f0d14e7fdd7b8afafa7385f7aac7b200d26e1ab6686b92c58dd17098b370dcc1b6257476dc3fa9e02bce297706cbd67eee816e3df38556a6bdd6f6c07187e4b51426734470a052d7fbe08fdee46b80f60ffb4a5337403c5a1f9f133a9c744a2e122e68e03ea41a6bdc00e0413030b065224f23ce7e3ebd99f261424bef4e4bbb4d31808c204c4c643da0a121a17a009043905a1dbab772d170df99031b46bb89acb0f57b6aab53528761713f00547c1c45afd31017b8f6477522461b28714e2c0f8643de662489ac0e01f33a8aaba642f48de3e04432e5ec7e203", + 4, + "3accf1d0f0e50270fc76410f57eaf2a96acc165eebce48e3c6cec5932cadfed270a698919156a54f923a262e3ef7941796c8cb3693d4365349fd2eee88dfd1e6b594582dddc512c32a780bcc426a97d87e1f76d7c6a15a559d2029fe6e0f3317be03dc9c4de6d95b33600d89f5f7210527e98c4533e4c6a2bcf19a460ea2a6cea375a2623647b05c643aa5f2c3a3f10f2bb589eaeabbf087cf5080a17f7a360ac9db7210eeaac2f02a52a571e37d8645c1217324cf657cb50ce73181512c0b0eccda43a3593cb2cbfa3bda81c31e16b7ec0cc8df0cd51d0871defa799d261baa652b2d56032ee9894c7c0d695c89250e4b83ecc53f2fbb6da14cf9c3d53f3936c16e050b0407e7bdaf7f47b7cfb814bee9d45addb7229d81e6e278aae4d1e30da342ac502f0d329ff2ce4abf72374fa858aa594bfa793c0baade9d54cc497dcb849dbc65f51d50fae34111e1e55eae0c0da4a2a5762a9acc594e8ce9a2a304b236b28b092762d6feca7765c42dbb06c11ce6c04ebedf8c11fabe2e473d6efe06ec39692962464216a1d30730aadc370f2fe59ebae19913890f14ee942f89f5f13471bc00b91be0c57280ffc253a8960e74bd6f1d13ca101094d917778b4d90381a64dc786630fe58359f9ac634efa11d10b4f2408357b8be3963a768d99ca301e7ae8e9df45be75cc3ba4f2968129cc6a9b0db9cb9c63e592dd6972c84f9b73c70653d7d4b89961746c68e23c49bde19fecfcdf6dc5c7fb3237aa448059428c4c136bde48a8ff5d748a7ce294514c507980d6b805fed1604d1c3b321f152b107", + return_code::success + }, + { + "41b907b27fd2eec91c730174063a74965d837b8363d37a4ce7257418c93260a8f47091b005c65846a962482ea7d35211e3ecf16ef2d0b6287d84ce5a95e93a00186b70c0735a2d5d5d3415d38ce3ae8f1dca1b4228dbda61cfd93f6f42548515ef052f0c5b90fb53c96b5bf27743038924bde786e1fe6a06c801bf2589e296518e48ccc00f5b8b64c02504ddb09a9c1036fa5eb15e85b1d38ecb20ab1c299c619493a6b4bb6e987d6d7759436a8e4671a7946dcf71043ecc04db3afc315f95040c15177bb50a2ace0c6b79e767266cf29d4cd384e78bac7390d93b52426c5d31f8fc8c2a0e2b574586aa8cdb47fa400c3cf7379f44aba3aa1dcd0484bc97e1d8e21a491405c615068e398b1c4461c14f01383b6a7d1ffd10b74801f248924d16db92e360ce2f1ad009004ee5f12badd416bf6e8953b8caad7e1b6a44790f68ae63d8e9dad23de7b6e377dae7ef877c0bbd88e55c1995f95a742adf1946ff116646b6f5ab6aaca20eed777430ebdd5c8e6042d18e51cdccdbdffc02bfad73a206", + "b035471f19385025b383e1829d57bb90532b7e8420fb6de22347d5499d70f30c905b267f3fe12c25af5d5358bf0c500475408754478a96e2ba512401ac903c7cf3bc225ec185dd61c03a67219cac0e836e49d071f3229e391d7c1b857cd93305ac168e05a05e2f451094db5bb2df0f14ad282e1d19f11de48540285183c91022b7066b635137149dec86813818af4d16ba7d5d356e8f9bc13eff6a02d59835842bc9b42a27e00e4fbd7bd4e8d5aa9ff3f8d318904f0fad0abed386557d153305740dd01b3f777ae822d9fbe6579506984be4a523898e17794321ca1e5289d3855d57944aa2df85263d4b718a0cb8c61564448b514ddb02ab4eedb093114dc5468901f6ed72863538a5a6c9523d703f9c66feff488d9b8b962e08008e5193d50256f9d8ca54f55799713d6ca8467caf6caf53afa1b10f9ca523205e3e23fc7b439050e71a0066a898cd1151598f5e4c12bec7af6b159986dbe84ea2563e177f90f816c19d19ece3ebdd5ef89961e7b9713cce9d66f33ecc7c86bfdf22afb28a0182b6d1d0430eef461c20a2aaa241ce7100ff9a5d7a59d31e675251b0931f407cd7d3b4fb166cb8bd09e3a68845cbc9071a23151687b0794ba8a07428795d20c33a51d1e06de138885410b1c834d02a0a20c19e61b2eb6a5d4e1c334c0925a417d0da00c3c9251a95f88f241218b3a3b52e9ecfe031dfb7c62418b2915c2bb5d08c21e3935e83617a50429eb2c5efdf00514e7778e43d1a93ce8895de8abb088f5c4bd2e90587380b72b32c75bf32a10d1a558a976f598382a696d3b45baab110d9eb8b4dff67600e00aa8113b9ec0538c8a507ca0d36028d45b32ce7ab2ca6a8371c711b92b03fc4a1619a913eca120fe81416bd2a8ad67ee574ed7dfeb2c407cdec5fc286cf6d9b241b9f28f42d4ee7c4ccebda60092918fc5e1302ef14f818df625409c9c1ef74e878694c1f29b393cb91d654fb3438999fd6eab84c841c4608e9944e61e4ebda7ca5fd2682916f065c6e937d952d87474847ae7c7adab8a463ac2d0ad894881992b90a343ba4d2ca93c7c970cacf243e8c4d72ddf2b42f0d", + 4, + "cc8d4803307dfab93b6389de099708118bfd8ee95314558d6967aa377952fea441d4c60ade51a2421ee03b1d71d0ba0c348de4ab87cc218736462e1e9fe11da41cd76122bcb87e824b49c2f0e61be7b5f79556e52bb87b29bf11f28e4d40f00ce944d7179afbf4706fbd5ddb212f6c43814f47cd04483c446c2f47adecf6e900832b99001b18014cf0612278ca7bf10a65f2def4f1d7c170433484b5994b838f4b469cf6f746c77bc360f0cdf6758ce10e3c861079529f742386ef8fac5ca903fa52618ca0d13434dc7e9cf90f5fa773fbec016d217c9e68c9f05e3124e9cd67c2cbdfc29870524dc2988fe1d75f20077260cdc3f7a5d224181c30e7d17b2f96c83badaa625b9ab080756fd7153c4ed0c991fde00b7e2ce6e2fc9fab65c6fc0819e4f7232daf87b6d702d5eab3710efb0c9edf7477f05a2f2fecdb7bee800a32dd11fd4870bc75a94167b13ee446701146f791ccd657a242df189c41ebf1c001f3052edaf66faa93b86526c267b4f77f020e9f5ca7748809d69798c3261a1a02c02f150ab905fabf0797392ea83228ff62a0648e90187a46704586a5c4d3525e64e60cb650c535078e7424d7ee8e690c6c40b01b753b5ca51664df4c2609ad01d2e0b9f1d5a7b862f1dbff57881f5d6939c88df4e454142ac8bdcb89d1f91d0d50433e1725506c537cb2f1bda8cd4a88fe6ee196ca5038927c2f45016ec4e3f07186ebcb0ac3258bee34d869179cd7062757c2fbdedbb0112c8ebcd3f85e4aad8c750b75c462be8123eed0423eb6f995de327d262c0c91cb60bf1359ff32fc00", + return_code::success + }, + { + "af7d28fa69e9ff7cf98da7614f02faf91f8ae2888d522db1a225724394bedd8547ae93cb07b41f5f21092846c6c2950e43328c2e6aaa18cf735a703f4ee43a60658167b9c1bf895ddbc898dae5269a335699c595aa9dc4137103d5480320270f756a4c35700b847a02d4933be43e508139affb438b7bcf547debcf9904f1056d197ec8484283e2f194430e16443d250f0b4734d5380cac631d6287e2b45a6a12fb5fea3eed96a7b2cd3bac9a532e4bb6176b1e792964444798e5bf151e14c314277fa052e05911619c457335e708633aca11239a33686e56dd949e6f50e5fe79f1d069bbb01822566f992299184ddc06d08c662a5d2b37668c7821bef5177ff4df977799dc81ae15d0444be9a54db2195d41e316f7ebdb7d879f8f7b355cb416137401a36684f0ccbce51fd4d8b32f45d81f2c33bc95687ed777e7fcb181367e163d94356c96d239f193dabf01616d13936ba746ed9a64578a5a4b191238fe8472e4135525afcac4ed818c13e518864ce82de26a6bb1066b9c0771c021716603", + "5528fc322669dcf2757583835b5ba5cc84f629db47e1d5e3ec78523fff567ec26100b7977ba038586c9e465abbaeb603554afef9cfe21ac33847b1d11796088cc6b18c7544355da3f996ddb0c0a15c8b1eeba2ec3a5cc8c7b4a8ecc7131e4609582cc42caa57f68017f95af50757bfc0d3c4d4327d1d40012af8f664da428f1984bf17c26d43b6fd65a8ce6c3d039d03f1247385a3f565108de722d4e08b0e9d23bba036646668167bdd41709ebe8bf5aadbd88ccc2af0c6d5940531c9fd50053e786ffe9011554db15fc7e130ea07cd254f21a86911fe758517274f96b89cb67e30c104186c4a6cb0d92cb82e39260245b68e74bdb828992697a1957be0564a9863f56eaf36bb5fc4d0869468b6ad4e36a1e7c550303c80c4ca0cbae773b309a61c6d4d6a4d2f17a4424c1987d294f195275581c8b8f88b7ce7fec5bc67e7bfd58bb747f39aa4dbc77d79cd18dd09142b10a45d49abc8fd544281f02a0e045062b72b25ead1a376e4f705ac83ad2385c84a8fd914d2f6a71d7eeb7126d677001013a0df759ff906a09fe4a3da307dd6cc17ee1fd72af8f7d953662be427cda2985cb1073563bbea492d9e6a96ca8a05ca5d45d349cb3e2f09cff6022a9916324eaa4fe5c543d46cafe5f82e81c5baddc2cc58100b03a20c2feaeed58cbd63019b8e3586d14193470d4ee9c1a0fc5e0a736e1ba94d7ad20ead3a3dacc4b2f3530ad751daffa944be4cb1969b3d2595058007d28d49e2fdebab68607c119b77d766785ed9e209582c737fce93b6ad0d4d795f86415238e0d3b70b9d8954d6a20ce85e7128588a849c505d5d2c81ff63bf12ea3ad52a316316ce49b2014dfbc486c9934dccb98db06089c03dc8f76ad70323ada12fe7e5b9f552c5b6cc073f72409a6e44f6634ca58bed30649b9840f177ea0039932f81574ea22b6da18b702f0e367f633e41d2b585d5166669f4c48d389f003eeecf06b5aa119d0df46de26adcb938d362e4410fdaa990a6fc4c2eca0f7bffee724789a0a47ba1b531bb4a3c95c129585ba5c9a6fe978a6915f4afedeb710ef6a55f153a5b21f943de6531680d", + 4, + "01cc207c7c76c65afc059d073106d545705af7c4e4ed78e6169c599bae1c9bf6358d5a2cdfeeae389cc64436dfe7b7192c733fe9e2d105c0eaec21589d8bb5ecd5c71a5fee083af47a1cbc3af2df8a13603a78956c39f55fd0663ed482846a047280f87426ecde4c535c0d30bdf4b95ff5aff45782129ee6c7a0fa20a632bc98e95bfb663685eb2443e4b1f518c40f00502303b3db49be61f36ef6af46b9097c83835a864ae6337ef07e40df617af1aacea98c0d75e96a104d41a3617e7a4f05fc1cdcec57ea40a0237ff387a5d9130b34c92cb57a3450080bbaa2f6f9e895851b05c05eec03abd2d5083c81c402a500d2bec4895cf0f58a9953e43ee9039a38ae73cc3ec325fa636777e1f597b69a2b6a62bd49fba5b163bc03ce73f277f818fad1c6681fa59be891c2baf85b6a5e908d96b6a6c4cf3d53b3de23fdade91b3dde7199648aca0fce1d2307253bf57b054a4c4dc276034f8d57017cddc0a84975c643f9ea808652f2cefea32f767fe8e6df58a837c47c3136ced7107e7dbd9711399605212e6a1b8da806a12636076f7da0629ca8173f0411ba2a1050d1bca61994e28f69f274ec94e016a3ba6f9a6b06cd17f570928b5e4b8c75a5d62a0a67bd54249702923b440355db775599ea7be7cd3c6d88ab8da7694e43352837b0080814880a1460bc61fae141d36f961db8393313f74a65c3eabcc38793b84062999364bb0c36a415445ec4318b59c16e850260a53e7aaaf72bcaa568b57b69b552bf827c3e1c116565122322d6c26e14354fd96dc4bb1161ede0ee36efeeae1a5503", + return_code::success + }, //test (three invalid g1 and g2 points, should fail) { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 3, "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", return_code::failure @@ -428,19 +484,39 @@ BOOST_AUTO_TEST_CASE( bls_testg1map ) { try { using test_add = std::tuple; const std::vector tests = { - //test (valid field element) - { - "c93f817b159bdf8404dc378514f845192bbae4faac7f4a568924f2d9725125000489408fd796461c288900add00d4618", - "d8e09005badb694b1e5dba8476ba3012cd2bf0c472ee1811ac9b34c869638b47e669bce16933e98ce9b129f83d93d71890d6fd13b77d4ad8df1a5f1c6b81df2b3f305721b7b7874cd81eba23ca05e8bc974b14f7e4c2c77cbdf321c340ba4903a2a46af290abe078e426f913e492b8d9b997232dbe6198aea719a31e73b40e110c4efa9e42d737a42883e0ca5f344d02", - return_code::success - }, - - //test (invalid field element, should fail) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - return_code::failure - }, + //test (valid field element) + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "15a40e7d0c871905db43ac11172e2f59acbc93fbd6f29750faf2d5454cfa732a37504ed19ade305c2d338f2b37a0a91133212273e76ea9ea9fdf2be2e8d42f3963cd476abce81651448cf5556b92ff40e28d78a34bc2519f71a06441990f2c09", + return_code::success + }, + { + "6de1c03023f2b4e454559b97266ebc1f96cd5510c4f48e2acafbe73a536a1477f2c8d1c9b5f6615d01968ea59ef4fd07", + "2c7390d4bfbe0ccbaae9699aab5458d62f6d1aa91938b0ab0717249ad89209cb14ee8ed764a8952415382dbbfdef2312d5b2988b1ed7e6907d73ef2335cba7f9263b63003effa44ab8d6805d6ed0f08d87919230f0cb45d9ec35b2e0615d920f", + return_code::success + }, + { + "d2e51018d97c13b16f9ad81abb6197f8368434b501c6f8b2d690fef722d806f49cb469d61f4bed69a124f8db3aab7512", + "d60fcadcf09a0903da1740403626c463e7b6bafd4d94e3b12494fab1b1dd0688823ffba1ce06ad3aa41dfbb4d03f9d17e483b41a9025fb46aae72abadd4a1f4c7b9fa66fb3b699cdcf20683c4de67f3dbef1231d062bf2f5c095d4c6b17c030d", + return_code::success + }, + { + "094956e84809a27f467de542a0149629866eb5b9ec353e267b0bef3e0836effe055c6f85278857b8846dde301dd1930e", + "af04301d928149db56084cd0e2a21706fb8d78010b3d688cb6a7fa3a7386b6f8da49bab1e894b69d20d1de7ec766aa1588b7a8aaea80423a3e13d2227ab7c5514e8a3a5960e8af86e85e65473d408532da4cd7790add01d2d19d73612fbb5209", + return_code::success + }, + { + "3a1acb866b91c2cb46858c70509b9789363b34479bbd65e216c9d91c52512a63464decd8e60bd27470d1551148415a01", + "ee8704a8d29554a7234c8599938d46fade4595adba6903465faa302949622e4273f49abd84dae83579836e10e58c3206ca0bfd27c67241775f1d307e6074a5303b33991f13f4a8c864717ace864b31f1a3987496005a3b434724553efefd4b09", + return_code::success + }, + + //test (invalid field element, should fail) + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, }; for(const auto& test : tests) { @@ -477,19 +553,38 @@ BOOST_AUTO_TEST_CASE( bls_testg2map ) { try { using test_add = std::tuple; const std::vector tests = { - //test (valid field element) - { - "d4f2cfec99387809574fcc2dba105603d950d490e2bebe0c212c05e16b784745ef4fe8e70b554d0a52fe0bed5ea6690ade2348eb8972a96740a430df162d920e175f5923a76d18650ea24a8ec06d414c6d1d218d673dac3619a1a5c142785708", - "9968ae9e9bf3d22ec6c9670efa64ea23d4966b41bb25f76ea2ef71b96fa35e031adb866b3df234065b9aa72d0b12ab14978678279eb944f05b5af53d91e700b57aa87076727def2e9f2fba3cf6784a25591ae1669c2cf15cdcf038b826d1e81178bd7b59b7e911e0c2d11d6805756222201e3364f8010fb651939eca63f7e77709042ee1030cd938f53905a714e815112a7dfeed207757d30382f69617014bc683a175d0dfbd74f2684de26c771f3f55a538e6d2f969eb282bddfec4fc08dd18f37df0889292f288dff631b02f07b88134410fd86526d234d75b9a329bc9a8b6e71c7ad516b87af9717d962cba5d2b19fd1b77746f1e484a54e6aec81ede148f01e2c8283c598a4976182d2ce287fe6888e23996ce03b03ce6709e4aa8e66416", - return_code::success - }, - - //test (invalid field element, should fail) - { - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - return_code::failure - }, + //test (valid field element) + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cebf24b3a427ffb720bdd7a6db5d078bf161cd790cec449d9b1dd32dd013f466e29cc28d8419e6d5f9eec96e89208301928865ac51d20bb4d44daec3277a8a42fa6fe995fa25706db09fe33db90d41237efaebb3862e2db05ba3b51821d1670a4159c35b8671620078d842a0c743b14f6034d3a00651f55df8e6cb9038d1ca95b8d2ba46326b2521c3a2d14436e060025cdfaa769a6e8030aebdee3c9a26c627ae764f9b196d26707fac12617c0e4ecf183fe605589d6707da0b3fa47797c604", + return_code::success + }, + { + "1449dbb73bbcb48b3b752e02dfa0edb5ede9419d8b601d3caf6d4298447b1db2fad35b44e4203eb885f3ad27785d770eca5e3e2d0530cf2d49254ead13700b8277167500205e7f30efce24ae70d4b1fb160aa7ca820ce7b767a21b7107bc5f02", + "4d9e217a0f270f7b3857dade18b09df0ac351a80a32e9317d58c730cfdf2681e37c763c4ae047ef0f9470bdafa4b7e02b89873bfd72bd20a5e9a64d6c191db420f002d04c951f7715a7e44b154c8ecd133220028a93cfa9d9fbfec7bb733430da73dd04ed8249a290af8e2f7877127c09382737d1206b023f17eab887fe27dc4e62473b3ed8f21dc6d51efa9cb743605db76e8502a1adf2b1cc72e8a5499084e7ef4cc166727fcd9e8846874b6af1f7b0a7af30410a4027e440dea77c76dc70c", + return_code::success + }, + { + "db4f64b6ead6e1a545fc454e24f0ee0cc9335ee6ee1b8eb70550c8d32312cd663a064fb651284b7cbaa8b5e41cb35a04cbbd1c96af164e0a97ce331daacd180ff7d3308d364aa956799902525dbf4180590fb246355a0174eb1d2afddba77018", + "7bf905347dcb42821d7deb674a9fc052835f12dba6b04fcd7ac581160ac31c45435354385ad4dc8954e5b2b51c9f34097827945d3c30a398927583560ba680f70dc872012cd034370cb5c2c1824e5292c53485f4ba5d9156c067af407bf8f01811b89684098a5e9914b5247a6a1f612b9885c8613ba4c1439577397d9d2742ea83fdf00b23b8f5122574c7b2ded9f202c0631f446ee9afaa967fc4da3bd02b3ac59207ab71b452d62bd37b06abca7ae19bf36ece41797b94ab89c61b34baa210", + return_code::success + }, + { + "b4108d552274d175fd4e52dd766ff396a4f365c102e0ef7b4d266f220ec67eefab48ac15d1db0d98ba31cda435616e0bdeb51952b044ce0f64b5d42199d9560ed0175f3d2c58af07909d29db4480c1b417dfbf7f1af274648adb54b029e38f08", + "f74a6a357dc6a1fb33344f60898ab9eb29c68170727136b26d943249fbbd9393bd893846ea0d43250d4fd37737e49f1463d11827561e80cda0f6ead2cd3c84d4be6d99d61fa4cbc41cce534af2cf3d1b3fc31ccecc1259cfc7530a93c58e801951454f38f693d2d763e0f993c202151d873eefec3e90507cea6232cb3c0061f254a2f4b5872098b23362763a79d6c004333e0e02ad077c8a3683d63827becf20c88a9b7a63bbac739bc3a4f659d119df2f5853e371a25c803fc8301c393e7804", + return_code::success + }, + { + "7e4dda81ee149d8b6b43a1a89c6f80d07b5fa93bff73215bd3c8677c671348b477a8912deba95a298574d64706b5450fb6fb07b9be96d4b87d677eeab47bc473ad7dc44c286b9e63b949ac64fb5b56e09638f48847238c18c1e4056aa616df03", + "5255e92a8a5338d96668c82f7303900657c50e4e4eed48a79808d7bed8321fa27c2db96a79d1d79a667484bf2c1504083ac69f5e8625b05e1b5a16513a98b119eb297ba5474ebe89b7fa0498ebc787a0a6134626b62e3770784886c894008e0b3abe627685e82eec72618f1e10afa131defa621dc57eb6d95ab25f251600776791f1f34afe032cd31a28d72d24c8e509493406a4e3f38b15bbf3f648ad03d1d1a2232db91a781fc109e8dd9d8d4e5bf76639883c0cb06b93a315ce8e060fc814", + return_code::success + }, + //test (invalid field element, should fail) + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, }; for(const auto& test : tests) { @@ -525,20 +620,20 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { c.produce_block(); //expected return is g1::zero(), which is x=0, y=1, z=0. 1 here means fp::R1 - c.push_action( tester1_account, "testg1exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg1wsum"_n, tester1_account, mutable_variant_object() ("points", std::vector()) ("scalars", std::vector()) ("num", 0) - ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FDFF02000000097602000CC40B00F4EBBA58C7535798485F455752705358CE776DEC56A2971A075C93E480FAC35EF615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); //expected return is g2::zero(), which is x=0, y=1, z=0. 1 here means fb2::one(), {fp::R1, 0} - c.push_action( tester1_account, "testg2exp"_n, tester1_account, mutable_variant_object() + c.push_action( tester1_account, "testg2wsum"_n, tester1_account, mutable_variant_object() ("points", std::vector()) ("scalars", std::vector()) ("num", 0) - ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FDFF02000000097602000CC40B00F4EBBA58C7535798485F455752705358CE776DEC56A2971A075C93E480FAC35EF615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); @@ -547,10 +642,203 @@ BOOST_AUTO_TEST_CASE( bls_empty ) { try { ("g1_points", std::vector()) ("g2_points", std::vector()) ("num", 0) - ("res", hex2bin("FDFF02000000097602000CC40B00F4EBBA58C7535798485F455752705358CE776DEC56A2971A075C93E480FAC35EF615000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + ("res", hex2bin("010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) ("expected_error", (int32_t)return_code::success) ); } FC_LOG_AND_RETHROW() } +BOOST_AUTO_TEST_CASE( bls_testfpmul ) { try { + tester c( setup_policy::preactivate_feature_and_new_bios ); + + const auto& tester1_account = account_name("tester1"); + c.create_accounts( {tester1_account} ); + c.produce_block(); + + const auto& pfm = c.control->get_protocol_feature_manager(); + const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); + BOOST_REQUIRE( d ); + + c.preactivate_protocol_features( {*d} ); + c.produce_block(); + + c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); + c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); + c.produce_block(); + + using test_add = std::tuple; + const std::vector tests = { + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + }; + + for(const auto& test : tests) { + auto op1 = hex2bin(std::get<0>(test)); + auto op2 = hex2bin(std::get<1>(test)); + auto expected_result = hex2bin(std::get<2>(test)); + auto expected_error = std::get<3>(test); + + c.push_action( tester1_account, "testfpmul"_n, tester1_account, mutable_variant_object() + ("op1", op1) + ("op2", op2) + ("res", expected_result) + ("expected_error", expected_error) + ); + } + +} FC_LOG_AND_RETHROW() } + +BOOST_AUTO_TEST_CASE( bls_testfpexp ) { try { + tester c( setup_policy::preactivate_feature_and_new_bios ); + + const auto& tester1_account = account_name("tester1"); + c.create_accounts( {tester1_account} ); + c.produce_block(); + + const auto& pfm = c.control->get_protocol_feature_manager(); + const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); + BOOST_REQUIRE( d ); + + c.preactivate_protocol_features( {*d} ); + c.produce_block(); + + c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); + c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); + c.produce_block(); + + using test_add = std::tuple; + const std::vector tests = { + { + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::failure + }, + { + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + }; + + for(const auto& test : tests) { + auto base = hex2bin(std::get<0>(test)); + auto exp = hex2bin(std::get<1>(test)); + auto expected_result = hex2bin(std::get<2>(test)); + auto expected_error = std::get<3>(test); + + c.push_action( tester1_account, "testfpexp"_n, tester1_account, mutable_variant_object() + ("base", base) + ("exp", exp) + ("res", expected_result) + ("expected_error", expected_error) + ); + } + +} FC_LOG_AND_RETHROW() } + + +BOOST_AUTO_TEST_CASE( bls_testfpmod ) { try { + tester c( setup_policy::preactivate_feature_and_new_bios ); + + const auto& tester1_account = account_name("tester1"); + c.create_accounts( {tester1_account} ); + c.produce_block(); + + const auto& pfm = c.control->get_protocol_feature_manager(); + const auto& d = pfm.get_builtin_digest( builtin_protocol_feature_t::bls_primitives ); + BOOST_REQUIRE( d ); + + c.preactivate_protocol_features( {*d} ); + c.produce_block(); + + c.set_code( tester1_account, test_contracts::bls_primitives_test_wasm() ); + c.set_abi( tester1_account, test_contracts::bls_primitives_test_abi().data() ); + c.produce_block(); + + using test_add = std::tuple; + const std::vector tests = { + { + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "AAAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A", + return_code::success + }, + { + "ABAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + { + "ACAAFFFFFFFFFEB9FFFF53B1FEFFAB1E24F6B0F6A0D23067BF1285F3844B7764D7AC4B43B6A71B4B9AE67F39EA11011A00000000000000000000000000000000", + "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + return_code::success + }, + }; + + for(const auto& test : tests) { + auto s = hex2bin(std::get<0>(test)); + auto expected_result = hex2bin(std::get<1>(test)); + auto expected_error = std::get<2>(test); + + c.push_action( tester1_account, "testfpmod"_n, tester1_account, mutable_variant_object() + ("s", s) + ("res", expected_result) + ("expected_error", expected_error) + ); + } + +} FC_LOG_AND_RETHROW() } + + BOOST_AUTO_TEST_SUITE_END() diff --git a/unittests/deep-mind/deep-mind.log b/unittests/deep-mind/deep-mind.log index cb54f2c062..cc9e109e82 100644 --- a/unittests/deep-mind/deep-mind.log +++ b/unittests/deep-mind/deep-mind.log @@ -34,11 +34,11 @@ DMLOG START_BLOCK 3 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":0,"consumed":0},"cpu_usage":{"last_ordinal":1262304002,"value_ex":1157,"consumed":101},"ram_usage":2724} DMLOG TRX_OP CREATE onblock da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb4 01e10b5e02005132b41600000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd000000 -DMLOG APPLIED_TRANSACTION 3 da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf101006400000000000000000000000000000000000000000001010000010000000000ea3055ccfe3b56076237b0b6da2f580652ee1420231b96d3d96b28183769ac932c9e5902000000000000000200000000000000010000000000ea3055020000000000000000000000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd00000000000000000000da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb01006400000000000000000000000000000000000000000001010000010000000000ea3055ccfe3b56076237b0b6da2f580652ee1420231b96d3d96b28183769ac932c9e5902000000000000000200000000000000010000000000ea3055020000000000000000000000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed32329801013b3d4b0000000000ea30550000000000015ab65a885a31e441ac485ebd2aeba87bf7ee6e7bcc40bf3a24506ba1000000000000000000000000000000000000000000000000000000000000000062267e8b11d7d8f28e1f991a4de2b08cf92500861af2795765bdc9263cd6f4cd000000000001000021010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd00000000000000000000da9fbe9042e1bc9bd64d7a4506534d492107a29f79ad671c1fea19ae3fb70eb403000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio code add setcode eosio 180494 177770 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":35325,"consumed":6104},"cpu_usage":{"last_ordinal":1262304002,"value_ex":12732,"consumed":2101},"ram_usage":180494} -DMLOG APPLIED_TRANSACTION 3 03917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d0070000fb050000000000000000d8170000000000000001010000010000000000ea30559a90c525172f87bbac0a6378610727f0fe1d7ebe908df973923d29a1606f9a5703000000000000000300000000000000010000000000ea3055030000000000000001000000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed3232fe8a010000000000ea30550000f18a010061736d01000000019d011a60000060037f7e7f0060027f7e0060027f7f0060057f7e7e7e7e0060047f7e7e7e0060017f017f60017f0060037f7f7f017f6000017f60027f7f017f60017e0060027e7f0060047e7e7e7e0060027f7f017e6000017e60047e7e7e7e017f60047f7e7e7f0060037f7f7f0060067e7e7e7e7f7f017f60047f7e7f7f0060037e7e7e0060037e7e7f017f60047f7f7e7f0060027e7e0060047f7f7f7f00028e041803656e761469735f666561747572655f616374697661746564000603656e761370726561637469766174655f66656174757265000703656e760c656f73696f5f617373657274000303656e76066d656d736574000803656e7610616374696f6e5f646174615f73697a65000903656e7610726561645f616374696f6e5f64617461000a03656e76066d656d637079000803656e760c726571756972655f61757468000b03656e760e7365745f70726976696c65676564000c03656e76137365745f7265736f757263655f6c696d697473000d03656e760561626f7274000003656e76167365745f70726f706f7365645f70726f647563657273000e03656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000303656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000a03656e760c63757272656e745f74696d65000f03656e76146765745f6163746976655f70726f647563657273000a03656e760b64625f66696e645f693634001003656e76095f5f6173686c746933001103656e7611656f73696f5f6173736572745f636f6465000203656e761063757272656e745f7265636569766572000f03656e760a64625f6765745f693634000803656e7606736861323536001203656e760c64625f73746f72655f693634001303656e760d64625f7570646174655f69363400140347460006070007090a08060607070a0a030307070a060715011602160316041603160316030516011603030a0a0a030a17170318181818181818180318181818031818181818081904050170010a0a05030100010616037f014180c0000b7f0041abc3000b7f0041abc3000b070901056170706c79002d090f010041010b092e30323436383a3b3d0ac98001460400101b0b800101037f02400240024002402000450d004100410028028c40200041107622016a220236028c404100410028028440220320006a41076a417871220036028440200241107420004d0d0120014000417f460d020c030b41000f0b4100200241016a36028c40200141016a4000417f470d010b4100419cc000100220030f0b20030b02000b3601017f230041106b2200410036020c4100200028020c28020041076a417871220036028440410020003602804041003f0036028c400b02000b06004190c0000bf50101067f4100210202400240410020006b22032000712000470d00200041104b0d01200110190f0b101d411636020041000f0b0240024002402000417f6a220420016a10192200450d002000200420006a2003712202460d012000417c6a220328020022044107712201450d02200020044178716a220441786a2205280200210620032001200220006b2207723602002002417c6a200420026b2203200172360200200241786a20064107712201200772360200200520012003723602002000101a0b20020f0b20000f0b200241786a200041786a280200200220006b22006a3602002002417c6a200328020020006b36020020020b3301017f411621030240024020014104490d0020012002101e2201450d0120002001360200410021030b20030f0b101d2802000b3801027f02402000410120001b2201101922000d000340410021004100280298402202450d012002110000200110192200450d000b0b20000b0600200010200b0e0002402000450d002000101a0b0b0600200010220b6b01027f230041106b2202240002402002410c6a20014104200141044b1b22012000410120001b2203101f450d00024003404100280298402200450d0120001100002002410c6a20012003101f0d000c020b0b2002410036020c0b200228020c2100200241106a240020000b08002000200110240b0e0002402000450d002000101a0b0b08002000200110260b0500100a000b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a36020020012000102a1a200141106a200128020420012802006b100c200141e0006a24000b920901047f02402000280208200028020422026b41074a0d00410041e8c0001002200041046a28020021020b20022001410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014a0d00410041e8c0001002200228020021030b20032004410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014a0d00410041e8c0001002200041046a28020021030b20032001410210061a200041046a2201200128020041026a36020020000bfa0203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c200110002100200141206a240020000bf60203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c20011001200141206a24000bcc0401017f23004190016b220324001018024020012000520d0002400240024002400240024002400240200242ffffb7f6a497b2d942570d00200242ffffffffb5f7d6d942570d01200242808080d0b2b3bb9932510d03200242808080c093fad6d942510d0420024280808080b6f7d6d942520d082003410036028c0120034101360288012003200329038801370300200120012003102f1a0c080b200242fffffffffff698d942550d0120024290a9d9d9dd8c99d6ba7f510d0420024280808080daac9bd6ba7f520d0720034100360264200341023602602003200329036037032820012001200341286a10311a0c070b2002428080b8f6a497b2d942510d0420024280808096cdebd4d942520d062003410036026c200341033602682003200329036837032020012001200341206a10331a0c060b2002428080808080f798d942510d042002428080b8f6a4979ad942520d0520034100360284012003410436028001200320032903800137030820012001200341086a10351a0c050b20034100360254200341053602502003200329035037033820012001200341386a10371a0c040b20034100360274200341063602702003200329037037031820012001200341186a10391a0c030b2003410036024c200341073602482003200329034837034020012001200341c0006a10371a0c020b2003410036027c200341083602782003200329037837031020012001200341106a103c1a0c010b2003410036025c200341093602582003200329035837033020012001200341306a103e1a0b4100101c20034190016a24000b1200200029030010072001200241004710080bd30201077f230041306b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441003a002820044200370320200220076a2103200441206a41086a210802400240200741074b0d0041004185c1001002200441206a2002410810061a200241086a21090c010b200441206a2002410810061a200241086a210920074108470d0041004185c10010020b20082009410110061a200441186a200336020020042002360210200441146a200241096a3602002004200137030820042000370300200420054101756a2103200441286a2d000021082004290320210002402005410171450d00200328020020066a28020021060b20032000200841ff0171200611010002402007418104490d002002101a0b200441306a240041010b0600200110070b830201057f230041306b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b20044200370328200220076a21030240200741074b0d0041004185c10010020b200441286a2002410810061a2004411c6a200241086a360200200441206a2003360200200420013703102004200037030820042002360218200441086a20054101756a21032004290328210002402005410171450d00200328020020066a28020021060b20032000200611020002402007418104490d002002101a0b200441306a240041010b0d0020002903001007200110290bf70201067f230041a0026b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441c8006a410041c80010031a2004200236023c200420023602382004200220076a360240200441386a200441c8006a10421a200441086a41086a220320042802403602002004200429033837030820044190016a41086a220820032802003602002004200429030837039001200441d8016a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290390012200370328200420003703d80120044190016a200441c8006a41c80010061a200441d8016a20044190016a41c80010061a200441186a20054101756a210302402005410171450d00200328020020066a28020021060b2003200441d8016a200611030002402007418104490d002002101a0b200441a0026a240041010b130020002903001007200120022003200410090b940302067f027e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037034820044200370340200442003703502004420037035820042002360234200420023602302004200220076a3602382004200441306a3602702004200441c0006a360210200441106a200441f0006a103f200441086a2203200428023836020020042004290330370300200441e0006a41086a2208200328020036020020042004290300370360200441f0006a41086a20082802002203360200200441286a2003360200200420003703102004200137031820042004290360220037032020042000370370200441106a20054101756a21032004290358210020042903502101200429034821092004290340210a02402005410171450d00200328020020066a28020021060b2003200a200920012000200611040002402007418104490d002002101a0b20044180016a240041010b0d00200029030010072001102c0bfe0301087f230041a0016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b200441c0006a41186a22034200370300200441c0006a41106a22084200370300200442003703482004420037034020042002360234200420023602302004200220076a3602382004200441306a3602602004200441c0006a3602800120044180016a200441e0006a1048200441086a2209200428023836020020042004290330370300200441e0006a41086a220a20092802003602002004200429030037036020044180016a41086a200a2802002209360200200441106a41186a200936020020042000370310200420013703182004200429036022003703202004200037038001200441e0006a41186a22092003290300370300200441e0006a41106a22032008290300370300200420042903483703682004200429034037036020044180016a41186a200929030037030020044180016a41106a200329030037030020042004290368370388012004200429036037038001200441106a20054101756a210302402005410171450d00200328020020066a28020021060b200320044180016a200611030002402007418104490d002002101a0b200441a0016a240041010b5601027f23002202210320002903001007024010042200418104490d00200010192202200010051a20022000100b1a200324000f0b20022000410f6a4170716b220224002002200010051a20022000100b1a200324000bb80501077f230041f0006b220321042003240020022802042105200228020021064100210741002102024010042208450d00024002402008418104490d002008101921020c010b20032008410f6a4170716b220224000b2002200810051a0b200441003602482004420037034020042002360234200420023602302004200220086a360238200441306a200441c0006a10411a200441086a2203200428023836020020042004290330370300200441d0006a41086a2209200328020036020020042004290300370350200441e0006a41086a20092802002203360200200441286a20033602002004200037031020042001370318200420042903502200370320200420003703602004410036025820044200370350200428024420042802406b220341306d21090240024002402003450d00200941d6aad52a4f0d01200441d8006a200310202207200941306c6a36020020042007360250200420073602542004280244200428024022096b22034101480d0020072009200310061a20042004280254200341306e41306c6a22073602540b200441106a20054101756a210302402005410171450d00200328020020066a28020021060b2004410036026820044200370360200720042802506b220741306d210502402007450d00200541d6aad52a4f0d02200441e8006a200710202207200541306c6a36020020042007360260200420073602642004280254200428025022096b22054101480d0020072009200510061a20042007200541306e41306c6a3602640b2003200441e0006a2006110300024020042802602207450d0020042007360264200710220b024020042802502207450d0020042007360254200710220b02402008418104490d002002101a0b024020042802402202450d0020042002360244200210220b200441f0006a240041010f0b200441d0006a1028000b200441e0006a1028000b130002402001102b0d00410041d9c20010020b0b0900200029030010070b870302067f017e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037035020044200370348200442003703582004200236023c200420023602382004200220076a3602402004200441386a3602702004200441c8006a360218200441186a200441f0006a1040200441086a41086a2203200428024036020020042004290338370308200441e0006a41086a2208200328020036020020042004290308370360200441f0006a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290360220037032820042000370370200441186a20054101756a210320042903582100200429035021012004290348210902402005410171450d00200328020020066a28020021060b2003200920012000200611050002402007418104490d002002101a0b20044180016a240041010bc00203017f017e027f230041c0006b2203240020032001370338200341306a41003602002003427f37032020034200370328200320002903002204370310200320043703180240024002402004200442808080809aecb4ee312001101022004100480d000240200341106a200010452200280230200341106a460d00410041b5c00010020b20032002360208200341106a20004200200341086a1046200328022822050d010c020b2003200236020c2003200341386a3602082003200341106a2001200341086a104720032802282205450d010b024002402003412c6a220628020022002005460d000340200041686a220028020021022000410036020002402002450d00200210220b20052000470d000b200341286a28020021000c010b200521000b2006200536020020001022200341c0006a24000f0b200341c0006a24000b9e0301057f23004180016b2203240020032204200229020037035841002102024010042205450d00024002402005418104490d002005101921020c010b20032005410f6a4170716b220224000b2002200510051a0b200441d0006a4100360200200442003703402004420037034820042002360234200420023602302004200220056a360238200221030240200541074b0d0041004185c1001002200428023421030b200441c0006a2003410810061a2004200341086a360234200441306a200441c0006a41086a220310431a200441086a2206200441306a41086a28020036020020042004290330370300200441e0006a41086a2207200628020036020020042004290300370360200441f0006a41086a20072802002206360200200441286a20063602002004200037031020042001370318200420042903602200370320200420003703702004200441d8006a3602742004200441106a360270200441f0006a200441c0006a104402402005418104490d002002101a0b024020032802002202450d00200441cc006a2002360200200210220b20044180016a240041010bc10201037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220041086a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041106a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041186a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000bf30101037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220441086a2102024020012802002203280208200328020422006b41074b0d0041004185c1001002200341046a28020021000b20022000410810061a200341046a2203200328020041086a360200200441106a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000be80303017f017e067f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22023602002003200741ff0071200641ff0171220674ad842103200641076a2106200221022007418001710d000b02400240024020012802042208200128020022096b41306d22072003a722024f0d002001200220076b105620012802002209200141046a2802002208470d010c020b0240200720024d0d00200141046a2009200241306c6a22083602000b20092008460d010b200041046a22042802002102200041086a210103400240200128020020026b41074b0d0041004185c1001002200428020021020b20092002410810061a2004200428020041086a220236020041002105420021030340024020022001280200490d00410041fbc2001002200428020021020b20022d000021072004200241016a22063602002003200741ff0071200541ff0171220274ad842103200241076a2105200621022007418001710d000b200920033e02082009410c6a21020240200128020020066b41204b0d0041004185c1001002200428020021060b20022006412110061a2004200428020041216a2202360200200941306a22092008470d000b0b20000b920901047f02402000280208200028020422026b41074b0d0041004185c1001002200041046a28020021020b20012002410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014b0d0041004185c1001002200228020021030b20042003410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014b0d0041004185c1001002200041046a28020021030b20012003410210061a200041046a2201200128020041026a36020020000ba10203017f017e057f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22083602002003200741ff0071200641ff0171220274ad842103200241076a2106200821022007418001710d000b0240024020012802042207200128020022026b22052003a722064f0d002001200620056b1051200041046a2802002108200141046a2802002107200128020021020c010b200520064d0d00200141046a200220066a22073602000b0240200041086a28020020086b200720026b22074f0d0041004185c1001002200041046a28020021080b20022008200710061a200041046a2202200228020020076a36020020000bf80103017f017e027f230041106b22022400200242003703002002410036020820012903002103024002402001410c6a28020020012802086b2204450d002004417f4c0d01200241086a20041020220520046a36020020022005360200200220053602042001410c6a280200200141086a28020022046b22014101480d0020052004200110061a2002200520016a3602040b20002802002000280204220128020422044101756a21002001280200210102402004410171450d00200028020020016a28020021010b2000200320022001110100024020022802002201450d0020022001360204200110220b200241106a24000f0b20021028000bbf0302077f017e230041206b22022103200224000240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a2802002105200341206a240020050f0b02400240024020014100410010142204417f4c0d0020044181044f0d0120022004410f6a4170716b22022400410021060c020b410041eec00010020b200410192102410121060b20012002200410141a41c000102022052000360230200542003703000240200441074b0d0041004185c10010020b20052002410810061a200541106a2107200241086a21080240200441786a411f4b0d0041004185c10010020b20072008412010061a20052001360234200320053602182003200529030022093703102003200136020c0240024002402000411c6a22072802002204200041206a2802004f0d00200420093703082004200136021020034100360218200420053602002007200441186a36020020060d010c020b200041186a200341186a200341106a2003410c6a105d2006450d010b2002101a0b200328021821012003410036021802402001450d00200110220b200341206a240020050bc40103027f017e017f230022042105024020012802302000460d00410041bdc10010020b024020002903001013510d00410041ebc10010020b20012903002106200328020022032802002207200328020420076b200141106a22071015024020062001290300510d004100419ec20010020b2004220441506a2203240020032001410810061a200441586a2007412010061a20012802342002200341281017024020062000290310540d00200041106a427e200642017c2006427d561b3703000b200524000bfb0101047f230041306b2204240020042002370328024020012903001013510d004100418ac10010020b20042003360214200420013602102004200441286a36021841c000102022032001200441106a105c1a2004200336022020042003290300220237031020042003280234220536020c024002402001411c6a22062802002207200141206a2802004f0d00200720023703082007200536021020044100360220200720033602002006200741186a3602000c010b200141186a200441206a200441106a2004410c6a105d0b2000200336020420002001360200200428022021012004410036022002402001450d00200110220b200441306a24000b960305027f017e017f017e017f230041d0006b2202240020002802002103024020012802002201280208200128020422006b411f4b0d0041004185c1001002200141046a28020021000b200241306a2000412010061a200141046a2201200128020041206a3602004200210441102101200241106a2105410021004200210602400340200241306a20006a2107024020014102490d002006420886200420073100008422044238888421062001417f6a210120044208862104200041016a22004120470d010c020b024020014101460d00410041ffc20010020b200520063703082005200420073100008437030041102101200541106a21054200210442002106200041016a22004120470d000b0b024020014110460d00024020014102490d00200220042006200141037441786a1011200241086a2903002106200229030021040b20052004370300200520063703080b20032002290310370300200341086a2002290318370300200341186a200241106a41186a290300370300200341106a200241106a41106a290300370300200241d0006a24000bba0101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20034200370300200241086a2102024020044178714108470d0041004185c10010020b20032002410810061a200341106a24000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000bd30201047f230041306b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d0041004185c1001002200341286a2802002105200328022421020b200341186a2002410810061a2003200241086a2202360224024020052002470d0041004185c1001002200341206a41086a2802002105200328022421020b200341176a2002410110061a2003200241016a2202360224024020052002470d0041004185c1001002200328022421020b200341166a2002410110061a2003200241016a3602242003410036021020034200370308200341206a200341086a10431a024020032802082202450d002003200236020c200210220b200341306a24000bbe0201067f0240024002400240024020002802082202200028020422036b20014f0d002003200028020022046b220520016a2206417f4c0d0241ffffffff0721070240200220046b220241feffffff034b0d0020062002410174220220022006491b2207450d020b2007102021020c030b200041046a21000340200341003a00002000200028020041016a22033602002001417f6a22010d000c040b0b41002107410021020c010b20001028000b200220076a2107200320016a20046b2104200220056a220521030340200341003a0000200341016a21032001417f6a22010d000b200220046a21042005200041046a2206280200200028020022016b22036b2102024020034101480d0020022001200310061a200028020021010b2000200236020020062004360200200041086a20073602002001450d00200110220f0b0bd00102047f017e230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a2102024020044108470d0041004185c10010020b200341076a2002410110061a2003290308210620032d0007210420001007200620044100471008200341106a24000bab0202047f047e230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037031841002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370318200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2105024020044110470d0041004185c10010020b200341086a2005410810061a200241186a2102024020044118470d0041004185c10010020b20032002410810061a200329030021062003290308210720032903102108200329031821092000100720092008200720061009200341206a24000bd30101047f230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b41002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2102024020044110470d0041004185c10010020b200341086a2002410810061a20001007200341206a24000bc60301047f23004180016b220221032002240041002104024010042205450d00024002402005418004490d002005101921040c010b20022005410f6a4170716b220424000b2004200510051a0b20032004360254200320043602502003200420056a3602582003410036024820034200370340200341d0006a200341c0006a10411a200341106a41086a2204200328025836020020032003290350370310200341e0006a41086a2205200428020036020020032003290310370360200341f0006a41086a20052802002204360200200341386a20043602002003200037032020032001370328200320032903602200370330200320003703702003410036020820034200370300200328024420032802406b220441306d2105024002402004450d00200541d6aad52a4f0d01200341086a200410202204200541306c6a36020020032004360200200320043602042003280244200328024022026b22054101480d0020042002200510061a20032003280204200541306e41306c6a3602040b200341206a20031038024020032802002204450d0020032004360204200410220b024020032802402204450d0020032004360244200410220b20034180016a24000f0b20031028000bc60301067f0240024002400240024020002802082202200028020422036b41306d20014f0d002003200028020022046b41306d220520016a220641d6aad52a4f0d0241d5aad52a21030240200220046b41306d220241a9d5aa154b0d0020062002410174220320032006491b2203450d020b200341306c102021040c030b200041046a21020340200341086a2200420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a4200370300200041003602002002200228020041306a22033602002001417f6a22010d000c040b0b41002103410021040c010b20001028000b2004200341306c6a21072004200541306c6a220521030340200341086a2202420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a420037030020024100360200200341306a21032001417f6a22010d000b2004200641306c6a21042005200041046a2206280200200028020022036b220141506d41306c6a2102024020014101480d0020022003200110061a200028020021030b2000200236020020062004360200200041086a20073602002003450d00200310220f0b0b8a0101037f230041e0006b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a10421a20001007200341086a1029200341e0006a24000b950101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20032903081007200341106a24000bd70303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a290300370300200320032903383703182003200329033037031020001007200341106a102c200341f0006a24000be00303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703100240200341106a102b0d00410041d9c20010020b200341f0006a24000beb0201037f23004180016b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d0041004185c1001002200328025421020b200341c8006a2002410810061a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10431a200341086a41086a2202200341d0006a41086a28020036020020032003290350370308200341e0006a41086a2204200228020036020020032003290308370360200341f0006a41086a20042802002202360200200341306a2002360200200320003703182003200137032020032003290360220037032820032000370370200341186a2003290348200341386a103d024020032802382202450d002003200236023c200210220b20034180016a24000bbc0102037f017e230041306b22032400200020013602302000420037030020002002280204220428020029030037030020022802002101200428020422042802002205200428020420056b200041106a2204101520032000410810061a20034108722004412010061a2000200129030842808080809aecb4ee31200228020829030020002903002206200341281016360234024020062001290310540d00200141106a427e200642017c2006427d561b3703000b200341306a240020000baa0301057f024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b2207450d010b200741186c102021040c020b41002107410021040c010b20001028000b20012802002106200141003602002004200541186c22086a2201200636020020012002290300370308200120032802003602102004200741186c6a2105200141186a210602400240200041046a280200220220002802002207460d00200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141106a200241786a280200360200200141086a200241706a290300370300200141686a21012004210220072004470d000b200141186a2101200041046a2802002107200028020021020c010b200721020b20002001360200200041046a2006360200200041086a2005360200024020072002460d000340200741686a220728020021012007410036020002402001450d00200110220b20022007470d000b0b02402002450d00200210220b0b0bdf030b00419cc0000b4c6661696c656420746f20616c6c6f63617465207061676573006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578000041e8c0000b1d7772697465006572726f722072656164696e67206974657261746f7200004185c1000b05726561640000418ac1000b3363616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374000041bdc1000b2e6f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e646578000041ebc1000b3363616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e74726163740000419ec2000b3b757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374000041d9c2000b2270726f746f636f6c2066656174757265206973206e6f7420616374697661746564000041fbc2000b04676574000041ffc2000b2c756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04b02100000000000000000000000003917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf1010000000000ea30556ab602000000000000000000000000 +DMLOG APPLIED_TRANSACTION 3 03917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d0070000fb050000000000000000d8170000000000000001010000010000000000ea30559a90c525172f87bbac0a6378610727f0fe1d7ebe908df973923d29a1606f9a5703000000000000000300000000000000010000000000ea3055030000000000000001000000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed3232fe8a010000000000ea30550000f18a010061736d01000000019d011a60000060037f7e7f0060027f7e0060027f7f0060057f7e7e7e7e0060047f7e7e7e0060017f017f60017f0060037f7f7f017f6000017f60027f7f017f60017e0060027e7f0060047e7e7e7e0060027f7f017e6000017e60047e7e7e7e017f60047f7e7e7f0060037f7f7f0060067e7e7e7e7f7f017f60047f7e7f7f0060037e7e7e0060037e7e7f017f60047f7f7e7f0060027e7e0060047f7f7f7f00028e041803656e761469735f666561747572655f616374697661746564000603656e761370726561637469766174655f66656174757265000703656e760c656f73696f5f617373657274000303656e76066d656d736574000803656e7610616374696f6e5f646174615f73697a65000903656e7610726561645f616374696f6e5f64617461000a03656e76066d656d637079000803656e760c726571756972655f61757468000b03656e760e7365745f70726976696c65676564000c03656e76137365745f7265736f757263655f6c696d697473000d03656e760561626f7274000003656e76167365745f70726f706f7365645f70726f647563657273000e03656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000303656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000a03656e760c63757272656e745f74696d65000f03656e76146765745f6163746976655f70726f647563657273000a03656e760b64625f66696e645f693634001003656e76095f5f6173686c746933001103656e7611656f73696f5f6173736572745f636f6465000203656e761063757272656e745f7265636569766572000f03656e760a64625f6765745f693634000803656e7606736861323536001203656e760c64625f73746f72655f693634001303656e760d64625f7570646174655f69363400140347460006070007090a08060607070a0a030307070a060715011602160316041603160316030516011603030a0a0a030a17170318181818181818180318181818031818181818081904050170010a0a05030100010616037f014180c0000b7f0041abc3000b7f0041abc3000b070901056170706c79002d090f010041010b092e30323436383a3b3d0ac98001460400101b0b800101037f02400240024002402000450d004100410028028c40200041107622016a220236028c404100410028028440220320006a41076a417871220036028440200241107420004d0d0120014000417f460d020c030b41000f0b4100200241016a36028c40200141016a4000417f470d010b4100419cc000100220030f0b20030b02000b3601017f230041106b2200410036020c4100200028020c28020041076a417871220036028440410020003602804041003f0036028c400b02000b06004190c0000bf50101067f4100210202400240410020006b22032000712000470d00200041104b0d01200110190f0b101d411636020041000f0b0240024002402000417f6a220420016a10192200450d002000200420006a2003712202460d012000417c6a220328020022044107712201450d02200020044178716a220441786a2205280200210620032001200220006b2207723602002002417c6a200420026b2203200172360200200241786a20064107712201200772360200200520012003723602002000101a0b20020f0b20000f0b200241786a200041786a280200200220006b22006a3602002002417c6a200328020020006b36020020020b3301017f411621030240024020014104490d0020012002101e2201450d0120002001360200410021030b20030f0b101d2802000b3801027f02402000410120001b2201101922000d000340410021004100280298402202450d012002110000200110192200450d000b0b20000b0600200010200b0e0002402000450d002000101a0b0b0600200010220b6b01027f230041106b2202240002402002410c6a20014104200141044b1b22012000410120001b2203101f450d00024003404100280298402200450d0120001100002002410c6a20012003101f0d000c020b0b2002410036020c0b200228020c2100200241106a240020000b08002000200110240b0e0002402000450d002000101a0b0b08002000200110260b0500100a000b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a36020020012000102a1a200141106a200128020420012802006b100c200141e0006a24000b920901047f02402000280208200028020422026b41074a0d00410041e8c0001002200041046a28020021020b20022001410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034a0d00410041e8c0001002200228020021030b20032004410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034a0d00410041e8c0001002200041046a28020021030b20032002410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014a0d00410041e8c0001002200228020021030b20032004410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014a0d00410041e8c0001002200041046a28020021030b20032001410210061a200041046a2201200128020041026a36020020000bfa0203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c200110002100200141206a240020000bf60203017f027e017f230041206b220124002001200029030022024220883c000b200120024228883c000a200120024230883c0009200120024238883c00082001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c000020012002a722043a000f200120044108763a000e200120044110763a000d200120044118763a000c20012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a00042001200041186a29030022023c00172001200029031022034220883c001b200120034228883c001a200120034230883c0019200120034238883c0018200120024220883c0013200120024228883c0012200120024230883c0011200120024238883c001020012002a722004108763a0016200120004110763a0015200120004118763a001420012003a722003a001f200120004108763a001e200120004110763a001d200120004118763a001c20011001200141206a24000bcc0401017f23004190016b220324001018024020012000520d0002400240024002400240024002400240200242ffffb7f6a497b2d942570d00200242ffffffffb5f7d6d942570d01200242808080d0b2b3bb9932510d03200242808080c093fad6d942510d0420024280808080b6f7d6d942520d082003410036028c0120034101360288012003200329038801370300200120012003102f1a0c080b200242fffffffffff698d942550d0120024290a9d9d9dd8c99d6ba7f510d0420024280808080daac9bd6ba7f520d0720034100360264200341023602602003200329036037032820012001200341286a10311a0c070b2002428080b8f6a497b2d942510d0420024280808096cdebd4d942520d062003410036026c200341033602682003200329036837032020012001200341206a10331a0c060b2002428080808080f798d942510d042002428080b8f6a4979ad942520d0520034100360284012003410436028001200320032903800137030820012001200341086a10351a0c050b20034100360254200341053602502003200329035037033820012001200341386a10371a0c040b20034100360274200341063602702003200329037037031820012001200341186a10391a0c030b2003410036024c200341073602482003200329034837034020012001200341c0006a10371a0c020b2003410036027c200341083602782003200329037837031020012001200341106a103c1a0c010b2003410036025c200341093602582003200329035837033020012001200341306a103e1a0b4100101c20034190016a24000b1200200029030010072001200241004710080bd30201077f230041306b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441003a002820044200370320200220076a2103200441206a41086a210802400240200741074b0d0041004185c1001002200441206a2002410810061a200241086a21090c010b200441206a2002410810061a200241086a210920074108470d0041004185c10010020b20082009410110061a200441186a200336020020042002360210200441146a200241096a3602002004200137030820042000370300200420054101756a2103200441286a2d000021082004290320210002402005410171450d00200328020020066a28020021060b20032000200841ff0171200611010002402007418104490d002002101a0b200441306a240041010b0600200110070b830201057f230041306b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b20044200370328200220076a21030240200741074b0d0041004185c10010020b200441286a2002410810061a2004411c6a200241086a360200200441206a2003360200200420013703102004200037030820042002360218200441086a20054101756a21032004290328210002402005410171450d00200328020020066a28020021060b20032000200611020002402007418104490d002002101a0b200441306a240041010b0d0020002903001007200110290bf70201067f230041a0026b2203210420032400200228020421052002280200210641002102024010042207450d00024002402007418104490d002007101921020c010b20032007410f6a4170716b220224000b2002200710051a0b200441c8006a410041c80010031a2004200236023c200420023602382004200220076a360240200441386a200441c8006a10421a200441086a41086a220320042802403602002004200429033837030820044190016a41086a220820032802003602002004200429030837039001200441d8016a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290390012200370328200420003703d80120044190016a200441c8006a41c80010061a200441d8016a20044190016a41c80010061a200441186a20054101756a210302402005410171450d00200328020020066a28020021060b2003200441d8016a200611030002402007418104490d002002101a0b200441a0026a240041010b130020002903001007200120022003200410090b940302067f027e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037034820044200370340200442003703502004420037035820042002360234200420023602302004200220076a3602382004200441306a3602702004200441c0006a360210200441106a200441f0006a103f200441086a2203200428023836020020042004290330370300200441e0006a41086a2208200328020036020020042004290300370360200441f0006a41086a20082802002203360200200441286a2003360200200420003703102004200137031820042004290360220037032020042000370370200441106a20054101756a21032004290358210020042903502101200429034821092004290340210a02402005410171450d00200328020020066a28020021060b2003200a200920012000200611040002402007418104490d002002101a0b20044180016a240041010b0d00200029030010072001102c0bfe0301087f230041a0016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b200441c0006a41186a22034200370300200441c0006a41106a22084200370300200442003703482004420037034020042002360234200420023602302004200220076a3602382004200441306a3602602004200441c0006a3602800120044180016a200441e0006a1048200441086a2209200428023836020020042004290330370300200441e0006a41086a220a20092802003602002004200429030037036020044180016a41086a200a2802002209360200200441106a41186a200936020020042000370310200420013703182004200429036022003703202004200037038001200441e0006a41186a22092003290300370300200441e0006a41106a22032008290300370300200420042903483703682004200429034037036020044180016a41186a200929030037030020044180016a41106a200329030037030020042004290368370388012004200429036037038001200441106a20054101756a210302402005410171450d00200328020020066a28020021060b200320044180016a200611030002402007418104490d002002101a0b200441a0016a240041010b5601027f23002202210320002903001007024010042200418104490d00200010192202200010051a20022000100b1a200324000f0b20022000410f6a4170716b220224002002200010051a20022000100b1a200324000bb80501077f230041f0006b220321042003240020022802042105200228020021064100210741002102024010042208450d00024002402008418104490d002008101921020c010b20032008410f6a4170716b220224000b2002200810051a0b200441003602482004420037034020042002360234200420023602302004200220086a360238200441306a200441c0006a10411a200441086a2203200428023836020020042004290330370300200441d0006a41086a2209200328020036020020042004290300370350200441e0006a41086a20092802002203360200200441286a20033602002004200037031020042001370318200420042903502200370320200420003703602004410036025820044200370350200428024420042802406b220341306d21090240024002402003450d00200941d6aad52a4f0d01200441d8006a200310202207200941306c6a36020020042007360250200420073602542004280244200428024022096b22034101480d0020072009200310061a20042004280254200341306e41306c6a22073602540b200441106a20054101756a210302402005410171450d00200328020020066a28020021060b2004410036026820044200370360200720042802506b220741306d210502402007450d00200541d6aad52a4f0d02200441e8006a200710202207200541306c6a36020020042007360260200420073602642004280254200428025022096b22054101480d0020072009200510061a20042007200541306e41306c6a3602640b2003200441e0006a2006110300024020042802602207450d0020042007360264200710220b024020042802502207450d0020042007360254200710220b02402008418104490d002002101a0b024020042802402202450d0020042002360244200210220b200441f0006a240041010f0b200441d0006a1028000b200441e0006a1028000b130002402001102b0d00410041d9c20010020b0b0900200029030010070b870302067f017e23004180016b22032104200324002002280204210520022802002106024002400240024010042207450d002007418104490d012007101921020c020b410021020c020b20032007410f6a4170716b220224000b2002200710051a0b2004420037035020044200370348200442003703582004200236023c200420023602382004200220076a3602402004200441386a3602702004200441c8006a360218200441186a200441f0006a1040200441086a41086a2203200428024036020020042004290338370308200441e0006a41086a2208200328020036020020042004290308370360200441f0006a41086a20082802002203360200200441306a2003360200200420003703182004200137032020042004290360220037032820042000370370200441186a20054101756a210320042903582100200429035021012004290348210902402005410171450d00200328020020066a28020021060b2003200920012000200611050002402007418104490d002002101a0b20044180016a240041010bc00203017f017e027f230041c0006b2203240020032001370338200341306a41003602002003427f37032020034200370328200320002903002204370310200320043703180240024002402004200442808080809aecb4ee312001101022004100480d000240200341106a200010452200280230200341106a460d00410041b5c00010020b20032002360208200341106a20004200200341086a1046200328022822050d010c020b2003200236020c2003200341386a3602082003200341106a2001200341086a104720032802282205450d010b024002402003412c6a220628020022002005460d000340200041686a220028020021022000410036020002402002450d00200210220b20052000470d000b200341286a28020021000c010b200521000b2006200536020020001022200341c0006a24000f0b200341c0006a24000b9e0301057f23004180016b2203240020032204200229020037035841002102024010042205450d00024002402005418104490d002005101921020c010b20032005410f6a4170716b220224000b2002200510051a0b200441d0006a4100360200200442003703402004420037034820042002360234200420023602302004200220056a360238200221030240200541074b0d0041004185c1001002200428023421030b200441c0006a2003410810061a2004200341086a360234200441306a200441c0006a41086a220310431a200441086a2206200441306a41086a28020036020020042004290330370300200441e0006a41086a2207200628020036020020042004290300370360200441f0006a41086a20072802002206360200200441286a20063602002004200037031020042001370318200420042903602200370320200420003703702004200441d8006a3602742004200441106a360270200441f0006a200441c0006a104402402005418104490d002002101a0b024020032802002202450d00200441cc006a2002360200200210220b20044180016a240041010bc10201037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220041086a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041106a2102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a360200200041186a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000bf30101037f20002802002102024020012802002203280208200328020422046b41074b0d0041004185c1001002200341046a28020021040b20022004410810061a200341046a2203200328020041086a3602002000280200220441086a2102024020012802002203280208200328020422006b41074b0d0041004185c1001002200341046a28020021000b20022000410810061a200341046a2203200328020041086a360200200441106a2100024020012802002201280208200128020422036b41074b0d0041004185c1001002200141046a28020021030b20002003410810061a200141046a2201200128020041086a3602000be80303017f017e067f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22023602002003200741ff0071200641ff0171220674ad842103200641076a2106200221022007418001710d000b02400240024020012802042208200128020022096b41306d22072003a722024f0d002001200220076b105620012802002209200141046a2802002208470d010c020b0240200720024d0d00200141046a2009200241306c6a22083602000b20092008460d010b200041046a22042802002102200041086a210103400240200128020020026b41074b0d0041004185c1001002200428020021020b20092002410810061a2004200428020041086a220236020041002105420021030340024020022001280200490d00410041fbc2001002200428020021020b20022d000021072004200241016a22063602002003200741ff0071200541ff0171220274ad842103200241076a2105200621022007418001710d000b200920033e02082009410c6a21020240200128020020066b41204b0d0041004185c1001002200428020021060b20022006412110061a2004200428020041216a2202360200200941306a22092008470d000b0b20000b920901047f02402000280208200028020422026b41074b0d0041004185c1001002200041046a28020021020b20012002410810061a200041046a2202200228020041086a2203360200200141086a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001410c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141106a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141146a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141186a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001411c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141206a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141246a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141286a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001412c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141306a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a2203360200200141346a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141386a21040240200041086a220528020020036b41034b0d0041004185c1001002200228020021030b20042003410410061a2002200228020041046a22033602002001413c6a21020240200528020020036b41034b0d0041004185c1001002200041046a28020021030b20022003410410061a200041046a2202200228020041046a2203360200200141c0006a21040240200041086a220528020020036b41014b0d0041004185c1001002200228020021030b20042003410210061a2002200228020041026a2203360200200141c2006a21010240200528020020036b41014b0d0041004185c1001002200041046a28020021030b20012003410210061a200041046a2201200128020041026a36020020000ba10203017f017e057f2000280204210242002103200041086a2104200041046a2105410021060340024020022004280200490d00410041fbc2001002200528020021020b20022d000021072005200241016a22083602002003200741ff0071200641ff0171220274ad842103200241076a2106200821022007418001710d000b0240024020012802042207200128020022026b22052003a722064f0d002001200620056b1051200041046a2802002108200141046a2802002107200128020021020c010b200520064d0d00200141046a200220066a22073602000b0240200041086a28020020086b200720026b22074f0d0041004185c1001002200041046a28020021080b20022008200710061a200041046a2202200228020020076a36020020000bf80103017f017e027f230041106b22022400200242003703002002410036020820012903002103024002402001410c6a28020020012802086b2204450d002004417f4c0d01200241086a20041020220520046a36020020022005360200200220053602042001410c6a280200200141086a28020022046b22014101480d0020052004200110061a2002200520016a3602040b20002802002000280204220128020422044101756a21002001280200210102402004410171450d00200028020020016a28020021010b2000200320022001110100024020022802002201450d0020022001360204200110220b200241106a24000f0b20021028000bbf0302077f017e230041206b22022103200224000240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a2802002105200341206a240020050f0b02400240024020014100410010142204417f4c0d0020044181044f0d0120022004410f6a4170716b22022400410021060c020b410041eec00010020b200410192102410121060b20012002200410141a41c000102022052000360230200542003703000240200441074b0d0041004185c10010020b20052002410810061a200541106a2107200241086a21080240200441786a411f4b0d0041004185c10010020b20072008412010061a20052001360234200320053602182003200529030022093703102003200136020c0240024002402000411c6a22072802002204200041206a2802004f0d00200420093703082004200136021020034100360218200420053602002007200441186a36020020060d010c020b200041186a200341186a200341106a2003410c6a105d2006450d010b2002101a0b200328021821012003410036021802402001450d00200110220b200341206a240020050bc40103027f017e017f230022042105024020012802302000460d00410041bdc10010020b024020002903001013510d00410041ebc10010020b20012903002106200328020022032802002207200328020420076b200141106a22071015024020062001290300510d004100419ec20010020b2004220441506a2203240020032001410810061a200441586a2007412010061a20012802342002200341281017024020062000290310540d00200041106a427e200642017c2006427d561b3703000b200524000bfb0101047f230041306b2204240020042002370328024020012903001013510d004100418ac10010020b20042003360214200420013602102004200441286a36021841c000102022032001200441106a105c1a2004200336022020042003290300220237031020042003280234220536020c024002402001411c6a22062802002207200141206a2802004f0d00200720023703082007200536021020044100360220200720033602002006200741186a3602000c010b200141186a200441206a200441106a2004410c6a105d0b2000200336020420002001360200200428022021012004410036022002402001450d00200110220b200441306a24000b960305027f017e017f017e017f230041d0006b2202240020002802002103024020012802002201280208200128020422006b411f4b0d0041004185c1001002200141046a28020021000b200241306a2000412010061a200141046a2201200128020041206a3602004200210441102101200241106a2105410021004200210602400340200241306a20006a2107024020014102490d002006420886200420073100008422044238888421062001417f6a210120044208862104200041016a22004120470d010c020b024020014101460d00410041ffc20010020b200520063703082005200420073100008437030041102101200541106a21054200210442002106200041016a22004120470d000b0b024020014110460d00024020014102490d00200220042006200141037441786a1011200241086a2903002106200229030021040b20052004370300200520063703080b20032002290310370300200341086a2002290318370300200341186a200241106a41186a290300370300200341106a200241106a41106a290300370300200241d0006a24000bba0101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20034200370300200241086a2102024020044178714108470d0041004185c10010020b20032002410810061a200341106a24000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000b4401037f230022022103024010042204450d00024002402004418004490d002004101921020c010b20022004410f6a4170716b220224000b2002200410051a0b200324000bd30201047f230041306b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d0041004185c1001002200341286a2802002105200328022421020b200341186a2002410810061a2003200241086a2202360224024020052002470d0041004185c1001002200341206a41086a2802002105200328022421020b200341176a2002410110061a2003200241016a2202360224024020052002470d0041004185c1001002200328022421020b200341166a2002410110061a2003200241016a3602242003410036021020034200370308200341206a200341086a10431a024020032802082202450d002003200236020c200210220b200341306a24000bbe0201067f0240024002400240024020002802082202200028020422036b20014f0d002003200028020022046b220520016a2206417f4c0d0241ffffffff0721070240200220046b220241feffffff034b0d0020062002410174220220022006491b2207450d020b2007102021020c030b200041046a21000340200341003a00002000200028020041016a22033602002001417f6a22010d000c040b0b41002107410021020c010b20001028000b200220076a2107200320016a20046b2104200220056a220521030340200341003a0000200341016a21032001417f6a22010d000b200220046a21042005200041046a2206280200200028020022016b22036b2102024020034101480d0020022001200310061a200028020021010b2000200236020020062004360200200041086a20073602002001450d00200110220f0b0bd00102047f017e230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a2102024020044108470d0041004185c10010020b200341076a2002410110061a2003290308210620032d0007210420001007200620044100471008200341106a24000bab0202047f047e230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037031841002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370318200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2105024020044110470d0041004185c10010020b200341086a2005410810061a200241186a2102024020044118470d0041004185c10010020b20032002410810061a200329030021062003290308210720032903102108200329031821092000100720092008200720061009200341206a24000bd30101047f230041206b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b41002102200341186a21050c020b20022004410f6a4170716b220224000b2002200410051a200341186a2105200441074b0d010b41004185c10010020b20052002410810061a200241086a21050240200441787122044108470d0041004185c10010020b200341106a2005410810061a200241106a2102024020044110470d0041004185c10010020b200341086a2002410810061a20001007200341206a24000bc60301047f23004180016b220221032002240041002104024010042205450d00024002402005418004490d002005101921040c010b20022005410f6a4170716b220424000b2004200510051a0b20032004360254200320043602502003200420056a3602582003410036024820034200370340200341d0006a200341c0006a10411a200341106a41086a2204200328025836020020032003290350370310200341e0006a41086a2205200428020036020020032003290310370360200341f0006a41086a20052802002204360200200341386a20043602002003200037032020032001370328200320032903602200370330200320003703702003410036020820034200370300200328024420032802406b220441306d2105024002402004450d00200541d6aad52a4f0d01200341086a200410202204200541306c6a36020020032004360200200320043602042003280244200328024022026b22054101480d0020042002200510061a20032003280204200541306e41306c6a3602040b200341206a20031038024020032802002204450d0020032004360204200410220b024020032802402204450d0020032004360244200410220b20034180016a24000f0b20031028000bc60301067f0240024002400240024020002802082202200028020422036b41306d20014f0d002003200028020022046b41306d220520016a220641d6aad52a4f0d0241d5aad52a21030240200220046b41306d220241a9d5aa154b0d0020062002410174220320032006491b2203450d020b200341306c102021040c030b200041046a21020340200341086a2200420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a4200370300200041003602002002200228020041306a22033602002001417f6a22010d000c040b0b41002103410021040c010b20001028000b2004200341306c6a21072004200541306c6a220521030340200341086a2202420037030020034200370300200341286a4200370300200341206a4200370300200341186a4200370300200341106a420037030020024100360200200341306a21032001417f6a22010d000b2004200641306c6a21042005200041046a2206280200200028020022036b220141506d41306c6a2102024020014101480d0020022003200110061a200028020021030b2000200236020020062004360200200041086a20073602002003450d00200310220f0b0b8a0101037f230041e0006b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a10421a20001007200341086a1029200341e0006a24000b950101047f230041106b22022103200224000240024002400240024010042204450d002004418004490d012004101921020c020b2003420037030841002102200341086a21050c020b20022004410f6a4170716b220224000b2002200410051a20034200370308200341086a2105200441074b0d010b41004185c10010020b20052002410810061a20032903081007200341106a24000bd70303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a290300370300200320032903383703182003200329033037031020001007200341106a102c200341f0006a24000be00303047f027e017f230041f0006b2202210320022400024002400240024010042204450d002004418004490d012004101921050c020b410021050c020b20022004410f6a4170716b220524000b2005200410051a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d0041004185c10010020b200341d0006a2005412010061a200341306a2105410021044200210702400340200341d0006a20046a2108024020024102490d002007420886200620083100008422064238888421072002417f6a210220064208862106200441016a22044120470d010c020b024020024101460d00410041ffc20010020b200520073703082005200620083100008437030041102102200541106a21054200210642002107200441016a22044120470d000b0b024020024110460d00024020024102490d00200320062007200241037441786a1011200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703100240200341106a102b0d00410041d9c20010020b200341f0006a24000beb0201037f23004180016b2202210320022400024002400240024010042204450d002004418004490d012004101921020c020b410021020c020b20022004410f6a4170716b220224000b2002200410051a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d0041004185c1001002200328025421020b200341c8006a2002410810061a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10431a200341086a41086a2202200341d0006a41086a28020036020020032003290350370308200341e0006a41086a2204200228020036020020032003290308370360200341f0006a41086a20042802002202360200200341306a2002360200200320003703182003200137032020032003290360220037032820032000370370200341186a2003290348200341386a103d024020032802382202450d002003200236023c200210220b20034180016a24000bbc0102037f017e230041306b22032400200020013602302000420037030020002002280204220428020029030037030020022802002101200428020422042802002205200428020420056b200041106a2204101520032000410810061a20034108722004412010061a2000200129030842808080809aecb4ee31200228020829030020002903002206200341281016360234024020062001290310540d00200141106a427e200642017c2006427d561b3703000b200341306a240020000baa0301057f024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b2207450d010b200741186c102021040c020b41002107410021040c010b20001028000b20012802002106200141003602002004200541186c22086a2201200636020020012002290300370308200120032802003602102004200741186c6a2105200141186a210602400240200041046a280200220220002802002207460d00200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141106a200241786a280200360200200141086a200241706a290300370300200141686a21012004210220072004470d000b200141186a2101200041046a2802002107200028020021020c010b200721020b20002001360200200041046a2006360200200041086a2005360200024020072002460d000340200741686a220728020021012007410036020002402001450d00200110220b20022007470d000b0b02402002450d00200210220b0b0bdf030b00419cc0000b4c6661696c656420746f20616c6c6f63617465207061676573006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578000041e8c0000b1d7772697465006572726f722072656164696e67206974657261746f7200004185c1000b05726561640000418ac1000b3363616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374000041bdc1000b2e6f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e646578000041ebc1000b3363616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e74726163740000419ec2000b3b757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374000041d9c2000b2270726f746f636f6c2066656174757265206973206e6f7420616374697661746564000041fbc2000b04676574000041ffc2000b2c756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04b02100000000000000000000000003917c562680b415b93db73416ff29230dfbe7ab1ba4d208b46029d01333cd3a03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb010000000000ea30556ab602000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio abi update setabi eosio 180538 44 DMLOG RAM_OP 0 eosio:eosio:abihash table add create_table eosio 180650 112 @@ -46,98 +46,98 @@ DMLOG TBL_OP INS 0 eosio eosio abihash eosio DMLOG RAM_OP 0 eosio:eosio:abihash:eosio table_row add primary_index_add eosio 180802 152 DMLOG DB_OP INS 0 eosio eosio eosio abihash eosio 0000000000ea3055d7abd75d188060de8a01ab2672d1cc2cd768fddc56203181b43685cc11f5ce46 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":41298,"consumed":7136},"cpu_usage":{"last_ordinal":1262304002,"value_ex":24307,"consumed":4101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 78216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d00700008101000000000000000008040000000000000001010000010000000000ea3055e7de58a9939c6e694d3235202685f51b7fab8e82b1f9f96a637dafd9be0998a204000000000000000400000000000000010000000000ea3055040000000000000001010000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed32328a110000000000ea305580110e656f73696f3a3a6162692f312e310019086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d650a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431360c70726f64756365725f6b657900020d70726f64756365725f6e616d65046e616d6511626c6f636b5f7369676e696e675f6b65790a7075626c69635f6b65790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f64650562797465730a736574676c696d69747300030372616d0675696e743634036e65740675696e743634036370750675696e74363409736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c650e70726f64756365725f6b65795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136110000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000ce4ebac8b2c20a736574676c696d697473000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f6861736800000000000000000000000000000078216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf1010000000000ea3055340100000000000000000000000000 +DMLOG APPLIED_TRANSACTION 3 78216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d00700008101000000000000000008040000000000000001010000010000000000ea3055e7de58a9939c6e694d3235202685f51b7fab8e82b1f9f96a637dafd9be0998a204000000000000000400000000000000010000000000ea3055040000000000000001010000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed32328a110000000000ea305580110e656f73696f3a3a6162692f312e310019086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d650a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431360c70726f64756365725f6b657900020d70726f64756365725f6e616d65046e616d6511626c6f636b5f7369676e696e675f6b65790a7075626c69635f6b65790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f64650562797465730a736574676c696d69747300030372616d0675696e743634036e65740675696e743634036370750675696e74363409736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c650e70726f64756365725f6b65795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136110000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000ce4ebac8b2c20a736574676c696d697473000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f6861736800000000000000000000000000000078216184577675cf681592f18c754116fdf63576c1fa05b7566dd6ae6fe2ed8003000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb010000000000ea3055340100000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241 {"feature_digest":"1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"f3c3d91c4603cde2397268bfed4e662465293aab10cd9416db0d442b8cec2949","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ONLY_LINK_TO_EXISTING_PERMISSION"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":42039,"consumed":7264},"cpu_usage":{"last_ordinal":1262304002,"value_ex":35882,"consumed":6101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055218268a92acd1b24eeaeff3b51b569de14ee151eea2132d748be984aa9535d1405000000000000000500000000000000010000000000ea3055050000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b724100000000000000000000aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055218268a92acd1b24eeaeff3b51b569de14ee151eea2132d748be984aa9535d1405000000000000000500000000000000010000000000ea3055050000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b724100000000000000000000aa30bc93a59737ce708fd4d691b61d7858bfb309c4cf883e77a6a161b5a4abe503000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99 {"feature_digest":"ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"9908b3f8413c8474ab2a6be149d3f4f6d0421d37886033f27d4759c47a26d944","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"REPLACE_DEFERRED"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":42780,"consumed":7392},"cpu_usage":{"last_ordinal":1262304002,"value_ex":47457,"consumed":8101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 3f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea305513ab6d113ba5b180d6f68e1b67bdea99847550d673a1785e40dfe4faee8ec7c706000000000000000600000000000000010000000000ea3055060000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99000000000000000000003f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 3f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea305513ab6d113ba5b180d6f68e1b67bdea99847550d673a1785e40dfe4faee8ec7c706000000000000000600000000000000010000000000ea3055060000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99000000000000000000003f12eecaafb41ec5142c6c6d69df767fb8f5183e1e5468aa418bef38a2bdf2bb03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f {"feature_digest":"4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"45967387ee92da70171efd9fefd1ca8061b5efe6f124d269cd2468b47f1575a0","dependencies":["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"NO_DUPLICATE_DEFERRED_ID"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":43521,"consumed":7520},"cpu_usage":{"last_ordinal":1262304002,"value_ex":59032,"consumed":10101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 39ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30552267bc3ee69f217c4f0bdbff84c23074f1780839b8adfb17537db55da4a0dc7607000000000000000700000000000000010000000000ea3055070000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000000000000000000039ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 39ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea30552267bc3ee69f217c4f0bdbff84c23074f1780839b8adfb17537db55da4a0dc7607000000000000000700000000000000010000000000ea3055070000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000000000000000000039ec55367e4e4d0d6063a5e5aa2aa15d4a1aa1fbe0abe42c9081713ee04e55b103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526 {"feature_digest":"e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"a98241c83511dc86c857221b9372b4aa7cea3aaebc567a48604e1d3db3557050","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"FIX_LINKAUTH_RESTRICTION"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":44262,"consumed":7648},"cpu_usage":{"last_ordinal":1262304002,"value_ex":70607,"consumed":12101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 72c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30550f86c0418ffb919c58d37997594e446d2d98fd38b1ff3849da2c5da410aa331a08000000000000000800000000000000010000000000ea3055080000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000000000000000000072c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 72c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea30550f86c0418ffb919c58d37997594e446d2d98fd38b1ff3849da2c5da410aa331a08000000000000000800000000000000010000000000ea3055080000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000000000000000000072c5e78f690d5d20ec8c8e12ace2a3b34929099b93f621a8671ae43df821bc5b03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428 {"feature_digest":"68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"2853617cec3eabd41881eb48882e6fc5e81a0db917d375057864b3befbe29acd","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISALLOW_EMPTY_PRODUCER_SCHEDULE"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":45003,"consumed":7776},"cpu_usage":{"last_ordinal":1262304002,"value_ex":82182,"consumed":14101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055659dd999c0cb81c2eea85d3eda39898997e4a9bd57bcebcac06cc25db35e000b09000000000000000900000000000000010000000000ea3055090000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a29742800000000000000000000e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055659dd999c0cb81c2eea85d3eda39898997e4a9bd57bcebcac06cc25db35e000b09000000000000000900000000000000010000000000ea3055090000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a29742800000000000000000000e358ede0d30a5ac5fa03a484a5142b0a38f658e0fb57644adb5b60c94206f9e003000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43 {"feature_digest":"ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e71b6712188391994c78d8c722c1d42c477cf091e5601b5cf1befd05721a57f3","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"RESTRICT_ACTION_TO_SELF"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":45744,"consumed":7904},"cpu_usage":{"last_ordinal":1262304002,"value_ex":93757,"consumed":16101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 60b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055d209fd21b66b7e1f62b25302fd208120700fb20e0a9a0151d3909e1ca7a98f460a000000000000000a00000000000000010000000000ea30550a0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000000000000000000060b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 60b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055d209fd21b66b7e1f62b25302fd208120700fb20e0a9a0151d3909e1ca7a98f460a000000000000000a00000000000000010000000000ea30550a0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000000000000000000060b8a605178774eed85eb65b3ae743e5f3dc9b11d4672e1d00be33a0d21c8dae03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405 {"feature_digest":"8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"2f1f13e291c79da5a2bbad259ed7c1f2d34f697ea460b14b565ac33b063b73e2","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ONLY_BILL_FIRST_AUTHORIZER"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":46485,"consumed":8032},"cpu_usage":{"last_ordinal":1262304002,"value_ex":105332,"consumed":18101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055fd71f42952743b790fcaa82dabd6a843676b9bd5b91c891fc050f9c41374a35e0b000000000000000b00000000000000010000000000ea30550b0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a40500000000000000000000689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055fd71f42952743b790fcaa82dabd6a843676b9bd5b91c891fc050f9c41374a35e0b000000000000000b00000000000000010000000000ea30550b0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a40500000000000000000000689db7ff0751fd6025dbc997d9a7ca1fe4e525ee48e55e5fb2aee8403077dd3e03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25 {"feature_digest":"2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"898082c59f921d0042e581f00a59d5ceb8be6f1d9c7a45b6f07c0e26eaee0222","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"FORWARD_SETCODE"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":47226,"consumed":8160},"cpu_usage":{"last_ordinal":1262304002,"value_ex":116907,"consumed":20101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 48ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea305512250767854476ab3904c7f604b0322bfa91821d01ddb20ecfaaff1beef8e04b0c000000000000000c00000000000000010000000000ea30550c0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000000000000000000048ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 48ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea305512250767854476ab3904c7f604b0322bfa91821d01ddb20ecfaaff1beef8e04b0c000000000000000c00000000000000010000000000ea30550c0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000000000000000000048ed94d5a6fa7dd478278b29bbff0a72bd9d9a5431423ed3f0b1ce393643108303000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d {"feature_digest":"f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_SENDER"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":47967,"consumed":8288},"cpu_usage":{"last_ordinal":1262304002,"value_ex":128482,"consumed":22101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055063f8bf038af0888c33fcfdd66c2f91fd6b060df73aaa32a1e905b143ceb9ac00d000000000000000d00000000000000010000000000ea30550d0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d00000000000000000000aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055063f8bf038af0888c33fcfdd66c2f91fd6b060df73aaa32a1e905b143ceb9ac00d000000000000000d00000000000000010000000000ea30550d0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d00000000000000000000aa192243a78a9d8954a3af3f044207536068d3ad3f7ffb3b7de53b959de190b003000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67 {"feature_digest":"4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"1812fdb5096fd854a4958eb9d53b43219d114de0e858ce00255bd46569ad2c68","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"RAM_RESTRICTIONS"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":48708,"consumed":8416},"cpu_usage":{"last_ordinal":1262304002,"value_ex":140057,"consumed":24101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055f279231a0740adb280f58749e984c932e17897073e9aedc1c33a102df52498430e000000000000000e00000000000000010000000000ea30550e0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d6700000000000000000000a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055f279231a0740adb280f58749e984c932e17897073e9aedc1c33a102df52498430e000000000000000e00000000000000010000000000ea30550e0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d6700000000000000000000a9e581a81302c707c14f5985458d2ef53faf24afacb03115f5cbc17271d7504803000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2 {"feature_digest":"4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"927fdf78c51e77a899f2db938249fb1f8bb38f4e43d9c1f75b190492080cbc34","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"WEBAUTHN_KEY"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":49449,"consumed":8544},"cpu_usage":{"last_ordinal":1262304002,"value_ex":151632,"consumed":26101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 4185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea305578e423734b3bacaadd9c1864e7a7c612255a9c0d9fcdeba49708ee6b147e13170f000000000000000f00000000000000010000000000ea30550f0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2000000000000000000004185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 4185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea305578e423734b3bacaadd9c1864e7a7c612255a9c0d9fcdeba49708ee6b147e13170f000000000000000f00000000000000010000000000ea30550f0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2000000000000000000004185b6265a360d2bf774af7d82bd837333cfb6b976390dac78c284207b6bbce103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707 {"feature_digest":"299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"ab76031cad7a457f4fd5f5fca97a3f03b8a635278e0416f77dcc91eb99a48e10","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"WTMSIG_BLOCK_SIGNATURES"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":50190,"consumed":8672},"cpu_usage":{"last_ordinal":1262304002,"value_ex":163207,"consumed":28101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055368a5df8e81472fb54f3424401fba4956a6e0737806b4f642b2d7014cf66fc2c10000000000000001000000000000000010000000000ea3055100000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670700000000000000000000f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055368a5df8e81472fb54f3424401fba4956a6e0737806b4f642b2d7014cf66fc2c10000000000000001000000000000000010000000000ea3055100000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670700000000000000000000f6025d888ddcfb8fdfeee18204122f8b7a71908a96ac4e52bf9542ff398b0d4403000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071 {"feature_digest":"c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"69b064c5178e2738e144ed6caa9349a3995370d78db29e494b3126ebd9111966","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ACTION_RETURN_VALUE"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":50931,"consumed":8800},"cpu_usage":{"last_ordinal":1262304002,"value_ex":174782,"consumed":30101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30552acd5ab1218225e0cc0a013d8e86b58cfc4d998058708fb1eb0116c1124f7c7f11000000000000001100000000000000010000000000ea3055110000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead4507100000000000000000000116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea30552acd5ab1218225e0cc0a013d8e86b58cfc4d998058708fb1eb0116c1124f7c7f11000000000000001100000000000000010000000000ea3055110000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead4507100000000000000000000116b232e8995b25d7bab8c5134bc993bcd84e72bc35d0b27fe723d7d25e98ac703000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4 {"feature_digest":"5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"70787548dcea1a2c52c913a37f74ce99e6caae79110d7ca7b859936a0075b314","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLOCKCHAIN_PARAMETERS"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":51672,"consumed":8928},"cpu_usage":{"last_ordinal":1262304002,"value_ex":186357,"consumed":32101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 11a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055db17f5e8a451e3814885ec6d61c420ac422f1e0de77043c9024e592b64f8bd1412000000000000001200000000000000010000000000ea3055120000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000000000000000000011a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 11a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055db17f5e8a451e3814885ec6d61c420ac422f1e0de77043c9024e592b64f8bd1412000000000000001200000000000000010000000000ea3055120000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000000000000000000011a09bc0cc023daf656af6dadf37577a9d4c0cea8020c1d007a2c3d6dc1e52c103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99 {"feature_digest":"bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"d2596697fed14a0840013647b99045022ae6a885089f35a7e78da7a43ad76ed4","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_CODE_HASH"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":52413,"consumed":9056},"cpu_usage":{"last_ordinal":1262304002,"value_ex":197932,"consumed":34101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 76bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055693240e7063adb7478594592f8a6e6cb76e33cabc605272575b687e3a0fa5f5e13000000000000001300000000000000010000000000ea3055130000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000000000000000000076bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 76bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055693240e7063adb7478594592f8a6e6cb76e33cabc605272575b687e3a0fa5f5e13000000000000001300000000000000010000000000ea3055130000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000000000000000000076bcbbd871a26403befd2ebf5491d6b84ded9f29cb95bfd54ca6ec46b1dfad5903000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40 {"feature_digest":"d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"8139e99247b87f18ef7eae99f07f00ea3adf39ed53f4d2da3f44e6aa0bfd7c62","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CONFIGURABLE_WASM_LIMITS2"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":53154,"consumed":9184},"cpu_usage":{"last_ordinal":1262304002,"value_ex":209507,"consumed":36101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 1948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055a40aa97866a6e0814065142f7d1038aaccb2e8a73661f6554c415c331ab8ec8b14000000000000001400000000000000010000000000ea3055140000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40000000000000000000001948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 1948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055a40aa97866a6e0814065142f7d1038aaccb2e8a73661f6554c415c331ab8ec8b14000000000000001400000000000000010000000000ea3055140000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40000000000000000000001948411767455fe23b05b44fe5fb737422ce3831a41f2c68064990fd6f52fdaf03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc {"feature_digest":"6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"68d6405cb8df3de95bd834ebb408196578500a9f818ff62ccc68f60b932f7d82","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CRYPTO_PRIMITIVES"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":53895,"consumed":9312},"cpu_usage":{"last_ordinal":1262304002,"value_ex":221082,"consumed":38101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 3cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30555705a61c2ae1877963ee8e857abb78d2975071d25ce32f1235b4d4803967a9fa15000000000000001500000000000000010000000000ea3055150000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc000000000000000000003cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 3cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea30555705a61c2ae1877963ee8e857abb78d2975071d25ce32f1235b4d4803967a9fa15000000000000001500000000000000010000000000ea3055150000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc000000000000000000003cea935e0deaa090b14d4ee01f3fee31a1c426779f1c32840aefaa99cb83ec5f03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b {"feature_digest":"35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e5d7992006e628a38c5e6c28dd55ff5e57ea682079bf41fef9b3cced0f46b491","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_BLOCK_NUM"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":54636,"consumed":9440},"cpu_usage":{"last_ordinal":1262304002,"value_ex":232657,"consumed":40101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 04ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055302a2f1713925c939a997367c967b457bfc2c580304f9686b1de22fc5946e40616000000000000001600000000000000010000000000ea3055160000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000000000000000000004ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 04ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055302a2f1713925c939a997367c967b457bfc2c580304f9686b1de22fc5946e40616000000000000001600000000000000010000000000ea3055160000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000000000000000000004ba316cf9ddd86690833edc0f4548f8c07f0d66c09dca029b0a1fb96f16c62803000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 -DMLOG FEATURE_OP PRE_ACTIVATE 0 98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88 {"feature_digest":"98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"01969c44de35999b924095ae7f50081a7f274409fdbccb9fc54fa7836c76089c","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES"}]} +DMLOG FEATURE_OP PRE_ACTIVATE 0 63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a {"feature_digest":"63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES2"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":55377,"consumed":9568},"cpu_usage":{"last_ordinal":1262304002,"value_ex":244232,"consumed":42101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 793b276fb55f2f81cbdcfcaf882555ea5dde340f80c16e5dc652ffad52eea87c03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30553a97dc6254ea785e8c6ee5994044fae975bfc8ef1916a24b476a984724cc5cf017000000000000001700000000000000010000000000ea3055170000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322098c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e8800000000000000000000793b276fb55f2f81cbdcfcaf882555ea5dde340f80c16e5dc652ffad52eea87c03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 450cd1132e85279e093be4ae967a313b793f7fe0bf579e0f0852e003a04ad39d03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055ddd516213adb142966c5365d88fe333b8e244cb90fe77627ff51a2901becc46d17000000000000001700000000000000010000000000ea3055170000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322063320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a00000000000000000000450cd1132e85279e093be4ae967a313b793f7fe0bf579e0f0852e003a04ad39d03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4 {"feature_digest":"fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"440c3efaaab212c387ce967c574dc813851cf8332d041beb418dfaf55facd5a9","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_1"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":56118,"consumed":9696},"cpu_usage":{"last_ordinal":1262304002,"value_ex":255807,"consumed":44101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30559ce3cf675d2f9ecbf427930685680d9117ba72ed64d5d7474fb50c8768a921d218000000000000001800000000000000010000000000ea3055180000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb400000000000000000000163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea30559ce3cf675d2f9ecbf427930685680d9117ba72ed64d5d7474fb50c8768a921d218000000000000001800000000000000010000000000ea3055180000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb400000000000000000000163cea51d12265063bf77437db57c2e9c1ef93dcb7205808665ab4cfc9bc7be103000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16 {"feature_digest":"09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"a857eeb932774c511a40efb30346ec01bfb7796916b54c3c69fe7e5fb70d5cba","dependencies":["fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4"],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_2"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":56859,"consumed":9824},"cpu_usage":{"last_ordinal":1262304002,"value_ex":267382,"consumed":46101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 0ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea3055b76acc0a0bc58aae737e94451f7f38e72ff2e66e45b1838f558f7266783bf69719000000000000001900000000000000010000000000ea3055190000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000000000000000000ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 0ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea3055b76acc0a0bc58aae737e94451f7f38e72ff2e66e45b1838f558f7266783bf69719000000000000001900000000000000010000000000ea3055190000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16000000000000000000000ba60f7118b04f4981554d97fcd15865c4ad6633f4e78f216d034a9ef6394e7f03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG FEATURE_OP PRE_ACTIVATE 0 8cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7 {"feature_digest":"8cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"bc726a24928ea2d71ba294b70c5c9efc515c1542139bcf9e42f8bc174f2e72ff","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"INSTANT_FINALITY"}]} DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304002,"value_ex":57600,"consumed":9952},"cpu_usage":{"last_ordinal":1262304002,"value_ex":278957,"consumed":48101},"ram_usage":180802} -DMLOG APPLIED_TRANSACTION 3 4b44a1f39c39048a1fa53c7070cea6a57f0afbb982370bcaa03d4d735797778c03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10100d007000010000000000000000080000000000000000001010000010000000000ea30551b7179e66f67158e50d547f27fb19f7660419a39880b1e596665bf44d4ce7fe21a000000000000001a00000000000000010000000000ea30551a0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000000000000000000004b44a1f39c39048a1fa53c7070cea6a57f0afbb982370bcaa03d4d735797778c03000000023b3d4b01000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf10000000000000000 +DMLOG APPLIED_TRANSACTION 3 4b44a1f39c39048a1fa53c7070cea6a57f0afbb982370bcaa03d4d735797778c03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0100d007000010000000000000000080000000000000000001010000010000000000ea30551b7179e66f67158e50d547f27fb19f7660419a39880b1e596665bf44d4ce7fe21a000000000000001a00000000000000010000000000ea30551a0000000000000001010000000000ea30550000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000000000000000000004b44a1f39c39048a1fa53c7070cea6a57f0afbb982370bcaa03d4d735797778c03000000023b3d4b010000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb0000000000000000 DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":2,"value_ex":0,"consumed":0},"average_block_cpu_usage":{"last_ordinal":2,"value_ex":833334,"consumed":100},"pending_net_usage":9952,"pending_cpu_usage":48100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1049625,"virtual_cpu_limit":200200} DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":3,"value_ex":82933334,"consumed":9952},"average_block_cpu_usage":{"last_ordinal":3,"value_ex":401659723,"consumed":48101},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1050675,"virtual_cpu_limit":200400} -DMLOG ACCEPTED_BLOCK 3 03000000030000000200000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000012d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b0200000000000000010000000000ea305503000000010000000000ea305502000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf1023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8c771cad6c14e7b03f51048ccf8f52fa1b54ba7880c11722d0aa93f5b9c4bb66b95d4808edc7d96ceeb3a19d03945d89f369abb41036038cd59ea2f711ba52b48000000000000002006b85ad39d5019e1cd871ba7f9d4dbdec7256c7c2c0e027d595e1654c8a50c1765e994e897703222fa1971c76f2b578b4fb12f8e28f6b03e61bbecdba00d592f0000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef26198000000000001010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0001023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8c771cad6c14e7b03f51048ccf8f52fa1b54ba7880c11722d0aa93f5b9c4bb66b95d4808edc7d96ceeb3a19d03945d89f369abb41036038cd59ea2f711ba52b48000000000000002006b85ad39d5019e1cd871ba7f9d4dbdec7256c7c2c0e027d595e1654c8a50c1765e994e897703222fa1971c76f2b578b4fb12f8e28f6b03e61bbecdba00d592f1800d0070000fb05010100203b7de491b51d3d74624078bc2c5dc4420985f0350afb6923a5585b5621750c9f126d7cff0efeade2068c7b618fc754b2abb5bff8cdb9bd0ecb4432b72ae1ed380100a82f78daed5c7b8c5ce755ff1ef7357b67e3ebc6d94c3609f9e662d0b8a4659bb8eb2575dbbddbc476694b9cca2dfea3b0bbd99d647776bdbb9e1da70e0adead081045158a7894b6405524a4d21424545aa8cacb0d0815a94891fa20414284ff2a025511a245ad54737ee77cf7ceeccb71f09a87545b9e7be77b9cef7ce79cef3cbf71f44fe94f1bf5d03d9f1951f447e343fdf3d87be873f2879efef473830dea77fff59e7bbef7f440d3bfd197d9f57368d1bfa54767949ab11b9736d48cd9b8840f7a0b372ed11f35136cf0436fe80dfac0b80dbc2afa67f84d6306e6063201ad97a8ff9234d00880f033d54c84469e48cd68b03c8b3ea54dd0909531c1fc52d0b0ed95c70e2dae4f3fd29eed5de8b6a767e77a8b8fcdf6daf32a42d7cd6bdd76d9548e51317aeaedd5f5c5d5e9d9f5f576b7a72c9aa273ed73ebed9e4af025c3b4d595e9f9d9deecf4fae2cfb4558d9b09defcf4409f1a2aa7cead3d2e53ebddf6f90b8b40e6426f41a568ba89e04eaf75171f5b5c6e3f4ac8d519393476dbebab17ba73ede9e5c5738bbd75358c9e70f6e155c24ae17d44a6aeaeadaeb7e7f1327f61aedd5d5737a1d3a1f3e1e5d5b9a5b985d9c595e9b5d9eeecb9768ffae9756e8956e29db9475f6918efa23e77a1db6daff4a67b8be7daea00d316339982ed81b579743afff0f4238b2bf3d38be347558696da34d17361b9b778af3a88ef0707693c3db73adf56868958aed36dcfb5097257d61a2280580ef09890d1fac2ec3d6f1c57af61e4a877bdb74a6445ffcd681aa6a60b6bf3e02dda0ed993275414abb8369444511c0f0d594b9f517c8b1e31237624a07ff4371cd123d60e51efd0adb7da86ff63ab8f46725b10ea353d34145aad7434623774b17959a51baaf8d45f568fb8a6c3d9b5b5e5c7d5eb6a07b42a745a7bfdd83d47c727ee7bd39b87fe66539f0854767bbaa9b5dd3093f2d7a9078655417f5be683f4a5c81ecb752737e3f44d5a9f9cccad539d22ee1417cfe76a9c1a9c29b29e53ef1ad64e4faa62e3c4b0a9dbb45007e81ff5e90e663b4d2fe83d39aca9bdf8cdcb2a33ce1e489d4d8d4ac7b5def8415a6e29a755c64d9d66d262f59651832ba175dc6cd2f3ad0a40313352c533b4f3ffd03ada2854d3601718b7043ccf3b757258611fef0076d96d07d2ecce62649cc0127ae5968b8d4e1e38ddc96ecbb17da75c405b74f67c6e4ed034553cd1c92da19207457c3ed70f0c1b0c21ac685a71b19387d4d78c9c75da192c1c776901daf9131d02648088f62d173b2e62184ec68434c5f29bca465367881c84970c54f4d1c22c80549d0a2430a126fe9ede4b742b469a9637a28be0ed843e6191fd00d024d49de6bd366d0a5a6777d2dc74429b0dde36f5df9e6bec7a5859225a9339fce1c9dc60ae39a894d39e26292146a426345d7a93f272c2484b6b9e2e1154e1a0398c01a6a8778011febd839629d7b3d95d34d54c62415e4c31a2584ca6381a31acea26051d200bf4245168a23feb1ca6d5d2043cd2d9e1eda8f8f61f4e43950da9f42744a85e22fae9c3a08b2e5e0021137ecde82da8ded0adb2d78ef257a75be822622d65756a7949d1bae92fd774c0846b1104fa0872b354c43fcee7e5eb2cceaa08c0b2a62194695a9245a3dc961b6c411509c9112f456fcd80799088f838bb54d8415018cf5c23410b00c783082a10f50e84dded3abb44840118013088481f4a76fd881cda17441ad78fc81dfb8288bb7e440eef0b22adeb47e4ee7d4164ecfa1139ba2f884c5c3f22c7f70591cb6a174cf45e9898014c4c05e33982a10750d17ba2a2050223a0592d1118361ae9778cd51be612eb3957aa3975c4aadc4cb9a78eab14d660aa456f43fc36466f357e9ba03728426c01e32d8f870db33cdef01bc66b7ec378b62d9fc883fbd4017a0b8ae4b1fbd44dfc96d1db30bf35e8ad8e193c2eaec645d5b8b01a17f0fa0d5edf1c57b70aee99c7e5f60a97d10a97db2a5c1abc0b8cbbb9dae36baa3d1eacf69809ce8a9118e10581c42db234bd1d1264d57dea2e2107b5fd4035eece6adc1d6459c844b286602bf4adefd3fe7f92f6da533efd522076fd194daed5619535e0fa38f56e78155bff121a57aefcf1b77ee7d73ffde2d44f929380af57ae7cf6db5fc35720b9b9b9f9fca7fff04f3e72cf43c356be5efe95ef50ef43c3817cddfc230c7ef770e22c7c910f12ba05b9544fd1d3d923f6297dccb263414ecb8f8ed693d42f71e55b1f7e71ea3dbcc4339f7cf1c57ff8e047bef6f98d3ed0bfffbddfa0efef1e8e05ea3c3dc8c59e119833c76c4b409205c8de305a8f539ef639d94705e5437ffbf257805a244096e9419a6541802c1cb3ce03719decded17a94fab537bffde13e10c0fc28808402e4494c08c8c5f6fbdba4fd251e4ed2c9de385a0f531979861ee1b8392de34e1fb3137ed844273b365a0ffcb01e3da271b326c3d68ed9861fd6e8643f365ab77ed83be9118f9b5332ecd4313be98791a20538e3c73d013cc6cd451977f198cdfcb8ac931d1fad6b3fec7df4a88d9bb332ecec313be6878d75b2b78c52f891dd415f9ed190a6d7283eb3194e0bf99b27b324fdb2d131046c8ce4ab19389231e8eea0198a568f24ccc8823c7e4064cec5c507d8f58eb3db9a86d1a0a6039d62ed3cbbc37007e32c240f3f2848d65b2e98526010b5769ab010ae038f30f1b0e277b025f8f92fc012a09310635fd260540df077b6d2bce4647f5eea12572b34fae9bc53d4007b414c1f3719351cc2e45a47da98c714f14094031716fa8220d5eabc4ea926751db1ae09479bbacec3d7e6082462fb1461abca25c5157dde4507b51a2086c978c36344650a3d2378e671fa73468757a36d79743d753d30ed296b52d09ec5612f0283b22d4fd91dd44c795b25e102f218997a4c0750d45614c9842289d0ac0145dae9d3e6886dbd0245a283666f5a0cf7652e3b927edb50e84a24f9b8b911f2f6450ad6157d667654f6725c1e13781095c6095c40a756866653a3bc550e555cd032934211daf1045303a7069d09efb9ea4c8ed96760595ee05e97205a1662d29e4bb22a1c7fa6ae9359cfe89cb9c55d2f6881ee71268c99452f700b562d5b1a1523aec20199181db4bb70e1e346d870f3e0d1c79cac96feaa3511197562c7a6be91227a4a1e93f2382d8fb3c29aa3f218ab38045e819050a478bb8c2816e738036dbe496c7b2b734d58365171658c8f34c2d75d5846ebcdc8eced1c6b0d722c138e3564d24cae847bf4581304060ec559728fe871baa9f138454a891e93cda1abf069c8c125c2790976e1d4a6de7960ee4ebf6775c207e6867108142639236748b4227fcf8884fefb560ebe02cf66fa3cdbd4b229614a764ab856bb1ad78840bb706d53ced910b85613ae65c0d8d5ae81718cc54bb2c31a2ca4eaaf98418892b289d978cc2ec8db647f6dac54cd430309821d9c450e083949b2b45f31bbb673bbb9f7b9f5d2f05e4e35e586844ea48239adfc6095dd46019b2246227596a5a3900f24d5c897ec33dbed18927e2e14b3ff4db5b71e8e2b5d9c94ba38f1eb267d5d9c6c93aaa4b4fd7071f6949a44a4060a93c5252b46af76aa9f17f9a8ed38d5a72be161d1b986537d7a40386604cfb395626a99fbd91010518ab173cd9a77ad2db8572bbef6ec575ffbe030ab7ea44c3397c7d43ab6ec7d8b182e223fcef421e535c0d2a77032e9f85b56ebe8815339b682d93966a4d726348cef82e03b431009d0e9a53c06b221840833428f28fca9af13a231231a6e4174461ef38209a000d1b08f682888f2bc15993a2f324be42e6596e6cd88d6f1d0e22c4fa5fdf440fb99b23d19907119c6f957efacdd4fed792a6a1ab27f2015ce672d957a25426f3763619dfd083b3a2f3e074727ad952a33fd4598347de34ddae92d7af1ecdede06fb1ba52dfb22f46243ccbad8b2c957f040763767c99ee6ec2a0ec8cc80ffb1b6c5b5d8d59c5d456f95562cbc8a15bb8c8481bec479f2cb8a83576477103b2134297833766a03e859f16345c3e5014e2ce144f8fbe347e87338f7d17ff9cc37de40bccf5038390595c4d11069b50772d522cd826f2758303e7b993d600b7e247ed49492c8ee0436d4cac3615d2f87d4113d31a3127ecb3a651878d20f7e6058a7a20b8abb3b790492d3493b816202e9da850e1020c1715cd2e19ac0034c1412e8900b3329c7b818a4a038c326b5442e947a482ee11feb6eff967ecc4af4b0a93df57212ab2306e25629e6b054cca1e742d857cce136e90dbd62862e15511a70ca4eeda2a343d6d1c66ba3ad815acb1c45be8e75370825dac2727c717440afb364676ff3ca3de21e7a1b14e6ad2e40eca2bd1db718648f2a151f5d9be326fa1af179c04a964f23407ad373ff00fdbc66e20a9868a6e24b34d070054ab45329e15f30da6e38613b54129f42944b2cca25c1d2568a599fe40cc08a40086639cbca8bf9c04cb15c21c6dd3f90287bec23b44687a34186a6010df5a3dc6e83a6fb395d55ca871ec8e932b4f4dff50d2261b00709d51e2095b84c7b8084d0ecdfa6bf6e593346bcf1a069a6147c3bae9271dabb19d2f18e2ca7f470d0d4db7989efc2d471029d4b6e48579071e69a73cee2097b75459d7711f21379d4fbfd27096e54c49d664487980c1249ee79d2435ea9f20e12d9526d891c083a7af613b97950aaaa2e5ecadeeb7bcb8de5c949d699d0facebc0b03a983cc81613726c1eee85b728274a564f0835229d2eeb4f5cbd2495adaa14e7857b52a5bc14dd007466aba21a8e469a2b7d124d84a934068120dd224649a18a189014d42170dd0049ed95b0cb248f5bedcb868a9703bd0447291c8da1c40b3e93940be207c54a4a6b886bc7b117510e2401155977b7f1545d441506511065af8da8aa8bb2162b13bfbaa8ba8af0e9143fb8248e3fa11b9635f1071d78fc8e17d41a475fd88dcbd2f888c5d3f2247f7059189eb47e4f8be20b27b11752f4caeb188ba072aba84b05b11f5b7c52f0ff7d1fa243badcfa0a68d5cb2cdfa88ed89c5ba180a3b617822313ce4122f650f55db492aa32ac3c5b925e55d591f52c61c4103346f04d4499660a128307e701712259ca6a0686e2bb738620389fe53f74397cc27502417c677740825f24bab6b48755e104ec1521e88c7b8f1ce61d6e6e46052e81dba402e3489b3cf8fa03f5130266727d7127d87f065450042870b65e4efa896783641cea40b386e534211cd496d89d4789ce65d6a7642602ea55261d877e1a00417a5b0469efa6b46c81821b6fe0b6b62899edd12a79ce47a13416de4108f3b1855443db8d34456556e6d69dc1c433585c2a0f0a4bfcf147074c48d4027e4ea1c9132aceea269dcb2cb0ee54c30d0ed0301b22bf0edfa910ba49183f2e21b12d20588700a0d3bcc63b343a374ba98ce0a914bc8ac629a6cad8684a5810d61c3622925253cf062a7b86bcbd8d82585e3b1a0d551445308dce98108b526112af5d4ab6b75779010321fe9dd61c70f725aa32665158d143697eb10a2b01cc41c82e32d92405471e94a3e90612401c97eca45083c25b8268fb4d1d41e0ce8076632174bd2a67fa5ad2106a2649c079c11d2888b9504c57fc69b03ba4896dcfc1037be2c3b66998e24f0e18f983d667203d9e6e771760b4d8c789c4cfcd873c20fe2dfe94e19df97c5a6b314ac09050981a3ac1d5bd9ad0c0195f7337251b13375c94553fa09faf8d9f7de4e6c232e51b0fa5d4d7e93d4cd82c39c1c3a46b84cf2da25da4ffb1217d21d874a0a071c1712754422ac5c05e864ef1b958188092d5f02909091a01ecd43cf46f60724b28fd9aa7b26c6583e41264cea100a706249b344b44b6622b49296b48eeb94c50a30904f218e9b5c4f844a75c8b130982d4c948a59fa211b0a0b858d14ae8b0ae228c9ee0c4228a4b96bb72004210dc270e5d930600b1c3026c54f683635ab00d6fa688af860cb443a244c1583c0389a4a7e01d9bc3728f5641e4c4d3cf524498b2e363ad80cf5b1f9206340d0ab2081149a08de95e7fc098c40c9b084430c670cf840c2c30f80c1001c72a3194cc61aa744850e3d04b1b03d3ab8d9413ec822bd068f000b0550d7b21ea77848e6d0820405be34e44ba3c3bb979b21d294f9a6ac6c324898105f3eef85321bd08c03a944affa37399518f854a264b612a46b78e9665837e93605c7df919d97b17e9c682fbe3dbc5d7dd9d216f910179773b795c36d3596d57b7a3f85d95244a87095c41ae3ab3cbe7a2fd4522e197c1fc80d02f26553a9bb6d92b5975c9529ea3da1226175581e8e9d003afca4be5a223c8d1dd6b1ca4d86d089879b7c07a5515d1e6079e220f730fc4f674e6e99ea7c4a6fcbec5b315b97b3f59eb3ab0923db26f00ea026b3fed1701dc9cabe6d5492748924e97c0ed7882d6435fae7b86830703b4af160f1a12cd9b407799af2ae171cad3c821f620a5c698a59f511d988b0c5f7a8016e3f291dc2ab0777d1456fbf1dd503b80a996be23700e23d231d6c71ef05b7b3011d3bf7fefb062960728e82342d8b6b900cc5e50dbec311c38292e1586a4afa350f91f328e15902d5b4151ce636bcf6509cd8a85526bf902f5e62d5e00b4f7cc58ebdddca313462bd02c9e921b5ca387a6374204d9fd7261057f07f5de10d68ba6d6a8ec28b4a668ed804fecbeb540c5394c5d81d5f712a95e0a70ced28d8eedc5edb8e1a7e478d6bd851c38f7ba51d855e77e73bb7c585403f322b4766db062503831a25811a7bd801efdd8148311e194556f468346b4cab1ae221176535ef4aa65ff6d6eed590ea1a69b4cfc4317b11a74ca76571b9a9bfb6b2295454fcae08e7607b2565b3aaa404a2baab4a4a807d04be9262717acec8035703032e989c159d754a640147f079ae90f81a37d0872a65dff3ac04ce72a710f181af81841c78579d196a20b6ac8184acb2b8936f32c9302e78707dade56f56a20632263d6b825352ba0e16c569cb65eec0578e41c4c1dab154bf387e0dfaa5635b2e17c0a3adc0700c2faa861597e8700e1ffad5e320f5fa3b9b280b2c81e86e0616488598c1f5dbefe7769ac8451714c7a02d898f57d1edb4a36dea1dc96dafe17d65bcf82a3dd99b868e47bf293ef9d5676f19d0f2b401d6f296b53c59956552f441a5e80df39698a53c4dfd83ec68f9e6aab746f596f937291396399eb1dd6d848574f66d44c0587438c5cd2ca9ec036cf37f0b0de3ebb0c8d80d9a1672b079a95dac8b45a2e2f439ee36e2e48b8db192b550550564771bc377292cdb98a735bb4ffca3a5fdf47ccec8e3b4f77ce450ca314cf8d69fe8047a3f22878e20fcdaff19f79e7434a3c746ebefac0dca7bf7dfbc36328542a6edb820b046600432719855c908c5604614532916a51dc32363fdba353d22d40c25b264e141fc88e82de6f851fa0349af1889da620490914b38808c3880440e860248c3c16513f65ae35786fd00d2ec08206309203d9c12f92a808ca6b80254c19100d29401a447c5226ea72f6500697d00197b3be92355e5d713a3238999b16dc1a2646ac606e245d6be134c3ebc8d41b32bcfd0ec6ed1e3c48a97becfd8ffff8cf51750b65c46aa38fcb211ed36e06ddc30edc657387689ea5ae68c04575f54db8239f95583c21d259e3d51a9c80984574c3ab62bd2debfb351fa2b49df5f09d88a559dc9167f25e0247f69659ca9fc9586f82b6ec05f69f5fd9506dfb13c25f8bc593c83898168ef7819edb16790fea93656c29531b92dc3e9b631e7adb35c01e3727499d6e15008d849b3385d64ef9638319907d92dcef6af04245d64f6d8be210d990cdc472248b8432a9797f8f46523e3e668992de55ca7de35d729a1aa53e9b3b8ea53ba3241e5b634cec1ad82dbf229f257908c2c9ec50b0e635956966141f1157268c47b09e0bdc470e7254625ff212e1ae2bd9832f41c702bb4fca25bfb4b4174e61acb79826461243f15364c32fc34462ea121730a88b0635c868d7c0e5c2e0918c13f3ec1ee2049d102d7fe49ea16fc85002be94fc0ae8acafc3b702f455adcf7b5f2e46906e10294915cc077a9785d5d9574627f8904bb8a21f13edb8a7ed9063b20a15ccd22152117b762a0148b24c4e5c5ad7e469696ab344d799b2b4dffd1a6fc93fef49d8fcc2e2eb7e75d6fd5cd2e2fafcecdf6da6e6df6d1f6ba5a7db8d39eebd197f575e95fecb5bbb3bdd5ee34ded7ddca6acf2daeb87317967b8bd38b2bf3ed8b8a7f0c99def9fe2e0d55ed6e77b5ebf07f5b2cae3c5a4d567cacd310ed8a33e0e9bd73b32b0036476db4baacbb0ed8bdd98797a9e111374bfd0bedae9b5b5de97567e77a8aeb00e9eb77e0786e757ef191c7f744efe581e5fcd06b5cee63cfa9f44df21f4350bb47786176e551225777f1dc6cf771b7d47edcbd7fa1bde22163d7b32b1ebe62cd9ae66bddd5deeadceab2f3ff71488969ffff18e132651a3cdac61cb22ce9dd1756da17d70806ed50684aa83eb278b13d3ffdf0e3bdf63ab05cef752fcc097569ee1f349552ff05ee7357f400d00700008101010100204b21f3cba072cc493e70861540df4677b498b0505a8b8e2a346b85a0c2dd2fc4263c4a7d8629026c4eb594ad96fac2bfe5f8ffebb9c841c353920b7b8ec11abc0100d90778da8d563b8f1c4510eedbf7e37cf209d9e60808402496c0dcdaac4e8ece01090112afe83043ef74ed4e6b677a86ee9edd5b3b2121b049888d842c84c0c1456702eb20b036424242c2e00408800c24fe03d53db3f33a58e860b6bbeaebeaeaaaafaab7f55bff9d1a796df0e5798263c37cc89f2fbe657e1eb8c7cb92e0de5f83c1eded95e4fded2d08150faf5ea5237e69f7855db2d3c199e351e5915a339c0b900d4103681849dff5c09daa3818bc34ec5057f319d54036b6c640752cc1617c024a17515d1a6b2f945c2f48a3ab3d09ca0b7dd68ab9d097078d292cd4267e9c39f089a70faea351378c85563b11c8802bf44c383eccc0cf20cd39e55a9d31df4c766ee487eed4f528174e4425baab412ab2fd44400f1dab73046827567402f6ece195a73495139455b44ee4ead4bb1db3594b2a94b929fa51367179f0f4882adc00722dea6c6edb0798d3452a7fd60d858643ed8c2598c8297bf18227220efe2f948148a1851bbb515c72a47ce34cbbeec655133b0106781de0c9aa059f8f41f3200b19833148090c41870e1c465c528b9b73c1c2798a3a57b5c2c0cfe276de28b9f0b90027552b7e6375c085d35a0691f6ac7a7768c39351b2a4eabb54b8e0dba3486d2b597131b1f0b3553ab68cff9c15a9dec3adc83b0327b5764a645b3bbd7c77b2ce294f6a755cf4a278e473d7c1692b91a74e75d083a9b5d828596cb8218364a6175132eb4b782fe61202581d2b906ec926dcee4a2cd2302de6ec9354785ea52d5bd5900bda21ea652849adab4030243b676debdc60af83126d32d91c2d34a85341c20682e6d233ab41b8f02f154e6a05e4e9b897c2b319c990c52e3a859123b533d932bbdf76c276c527c2e4b21ceb4d8cd8aa8bb1b56dac6d90260d1b8db10c036bbaa54063abace4ba8ea2241c3da3f77980ddaa92bd2e7628c7629ab617f54c2527174b05a6ae8a8236da3229af186acd0293fea689c65e7716ccb0eb61a892b5e548eeca2475a55ec7d3d32658c78357533c329d62a2b5eda28a6cb492c93f3758e35524f9ac128236578e11276e742c286468aca330a42cf661ab98b783ebbd58643cafff27cf7b71c4685a678db575669c5f1543c3e0735af70bef07a975ec4a819b769132cbcc6379f1637c36f3278f7c7debe2cb1f7c7eadd434c8feb73fdd3bfaf4956223c0f1fcb4fec587792193fd4fee3cc31edc2956278e5f1fdd7cfc59566c1fbd39fc19d8d14999a138ee42707492b171f5c0afa848c877af9e78c7cb22f570ec3f77fb789951c882be4940930cf4f0d1db6fdc5f16528fe3ddaf0eee2fb324e3d8fb1e057942cd851ffef1fb8fc5fcd920f8af3f2e66c9fcffb84b7ff865b7ce875708c9ff60d8f137aa5a1fa900d00700001001010020742877c36a520b152b1337ea1ecd37b0c98ad07289c32fec392e7eebab9f0ac71f7bc8c718cfa75317b2e15702372a9222c4616783ee7b3f0ec6358f8c328eea00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72410000d00700001001010020058e23368b919493d6ac61d27f66b829a53893e88ddde857d3b82d913960960d22fa36f397752b98c295e3b31927f740127c0a99e76f8bfeea88f44466b8fbfd00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea990000d0070000100101001f43fe868e263d8134cf705aa85e26ce78ebb058edd558865fa3d240f5cb9e50c2389e9c8276eac800b7233a552045b2e79124c97e5156a0649849cc7f5d09eee600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000d0070000100101001f29e82b08ccf15e2187f29fea11ee3f4974f41b51e45b19f353348d8848b86fb71cadd88630456b7a1c60803c7b402487d41fbf18f0b0a13b4cca1f740447938300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000d0070000100101002047a8b784c3765b5c63ac52e3d8461b80bc2d3e3f62434f8accb277d9f2487cfd3c0728fcd26b5119a11288e5db46bc5b547877e220971609d1cef8cba443340800005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974280000d007000010010100203e701fbafd4149bc95b55a6bfc3b78246f5c2668ccc05ed4059a36ceb38f140b31e3b69e15f2579571e5bde39e034947271599c200e540b3949112bef163074c00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000d0070000100101001f0cc7352e60f4f8476783d6d1b48766a111c56fee2c1a552e76a75c92bc17de172f994ffc854c09717c904054819ca7a17379ddecaf531c439b35337ba099b81300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4050000d0070000100101002040965063a83be2d53b36c8d7e0775f503c2caa1407e586314562aace52c272fe60659e196413a6c9db4168470bcabb9a5851121c10c7b665f363f6cd4d1e4bda00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000d0070000100101002074ea7468b2a031c4cd53bf10ec3ac66b0c4b5c8779e045f1ef8d9c7b116be649217ff340107d0163397b99918ee2ce822b66cd6fce7b385af97a04671136e2ee00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d0000d007000010010100204dfb21ca5140582379bc026792c16b4cf97827143a4a9cd99ae70b3e6016cd6316bcbb9f1cb1233f12a0bbcd9debafa64724d0459b5c8d3cb67ceddfb2e3962500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d670000d0070000100101002033446a3a94ade71dff3edb786259679487ab701bbc147490b1d4159fecf545fa22fee0698db16bf616465e5cebb985bfc4d9ed1ec4a55e38997dd4b4bbc427eb00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c20000d0070000100101001f3f67edd35bf731a07f40c638e8812112cd7d1baa39ec7dac4a1b2f0c83ac8bd53689b56dba69a7386e3860a6f8976695ac0bc2b5dacae91080f1d54df2dac0c000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b44767070000d0070000100101001f1e030564013603d54f9e983b63cd940f8ff09ae038b14813f4021bb0c09ebb640d90cb4f8d57be2809f492a51737b671a5f549d4efa8e7efdaeaa9663c09d1ad00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450710000d007000010010100205cea642eecf05568ce8c5564e63349eea3b816108914ba2ab5efffbb8ea467265f0b6d474f03ed02a3bf529fd6e55a595cbf8dd1adf4311cb9c51e862f8a535400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000d0070000100101001f4556076cc86e0840bf69664f1ef8fcd4d91abda313d08e7840d24ba45cb429cf12b7d3a1f64250c19d1b975e7b107853beff70ebfc4c27c44f825dc05cdc9cd600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000d0070000100101001f354d903ad0f2c6cc9d9a377d681ffaa00475d1e559e48074b4c8cce3111d5c172903b2f179ad4d736dda4e7d1b6a859baeab9dde5e5e495ce09733ec4650634400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb400000d0070000100101001f1766fa716a828da244c9ce52919b7a19acb38dbd110d1bb0039bb2477c17e4465dceecb8330ed5ee9de1330930dfcfa1a5e8149ce8536a82c0093642adf7328200005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc0000d00700001001010020488923db1c78fa430a3a9eab75f4ee467c7b9a3d3b4eb3bd08e183c82ef79b9102a4d2a7d1ec79c96b404911ae1b10f579bd82a660011c1ca2b872b30ef7dcac00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000d0070000100101002031ca6aeda725c01ed6aa6199dd2767930803051d3bc2897956bc9f97f8db5abf3bf243b775b4020f0c96d8ad197d591d11f8a51760c19fdc81134eff06a1941f00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322098c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e880000d0070000100101001f184aad2b65730f7485957642fa1688c66e8ece7827ee2e8e01f8bc904cedd8ec5462c12a1e3c6cd41f4a15a350ec8575bb05e9597f4316ff73a4e1066aeab3d500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40000d0070000100101002041c996b52c4bdbbc4fbdaf707dd01e74c46c51ce2c8e10e174e12502cb6be3f23e2d44e8e8802e970bc5ccfc4d056e400c92a56667183c37e0f79fbe77540a0000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160000d0070000100101002064bee652fda3828128a5e42da08c65127b9e247662507ed6b46d8d18ecf73afd3313c096184a70a88fad68232faa6438a23eb399cfeeb9b18e044f94ffa6049f00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000001 +DMLOG ACCEPTED_BLOCK 3 03000000030000000200000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000012d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b0200000000000000010000000000ea305503000000010000000000ea305502000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100000000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82d8cdf5a48c796389dd8078c999af1b8542b7e1d56784775146ab9963566974d9426f419e11a481547c9e05fe24a17d138a7fcdcf5ff599a09e03630dec0c79900000000000000207b3e5f9a58ec8f603285898120bc8c58e80f603b37dddf6f00bf79d75d62f5024d1665fa7e7af18a5f639ba3d3bc6d6858c31658a0473ed2ce4c879daa5efe560000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef26198000000000001010ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd0001023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82d8cdf5a48c796389dd8078c999af1b8542b7e1d56784775146ab9963566974d9426f419e11a481547c9e05fe24a17d138a7fcdcf5ff599a09e03630dec0c79900000000000000207b3e5f9a58ec8f603285898120bc8c58e80f603b37dddf6f00bf79d75d62f5024d1665fa7e7af18a5f639ba3d3bc6d6858c31658a0473ed2ce4c879daa5efe561800d0070000fb05010100203b7de491b51d3d74624078bc2c5dc4420985f0350afb6923a5585b5621750c9f126d7cff0efeade2068c7b618fc754b2abb5bff8cdb9bd0ecb4432b72ae1ed380100a82f78daed5c7b8c5ce755ff1ef7357b67e3ebc6d94c3609f9e662d0b8a4659bb8eb2575dbbddbc476694b9cca2dfea3b0bbd99d647776bdbb9e1da70e0adead081045158a7894b6405524a4d21424545aa8cacb0d0815a94891fa20414284ff2a025511a245ad54737ee77cf7ceeccb71f09a87545b9e7be77b9cef7ce79cef3cbf71f44fe94f1bf5d03d9f1951f447e343fdf3d87be873f2879efef473830dea77fff59e7bbef7f440d3bfd197d9f57368d1bfa54767949ab11b9736d48cd9b8840f7a0b372ed11f35136cf0436fe80dfac0b80dbc2afa67f84d6306e6063201ad97a8ff9234d00880f033d54c84469e48cd68b03c8b3ea54dd0909531c1fc52d0b0ed95c70e2dae4f3fd29eed5de8b6a767e77a8b8fcdf6daf32a42d7cd6bdd76d9548e51317aeaedd5f5c5d5e9d9f5f576b7a72c9aa273ed73ebed9e4af025c3b4d595e9f9d9deecf4fae2cfb4558d9b09defcf4409f1a2aa7cead3d2e53ebddf6f90b8b40e6426f41a568ba89e04eaf75171f5b5c6e3f4ac8d519393476dbebab17ba73ede9e5c5738bbd75358c9e70f6e155c24ae17d44a6aeaeadaeb7e7f1327f61aedd5d5737a1d3a1f3e1e5d5b9a5b985d9c595e9b5d9eeecb9768ffae9756e8956e29db9475f6918efa23e77a1db6daff4a67b8be7daea00d316339982ed81b579743afff0f4238b2bf3d38be347558696da34d17361b9b778af3a88ef0707693c3db73adf56868958aed36dcfb5097257d61a2280580ef09890d1fac2ec3d6f1c57af61e4a877bdb74a6445ffcd681aa6a60b6bf3e02dda0ed993275414abb8369444511c0f0d594b9f517c8b1e31237624a07ff4371cd123d60e51efd0adb7da86ff63ab8f46725b10ea353d34145aad7434623774b17959a51baaf8d45f568fb8a6c3d9b5b5e5c7d5eb6a07b42a745a7bfdd83d47c727ee7bd39b87fe66539f0854767bbaa9b5dd3093f2d7a9078655417f5be683f4a5c81ecb752737e3f44d5a9f9cccad539d22ee1417cfe76a9c1a9c29b29e53ef1ad64e4faa62e3c4b0a9dbb45007e81ff5e90e663b4d2fe83d39aca9bdf8cdcb2a33ce1e489d4d8d4ac7b5def8415a6e29a755c64d9d66d262f59651832ba175dc6cd2f3ad0a40313352c533b4f3ffd03ada2854d3601718b7043ccf3b757258611fef0076d96d07d2ecce62649cc0127ae5968b8d4e1e38ddc96ecbb17da75c405b74f67c6e4ed034553cd1c92da19207457c3ed70f0c1b0c21ac685a71b19387d4d78c9c75da192c1c776901daf9131d02648088f62d173b2e62184ec68434c5f29bca465367881c84970c54f4d1c22c80549d0a2430a126fe9ede4b742b469a9637a28be0ed843e6191fd00d024d49de6bd366d0a5a6777d2dc74429b0dde36f5df9e6bec7a5859225a9339fce1c9dc60ae39a894d39e26292146a426345d7a93f272c2484b6b9e2e1154e1a0398c01a6a8778011febd839629d7b3d95d34d54c62415e4c31a2584ca6381a31acea26051d200bf4245168a23feb1ca6d5d2043cd2d9e1eda8f8f61f4e43950da9f42744a85e22fae9c3a08b2e5e0021137ecde82da8ded0adb2d78ef257a75be822622d65756a7949d1bae92fd774c0846b1104fa0872b354c43fcee7e5eb2cceaa08c0b2a62194695a9245a3dc961b6c411509c9112f456fcd80799088f838bb54d8415018cf5c23410b00c783082a10f50e84dded3abb44840118013088481f4a76fd881cda17441ad78fc81dfb8288bb7e440eef0b22adeb47e4ee7d4164ecfa1139ba2f884c5c3f22c7f70591cb6a174cf45e9898014c4c05e33982a10750d17ba2a2050223a0592d1118361ae9778cd51be612eb3957aa3975c4aadc4cb9a78eab14d660aa456f43fc36466f357e9ba03728426c01e32d8f870db33cdef01bc66b7ec378b62d9fc883fbd4017a0b8ae4b1fbd44dfc96d1db30bf35e8ad8e193c2eaec645d5b8b01a17f0fa0d5edf1c57b70aee99c7e5f60a97d10a97db2a5c1abc0b8cbbb9dae36baa3d1eacf69809ce8a9118e10581c42db234bd1d1264d57dea2e2107b5fd4035eece6adc1d6459c844b286602bf4adefd3fe7f92f6da533efd522076fd194daed5619535e0fa38f56e78155bff121a57aefcf1b77ee7d73ffde2d44f929380af57ae7cf6db5fc35720b9b9b9f9fca7fff04f3e72cf43c356be5efe95ef50ef43c3817cddfc230c7ef770e22c7c910f12ba05b9544fd1d3d923f6297dccb263414ecb8f8ed693d42f71e55b1f7e71ea3dbcc4339f7cf1c57ff8e047bef6f98d3ed0bfffbddfa0efef1e8e05ea3c3dc8c59e119833c76c4b409205c8de305a8f539ef639d94705e5437ffbf257805a244096e9419a6541802c1cb3ce03719decded17a94fab537bffde13e10c0fc28808402e4494c08c8c5f6fbdba4fd251e4ed2c9de385a0f531979861ee1b8392de34e1fb3137ed844273b365a0ffcb01e3da271b326c3d68ed9861fd6e8643f365ab77ed83be9118f9b5332ecd4313be98791a20538e3c73d013cc6cd451977f198cdfcb8ac931d1fad6b3fec7df4a88d9bb332ecec313be6878d75b2b78c52f891dd415f9ed190a6d7283eb3194e0bf99b27b324fdb2d131046c8ce4ab19389231e8eea0198a568f24ccc8823c7e4064cec5c507d8f58eb3db9a86d1a0a6039d62ed3cbbc37007e32c240f3f2848d65b2e98526010b5769ab010ae038f30f1b0e277b025f8f92fc012a09310635fd260540df077b6d2bce4647f5eea12572b34fae9bc53d4007b414c1f3719351cc2e45a47da98c714f14094031716fa8220d5eabc4ea926751db1ae09479bbacec3d7e6082462fb1461abca25c5157dde4507b51a2086c978c36344650a3d2378e671fa73468757a36d79743d753d30ed296b52d09ec5612f0283b22d4fd91dd44c795b25e102f218997a4c0750d45614c9842289d0ac0145dae9d3e6886dbd0245a283666f5a0cf7652e3b927edb50e84a24f9b8b911f2f6450ad6157d667654f6725c1e13781095c6095c40a756866653a3bc550e555cd032934211daf1045303a7069d09efb9ea4c8ed96760595ee05e97205a1662d29e4bb22a1c7fa6ae9359cfe89cb9c55d2f6881ee71268c99452f700b562d5b1a1523aec20199181db4bb70e1e346d870f3e0d1c79cac96feaa3511197562c7a6be91227a4a1e93f2382d8fb3c29aa3f218ab38045e819050a478bb8c2816e738036dbe496c7b2b734d58365171658c8f34c2d75d5846ebcdc8eced1c6b0d722c138e3564d24cae847bf4581304060ec559728fe871baa9f138454a891e93cda1abf069c8c125c2790976e1d4a6de7960ee4ebf6775c207e6867108142639236748b4227fcf8884fefb560ebe02cf66fa3cdbd4b229614a764ab856bb1ad78840bb706d53ced910b85613ae65c0d8d5ae81718cc54bb2c31a2ca4eaaf98418892b289d978cc2ec8db647f6dac54cd430309821d9c450e083949b2b45f31bbb673bbb9f7b9f5d2f05e4e35e586844ea48239adfc6095dd46019b2246227596a5a3900f24d5c897ec33dbed18927e2e14b3ff4db5b71e8e2b5d9c94ba38f1eb267d5d9c6c93aaa4b4fd7071f6949a44a4060a93c5252b46af76aa9f17f9a8ed38d5a72be161d1b986537d7a40386604cfb395626a99fbd91010518ab173cd9a77ad2db8572bbef6ec575ffbe030ab7ea44c3397c7d43ab6ec7d8b182e223fcef421e535c0d2a77032e9f85b56ebe8815339b682d93966a4d726348cef82e03b431009d0e9a53c06b221840833428f28fca9af13a231231a6e4174461ef38209a000d1b08f682888f2bc15993a2f324be42e6596e6cd88d6f1d0e22c4fa5fdf440fb99b23d19907119c6f957efacdd4fed792a6a1ab27f2015ce672d957a25426f3763619dfd083b3a2f3e074727ad952a33fd4598347de34ddae92d7af1ecdede06fb1ba52dfb22f46243ccbad8b2c957f040763767c99ee6ec2a0ec8cc80ffb1b6c5b5d8d59c5d456f95562cbc8a15bb8c8481bec479f2cb8a83576477103b2134297833766a03e859f16345c3e5014e2ce144f8fbe347e87338f7d17ff9cc37de40bccf5038390595c4d11069b50772d522cd826f2758303e7b993d600b7e247ed49492c8ee0436d4cac3615d2f87d4113d31a3127ecb3a651878d20f7e6058a7a20b8abb3b790492d3493b816202e9da850e1020c1715cd2e19ac0034c1412e8900b3329c7b818a4a038c326b5442e947a482ee11feb6eff967ecc4af4b0a93df57212ab2306e25629e6b054cca1e742d857cce136e90dbd62862e15511a70ca4eeda2a343d6d1c66ba3ad815acb1c45be8e75370825dac2727c717440afb364676ff3ca3de21e7a1b14e6ad2e40eca2bd1db718648f2a151f5d9be326fa1af179c04a964f23407ad373ff00fdbc66e20a9868a6e24b34d070054ab45329e15f30da6e38613b54129f42944b2cca25c1d2568a599fe40cc08a40086639cbca8bf9c04cb15c21c6dd3f90287bec23b44687a34186a6010df5a3dc6e83a6fb395d55ca871ec8e932b4f4dff50d2261b00709d51e2095b84c7b8084d0ecdfa6bf6e593346bcf1a069a6147c3bae9271dabb19d2f18e2ca7f470d0d4db7989efc2d471029d4b6e48579071e69a73cee2097b75459d7711f21379d4fbfd27096e54c49d664487980c1249ee79d2435ea9f20e12d9526d891c083a7af613b97950aaaa2e5ecadeeb7bcb8de5c949d699d0facebc0b03a983cc81613726c1eee85b728274a564f0835229d2eeb4f5cbd2495adaa14e7857b52a5bc14dd007466aba21a8e469a2b7d124d84a934068120dd224649a18a189014d42170dd0049ed95b0cb248f5bedcb868a9703bd0447291c8da1c40b3e93940be207c54a4a6b886bc7b117510e2401155977b7f1545d441506511065af8da8aa8bb2162b13bfbaa8ba8af0e9143fb8248e3fa11b9635f1071d78fc8e17d41a475fd88dcbd2f888c5d3f2247f7059189eb47e4f8be20b27b11752f4caeb188ba072aba84b05b11f5b7c52f0ff7d1fa243badcfa0a68d5cb2cdfa88ed89c5ba180a3b617822313ce4122f650f55db492aa32ac3c5b925e55d591f52c61c4103346f04d4499660a128307e701712259ca6a0686e2bb738620389fe53f74397cc27502417c677740825f24bab6b48755e104ec1521e88c7b8f1ce61d6e6e46052e81dba402e3489b3cf8fa03f5130266727d7127d87f065450042870b65e4efa896783641cea40b386e534211cd496d89d4789ce65d6a7642602ea55261d877e1a00417a5b0469efa6b46c81821b6fe0b6b62899edd12a79ce47a13416de4108f3b1855443db8d34456556e6d69dc1c433585c2a0f0a4bfcf147074c48d4027e4ea1c9132aceea269dcb2cb0ee54c30d0ed0301b22bf0edfa910ba49183f2e21b12d20588700a0d3bcc63b343a374ba98ce0a914bc8ac629a6cad8684a5810d61c3622925253cf062a7b86bcbd8d82585e3b1a0d551445308dce98108b526112af5d4ab6b75779010321fe9dd61c70f725aa32665158d143697eb10a2b01cc41c82e32d92405471e94a3e90612401c97eca45083c25b8268fb4d1d41e0ce8076632174bd2a67fa5ad2106a2649c079c11d2888b9504c57fc69b03ba4896dcfc1037be2c3b66998e24f0e18f983d667203d9e6e771760b4d8c789c4cfcd873c20fe2dfe94e19df97c5a6b314ac09050981a3ac1d5bd9ad0c0195f7337251b13375c94553fa09faf8d9f7de4e6c232e51b0fa5d4d7e93d4cd82c39c1c3a46b84cf2da25da4ffb1217d21d874a0a071c1712754422ac5c05e864ef1b958188092d5f02909091a01ecd43cf46f60724b28fd9aa7b26c6583e41264cea100a706249b344b44b6622b49296b48eeb94c50a30904f218e9b5c4f844a75c8b130982d4c948a59fa211b0a0b858d14ae8b0ae228c9ee0c4228a4b96bb72004210dc270e5d930600b1c3026c54f683635ab00d6fa688af860cb443a244c1583c0389a4a7e01d9bc3728f5641e4c4d3cf524498b2e363ad80cf5b1f9206340d0ab2081149a08de95e7fc098c40c9b084430c670cf840c2c30f80c1001c72a3194cc61aa744850e3d04b1b03d3ab8d9413ec822bd068f000b0550d7b21ea77848e6d0820405be34e44ba3c3bb979b21d294f9a6ac6c324898105f3eef85321bd08c03a944affa37399518f854a264b612a46b78e9665837e93605c7df919d97b17e9c682fbe3dbc5d7dd9d216f910179773b795c36d3596d57b7a3f85d95244a87095c41ae3ab3cbe7a2fd4522e197c1fc80d02f26553a9bb6d92b5975c9529ea3da1226175581e8e9d003afca4be5a223c8d1dd6b1ca4d86d089879b7c07a5515d1e6079e220f730fc4f674e6e99ea7c4a6fcbec5b315b97b3f59eb3ab0923db26f00ea026b3fed1701dc9cabe6d5492748924e97c0ed7882d6435fae7b86830703b4af160f1a12cd9b407799af2ae171cad3c821f620a5c698a59f511d988b0c5f7a8016e3f291dc2ab0777d1456fbf1dd503b80a996be23700e23d231d6c71ef05b7b3011d3bf7fefb062960728e82342d8b6b900cc5e50dbec311c38292e1586a4afa350f91f328e15902d5b4151ce636bcf6509cd8a85526bf902f5e62d5e00b4f7cc58ebdddca313462bd02c9e921b5ca387a6374204d9fd7261057f07f5de10d68ba6d6a8ec28b4a668ed804fecbeb540c5394c5d81d5f712a95e0a70ced28d8eedc5edb8e1a7e478d6bd851c38f7ba51d855e77e73bb7c585403f322b4766db062503831a25811a7bd801efdd8148311e194556f468346b4cab1ae221176535ef4aa65ff6d6eed590ea1a69b4cfc4317b11a74ca76571b9a9bfb6b2295454fcae08e7607b2565b3aaa404a2baab4a4a807d04be9262717acec8035703032e989c159d754a640147f079ae90f81a37d0872a65dff3ac04ce72a710f181af81841c78579d196a20b6ac8184acb2b8936f32c9302e78707dade56f56a20632263d6b825352ba0e16c569cb65eec0578e41c4c1dab154bf387e0dfaa5635b2e17c0a3adc0700c2faa861597e8700e1ffad5e320f5fa3b9b280b2c81e86e0616488598c1f5dbefe7769ac8451714c7a02d898f57d1edb4a36dea1dc96dafe17d65bcf82a3dd99b868e47bf293ef9d5676f19d0f2b401d6f296b53c59956552f441a5e80df39698a53c4dfd83ec68f9e6aab746f596f937291396399eb1dd6d848574f66d44c0587438c5cd2ca9ec036cf37f0b0de3ebb0c8d80d9a1672b079a95dac8b45a2e2f439ee36e2e48b8db192b550550564771bc377292cdb98a735bb4ffca3a5fdf47ccec8e3b4f77ce450ca314cf8d69fe8047a3f22878e20fcdaff19f79e7434a3c746ebefac0dca7bf7dfbc36328542a6edb820b046600432719855c908c5604614532916a51dc32363fdba353d22d40c25b264e141fc88e82de6f851fa0349af1889da620490914b38808c3880440e860248c3c16513f65ae35786fd00d2ec08206309203d9c12f92a808ca6b80254c19100d29401a447c5226ea72f6500697d00197b3be92355e5d713a3238999b16dc1a2646ac606e245d6be134c3ebc8d41b32bcfd0ec6ed1e3c48a97becfd8ffff8cf51750b65c46aa38fcb211ed36e06ddc30edc657387689ea5ae68c04575f54db8239f95583c21d259e3d51a9c80984574c3ab62bd2debfb351fa2b49df5f09d88a559dc9167f25e0247f69659ca9fc9586f82b6ec05f69f5fd9506dfb13c25f8bc593c83898168ef7819edb16790fea93656c29531b92dc3e9b631e7adb35c01e3727499d6e15008d849b3385d64ef9638319907d92dcef6af04245d64f6d8be210d990cdc472248b8432a9797f8f46523e3e668992de55ca7de35d729a1aa53e9b3b8ea53ba3241e5b634cec1ad82dbf229f257908c2c9ec50b0e635956966141f1157268c47b09e0bdc470e7254625ff212e1ae2bd9832f41c702bb4fca25bfb4b4174e61acb79826461243f15364c32fc34462ea121730a88b0635c868d7c0e5c2e0918c13f3ec1ee2049d102d7fe49ea16fc85002be94fc0ae8acafc3b702f455adcf7b5f2e46906e10294915cc077a9785d5d9574627f8904bb8a21f13edb8a7ed9063b20a15ccd22152117b762a0148b24c4e5c5ad7e469696ab344d799b2b4dffd1a6fc93fef49d8fcc2e2eb7e75d6fd5cd2e2fafcecdf6da6e6df6d1f6ba5a7db8d39eebd197f575e95fecb5bbb3bdd5ee34ded7ddca6acf2daeb87317967b8bd38b2bf3ed8b8a7f0c99def9fe2e0d55ed6e77b5ebf07f5b2cae3c5a4d567cacd310ed8a33e0e9bd73b32b0036476db4baacbb0ed8bdd98797a9e111374bfd0bedae9b5b5de97567e77a8aeb00e9eb77e0786e757ef191c7f744efe581e5fcd06b5cee63cfa9f44df21f4350bb47786176e551225777f1dc6cf771b7d47edcbd7fa1bde22163d7b32b1ebe62cd9ae66bddd5deeadceab2f3ff71488969ffff18e132651a3cdac61cb22ce9dd1756da17d70806ed50684aa83eb278b13d3ffdf0e3bdf63ab05cef752fcc097569ee1f349552ff05ee7357f400d00700008101010100204b21f3cba072cc493e70861540df4677b498b0505a8b8e2a346b85a0c2dd2fc4263c4a7d8629026c4eb594ad96fac2bfe5f8ffebb9c841c353920b7b8ec11abc0100d90778da8d563b8f1c4510eedbf7e37cf209d9e60808402496c0dcdaac4e8ece01090112afe83043ef74ed4e6b677a86ee9edd5b3b2121b049888d842c84c0c1456702eb20b036424242c2e00408800c24fe03d53db3f33a58e860b6bbeaebeaeaaaafaab7f55bff9d1a796df0e5798263c37cc89f2fbe657e1eb8c7cb92e0de5f83c1eded95e4fded2d08150faf5ea5237e69f7855db2d3c199e351e5915a339c0b900d4103681849dff5c09daa3818bc34ec5057f319d54036b6c640752cc1617c024a17515d1a6b2f945c2f48a3ab3d09ca0b7dd68ab9d097078d292cd4267e9c39f089a70faea351378c85563b11c8802bf44c383eccc0cf20cd39e55a9d31df4c766ee487eed4f528174e4425baab412ab2fd44400f1dab73046827567402f6ece195a73495139455b44ee4ead4bb1db3594b2a94b929fa51367179f0f4882adc00722dea6c6edb0798d3452a7fd60d858643ed8c2598c8297bf18227220efe2f948148a1851bbb515c72a47ce34cbbeec655133b0106781de0c9aa059f8f41f3200b19833148090c41870e1c465c528b9b73c1c2798a3a57b5c2c0cfe276de28b9f0b90027552b7e6375c085d35a0691f6ac7a7768c39351b2a4eabb54b8e0dba3486d2b597131b1f0b3553ab68cff9c15a9dec3adc83b0327b5764a645b3bbd7c77b2ce294f6a755cf4a278e473d7c1692b91a74e75d083a9b5d828596cb8218364a6175132eb4b782fe61202581d2b906ec926dcee4a2cd2302de6ec9354785ea52d5bd5900bda21ea652849adab4030243b676debdc60af83126d32d91c2d34a85341c20682e6d233ab41b8f02f154e6a05e4e9b897c2b319c990c52e3a859123b533d932bbdf76c276c527c2e4b21ceb4d8cd8aa8bb1b56dac6d90260d1b8db10c036bbaa54063abace4ba8ea2241c3da3f77980ddaa92bd2e7628c7629ab617f54c2527174b05a6ae8a8236da3229af186acd0293fea689c65e7716ccb0eb61a892b5e548eeca2475a55ec7d3d32658c78357533c329d62a2b5eda28a6cb492c93f3758e35524f9ac128236578e11276e742c286468aca330a42cf661ab98b783ebbd58643cafff27cf7b71c4685a678db575669c5f1543c3e0735af70bef07a975ec4a819b769132cbcc6379f1637c36f3278f7c7debe2cb1f7c7eadd434c8feb73fdd3bfaf4956223c0f1fcb4fec587792193fd4fee3cc31edc2956278e5f1fdd7cfc59566c1fbd39fc19d8d14999a138ee42707492b171f5c0afa848c877af9e78c7cb22f570ec3f77fb789951c882be4940930cf4f0d1db6fdc5f16528fe3ddaf0eee2fb324e3d8fb1e057942cd851ffef1fb8fc5fcd920f8af3f2e66c9fcffb84b7ff865b7ce875708c9ff60d8f137aa5a1fa900d00700001001010020742877c36a520b152b1337ea1ecd37b0c98ad07289c32fec392e7eebab9f0ac71f7bc8c718cfa75317b2e15702372a9222c4616783ee7b3f0ec6358f8c328eea00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232201a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72410000d00700001001010020058e23368b919493d6ac61d27f66b829a53893e88ddde857d3b82d913960960d22fa36f397752b98c295e3b31927f740127c0a99e76f8bfeea88f44466b8fbfd00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea990000d0070000100101001f43fe868e263d8134cf705aa85e26ce78ebb058edd558865fa3d240f5cb9e50c2389e9c8276eac800b7233a552045b2e79124c97e5156a0649849cc7f5d09eee600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f0000d0070000100101001f29e82b08ccf15e2187f29fea11ee3f4974f41b51e45b19f353348d8848b86fb71cadd88630456b7a1c60803c7b402487d41fbf18f0b0a13b4cca1f740447938300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff5260000d0070000100101002047a8b784c3765b5c63ac52e3d8461b80bc2d3e3f62434f8accb277d9f2487cfd3c0728fcd26b5119a11288e5db46bc5b547877e220971609d1cef8cba443340800005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322068dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974280000d007000010010100203e701fbafd4149bc95b55a6bfc3b78246f5c2668ccc05ed4059a36ceb38f140b31e3b69e15f2579571e5bde39e034947271599c200e540b3949112bef163074c00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c430000d0070000100101001f0cc7352e60f4f8476783d6d1b48766a111c56fee2c1a552e76a75c92bc17de172f994ffc854c09717c904054819ca7a17379ddecaf531c439b35337ba099b81300005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4050000d0070000100101002040965063a83be2d53b36c8d7e0775f503c2caa1407e586314562aace52c272fe60659e196413a6c9db4168470bcabb9a5851121c10c7b665f363f6cd4d1e4bda00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232202652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed250000d0070000100101002074ea7468b2a031c4cd53bf10ec3ac66b0c4b5c8779e045f1ef8d9c7b116be649217ff340107d0163397b99918ee2ce822b66cd6fce7b385af97a04671136e2ee00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d0000d007000010010100204dfb21ca5140582379bc026792c16b4cf97827143a4a9cd99ae70b3e6016cd6316bcbb9f1cb1233f12a0bbcd9debafa64724d0459b5c8d3cb67ceddfb2e3962500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d670000d0070000100101002033446a3a94ade71dff3edb786259679487ab701bbc147490b1d4159fecf545fa22fee0698db16bf616465e5cebb985bfc4d9ed1ec4a55e38997dd4b4bbc427eb00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232204fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c20000d0070000100101001f3f67edd35bf731a07f40c638e8812112cd7d1baa39ec7dac4a1b2f0c83ac8bd53689b56dba69a7386e3860a6f8976695ac0bc2b5dacae91080f1d54df2dac0c000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b44767070000d0070000100101001f1e030564013603d54f9e983b63cd940f8ff09ae038b14813f4021bb0c09ebb640d90cb4f8d57be2809f492a51737b671a5f549d4efa8e7efdaeaa9663c09d1ad00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450710000d007000010010100205cea642eecf05568ce8c5564e63349eea3b816108914ba2ab5efffbb8ea467265f0b6d474f03ed02a3bf529fd6e55a595cbf8dd1adf4311cb9c51e862f8a535400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232205443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b40000d0070000100101001f4556076cc86e0840bf69664f1ef8fcd4d91abda313d08e7840d24ba45cb429cf12b7d3a1f64250c19d1b975e7b107853beff70ebfc4c27c44f825dc05cdc9cd600005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e990000d0070000100101001f354d903ad0f2c6cc9d9a377d681ffaa00475d1e559e48074b4c8cce3111d5c172903b2f179ad4d736dda4e7d1b6a859baeab9dde5e5e495ce09733ec4650634400005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb400000d0070000100101001f1766fa716a828da244c9ce52919b7a19acb38dbd110d1bb0039bb2477c17e4465dceecb8330ed5ee9de1330930dfcfa1a5e8149ce8536a82c0093642adf7328200005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232206bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc0000d00700001001010020488923db1c78fa430a3a9eab75f4ee467c7b9a3d3b4eb3bd08e183c82ef79b9102a4d2a7d1ec79c96b404911ae1b10f579bd82a660011c1ca2b872b30ef7dcac00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322035c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b0000d0070000100101001f61ee60b366c2f3623012648000835e6089f9e9594a113acad200ae8a87bd05274acede23160e2e187d9921ea2ff6f37e3bd10ffd624ffceb511455c42f1c9ee200005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322063320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a0000d0070000100101001f184aad2b65730f7485957642fa1688c66e8ece7827ee2e8e01f8bc904cedd8ec5462c12a1e3c6cd41f4a15a350ec8575bb05e9597f4316ff73a4e1066aeab3d500005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed323220fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40000d0070000100101002041c996b52c4bdbbc4fbdaf707dd01e74c46c51ce2c8e10e174e12502cb6be3f23e2d44e8e8802e970bc5ccfc4d056e400c92a56667183c37e0f79fbe77540a0000005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed32322009e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160000d0070000100101002064bee652fda3828128a5e42da08c65127b9e247662507ed6b46d8d18ecf73afd3313c096184a70a88fad68232faa6438a23eb399cfeeb9b18e044f94ffa6049f00005206e10b5e02005132b41600000000010000000000ea30550000002a9bed3232010000000000ea305500000000a8ed3232208cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000001 DMLOG START_BLOCK 4 DMLOG FEATURE_OP ACTIVATE 1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241 {"feature_digest":"1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"f3c3d91c4603cde2397268bfed4e662465293aab10cd9416db0d442b8cec2949","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"ONLY_LINK_TO_EXISTING_PERMISSION"}]} DMLOG FEATURE_OP ACTIVATE ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99 {"feature_digest":"ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"9908b3f8413c8474ab2a6be149d3f4f6d0421d37886033f27d4759c47a26d944","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"REPLACE_DEFERRED"}]} @@ -157,31 +157,31 @@ DMLOG FEATURE_OP ACTIVATE bcd2a26394b36614fd4894241d3c451ab0f6fd110958c342307362 DMLOG FEATURE_OP ACTIVATE d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40 {"feature_digest":"d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"8139e99247b87f18ef7eae99f07f00ea3adf39ed53f4d2da3f44e6aa0bfd7c62","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CONFIGURABLE_WASM_LIMITS2"}]} DMLOG FEATURE_OP ACTIVATE 6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc {"feature_digest":"6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"68d6405cb8df3de95bd834ebb408196578500a9f818ff62ccc68f60b932f7d82","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"CRYPTO_PRIMITIVES"}]} DMLOG FEATURE_OP ACTIVATE 35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b {"feature_digest":"35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"e5d7992006e628a38c5e6c28dd55ff5e57ea682079bf41fef9b3cced0f46b491","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"GET_BLOCK_NUM"}]} -DMLOG FEATURE_OP ACTIVATE 98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88 {"feature_digest":"98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"01969c44de35999b924095ae7f50081a7f274409fdbccb9fc54fa7836c76089c","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES"}]} +DMLOG FEATURE_OP ACTIVATE 63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a {"feature_digest":"63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"BLS_PRIMITIVES2"}]} DMLOG FEATURE_OP ACTIVATE fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4 {"feature_digest":"fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"440c3efaaab212c387ce967c574dc813851cf8332d041beb418dfaf55facd5a9","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_1"}]} DMLOG FEATURE_OP ACTIVATE 09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16 {"feature_digest":"09e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc16","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"a857eeb932774c511a40efb30346ec01bfb7796916b54c3c69fe7e5fb70d5cba","dependencies":["fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4"],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"DISABLE_DEFERRED_TRXS_STAGE_2"}]} DMLOG FEATURE_OP ACTIVATE 8cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7 {"feature_digest":"8cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7","subjective_restrictions":{"enabled":true,"preactivation_required":true,"earliest_allowed_activation_time":"1970-01-01T00:00:00.000"},"description_digest":"bc726a24928ea2d71ba294b70c5c9efc515c1542139bcf9e42f8bc174f2e72ff","dependencies":[],"protocol_feature_type":"builtin","specification":[{"name":"builtin_feature_codename","value":"INSTANT_FINALITY"}]} DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":57599,"consumed":1},"cpu_usage":{"last_ordinal":1262304003,"value_ex":279534,"consumed":101},"ram_usage":180802} -DMLOG TRX_OP CREATE onblock 2194e185d9b96978f1f64e0b6d85c143f8ce43d0a01e84f21c14fcdaf84f8a6b 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8c771cad6c14e7b03f51048ccf8f52fa1b54ba7880c11722d0aa93f5b9c4bb66b95d4808edc7d96ceeb3a19d03945d89f369abb41036038cd59ea2f711ba52b48000000000000000000 -DMLOG APPLIED_TRANSACTION 4 2194e185d9b96978f1f64e0b6d85c143f8ce43d0a01e84f21c14fcdaf84f8a6b04000000033b3d4b0100000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f01006400000000000000000000000000000000000000000001010000010000000000ea3055454334eab0d5e354660b8a20073ee85c6da78a0a4cf7c2e7d1930d5af6f807cb1b000000000000001b00000000000000010000000000ea30551b0000000000000001010000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e8c771cad6c14e7b03f51048ccf8f52fa1b54ba7880c11722d0aa93f5b9c4bb66b95d4808edc7d96ceeb3a19d03945d89f369abb41036038cd59ea2f711ba52b48000000000000000000000000000000002194e185d9b96978f1f64e0b6d85c143f8ce43d0a01e84f21c14fcdaf84f8a6b04000000033b3d4b0100000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f0000000000000000 +DMLOG TRX_OP CREATE onblock 5d4ece78f69e0de92cfe8d938361ab91671cca2213a7a6b9137a44431a19fd61 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82d8cdf5a48c796389dd8078c999af1b8542b7e1d56784775146ab9963566974d9426f419e11a481547c9e05fe24a17d138a7fcdcf5ff599a09e03630dec0c799000000000000000000 +DMLOG APPLIED_TRANSACTION 4 5d4ece78f69e0de92cfe8d938361ab91671cca2213a7a6b9137a44431a19fd6104000000033b3d4b0100000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f98101006400000000000000000000000000000000000000000001010000010000000000ea3055726496fe3dfa6d508103599b7b80e51d333346f2f8f458fa0a1998e3c0feb5cc1b000000000000001b00000000000000010000000000ea30551b0000000000000001010000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed323274023b3d4b0000000000ea305500000000000213588be25132b4167ced6df22b5439e376d5a20284190bb94a43e3e82d8cdf5a48c796389dd8078c999af1b8542b7e1d56784775146ab9963566974d9426f419e11a481547c9e05fe24a17d138a7fcdcf5ff599a09e03630dec0c799000000000000000000000000000000005d4ece78f69e0de92cfe8d938361ab91671cca2213a7a6b9137a44431a19fd6104000000033b3d4b0100000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f9810000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio code update setcode eosio 228262 47460 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":102044,"consumed":7681},"cpu_usage":{"last_ordinal":1262304003,"value_ex":291109,"consumed":2101},"ram_usage":228262} -DMLOG APPLIED_TRANSACTION 4 9057c59fe57b4e720763df9b5012dc740ad6af36bd4026373eea97495d5ab02f04000000033b3d4b0100000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f0100d0070000c0070000000000000000001e0000000000000001010000010000000000ea30551c240682ae5fae980e95614b63bdaeed9a2ca9d440fd4f0f4ae24fc58f8fdcdd1c000000000000001c00000000000000010000000000ea30551c0000000000000002010000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed323288b0010000000000ea30550000fbaf010061736d010000000198011960000060027f7f0060037f7f7f0060047e7e7e7e017f6000017e60047f7e7e7f0060057f7f7f7f7f017f60037f7f7f017f60027f7f017f60027f7f017e60057f7f7f7f7f0060067e7e7e7e7f7f017f60017e0060027e7f0060047e7e7e7e0060037e7f7f017e60017f0060017f017f6000017f60027f7e0060047f7e7f7f0060037e7e7e0060037f7e7f0060047f7f7f7f0060027e7e000285062503656e760b64625f66696e645f693634000303656e760c656f73696f5f617373657274000103656e761063757272656e745f7265636569766572000403656e760561626f7274000003656e760d6173736572745f736861323536000203656e760b6173736572745f73686131000203656e760d6173736572745f736861353132000203656e76106173736572745f726970656d64313630000203656e7606736861323536000203656e76095f5f6173686c746933000503656e760473686131000203656e7606736861353132000203656e7609726970656d64313630000203656e760b7265636f7665725f6b6579000603656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000103656e76066d656d637079000703656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000803656e76167365745f70726f706f7365645f70726f647563657273000903656e760c63757272656e745f74696d65000403656e76146765745f6163746976655f70726f647563657273000803656e76087072696e74735f6c000103656e76126173736572745f7265636f7665725f6b6579000a03656e760c64625f73746f72655f693634000b03656e760c726571756972655f61757468000c03656e760e7365745f70726976696c65676564000d03656e76137365745f7265736f757263655f6c696d697473000e03656e76197365745f70726f706f7365645f70726f6475636572735f6578000f03656e760e7365745f66696e616c697a657273000103656e761370726561637469766174655f66656174757265001003656e76067072696e7473001003656e761469735f666561747572655f616374697661746564001103656e7610616374696f6e5f646174615f73697a65001203656e7610726561645f616374696f6e5f64617461000803656e7611656f73696f5f6173736572745f636f6465001303656e760a64625f6765745f693634000703656e760d64625f7570646174655f693634001403656e76087072696e746865780001034e4d0015111000111010100c1008021016080208170101010801100118181818181818081818181818080101180818081818180800080801010108010101080801010102080108020202020801080104050170010d0d05030100010616037f014180c0000b7f0041e2c5000b7f0041e2c5000b070901056170706c7900260912010041010b0c5a5b5c5e5f606364656a6b6c0acba1014d040010290bf403002000102e102520002001510440428080f9d4a98499dc9a7f200251044020002001103f05428080add68d959ba955200251044020002001104005428080add68d95abd1ca0020025104402000200110410542808080e8b2edc0d38b7f200251044020002001104205428080add68db8baf1542002510440200020011043054280f8a6d4d2a8a1d3c1002002510440200020011044054280808080d4c4a2d942200251044020002001104505428080808080f798d9422002510440200020011047054280808080aefadeeaa47f2002510440200020011048054280808080b6f7d6d942200251044020002001104905428080b8f6a4979ad942200251044020002001104a0542808080c093fad6d942200251044020002001104b05428080a0d6f0e9add942200251044020002001104f054280808096cdebd4d9422002510440200020011051054280808080daac9bd6ba7f20025104402000200110530542808080d0b2b3bb99322002510440200020011054054290a9d9d9dd8c99d6ba7f2002510440200020011055052000428080808080c0ba98d500520440410042808080d9d3b3ed82ef0010210b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b05428080808080c0ba98d50020015104404280808080aefadeeaa47f2002510440410042818080d9d3b3ed82ef0010210b0b0b410010320b7201037f024020000d0041000f0b4100410028028c40200041107622016a220236028c404100410028028440220320006a410f6a4170712200360284400240200241107420004b0d004100200241016a36028c40200141016a21010b024020014000417f470d0041004190c00010010b20030b02000b3601017f230041106b2200410036020c4100200028020c280200410f6a417071220036028040410020003602844041003f0036028c400b3301027f2000410120001b2101024003402001102722000d01410021004100280284412202450d0120021100000c000b0b20000b0600200010280b05001003000b05001003000b0a0041002000370388410b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a3602002001200010301a200141106a200128020420012802006b100e200141e0006a24000ba20801027f02402000280208200028020422026b41074a0d0041004190c1001001200028020421020b200220014108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014a0d0041004190c1001001200028020421020b200220034102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014a0d0041004190c1001001200028020421020b200220014102100f1a2000200028020441026a36020420000bfa0103017f027e017f230041306b2203240020012002200341106a1008420021044110210141002102420021050340200341106a20026a21060240024020014102490d002005420886200420063100008422044238888421052001417f6a2101200442088621040c010b024020014101460d00410041a9c00010010b200020053703082000200420063100008437030041102101200041106a210042002104420021050b200241016a22024120470d000b024020014110460d00024020014102490d00200320042005200141037441786a1009200341086a2903002105200329030021040b20002004370300200020053703080b200341306a24000b02000b970503017f017e047f230041f0006b22032400200341206a4100360200200342003703182003427f37031020032000290300220437030820032004370300024002402004200442808080809aecb4ee312001100022004100480d00024020032000103422002802302003460d00410041c0c20010010b2003200236023020032000200341306a10350c010b024020041002510d004100418ac30010010b41c000102a22004200370310200041286a22054200370300200041206a22064200370300200041186a220742003703002000200336023020002001370300200341306a20022802002208200228020420086b10312005200341306a41186a2903003703002006200341306a41106a29030037030020072003290338370300200020032903303703102003200341306a41286a3602682003200341306a360260200341306a20004108100f1a2003200341306a410872360264200341e0006a200041106a10361a2000200329030842808080809aecb4ee31200120002903002204200341306a412810162205360234024020042003290310540d002003427e200442017c2004427d561b3703100b200320003602602003200029030022043703302003200536022c02400240200328021c220220032802204f0d00200220053602102002200437030820034100360260200220003602002003200241186a36021c0c010b200341186a200341e0006a200341306a2003412c6a10370b20032802602100200341003602602000450d002000102b0b024020032802182205450d0002400240200328021c22002005470d00200521000c010b0340200041686a220028020021022000410036020002402002450d002002102b0b20052000470d000b200328021821000b2003200536021c2000102b0b200341f0006a24000b840603097f027e017f230041e0006b220221032002240002400240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a28020021060c010b024002400240024020014100410010222205417f4a0d00410041f3c20010010c010b2005418104490d010b200510272107410121080c010b20022005410f6a4170716b22072400410021080b20012007200510221a41c000102a220642003703102006420037030020062000360230200641186a4200370300200641206a4200370300200641286a42003703000240200541074b0d00410041d9c40010010b200620074108100f1a200741086a21040240200541786a411f4b0d00410041d9c40010010b200041186a2109200641106a210a200341c0006a20044120100f1a4200210b41102105200341206a2102410021044200210c0340200341c0006a20046a210d0240024020054102490d00200c420886200b200d31000084220b42388884210c2005417f6a2105200b420886210b0c010b024020054101460d00410041b6c50010010b2002200c3703082002200b200d3100008437030041102105200241106a21024200210b4200210c0b200441016a22044120470d000b024020054110460d00024020054102490d00200341086a200b200c200541037441786a1009200341106a290300210c2003290308210b0b2002200b3703002002200c3703080b200a2003290320370300200a41086a2003290328370300200a41186a200341206a41186a290300370300200a41106a200341206a41106a290300370300200620013602342003200636022020032006290300220b3703402003200136021c02400240200028021c2205200041206a2802004f0d00200520013602102005200b37030820034100360220200520063602002000200541186a36021c0c010b2009200341206a200341c0006a2003411c6a10370b02402008450d00200710280b20032802202105200341003602202005450d002005102b0b200341e0006a240020060b980203027f017e017f230041206b2203210420032400024020012802302000460d00410041bdc30010010b024010022000290300510d00410041ebc30010010b200129030021052004200228020022022802002206200228020420066b1031200141286a200441186a290300370300200141206a200441106a290300370300200141186a200429030837030020012004290300370310200141106a2102024020052001290300510d004100419ec40010010b200341506a220324002004200341286a36020820042003360200200320014108100f1a2004200341086a3602042004200210361a20012802344200200341281023024020052000290310540d002000427e200542017c2005427d561b3703100b200441206a24000bd20303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402000280208200028020422016b411f4a0d0041004188c2001001200028020421010b200120024120100f1a2000200028020441206a360204200241206a240020000b9a0301057f0240024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b22070d0041002107410021040c010b200741186c102a21040b20012802002106200141003602002004200541186c22086a2201200328020036021020012002290300370308200120063602002004200741186c6a2105200141186a21062000280204220220002802002207460d01200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141086a200241706a2202290300370300200141106a200241086a280200360200200141686a21012004210220072004470d000b200141186a210120002802042107200028020021040c020b2000102d000b200721040b200020053602082000200636020420002001360200024020072004460d000340200741686a220728020021012007410036020002402001450d002001102b0b20042007470d000b0b02402004450d002004102b0b0bd00203047f017e017f230041106b220224004100210320004100360208200042003702002002410036020020012802042204200128020022056b410575ad21060340200341016a2103200642078822064200520d000b2002200336020002400240024020052004460d0003402002200341086a3602002003410c6a2103200541186a2802002207ad21060340200341016a2103200642078822064200520d000b20022003417c6a3602002007417f460d022002200336020020022005410c6a10561a20022802002103200541206a22052004470d000b20002802002105200028020421070c020b41002105410021070c010b1057000b024002402003200720056b22074d0d002000200320076b103a200028020021050c010b200320074f0d002000200520036a3602040b2002200536020420022005360200200220002802043602082002200110581a200241106a24000be30203057f017e047f230041106b22022400200041003602082000420037020041082103200141086a21042001410c6a2802002205200128020822066b41286dad21070340200341016a2103200742078822074200520d000b0240024020062005460d00034020062802042208ad420020062d00002209410171220a1b2107200341086a210b0340200b41016a210b200742078822074200520d000b2006280218220320082009410176200a1b6b2006411c6a28020022096b2108200920036bad210703402008417f6a2108200742078822074200520d000b200b20086b2103200641286a22062005470d000b4100210341002106200b2008460d01200b20086b21030b20002003103a20002802042103200028020021060b2002200636020420022006360200200220033602080240200320066b41074a0d0041004188c20010010b200620014108100f1a2002200641086a36020420022004103b1a200241106a24000b980201057f02400240024020002802082202200028020422036b2001490d000340200341003a00002000200028020441016a22033602042001417f6a22010d000c020b0b2003200028020022046b220520016a2206417f4c0d0141ffffffff07210302400240200220046b220241feffffff034b0d0020062002410174220320032006491b22030d0041002103410021020c010b2003102a21020b200220036a2106200220056a220421030340200341003a0000200341016a21032001417f6a22010d000b20042000280204200028020022016b22026b2104024020024101480d00200420012002100f1a200028020021010b2000200636020820002003360204200020043602002001450d002001102b0b0f0b2000102d000b830203017f017e037f230041106b22022400200128020420012802006b41286dad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b02402001280200220520012802042201460d00034002402000200510612204280208200428020422066b41074a0d0041004188c2001001200428020421060b2006200541106a4108100f1a2004200428020441086a3602042004200541186a10621a200541286a22052001470d000b0b200241106a240020000baf0302017f027e230041206b22022400200029030010172002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722004108763a0016200220004110763a0015200220004118763a001420022004a722003a0007200220004108763a0006200220004110763a0005200220004118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c00102002101c41bdc100101d2001103d41bbc100101d200241206a24000b9c0303017f027e017f230041206b220124002001200041186a29030022023c00172001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c0000200120024220883c001320012002a722044108763a0016200120044110763a0015200120044118763a001420012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a0004200120002903002203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370308200120002903102203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370318200120024230883c0011200120024228883c0012200120024238883c0010200141201024200141206a24000ba70303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402002101e0d00410041d8c10010010b200241206a24000bb90101047f230041106b2202210320022400024002400240101f22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20034200370300200241086a2102024020044178714108470d00410041d9c40010010b200320024108100f1a200341106a24000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000bc90201047f230041306b220221032002240002400240101f22040d00410021020c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d00410041d9c400100120032802282105200328022421020b200341186a20024108100f1a2003200241086a2202360224024020052002470d00410041d9c400100120032802282105200328022421020b200341176a20024101100f1a2003200241016a2202360224024020052002470d00410041d9c4001001200328022421020b200341166a20024101100f1a2003200241016a3602242003410036021020034200370308200341206a200341086a10461a024020032802082202450d002003200236020c2002102b0b200341306a24000bff0103017f017e047f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22063602042003200541ff0071200441ff0171220274ad842103200241076a2104200621022005418001710d000b0240024020012802042205200128020022026b22072003a722044f0d002001200420076b103a2000280204210620012802042105200128020021020c010b200720044d0d002001200220046a22053602040b0240200028020820066b200520026b22054f0d00410041d9c4001001200028020421060b200220062005100f1a2000200028020420056a36020420000bb20202037f017e23004180016b220221032002240002400240101f22040d00410021020c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d00410041d9c4001001200328025421020b200341c8006a20024108100f1a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10461a200341086a41086a200341d0006a41086a2802002202360200200341306a2002360200200320032903502205370308200320013703202003200037031820032005370328200341186a2003290348200341386a1033024020032802382202450d002003200236023c2002102b0b20034180016a24000b4c01037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b410041d5c0001001200324000bcf0102047f017e230041106b2202210320022400024002400240101f22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a2102024020044108470d00410041d9c40010010b200341076a20024101100f1a2003290308210620032d0007210420001017200620044100471018200341106a24000baa0202047f047e230041206b2202210320022400024002400240101f22040d002003420037031841002102200341186a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370318200341186a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a21050240200441787122044108470d00410041d9c40010010b200341106a20054108100f1a200241106a2105024020044110470d00410041d9c40010010b200341086a20054108100f1a200241186a2102024020044118470d00410041d9c40010010b200320024108100f1a200329030021062003290308210720032903102108200329031821092000101720092008200720061019200341206a24000ba103010b7f230041306b2202210320022400410021040240101f2205450d00024002402005418004490d002005102721040c010b20022005410f6a4170716b220424000b2004200510201a0b20032004360214200320043602102003200420056a3602182003410036020820034200370300200341106a2003104c1a20001017200341206a20031038420120032802202204200328022420046b101a1a024020032802202204450d00200320043602242004102b0b024020032802002206450d0002400240200328020422072006470d00200621040c010b03402007220441606a21070240200441786a2208280200417f460d002004416c6a2209280200220a450d00200a21050240200441706a220b2802002204200a460d000340200441486a21050240200441786a2202280200220c417f460d00200341206a200441486a200c4102744188c5006a2802001101000b2002417f36020020052104200a2005470d000b200928020021050b200b200a3602002005102b0b2008417f36020020072006470d000b200328020021040b200320063602042004102b0b200341306a24000bcc0303027f017e097f230041206b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042207200128020022056b41057522062004a722034f0d002001200320066b104d200128020421070c010b200620034d0d000240200520034105746a22082007460d0003402007220341606a21070240200341786a2209280200417f460d002003416c6a220a280200220b450d00200b21060240200341706a220c2802002203200b460d000340200341486a21060240200341786a2205280200220d417f460d00200241186a200341486a200d4102744188c5006a2802001101000b2005417f36020020062103200b2006470d000b200a28020021060b200c200b3602002006102b0b2009417f36020020072008470d000b0b20012008360204200821070b0240200128020022032007460d00034020022000360208200220033602102002200341086a360214200241106a200241086a104e200341206a22032007470d000b0b200241206a240020000b9f06030a7f017e037f230041106b220224000240024020002802082203200028020422046b4105752001490d000340200441186a2203420037030020044200370300200441106a4200370300200441086a4200370300200341003602002000200028020441206a22043602042001417f6a22010d000c020b0b02400240024002402004200028020022056b410575220620016a220741808080c0004f0d0041ffffff3f210402400240200320056b220341057541feffff1f4b0d00024020072003410475220420042007491b22040d0041002104410021030c020b200441808080c0004f0d030b2004410574102a21030b200320044105746a2108200320064105746a22092104034020044200370300200441186a4200370300200441106a4200370300200441086a4200370300200441206a21042001417f6a22010d000b2000280204220a20002802002206460d022006200a6b210b410021050340200920056a220141786a2206417f360200200a20056a220341606a290300210c200141686a220741003a0000200141606a200c3703000240200341786a280200220d417f460d00200141706a220e42003702002001416c6a220f4100360200200e200341706a280200360200200f2003416c6a220e280200360200200141746a200341746a22012802003602002007200341686a2802003602002006200d36020020014100360200200e42003702000b200b200541606a2205470d000b200920056a2109200028020421062000280200210d0c030b2000102d000b1003000b2006210d0b20002008360208200020043602042000200936020002402006200d460d0003402006220441606a21060240200441786a2207280200417f460d002004416c6a220e2802002200450d00200021010240200441706a220f28020022042000460d000340200441486a21010240200441786a22032802002205417f460d00200241086a200441486a20054102744188c5006a2802001101000b2003417f3602002001210420002001470d000b200e28020021010b200f20003602002001102b0b2007417f3602002006200d470d000b0b200d450d00200d102b0b200241106a24000bca0102037f017e20002802002102024020012802002203280208200328020422046b41074b0d00410041d9c4001001200328020421040b200220044108100f1a2003200328020441086a3602042000280204210220012802002201280204210342002105410021040340024020032001280208490d0041004183c5001001200128020421030b20032d000021002001200341016a22033602042005200041ff0071200441ff0171220474ad842105200441076a2104200321032000418001710d000b200120022005a710660b810301047f230041c0006b2202210320022400410021040240101f2205450d00024002402005418004490d002005102721040c010b20022005410f6a4170716b220424000b2004200510201a0b20032004360224200320043602202003200420056a360228200341186a410036020020034200370310200342003703080240200541074b0d00410041d9c4001001200328022421040b200341086a20044108100f1a2003200441086a360224200341206a200341086a41086a10501a20001017200341306a200341086a103920032802302204200328023420046b101b024020032802302204450d00200320043602342004102b0b024020032802102202450d0002400240200328021422042002470d00200221040c010b03400240200441706a2802002205450d00200441746a20053602002005102b0b200441586a21050240200441586a2d0000410171450d00200441606a280200102b0b2005210420022005470d000b200328021021040b200320023602142004102b0b200341c0006a24000b840303017f017e037f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22023602042003200541ff0071200441ff0171220474ad842103200441076a2104200221022005418001710d000b0240024020012802042206200128020022046b41286d22052003a722024f0d002001200220056b106f200128020421060c010b200520024d0d0002402004200241286c6a22052006460d0003400240200641706a2802002202450d00200641746a20023602002002102b0b200641586a21020240200641586a2d0000410171450d00200641606a280200102b0b2002210620052002470d000b0b20012005360204200521060b0240200128020022052006460d000340024020002005106e2202280208200228020422046b41074b0d00410041d9c4001001200228020421040b200541106a20044108100f1a2002200228020441086a3602042002200541186a10701a200541286a22052006470d000b0b20000b890101037f230041e0006b220221032002240002400240101f22040d00410021020c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a10521a20001017200341086a102f200341e0006a24000ba20801027f02402000280208200028020422026b41074b0d00410041d9c4001001200028020421020b200120024108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014b0d00410041d9c4001001200028020421020b200320024102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014b0d00410041d9c4001001200028020421020b200120024102100f1a2000200028020441026a36020420000b940101047f230041106b2202210320022400024002400240101f22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20032903081017200341106a24000b8c0405047f017e037f017e017f230041f0006b220221032002240002400240101f22040d00410021050c010b024002402004418004490d002004102721050c010b20022004410f6a4170716b220524000b2005200410201a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200520046a2107200341d0006a20054120100f1a200541206a2108200341306a2109410021044200210a0340200341d0006a20046a210b0240024020024102490d00200a4208862006200b31000084220642388884210a2002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b2009200a37030820092006200b3100008437030041102102200941106a2109420021064200210a0b200441016a22044120470d000b024020024110460d00024020024102490d0020032006200a200241037441786a1009200341086a290300210a200329030021060b200920063703002009200a3703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a2903003703002003200329033837031820032003290330370310200341d0006a41186a2007360200200341e4006a2008360200200320053602602003200137035820032000370350200341d0006a200341106a103c200341f0006a24000bc80303047f027e017f230041f0006b220221032002240002400240101f22040d00410021050c010b024002402004418004490d002004102721050c010b20022004410f6a4170716b220524000b2005200410201a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200341d0006a20054120100f1a200341306a210541002104420021070340200341d0006a20046a21080240024020024102490d002007420886200620083100008422064238888421072002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b200520073703082005200620083100008437030041102102200541106a210542002106420021070b200441016a22044120470d000b024020024110460d00024020024102490d00200320062007200241037441786a1009200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703102002200341106a103e200341f0006a24000bd50103037f017e017f230041106b2202240020012802042203200128020022046b41386dad2105200028020021010340200141016a2101200542078822054200520d000b200020013602000240024020042003460d00034020042802302206ad21050340200141016a2101200542078822054200520d000b20002001360200200220003602002006417f460d0220022002360208200241086a2004200641027441fcc1006a2802001101002000200028020041026a2201360200200441386a22042003470d000b0b200241106a240020000f0b1057000b05001003000bfe0103017f017e037f230041106b22022400200128020420012802006b410575ad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b02402001280200220520012802042206460d0003400240200028020820046b41074a0d0041004188c2001001200028020421040b200420054108100f1a2000200028020441086a3602042000200541086a10591a200541206a22052006460d01200028020421040c000b0b200241106a240020000bdd0103027f017e027f230041106b22022400200028020421032001350210210403402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b02402001280210417f460d00200141046a21050240200028020820036b41034a0d0041004188c2001001200028020421030b200320014104100f1a2000200028020441046a36020420002005105d1a200241106a240020000f0b1057000b170020002802002802002200200028020041216a3602000b170020002802002802002200200028020041216a3602000b7602017f017e20002802002802002202200228020041226a2200360200200141286a350200420020012d00244101711b21030340200041016a2100200342078822034200520d000b200220003602000240200128022820012d0024220141017620014101711b2201450d002002200120006a3602000b0b990303017f017e047f230041106b22022400200128020420012802006b41386dad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b024002402001280200220720012802042201460d0003402007350230210303402003a721052002200342078822034200522206410774200541ff0071723a000e0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410e6a4101100f1a2000200028020441016a220436020420060d000b2002200036020020072802302204417f460d0220022002360208200241086a2007200441027441b4c2006a280200110100200741346a210502402000280208200028020422046b41014a0d0041004188c2001001200028020421040b200420054102100f1a2000200028020441026a2204360204200741386a22072001470d000b0b200241106a240020000f0b1057000b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0baa0101037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b200141216a21030240200028020820026b41004a0d0041004188c2001001200028020421020b200220034101100f1a2000200028020441016a3602042000200141246a10611a0bfd0103027f017e027f230041106b22022400200128020420012d0000220341017620034101711bad21042000280204210303402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b0240200128020420012d00002205410176200541017122061b2205450d002001280208200141016a20061b21060240200028020820036b20054e0d0041004188c2001001200028020421030b200320062005100f1a2000200028020420056a3602040b200241106a240020000bd20103017f017e037f230041106b22022400200128020420012802006bad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b0240200028020820046b2001280204200128020022066b22054e0d0041004188c2001001200028020421040b200420062005100f1a2000200028020420056a360204200241106a240020000b02000b02000b1a00024020012d0024410171450d002001412c6a280200102b0b0bae0201047f230041206b220324000240024020020d00200341146a41003602002003420037020c200341086a410472210402402000280208200028020422026b41034b0d00410041d9c4001001200028020421020b200341086a20024104100f1a2000200028020441046a3602042000200410671a02402001280210417f460d0020012802042205450d00200521020240200141086a28020022002005460d000340200041486a21020240200041786a22042802002206417f460d00200341186a200041486a20064102744188c5006a2802001101000b2004417f3602002002210020052002470d000b200128020421020b200120053602082002102b0b2001200329030837020020014100360210200141086a20032903103702000c010b410041a0c50010010b200341206a24000b870303027f017e047f230041106b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042205200128020022076b41386d22062004a722034f0d002001200320066b1068200128020421050c010b200620034d0d0002402007200341386c6a22082005460d000340200541486a21030240200541786a22062802002207417f460d00200241086a200541486a20074102744188c5006a2802001101000b2006417f3602002003210520082003470d000b0b20012008360204200821050b0240200128020022032005460d0003402000200310691a02402000280208200028020422066b41014b0d00410041d9c4001001200028020421060b200341346a20064102100f1a2000200028020441026a360204200341386a22032005470d000b0b200241106a240020000ba105010c7f230041106b2202240002400240024020002802082203200028020422046b41386d2001490d000340200441306a2203420037020020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200341003602002000200028020441386a22043602042001417f6a22010d000c020b0b2004200028020022056b41386d220620016a220741a592c9244f0d0141a492c924210402400240200320056b41386d22034191c9a4124b0d0020072003410174220420042007491b22040d0041002104410021030c010b200441386c102a21030b2003200441386c6a21082003200641386c6a22092104034020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200441306a4200370200200441386a21042001417f6a22010d000b024002402000280204220a20002802002205470d002000200836020820002004360204200020093602000c010b2005200a6b210b410021010340200920016a220341786a2206417f360200200341486a220741003a00000240200a20016a220541786a220c280200220d417f460d00200241086a2007200541486a200d4102744194c5006a2802001102002006200c2802003602000b2003417c6a2005417c6a2f01003b0100200b200141486a2201470d000b200020083602082000280204210320002004360204200028020021052000200920016a36020020032005460d000340200341486a21040240200341786a22012802002200417f460d002002200341486a20004102744188c5006a2802001101000b2001417f3602002004210320052004470d000b0b2005450d002005102b0b200241106a24000f0b2000102d000bdf0203027f017e037f230041306b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22073602042004200641ff0071200541ff0171220374ad842104200341076a2105200721032006418001710d000b024002402004a722030d00410021030340200220036a2106024020002802082007470d00410041d9c4001001200028020421070b200620074101100f1a2000200028020441016a2207360204200341016a22034121470d000b024020012802302203417f460d00200241286a200120034102744188c5006a2802001101000b2001200229030037000020014100360230200141206a200241206a2d00003a0000200141186a200241186a290300370000200141106a200241106a290300370000200141086a200241086a2903003700000c010b200020012003106d0b200241306a240020000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b7801017f20012002290200370200200141206a200241206a2f01003b0100200141186a200241186a290200370200200141106a200241106a290200370200200141086a200241086a2902003702002001412c6a2002412c6a22032802003602002001200229022437022420024200370224200341003602000be70401037f230041c0006b22032400024002402002417f6a220241014b0d000240024020020e020001000b20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b2001200329030837000020014101360230200141206a200341086a41206a2d00003a0000200141186a200341086a41186a290300370000200141106a200341086a41106a290300370000200141086a200341086a41086a2903003700000c020b200341346a41003602002003420037022c20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b200341296a2104024020002802082002470d00410041d9c4001001200028020421020b200420024101100f1a2000200028020441016a36020420002003412c6a2202106e1a024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b200120032903083702002001410236023020012002290200370224200141206a200341086a41206a2f01003b0100200141186a200341086a41186a290300370200200141106a200341086a41106a290300370200200141086a200341086a41086a2903003702002001412c6a200241086a2802003602000c010b410041a0c50010010b200341c0006a24000ba00301057f230041206b2202240020024100360218200242003703102000200241106a10461a0240024002402002280214200228021022036b2204450d00200241086a410036020020024200370300200441704f0d02024002402004410a4b0d00200220044101743a0000200241017221050c010b200441106a4170712206102a21052002200436020420022006410172360200200220053602080b0340200520032d00003a0000200541016a2105200341016a21032004417f6a22040d000b200541003a00000240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102b200141003602000b20012002290300370200200141086a200241086a2802003602000c010b0240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102b200141003602000b20014100360208200142003702000b024020022802102205450d00200220053602142005102b0b200241206a240020000f0b2002102c000ba505010a7f0240024020002802082202200028020422036b41286d2001490d000340200341206a22024200370300200341086a2204420037030020034200370300200341186a4200370300200341106a420037030020024100360200200441003602002000200028020441286a22033602042001417f6a22010d000c020b0b0240024002402003200028020022046b41286d220520016a220641e7cc99334f0d0041e6cc9933210302400240200220046b41286d220241b2e6cc194b0d0020062002410174220320032006491b22030d0041002103410021020c010b200341286c102a21020b2002200341286c6a21072002200541286c6a22082103034020034200370300200341206a4200370300200341186a4200370300200341106a4200370300200341086a4200370300200341286a21032001417f6a22010d000b2000280204220920002802002201460d01200120096b210a410021040340200820046a220241586a2206200920046a220141586a2205290200370200200641086a200541086a280200360200200241746a22064200370200200241706a220b41003602002006200141746a280200360200200b200141706a2206280200360200200241686a200141686a290300370300200241786a200141786a2202280200360200200141606a4100360200200542003702002006420037020020024100360200200a200441586a2204470d000b200820046a210820002802042101200028020021020c020b2000102d000b200121020b200020073602082000200336020420002008360200024020012002460d0003400240200141706a2802002203450d00200141746a20033602002003102b0b200141586a21030240200141586a2d0000410171450d00200141606a280200102b0b2003210120022003470d000b0b2002450d002002102b0b0bff0103017f017e047f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22063602042003200541ff0071200441ff0171220274ad842103200241076a2104200621022005418001710d000b0240024020012802042205200128020022026b22072003a722044f0d002001200420076b10712000280204210620012802042105200128020021020c010b200720044d0d002001200220046a22053602040b0240200028020820066b200520026b22054f0d00410041d9c4001001200028020421060b200220062005100f1a2000200028020420056a36020420000b980201057f02400240024020002802082202200028020422036b2001490d000340200341003a00002000200028020441016a22033602042001417f6a22010d000c020b0b2003200028020022046b220520016a2206417f4c0d0141ffffffff07210302400240200220046b220241feffffff034b0d0020062002410174220320032006491b22030d0041002103410021020c010b2003102a21020b200220036a2106200220056a220421030340200341003a0000200341016a21032001417f6a22010d000b20042000280204200028020022016b22026b2104024020024101480d00200420012002100f1a200028020021010b2000200636020820002003360204200020043602002001450d002001102b0b0f0b2000102d000b0beb0503004190c0000b796661696c656420746f20616c6c6f6361746520706167657300756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f7200746865206f6e6572726f7220616374696f6e2063616e6e6f742062652063616c6c6564206469726563746c790000000000000000004189c1000bd904000000000000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e64000a006665617475726520646967657374206163746976617465643a200070726f746f636f6c2066656174757265206973206e6f74206163746976617465640000000100000002000000030000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e6400000400000005000000060000006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578006572726f722072656164696e67206974657261746f720063616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374006f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e6465780063616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e747261637400757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374006461746173747265616d20617474656d7074656420746f207265616420706173742074686520656e640067657400000700000008000000090000000a0000000b0000000c000000696e76616c69642076617269616e7420696e64657800756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04e8220000000000000000000000009057c59fe57b4e720763df9b5012dc740ad6af36bd4026373eea97495d5ab02f04000000033b3d4b0100000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f010000000000ea305564b900000000000000000000000000 +DMLOG APPLIED_TRANSACTION 4 223047cba8950eb797eefed5cc804e27e1d3c87e26edd1cef8dfcebbb7a5486704000000033b3d4b0100000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f9810100d0070000c0070000000000000000001e0000000000000001010000010000000000ea30551c240682ae5fae980e95614b63bdaeed9a2ca9d440fd4f0f4ae24fc58f8fdcdd1c000000000000001c00000000000000010000000000ea30551c0000000000000002010000000000ea30550000000000ea305500000040258ab2c2010000000000ea305500000000a8ed323288b0010000000000ea30550000fbaf010061736d010000000198011960000060027f7f0060037f7f7f0060047e7e7e7e017f6000017e60047f7e7e7f0060057f7f7f7f7f017f60037f7f7f017f60027f7f017f60027f7f017e60057f7f7f7f7f0060067e7e7e7e7f7f017f60017e0060027e7f0060047e7e7e7e0060037e7f7f017e60017f0060017f017f6000017f60027f7e0060047f7e7f7f0060037e7e7e0060037f7e7f0060047f7f7f7f0060027e7e000285062503656e760b64625f66696e645f693634000303656e760c656f73696f5f617373657274000103656e761063757272656e745f7265636569766572000403656e760561626f7274000003656e760d6173736572745f736861323536000203656e760b6173736572745f73686131000203656e760d6173736572745f736861353132000203656e76106173736572745f726970656d64313630000203656e7606736861323536000203656e76095f5f6173686c746933000503656e760473686131000203656e7606736861353132000203656e7609726970656d64313630000203656e760b7265636f7665725f6b6579000603656e76207365745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000103656e76066d656d637079000703656e76206765745f626c6f636b636861696e5f706172616d65746572735f7061636b6564000803656e76167365745f70726f706f7365645f70726f647563657273000903656e760c63757272656e745f74696d65000403656e76146765745f6163746976655f70726f647563657273000803656e76087072696e74735f6c000103656e76126173736572745f7265636f7665725f6b6579000a03656e760c64625f73746f72655f693634000b03656e760c726571756972655f61757468000c03656e760e7365745f70726976696c65676564000d03656e76137365745f7265736f757263655f6c696d697473000e03656e76197365745f70726f706f7365645f70726f6475636572735f6578000f03656e760e7365745f66696e616c697a657273000103656e761370726561637469766174655f66656174757265001003656e76067072696e7473001003656e761469735f666561747572655f616374697661746564001103656e7610616374696f6e5f646174615f73697a65001203656e7610726561645f616374696f6e5f64617461000803656e7611656f73696f5f6173736572745f636f6465001303656e760a64625f6765745f693634000703656e760d64625f7570646174655f693634001403656e76087072696e746865780001034e4d0015111000111010100c1008021016080208170101010801100118181818181818081818181818080101180818081818180800080801010108010101080801010102080108020202020801080104050170010d0d05030100010616037f014180c0000b7f0041e2c5000b7f0041e2c5000b070901056170706c7900260912010041010b0c5a5b5c5e5f606364656a6b6c0acba1014d040010290bf403002000102e102520002001510440428080f9d4a98499dc9a7f200251044020002001103f05428080add68d959ba955200251044020002001104005428080add68d95abd1ca0020025104402000200110410542808080e8b2edc0d38b7f200251044020002001104205428080add68db8baf1542002510440200020011043054280f8a6d4d2a8a1d3c1002002510440200020011044054280808080d4c4a2d942200251044020002001104505428080808080f798d9422002510440200020011047054280808080aefadeeaa47f2002510440200020011048054280808080b6f7d6d942200251044020002001104905428080b8f6a4979ad942200251044020002001104a0542808080c093fad6d942200251044020002001104b05428080a0d6f0e9add942200251044020002001104f054280808096cdebd4d9422002510440200020011051054280808080daac9bd6ba7f20025104402000200110530542808080d0b2b3bb99322002510440200020011054054290a9d9d9dd8c99d6ba7f2002510440200020011055052000428080808080c0ba98d500520440410042808080d9d3b3ed82ef0010210b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b05428080808080c0ba98d50020015104404280808080aefadeeaa47f2002510440410042818080d9d3b3ed82ef0010210b0b0b410010320b7201037f024020000d0041000f0b4100410028028c40200041107622016a220236028c404100410028028440220320006a410f6a4170712200360284400240200241107420004b0d004100200241016a36028c40200141016a21010b024020014000417f470d0041004190c00010010b20030b02000b3601017f230041106b2200410036020c4100200028020c280200410f6a417071220036028040410020003602844041003f0036028c400b3301027f2000410120001b2101024003402001102722000d01410021004100280284412202450d0120021100000c000b0b20000b0600200010280b05001003000b05001003000b0a0041002000370388410b4e01017f230041e0006b220124002001200141d8006a3602082001200141106a3602042001200141106a3602002001200010301a200141106a200128020420012802006b100e200141e0006a24000ba20801027f02402000280208200028020422026b41074a0d0041004190c1001001200028020421020b200220014108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034a0d0041004190c1001001200028020421020b200220034104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014a0d0041004190c1001001200028020421020b200220034102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014a0d0041004190c1001001200028020421020b200220014102100f1a2000200028020441026a36020420000bfa0103017f027e017f230041306b2203240020012002200341106a1008420021044110210141002102420021050340200341106a20026a21060240024020014102490d002005420886200420063100008422044238888421052001417f6a2101200442088621040c010b024020014101460d00410041a9c00010010b200020053703082000200420063100008437030041102101200041106a210042002104420021050b200241016a22024120470d000b024020014110460d00024020014102490d00200320042005200141037441786a1009200341086a2903002105200329030021040b20002004370300200020053703080b200341306a24000b02000b970503017f017e047f230041f0006b22032400200341206a4100360200200342003703182003427f37031020032000290300220437030820032004370300024002402004200442808080809aecb4ee312001100022004100480d00024020032000103422002802302003460d00410041c0c20010010b2003200236023020032000200341306a10350c010b024020041002510d004100418ac30010010b41c000102a22004200370310200041286a22054200370300200041206a22064200370300200041186a220742003703002000200336023020002001370300200341306a20022802002208200228020420086b10312005200341306a41186a2903003703002006200341306a41106a29030037030020072003290338370300200020032903303703102003200341306a41286a3602682003200341306a360260200341306a20004108100f1a2003200341306a410872360264200341e0006a200041106a10361a2000200329030842808080809aecb4ee31200120002903002204200341306a412810162205360234024020042003290310540d002003427e200442017c2004427d561b3703100b200320003602602003200029030022043703302003200536022c02400240200328021c220220032802204f0d00200220053602102002200437030820034100360260200220003602002003200241186a36021c0c010b200341186a200341e0006a200341306a2003412c6a10370b20032802602100200341003602602000450d002000102b0b024020032802182205450d0002400240200328021c22002005470d00200521000c010b0340200041686a220028020021022000410036020002402002450d002002102b0b20052000470d000b200328021821000b2003200536021c2000102b0b200341f0006a24000b840603097f027e017f230041e0006b220221032002240002400240200028021822042000411c6a2802002205460d0002400340200541786a2802002001460d012004200541686a2205470d000c020b0b20042005460d00200541686a28020021060c010b024002400240024020014100410010222205417f4a0d00410041f3c20010010c010b2005418104490d010b200510272107410121080c010b20022005410f6a4170716b22072400410021080b20012007200510221a41c000102a220642003703102006420037030020062000360230200641186a4200370300200641206a4200370300200641286a42003703000240200541074b0d00410041d9c40010010b200620074108100f1a200741086a21040240200541786a411f4b0d00410041d9c40010010b200041186a2109200641106a210a200341c0006a20044120100f1a4200210b41102105200341206a2102410021044200210c0340200341c0006a20046a210d0240024020054102490d00200c420886200b200d31000084220b42388884210c2005417f6a2105200b420886210b0c010b024020054101460d00410041b6c50010010b2002200c3703082002200b200d3100008437030041102105200241106a21024200210b4200210c0b200441016a22044120470d000b024020054110460d00024020054102490d00200341086a200b200c200541037441786a1009200341106a290300210c2003290308210b0b2002200b3703002002200c3703080b200a2003290320370300200a41086a2003290328370300200a41186a200341206a41186a290300370300200a41106a200341206a41106a290300370300200620013602342003200636022020032006290300220b3703402003200136021c02400240200028021c2205200041206a2802004f0d00200520013602102005200b37030820034100360220200520063602002000200541186a36021c0c010b2009200341206a200341c0006a2003411c6a10370b02402008450d00200710280b20032802202105200341003602202005450d002005102b0b200341e0006a240020060b980203027f017e017f230041206b2203210420032400024020012802302000460d00410041bdc30010010b024010022000290300510d00410041ebc30010010b200129030021052004200228020022022802002206200228020420066b1031200141286a200441186a290300370300200141206a200441106a290300370300200141186a200429030837030020012004290300370310200141106a2102024020052001290300510d004100419ec40010010b200341506a220324002004200341286a36020820042003360200200320014108100f1a2004200341086a3602042004200210361a20012802344200200341281023024020052000290310540d002000427e200542017c2005427d561b3703100b200441206a24000bd20303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402000280208200028020422016b411f4a0d0041004188c2001001200028020421010b200120024120100f1a2000200028020441206a360204200241206a240020000b9a0301057f0240024002402000280204200028020022046b41186d220541016a220641abd5aad5004f0d0041aad5aad500210702400240200028020820046b41186d220441d4aad52a4b0d0020062004410174220720072006491b22070d0041002107410021040c010b200741186c102a21040b20012802002106200141003602002004200541186c22086a2201200328020036021020012002290300370308200120063602002004200741186c6a2105200141186a21062000280204220220002802002207460d01200420086a41686a21010340200241686a220428020021032004410036020020012003360200200141086a200241706a2202290300370300200141106a200241086a280200360200200141686a21012004210220072004470d000b200141186a210120002802042107200028020021040c020b2000102d000b200721040b200020053602082000200636020420002001360200024020072004460d000340200741686a220728020021012007410036020002402001450d002001102b0b20042007470d000b0b02402004450d002004102b0b0bd00203047f017e017f230041106b220224004100210320004100360208200042003702002002410036020020012802042204200128020022056b410575ad21060340200341016a2103200642078822064200520d000b2002200336020002400240024020052004460d0003402002200341086a3602002003410c6a2103200541186a2802002207ad21060340200341016a2103200642078822064200520d000b20022003417c6a3602002007417f460d022002200336020020022005410c6a10561a20022802002103200541206a22052004470d000b20002802002105200028020421070c020b41002105410021070c010b1057000b024002402003200720056b22074d0d002000200320076b103a200028020021050c010b200320074f0d002000200520036a3602040b2002200536020420022005360200200220002802043602082002200110581a200241106a24000be30203057f017e047f230041106b22022400200041003602082000420037020041082103200141086a21042001410c6a2802002205200128020822066b41286dad21070340200341016a2103200742078822074200520d000b0240024020062005460d00034020062802042208ad420020062d00002209410171220a1b2107200341086a210b0340200b41016a210b200742078822074200520d000b2006280218220320082009410176200a1b6b2006411c6a28020022096b2108200920036bad210703402008417f6a2108200742078822074200520d000b200b20086b2103200641286a22062005470d000b4100210341002106200b2008460d01200b20086b21030b20002003103a20002802042103200028020021060b2002200636020420022006360200200220033602080240200320066b41074a0d0041004188c20010010b200620014108100f1a2002200641086a36020420022004103b1a200241106a24000b980201057f02400240024020002802082202200028020422036b2001490d000340200341003a00002000200028020441016a22033602042001417f6a22010d000c020b0b2003200028020022046b220520016a2206417f4c0d0141ffffffff07210302400240200220046b220241feffffff034b0d0020062002410174220320032006491b22030d0041002103410021020c010b2003102a21020b200220036a2106200220056a220421030340200341003a0000200341016a21032001417f6a22010d000b20042000280204200028020022016b22026b2104024020024101480d00200420012002100f1a200028020021010b2000200636020820002003360204200020043602002001450d002001102b0b0f0b2000102d000b830203017f017e037f230041106b22022400200128020420012802006b41286dad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b02402001280200220520012802042201460d00034002402000200510612204280208200428020422066b41074a0d0041004188c2001001200428020421060b2006200541106a4108100f1a2004200428020441086a3602042004200541186a10621a200541286a22052001470d000b0b200241106a240020000baf0302017f027e230041206b22022400200029030010172002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722004108763a0016200220004110763a0015200220004118763a001420022004a722003a0007200220004108763a0006200220004110763a0005200220004118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c00102002101c41bdc100101d2001103d41bbc100101d200241206a24000b9c0303017f027e017f230041206b220124002001200041186a29030022023c00172001200041086a29030022034220883c0003200120034228883c0002200120034230883c0001200120034238883c0000200120024220883c001320012002a722044108763a0016200120044110763a0015200120044118763a001420012003a722043a0007200120044108763a0006200120044110763a0005200120044118763a0004200120002903002203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370308200120002903102203423886200342288642808080808080c0ff0083842003421886428080808080e03f8320034208864280808080f01f838484200342088842808080f80f832003421888428080fc07838420034228884280fe03832003423888848484370318200120024230883c0011200120024228883c0012200120024238883c0010200141201024200141206a24000ba70303017f027e017f230041206b220224002002200141186a29030022033c00172002200141086a29030022044220883c0003200220044228883c0002200220044230883c0001200220044238883c0000200220034220883c001320022003a722054108763a0016200220054110763a0015200220054118763a001420022004a722053a0007200220054108763a0006200220054110763a0005200220054118763a0004200220012903002204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370308200220012903102204423886200442288642808080808080c0ff0083842004421886428080808080e03f8320044208864280808080f01f838484200442088842808080f80f832004421888428080fc07838420044228884280fe03832004423888848484370318200220034230883c0011200220034228883c0012200220034238883c001002402002101e0d00410041d8c10010010b200241206a24000bb90101047f230041106b2202210320022400024002400240101f22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20034200370300200241086a2102024020044178714108470d00410041d9c40010010b200320024108100f1a200341106a24000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000b4401037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b200324000bc90201047f230041306b220221032002240002400240101f22040d00410021020c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b20032002360224200320023602202003200220046a2205360228200342003703180240200441074b0d00410041d9c400100120032802282105200328022421020b200341186a20024108100f1a2003200241086a2202360224024020052002470d00410041d9c400100120032802282105200328022421020b200341176a20024101100f1a2003200241016a2202360224024020052002470d00410041d9c4001001200328022421020b200341166a20024101100f1a2003200241016a3602242003410036021020034200370308200341206a200341086a10461a024020032802082202450d002003200236020c2002102b0b200341306a24000bff0103017f017e047f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22063602042003200541ff0071200441ff0171220274ad842103200241076a2104200621022005418001710d000b0240024020012802042205200128020022026b22072003a722044f0d002001200420076b103a2000280204210620012802042105200128020021020c010b200720044d0d002001200220046a22053602040b0240200028020820066b200520026b22054f0d00410041d9c4001001200028020421060b200220062005100f1a2000200028020420056a36020420000bb20202037f017e23004180016b220221032002240002400240101f22040d00410021020c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b20032002360254200320023602502003200220046a360258200342003703480240200441074b0d00410041d9c4001001200328025421020b200341c8006a20024108100f1a2003200241086a3602542003410036024020034200370338200341d0006a200341386a10461a200341086a41086a200341d0006a41086a2802002202360200200341306a2002360200200320032903502205370308200320013703202003200037031820032005370328200341186a2003290348200341386a1033024020032802382202450d002003200236023c2002102b0b20034180016a24000b4c01037f2300220221030240101f2204450d00024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b410041d5c0001001200324000bcf0102047f017e230041106b2202210320022400024002400240101f22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a2102024020044108470d00410041d9c40010010b200341076a20024101100f1a2003290308210620032d0007210420001017200620044100471018200341106a24000baa0202047f047e230041206b2202210320022400024002400240101f22040d002003420037031841002102200341186a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370318200341186a2105200441074b0d010b410041d9c40010010b200520024108100f1a200241086a21050240200441787122044108470d00410041d9c40010010b200341106a20054108100f1a200241106a2105024020044110470d00410041d9c40010010b200341086a20054108100f1a200241186a2102024020044118470d00410041d9c40010010b200320024108100f1a200329030021062003290308210720032903102108200329031821092000101720092008200720061019200341206a24000ba103010b7f230041306b2202210320022400410021040240101f2205450d00024002402005418004490d002005102721040c010b20022005410f6a4170716b220424000b2004200510201a0b20032004360214200320043602102003200420056a3602182003410036020820034200370300200341106a2003104c1a20001017200341206a20031038420120032802202204200328022420046b101a1a024020032802202204450d00200320043602242004102b0b024020032802002206450d0002400240200328020422072006470d00200621040c010b03402007220441606a21070240200441786a2208280200417f460d002004416c6a2209280200220a450d00200a21050240200441706a220b2802002204200a460d000340200441486a21050240200441786a2202280200220c417f460d00200341206a200441486a200c4102744188c5006a2802001101000b2002417f36020020052104200a2005470d000b200928020021050b200b200a3602002005102b0b2008417f36020020072006470d000b200328020021040b200320063602042004102b0b200341306a24000bcc0303027f017e097f230041206b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042207200128020022056b41057522062004a722034f0d002001200320066b104d200128020421070c010b200620034d0d000240200520034105746a22082007460d0003402007220341606a21070240200341786a2209280200417f460d002003416c6a220a280200220b450d00200b21060240200341706a220c2802002203200b460d000340200341486a21060240200341786a2205280200220d417f460d00200241186a200341486a200d4102744188c5006a2802001101000b2005417f36020020062103200b2006470d000b200a28020021060b200c200b3602002006102b0b2009417f36020020072008470d000b0b20012008360204200821070b0240200128020022032007460d00034020022000360208200220033602102002200341086a360214200241106a200241086a104e200341206a22032007470d000b0b200241206a240020000b9f06030a7f017e037f230041106b220224000240024020002802082203200028020422046b4105752001490d000340200441186a2203420037030020044200370300200441106a4200370300200441086a4200370300200341003602002000200028020441206a22043602042001417f6a22010d000c020b0b02400240024002402004200028020022056b410575220620016a220741808080c0004f0d0041ffffff3f210402400240200320056b220341057541feffff1f4b0d00024020072003410475220420042007491b22040d0041002104410021030c020b200441808080c0004f0d030b2004410574102a21030b200320044105746a2108200320064105746a22092104034020044200370300200441186a4200370300200441106a4200370300200441086a4200370300200441206a21042001417f6a22010d000b2000280204220a20002802002206460d022006200a6b210b410021050340200920056a220141786a2206417f360200200a20056a220341606a290300210c200141686a220741003a0000200141606a200c3703000240200341786a280200220d417f460d00200141706a220e42003702002001416c6a220f4100360200200e200341706a280200360200200f2003416c6a220e280200360200200141746a200341746a22012802003602002007200341686a2802003602002006200d36020020014100360200200e42003702000b200b200541606a2205470d000b200920056a2109200028020421062000280200210d0c030b2000102d000b1003000b2006210d0b20002008360208200020043602042000200936020002402006200d460d0003402006220441606a21060240200441786a2207280200417f460d002004416c6a220e2802002200450d00200021010240200441706a220f28020022042000460d000340200441486a21010240200441786a22032802002205417f460d00200241086a200441486a20054102744188c5006a2802001101000b2003417f3602002001210420002001470d000b200e28020021010b200f20003602002001102b0b2007417f3602002006200d470d000b0b200d450d00200d102b0b200241106a24000bca0102037f017e20002802002102024020012802002203280208200328020422046b41074b0d00410041d9c4001001200328020421040b200220044108100f1a2003200328020441086a3602042000280204210220012802002201280204210342002105410021040340024020032001280208490d0041004183c5001001200128020421030b20032d000021002001200341016a22033602042005200041ff0071200441ff0171220474ad842105200441076a2104200321032000418001710d000b200120022005a710660b810301047f230041c0006b2202210320022400410021040240101f2205450d00024002402005418004490d002005102721040c010b20022005410f6a4170716b220424000b2004200510201a0b20032004360224200320043602202003200420056a360228200341186a410036020020034200370310200342003703080240200541074b0d00410041d9c4001001200328022421040b200341086a20044108100f1a2003200441086a360224200341206a200341086a41086a10501a20001017200341306a200341086a103920032802302204200328023420046b101b024020032802302204450d00200320043602342004102b0b024020032802102202450d0002400240200328021422042002470d00200221040c010b03400240200441706a2802002205450d00200441746a20053602002005102b0b200441586a21050240200441586a2d0000410171450d00200441606a280200102b0b2005210420022005470d000b200328021021040b200320023602142004102b0b200341c0006a24000b840303017f017e037f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22023602042003200541ff0071200441ff0171220474ad842103200441076a2104200221022005418001710d000b0240024020012802042206200128020022046b41286d22052003a722024f0d002001200220056b106f200128020421060c010b200520024d0d0002402004200241286c6a22052006460d0003400240200641706a2802002202450d00200641746a20023602002002102b0b200641586a21020240200641586a2d0000410171450d00200641606a280200102b0b2002210620052002470d000b0b20012005360204200521060b0240200128020022052006460d000340024020002005106e2202280208200228020422046b41074b0d00410041d9c4001001200228020421040b200541106a20044108100f1a2002200228020441086a3602042002200541186a10701a200541286a22052006470d000b0b20000b890101037f230041e0006b220221032002240002400240101f22040d00410021020c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a0b20032002360254200320023602502003200220046a360258200341d0006a200341086a10521a20001017200341086a102f200341e0006a24000ba20801027f02402000280208200028020422026b41074b0d00410041d9c4001001200028020421020b200120024108100f1a2000200028020441086a2202360204200141086a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001410c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141106a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141146a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141186a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001411c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141206a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141246a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141286a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001412c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141306a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141346a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141386a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a22023602042001413c6a21030240200028020820026b41034b0d00410041d9c4001001200028020421020b200320024104100f1a2000200028020441046a2202360204200141c0006a21030240200028020820026b41014b0d00410041d9c4001001200028020421020b200320024102100f1a2000200028020441026a2202360204200141c2006a21010240200028020820026b41014b0d00410041d9c4001001200028020421020b200120024102100f1a2000200028020441026a36020420000b940101047f230041106b2202210320022400024002400240101f22040d002003420037030841002102200341086a21050c010b024002402004418004490d002004102721020c010b20022004410f6a4170716b220224000b2002200410201a20034200370308200341086a2105200441074b0d010b410041d9c40010010b200520024108100f1a20032903081017200341106a24000b8c0405047f017e037f017e017f230041f0006b220221032002240002400240101f22040d00410021050c010b024002402004418004490d002004102721050c010b20022004410f6a4170716b220524000b2005200410201a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200520046a2107200341d0006a20054120100f1a200541206a2108200341306a2109410021044200210a0340200341d0006a20046a210b0240024020024102490d00200a4208862006200b31000084220642388884210a2002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b2009200a37030820092006200b3100008437030041102102200941106a2109420021064200210a0b200441016a22044120470d000b024020024110460d00024020024102490d0020032006200a200241037441786a1009200341086a290300210a200329030021060b200920063703002009200a3703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a2903003703002003200329033837031820032003290330370310200341d0006a41186a2007360200200341e4006a2008360200200320053602602003200137035820032000370350200341d0006a200341106a103c200341f0006a24000bc80303047f027e017f230041f0006b220221032002240002400240101f22040d00410021050c010b024002402004418004490d002004102721050c010b20022004410f6a4170716b220524000b2005200410201a0b42002106200341286a420037030041102102200341106a41106a4200370300200342003703182003420037031002402004411f4b0d00410041d9c40010010b200341d0006a20054120100f1a200341306a210541002104420021070340200341d0006a20046a21080240024020024102490d002007420886200620083100008422064238888421072002417f6a2102200642088621060c010b024020024101460d00410041b6c50010010b200520073703082005200620083100008437030041102102200541106a210542002106420021070b200441016a22044120470d000b024020024110460d00024020024102490d00200320062007200241037441786a1009200341086a2903002107200329030021060b20052006370300200520073703080b200341106a41186a200341306a41186a290300370300200341106a41106a200341306a41106a29030037030020032003290338370318200320032903303703102002200341106a103e200341f0006a24000bd50103037f017e017f230041106b2202240020012802042203200128020022046b41386dad2105200028020021010340200141016a2101200542078822054200520d000b200020013602000240024020042003460d00034020042802302206ad21050340200141016a2101200542078822054200520d000b20002001360200200220003602002006417f460d0220022002360208200241086a2004200641027441fcc1006a2802001101002000200028020041026a2201360200200441386a22042003470d000b0b200241106a240020000f0b1057000b05001003000bfe0103017f017e037f230041106b22022400200128020420012802006b410575ad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b02402001280200220520012802042206460d0003400240200028020820046b41074a0d0041004188c2001001200028020421040b200420054108100f1a2000200028020441086a3602042000200541086a10591a200541206a22052006460d01200028020421040c000b0b200241106a240020000bdd0103027f017e027f230041106b22022400200028020421032001350210210403402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b02402001280210417f460d00200141046a21050240200028020820036b41034a0d0041004188c2001001200028020421030b200320014104100f1a2000200028020441046a36020420002005105d1a200241106a240020000f0b1057000b170020002802002802002200200028020041216a3602000b170020002802002802002200200028020041216a3602000b7602017f017e20002802002802002202200228020041226a2200360200200141286a350200420020012d00244101711b21030340200041016a2100200342078822034200520d000b200220003602000240200128022820012d0024220141017620014101711b2201450d002002200120006a3602000b0b990303017f017e047f230041106b22022400200128020420012802006b41386dad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b024002402001280200220720012802042201460d0003402007350230210303402003a721052002200342078822034200522206410774200541ff0071723a000e0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410e6a4101100f1a2000200028020441016a220436020420060d000b2002200036020020072802302204417f460d0220022002360208200241086a2007200441027441b4c2006a280200110100200741346a210502402000280208200028020422046b41014a0d0041004188c2001001200028020421040b200420054102100f1a2000200028020441026a2204360204200741386a22072001470d000b0b200241106a240020000f0b1057000b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0b6401037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b0baa0101037f200028020028020022002802042102410021030340200120036a21040240200028020820026b41004a0d0041004188c2001001200028020421020b200220044101100f1a2000200028020441016a2202360204200341016a22034121470d000b200141216a21030240200028020820026b41004a0d0041004188c2001001200028020421020b200220034101100f1a2000200028020441016a3602042000200141246a10611a0bfd0103027f017e027f230041106b22022400200128020420012d0000220341017620034101711bad21042000280204210303402004a721052002200442078822044200522206410774200541ff0071723a000f0240200028020820036b41004a0d0041004188c2001001200028020421030b20032002410f6a4101100f1a2000200028020441016a220336020420060d000b0240200128020420012d00002205410176200541017122061b2205450d002001280208200141016a20061b21060240200028020820036b20054e0d0041004188c2001001200028020421030b200320062005100f1a2000200028020420056a3602040b200241106a240020000bd20103017f017e037f230041106b22022400200128020420012802006bad21032000280204210403402003a721052002200342078822034200522206410774200541ff0071723a000f0240200028020820046b41004a0d0041004188c2001001200028020421040b20042002410f6a4101100f1a2000200028020441016a220436020420060d000b0240200028020820046b2001280204200128020022066b22054e0d0041004188c2001001200028020421040b200420062005100f1a2000200028020420056a360204200241106a240020000b02000b02000b1a00024020012d0024410171450d002001412c6a280200102b0b0bae0201047f230041206b220324000240024020020d00200341146a41003602002003420037020c200341086a410472210402402000280208200028020422026b41034b0d00410041d9c4001001200028020421020b200341086a20024104100f1a2000200028020441046a3602042000200410671a02402001280210417f460d0020012802042205450d00200521020240200141086a28020022002005460d000340200041486a21020240200041786a22042802002206417f460d00200341186a200041486a20064102744188c5006a2802001101000b2004417f3602002002210020052002470d000b200128020421020b200120053602082002102b0b2001200329030837020020014100360210200141086a20032903103702000c010b410041a0c50010010b200341206a24000b870303027f017e047f230041106b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22033602042004200641ff0071200541ff0171220574ad842104200541076a2105200321032006418001710d000b0240024020012802042205200128020022076b41386d22062004a722034f0d002001200320066b1068200128020421050c010b200620034d0d0002402007200341386c6a22082005460d000340200541486a21030240200541786a22062802002207417f460d00200241086a200541486a20074102744188c5006a2802001101000b2006417f3602002003210520082003470d000b0b20012008360204200821050b0240200128020022032005460d0003402000200310691a02402000280208200028020422066b41014b0d00410041d9c4001001200028020421060b200341346a20064102100f1a2000200028020441026a360204200341386a22032005470d000b0b200241106a240020000ba105010c7f230041106b2202240002400240024020002802082203200028020422046b41386d2001490d000340200441306a2203420037020020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200341003602002000200028020441386a22043602042001417f6a22010d000c020b0b2004200028020022056b41386d220620016a220741a592c9244f0d0141a492c924210402400240200320056b41386d22034191c9a4124b0d0020072003410174220420042007491b22040d0041002104410021030c010b200441386c102a21030b2003200441386c6a21082003200641386c6a22092104034020044200370200200441286a4200370200200441186a4200370200200441106a4200370200200441086a4200370200200441206a4200370200200441306a4200370200200441386a21042001417f6a22010d000b024002402000280204220a20002802002205470d002000200836020820002004360204200020093602000c010b2005200a6b210b410021010340200920016a220341786a2206417f360200200341486a220741003a00000240200a20016a220541786a220c280200220d417f460d00200241086a2007200541486a200d4102744194c5006a2802001102002006200c2802003602000b2003417c6a2005417c6a2f01003b0100200b200141486a2201470d000b200020083602082000280204210320002004360204200028020021052000200920016a36020020032005460d000340200341486a21040240200341786a22012802002200417f460d002002200341486a20004102744188c5006a2802001101000b2001417f3602002004210320052004470d000b0b2005450d002005102b0b200241106a24000f0b2000102d000bdf0203027f017e037f230041306b220224002000280204210342002104410021050340024020032000280208490d0041004183c5001001200028020421030b20032d000021062000200341016a22073602042004200641ff0071200541ff0171220374ad842104200341076a2105200721032006418001710d000b024002402004a722030d00410021030340200220036a2106024020002802082007470d00410041d9c4001001200028020421070b200620074101100f1a2000200028020441016a2207360204200341016a22034121470d000b024020012802302203417f460d00200241286a200120034102744188c5006a2802001101000b2001200229030037000020014100360230200141206a200241206a2d00003a0000200141186a200241186a290300370000200141106a200241106a290300370000200141086a200241086a2903003700000c010b200020012003106d0b200241306a240020000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b4c0020012002290000370000200141206a200241206a2d00003a0000200141186a200241186a290000370000200141106a200241106a290000370000200141086a200241086a2900003700000b7801017f20012002290200370200200141206a200241206a2f01003b0100200141186a200241186a290200370200200141106a200241106a290200370200200141086a200241086a2902003702002001412c6a2002412c6a22032802003602002001200229022437022420024200370224200341003602000be70401037f230041c0006b22032400024002402002417f6a220241014b0d000240024020020e020001000b20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b2001200329030837000020014101360230200141206a200341086a41206a2d00003a0000200141186a200341086a41186a290300370000200141106a200341086a41106a290300370000200141086a200341086a41086a2903003700000c020b200341346a41003602002003420037022c20002802042102410021040340200341086a20046a2105024020002802082002470d00410041d9c4001001200028020421020b200520024101100f1a2000200028020441016a2202360204200441016a22044121470d000b200341296a2104024020002802082002470d00410041d9c4001001200028020421020b200420024101100f1a2000200028020441016a36020420002003412c6a2202106e1a024020012802302200417f460d00200341386a200120004102744188c5006a2802001101000b200120032903083702002001410236023020012002290200370224200141206a200341086a41206a2f01003b0100200141186a200341086a41186a290300370200200141106a200341086a41106a290300370200200141086a200341086a41086a2903003702002001412c6a200241086a2802003602000c010b410041a0c50010010b200341c0006a24000ba00301057f230041206b2202240020024100360218200242003703102000200241106a10461a0240024002402002280214200228021022036b2204450d00200241086a410036020020024200370300200441704f0d02024002402004410a4b0d00200220044101743a0000200241017221050c010b200441106a4170712206102a21052002200436020420022006410172360200200220053602080b0340200520032d00003a0000200541016a2105200341016a21032004417f6a22040d000b200541003a00000240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102b200141003602000b20012002290300370200200141086a200241086a2802003602000c010b0240024020012d00004101710d00200141003b01000c010b200128020841003a00002001410036020420012d0000410171450d002001280208102b200141003602000b20014100360208200142003702000b024020022802102205450d00200220053602142005102b0b200241206a240020000f0b2002102c000ba505010a7f0240024020002802082202200028020422036b41286d2001490d000340200341206a22024200370300200341086a2204420037030020034200370300200341186a4200370300200341106a420037030020024100360200200441003602002000200028020441286a22033602042001417f6a22010d000c020b0b0240024002402003200028020022046b41286d220520016a220641e7cc99334f0d0041e6cc9933210302400240200220046b41286d220241b2e6cc194b0d0020062002410174220320032006491b22030d0041002103410021020c010b200341286c102a21020b2002200341286c6a21072002200541286c6a22082103034020034200370300200341206a4200370300200341186a4200370300200341106a4200370300200341086a4200370300200341286a21032001417f6a22010d000b2000280204220920002802002201460d01200120096b210a410021040340200820046a220241586a2206200920046a220141586a2205290200370200200641086a200541086a280200360200200241746a22064200370200200241706a220b41003602002006200141746a280200360200200b200141706a2206280200360200200241686a200141686a290300370300200241786a200141786a2202280200360200200141606a4100360200200542003702002006420037020020024100360200200a200441586a2204470d000b200820046a210820002802042101200028020021020c020b2000102d000b200121020b200020073602082000200336020420002008360200024020012002460d0003400240200141706a2802002203450d00200141746a20033602002003102b0b200141586a21030240200141586a2d0000410171450d00200141606a280200102b0b2003210120022003470d000b0b2002450d002002102b0b0bff0103017f017e047f2000280204210242002103410021040340024020022000280208490d0041004183c5001001200028020421020b20022d000021052000200241016a22063602042003200541ff0071200441ff0171220274ad842103200241076a2104200621022005418001710d000b0240024020012802042205200128020022026b22072003a722044f0d002001200420076b10712000280204210620012802042105200128020021020c010b200720044d0d002001200220046a22053602040b0240200028020820066b200520026b22054f0d00410041d9c4001001200028020421060b200220062005100f1a2000200028020420056a36020420000b980201057f02400240024020002802082202200028020422036b2001490d000340200341003a00002000200028020441016a22033602042001417f6a22010d000c020b0b2003200028020022046b220520016a2206417f4c0d0141ffffffff07210302400240200220046b220241feffffff034b0d0020062002410174220320032006491b22030d0041002103410021020c010b2003102a21020b200220036a2106200220056a220421030340200341003a0000200341016a21032001417f6a22010d000b20042000280204200028020022016b22026b2104024020024101480d00200420012002100f1a200028020021010b2000200636020820002003360204200020043602002001450d002001102b0b0f0b2000102d000b0beb0503004190c0000b796661696c656420746f20616c6c6f6361746520706167657300756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f7200746865206f6e6572726f7220616374696f6e2063616e6e6f742062652063616c6c6564206469726563746c790000000000000000004189c1000bd904000000000000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e64000a006665617475726520646967657374206163746976617465643a200070726f746f636f6c2066656174757265206973206e6f74206163746976617465640000000100000002000000030000006461746173747265616d20617474656d7074656420746f20777269746520706173742074686520656e6400000400000005000000060000006f626a6563742070617373656420746f206974657261746f725f746f206973206e6f7420696e206d756c74695f696e646578006572726f722072656164696e67206974657261746f720063616e6e6f7420637265617465206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e7472616374006f626a6563742070617373656420746f206d6f64696679206973206e6f7420696e206d756c74695f696e6465780063616e6e6f74206d6f64696679206f626a6563747320696e207461626c65206f6620616e6f7468657220636f6e747261637400757064617465722063616e6e6f74206368616e6765207072696d617279206b6579207768656e206d6f64696679696e6720616e206f626a656374006461746173747265616d20617474656d7074656420746f207265616420706173742074686520656e640067657400000700000008000000090000000a0000000b0000000c000000696e76616c69642076617269616e7420696e64657800756e6578706563746564206572726f7220696e2066697865645f627974657320636f6e7374727563746f72000041000b04e822000000000000000000000000223047cba8950eb797eefed5cc804e27e1d3c87e26edd1cef8dfcebbb7a5486704000000033b3d4b0100000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f981010000000000ea305564b900000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG RAM_OP 0 eosio abi update setabi eosio 228605 343 DMLOG DB_OP UPD 0 eosio:eosio eosio eosio abihash eosio 0000000000ea3055d7abd75d188060de8a01ab2672d1cc2cd768fddc56203181b43685cc11f5ce46:0000000000ea3055d25ba1c27db2b0217ea5fbc63b42d330dd8054f0e17722ff462d10a28d102de9 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304003,"value_ex":108572,"consumed":8809},"cpu_usage":{"last_ordinal":1262304003,"value_ex":302684,"consumed":4101},"ram_usage":228605} -DMLOG APPLIED_TRANSACTION 4 e41d81109e4a8dc4047314d62359024ebeed02a9dfd119a5643d2e0d24b0ab5604000000033b3d4b0100000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f0100d00700008d01000000000000000068040000000000000001010000010000000000ea3055a5fdef6028771be2d334e6d1b22f2a968c33fd73f3a09d9c821e0dc85912ab691d000000000000001d00000000000000010000000000ea30551d0000000000000002020000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed3232e1130000000000ea3055d7130e656f73696f3a3a6162692f312e320117626c6f636b5f7369676e696e675f617574686f726974792276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f76301c086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d1a626c6f636b5f7369676e696e675f617574686f726974795f76300002097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d651366696e616c697a65725f617574686f7269747900030b6465736372697074696f6e06737472696e6707667765696768740675696e743634177075626c69635f6b65795f67315f616666696e655f6c650562797465730d66696e616c697a65725f73657400020a667468726573686f6c640675696e7436340a66696e616c697a6572731566696e616c697a65725f617574686f726974795b5d0a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431361270726f64756365725f617574686f7269747900020d70726f64756365725f6e616d65046e616d6509617574686f7269747917626c6f636b5f7369676e696e675f617574686f726974790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f64650562797465730973657466696e73657400010766696e5f7365740d66696e616c697a65725f73657409736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c651470726f64756365725f617574686f726974795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136110000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000c80a4fb7b2c20973657466696e736574000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f68617368000000012276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f7630011a626c6f636b5f7369676e696e675f617574686f726974795f76300000000000000000000000e41d81109e4a8dc4047314d62359024ebeed02a9dfd119a5643d2e0d24b0ab5604000000033b3d4b0100000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f010000000000ea3055570100000000000000000000000000 +DMLOG APPLIED_TRANSACTION 4 3f85fab5e452292e0748e331b3cc79601dffe12abc2a2b26c2638509e0cccac604000000033b3d4b0100000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f9810100d00700008d01000000000000000068040000000000000001010000010000000000ea3055a5fdef6028771be2d334e6d1b22f2a968c33fd73f3a09d9c821e0dc85912ab691d000000000000001d00000000000000010000000000ea30551d0000000000000002020000000000ea30550000000000ea305500000000b863b2c2010000000000ea305500000000a8ed3232e1130000000000ea3055d7130e656f73696f3a3a6162692f312e320117626c6f636b5f7369676e696e675f617574686f726974792276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f76301c086162695f686173680002056f776e6572046e616d6504686173680b636865636b73756d32353608616374697661746500010e666561747572655f6469676573740b636865636b73756d32353609617574686f726974790004097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d086163636f756e7473197065726d697373696f6e5f6c6576656c5f7765696768745b5d0577616974730d776169745f7765696768745b5d1a626c6f636b5f7369676e696e675f617574686f726974795f76300002097468726573686f6c640675696e743332046b6579730c6b65795f7765696768745b5d15626c6f636b636861696e5f706172616d65746572730011136d61785f626c6f636b5f6e65745f75736167650675696e7436341a7461726765745f626c6f636b5f6e65745f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6e65745f75736167650675696e7433321e626173655f7065725f7472616e73616374696f6e5f6e65745f75736167650675696e743332106e65745f75736167655f6c65657761790675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f6e756d0675696e74333223636f6e746578745f667265655f646973636f756e745f6e65745f75736167655f64656e0675696e743332136d61785f626c6f636b5f6370755f75736167650675696e7433321a7461726765745f626c6f636b5f6370755f75736167655f7063740675696e743332196d61785f7472616e73616374696f6e5f6370755f75736167650675696e743332196d696e5f7472616e73616374696f6e5f6370755f75736167650675696e743332186d61785f7472616e73616374696f6e5f6c69666574696d650675696e7433321e64656665727265645f7472785f65787069726174696f6e5f77696e646f770675696e743332156d61785f7472616e73616374696f6e5f64656c61790675696e743332166d61785f696e6c696e655f616374696f6e5f73697a650675696e743332176d61785f696e6c696e655f616374696f6e5f64657074680675696e743136136d61785f617574686f726974795f64657074680675696e7431360b63616e63656c64656c617900020e63616e63656c696e675f61757468107065726d697373696f6e5f6c6576656c067472785f69640b636865636b73756d3235360a64656c657465617574680002076163636f756e74046e616d650a7065726d697373696f6e046e616d651366696e616c697a65725f617574686f7269747900030b6465736372697074696f6e06737472696e6707667765696768740675696e743634177075626c69635f6b65795f67315f616666696e655f6c650562797465730d66696e616c697a65725f73657400020a667468726573686f6c640675696e7436340a66696e616c697a6572731566696e616c697a65725f617574686f726974795b5d0a6b65795f7765696768740002036b65790a7075626c69635f6b6579067765696768740675696e743136086c696e6b617574680004076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650b726571756972656d656e74046e616d650a6e65776163636f756e7400040763726561746f72046e616d65046e616d65046e616d65056f776e657209617574686f726974790661637469766509617574686f72697479076f6e6572726f7200020973656e6465725f69640775696e743132380873656e745f747278056279746573107065726d697373696f6e5f6c6576656c0002056163746f72046e616d650a7065726d697373696f6e046e616d65177065726d697373696f6e5f6c6576656c5f77656967687400020a7065726d697373696f6e107065726d697373696f6e5f6c6576656c067765696768740675696e7431361270726f64756365725f617574686f7269747900020d70726f64756365725f6e616d65046e616d6509617574686f7269747917626c6f636b5f7369676e696e675f617574686f726974790c72657161637469766174656400010e666561747572655f6469676573740b636865636b73756d323536077265716175746800010466726f6d046e616d65067365746162690002076163636f756e74046e616d65036162690562797465730a736574616c696d6974730004076163636f756e74046e616d650972616d5f627974657305696e7436340a6e65745f77656967687405696e7436340a6370755f77656967687405696e74363407736574636f64650004076163636f756e74046e616d6506766d747970650575696e743809766d76657273696f6e0575696e743804636f64650562797465730973657466696e73657400010766696e5f7365740d66696e616c697a65725f73657409736574706172616d73000106706172616d7315626c6f636b636861696e5f706172616d657465727307736574707269760002076163636f756e74046e616d650769735f707269760575696e74380873657470726f64730001087363686564756c651470726f64756365725f617574686f726974795b5d0a756e6c696e6b617574680003076163636f756e74046e616d6504636f6465046e616d650474797065046e616d650a757064617465617574680004076163636f756e74046e616d650a7065726d697373696f6e046e616d6506706172656e74046e616d65046175746809617574686f726974790b776169745f776569676874000208776169745f7365630675696e743332067765696768740675696e743136110000002a9bed32320861637469766174650000bc892a4585a6410b63616e63656c64656c6179000040cbdaa8aca24a0a64656c65746561757468000000002d6b03a78b086c696e6b617574680000409e9a2264b89a0a6e65776163636f756e7400000000e0d27bd5a4076f6e6572726f7200905436db6564acba0c72657161637469766174656400000000a0656dacba07726571617574680000000000b863b2c206736574616269000000ce4eba68b2c20a736574616c696d6974730000000040258ab2c207736574636f6465000000c80a4fb7b2c20973657466696e736574000000c0d25c53b3c209736574706172616d730000000060bb5bb3c207736574707269760000000038d15bb3c20873657470726f6473000040cbdac0e9e2d40a756e6c696e6b61757468000040cbdaa86c52d50a757064617465617574680001000000a061d3dc31036936340000086162695f68617368000000012276617269616e745f626c6f636b5f7369676e696e675f617574686f726974795f7630011a626c6f636b5f7369676e696e675f617574686f726974795f763000000000000000000000003f85fab5e452292e0748e331b3cc79601dffe12abc2a2b26c2638509e0cccac604000000033b3d4b0100000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f981010000000000ea3055570100000000000000000000000000 DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":3,"value_ex":82933334,"consumed":9952},"average_block_cpu_usage":{"last_ordinal":3,"value_ex":401659723,"consumed":48101},"pending_net_usage":8808,"pending_cpu_usage":4100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1050675,"virtual_cpu_limit":200400} DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":155642222,"consumed":8891},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":432479225,"consumed":4499},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} -DMLOG ACCEPTED_BLOCK 4 04000000040000000300000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000000000003000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf12d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888be03e3647461734768c46c32b8795974eb830455e9c28467caefd7af2321c85310300000000000000010000000000ea305504000000010000000000ea305503000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000000000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980f033b3d4b0000000000ea30550000000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf13a11ba5589049aa9c0a1c04fa2d9c16fc411bc7cb27f891d81f49284e0d25654680896d5c376d2a5b78bddbaa4758085e15f48a6efa0915c9a90fa4a17a915ad0000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb700200cb8c7a6b1ca4094f2c5b2a06f52edfc6e0a53a454d2d7dd4728fe85700204c9208d26cf966ec66da3a1e7579939b364f3f95e3962c3eb64c2657e2ea0ecd4c70000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011709e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b468dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4058cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb798c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001033b3d4b0000000000ea30550000000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf13a11ba5589049aa9c0a1c04fa2d9c16fc411bc7cb27f891d81f49284e0d25654680896d5c376d2a5b78bddbaa4758085e15f48a6efa0915c9a90fa4a17a915ad0000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb700200cb8c7a6b1ca4094f2c5b2a06f52edfc6e0a53a454d2d7dd4728fe85700204c9208d26cf966ec66da3a1e7579939b364f3f95e3962c3eb64c2657e2ea0ecd4c70200d0070000c0070101001f206b49cc87094cadebbaf9c25c1816b3a8c0aca59ea337e51205e3c6ff1c023c57b0b609b62bdaf65d6a7e576a329415ac900ea1b86b6c5441eb32d498d3e6ee0100cf3b78daed5c0b906455793e8ffb9abe33bb17586198dd84dbed1807041d60d99d20097b27c2eeca538286bc9ced9d6998e9796e4fefcaa6ccce1a366635a6ca242602a612b030086635859665b4ac5a8854a93115a240492a26e6516a341a524945638c9bfffbff736fdfee99c1c501b42a0e6cf7b9e79ef39f73fef39fff7d3afc87f8f556bdfc917bbea1e84fe3437d75f4b5f4b9eb256f7de89172857aefd72fb9e4f89f96aafee7035ad597e751a3efd4e7ee536a9f595951fbec0a3ebd23f4a757f6297d649fb772e40855f92bf8a33a2b5fa6f83ce2dea97d01ba71bd3e42f08ee49008ec116ea8a946af3060f4a517049d8795562bdc458019aa31bf1ebcc436160ec553fb276e9d59989a98d9b15d59d4f4371697671627eacbcb8d565b69542593075badc6427ba2d5986ccc1c6ab494876abfbe7f919a289407a4fdc4f274fd92cb7628c3b03b75174b4da9d565175f227589ab6bcd2c35e6a72ede312ad5411952df04cd677aae3d73a9f2f1ec75400665587d3d40629af022cd7762b6715805a849971bed89fd738b93b393d3f5998589a57aab3edf68375acb549c9c6d4cc98a83f9c6fce4d26115729fdbbe579f08cdce06e8a5d6e2d2e272630a85a98393d446f531567314b667e61b82be2d005b9f6c13424bad1954b4d49a59682f4fccc96ccecc51545a4d85a1d2ee2db7175b0ddebe98ab5a8d030767a8a67eb03dadfa51b5492636736866ae711bcd76009567a1b2d5585e3cd89a6c4ccccdcccfb497d526bc3977ed754c346e579b0b704433f5b9995fc18c798a672db51abc967abb31716ba3de3ed86aa88451296b91872d33cbf9db89bcf9943a43e8809e171726a6eaedfac4328156677235c19d9a28bd130c9d51a6d289c9c5a9863a0bf515c208f00a7cf0e60d50c5c1a5294c0b755b3ae89da605697bfd75ea456724ea8c2449fa93c8246747263a476b1de9440fca5f249f5a5309e5484511b7a07ff830918e0cfdd197f67cbda407067cab950eceb62b3a3b7a52c52b2afbc7478bafb04ffbf5a5a5b9c3ea27faced42ad371ff2ffce22fbd7e62dfe454a3393b57f98b7bf5759e4ace8fffd3aa54252f4f5e92aa54bfc6db357ef4e87f3ffec0b1bbfef6ee95d4d033aa932b7daa3ef1e46ffddebb1e786da776575efbbebffeb4ea5467a83efa9587be7ef273bf598231ee5a7fe4a3ff7e73a7f667a8f65b7ffcf867df7befe71e2ec17815c338faf827defdd478a7f62aa93dfacd3bcbb5bba5f6fddffebbafde571a6f8f547ff89b4f961bef45ed47feebbe77de5dae7d35b73df9bbdfee6a7b0d6aef79f2e97f3951aebd81dbfefe5f7eedf172ed6b64b4bff993773df9d1d2247e96ab1f7be8831fbbeb924eedcdfef8db1f78eaa92fbcedaeaec6aff553250b3cf9d13b9f503779bb327e7eea731ffcfaaffd9b4aaaf1aa3fbfd43edfbe2e541084377543c8547249dcd276c5d0a8032a539ba92a5323e66df49c25876aba59333be8496a8fedaad95435b3cdcd6ce9404deda00aea68b2a49daa6bd09dcaba89f6a9a64255c7f45aef52d9ca6ebccdde7e52253a4e6d6c54bc43eb9517d318b3357ab3c3f453671aa17fc4a80ef8a3bb508b613275a502dcf8526d56686a3a555babdaecb2043f79694d0de84c55658e59cd5c35a053738652fd2a8e531507a0ea91d82796a0dc670593553bedf12cbe5e26f245355bd3c384389afae7152d22e2624225af28e1b54a4687f831d5237845339e4d3651cd17557358c5ef8e688640e70841a00faf6666b3f0d5b2fe8769fd5c5935716aa84f946c1e4a79e55e1631ae3dd436ab360741bdeddabd6de6957a7b45effe0df54e36d47bcb867a0f6ea8f7b60df54e37d47b7843bd4736d4fbc20df51edd50efed1bea3db6a1de576ca8f749d5dd5dafd7dd94ba9ba2fb23d45d7fefeebaa73b3aabf8dbdaea157384f9cee86ccd32dbc158493389c655d5cb922a189aa1b24f2c0e2f52d3ac0606fc9660ee1d50a93f1ebd39f5d2e062a58ed5bcf1b1e3c7aa3ebd5ba179a51ebdab7afdc27f337d35cfed01e1bed473a725d694f7dd69158603bf6f561546c7a831b3f29ac95262dd022621309de12df5c778b69dddde4cfa688e51f37c4b3d538b2f0f03793ba150f078c4f589d4883f12eb7f27692b64437858fed34ad66fe900420e50699cf8f2207dadecb4090da3085ccdc3942d03641c78b44448b7bbfff543dfb89844808214d9c3f3a31ec9f61ae17b34b5b2f0938f88d84969ef46f19ee7925c26f8f112f31a6ef6d63f4733228ce4829ac22412c2c948b3e6a34ceba019d682bc3cd8ac85ae9c5a80a52dc41320a78664422dc2979746b3c9c58428d453275a0b5a05f29ce4cf219036e6a09d6f4765e5dc66846866da3dec30fb64002582c335895a3bcc14154900f12e263b86044e54c69143a4839a9c5df37798ed8c4a6a99dc8c2d1d3f4268d56fa48f5f7ddd569a0370a678d06217803fea7821ef821d31db6a065fe90dd4dfe04d425fb25b197735a9ec2ad1d3202d605b3f76828a6ebebc1c4b3c2cd91903d0beaaca7baaab0620b85f16cb488335ffaa01d51997e86a378e415511480b7d65ba896da76393b24a016230806108066d81022533a42abe31d96d0c9f067c9a65f7b1c0f6e5e712fa80a9d2b487654c8519d0e1253183ddf5f930d0b03e91ff081483ab49e9a02381596062fd86740f7abe1a73a44a4c2c608a93ffe8e8d02c935acdcf568477fc07c814e8f1b337797b0750485e5a0d335d8d504bd815cd68b6160e53fb2a9d294d94e327b52121da4088d6d16800c48fa601e1da551001e7a5112919cc3f64d52d7bea137c4a823414e20aa186784656989dd7d508f45fed2338c4322a843e62a6a997a5d48d78474cecc4e7035d3599b0937e6662dcaa591de0e5fbc246fac1c5e27480b958cc5cac9fde1117f3d3185c2c9653eae75cecc38ff20c4cda0f2233795fe1623e94d126f3cd18c3d20e808b790517f3732ee68607d7221018b2c3c8f858d2347082484bc620c09a0c19a715bc485153416f7a18910726eab474cc2be0db5c95744ebea66347d417ec3029be70ae083cf816bdd996d3dab69acf1c87c80647cbc7cb84bee2e268a5f414e06881be8aa3d5c7e339645b22563a570431c239084909e6c3cadb232050efcb1960fd350de23b8d35c49ef914a4c49dabc4218699f383a72ad9868f33b334bb12c3ac4138e8d7b832d522073ce183fc1108330cc00ca1efd0be145882ee45cf49e79910e911eef90125266b564d0db68e079011ff50e8d1663736598c80bd8db0f2ee812d83ef3825dbe3bd86fca5798143d26ab68f83024692173354e5d8a02236e8830dfa051b2402027ff8acedc86dc20cb10616f1bc929abd429d233a3d3f7ae3e9f12b9405371c1fa192e1d228953497c6a884ee96db9d85d2fdc40ba24397abb3f9ac27547a119706a9b4059da8c1e52ae43ab40b8a767ed1cec31464fcb13763e8378b5578f4e42975c731aa1874155fbcf20e5613f8e9e9f3ee388697d1713c7e6b335e0da2fc9d903b8d50f9bbf60e9ef6b163c7e4e4d130c9f33ccc202308483b834b40e4995c02fa922e334bcf66e709233dfe48a184811a8927a425252c652230bca3a48bdd6db5bfe25832dee383b0379b0dced37610f308b2f73df1e0133885d9832854c3bc2d111937f3b2c71f7ce202629074ba89dfb46b21b1e560efd65a88e9100757ac8b11471d9c4b2e806aa4591a40048046213506e76a64ff691c4f85934eb366ba87151a4823746fb28e47cc3770b6a54c3714e1133549d054b5854d4e62c8c328a434c9285a0e04e8935e2f916e579c37689754cd43e3799a754892a361eab1d0e4211d4a431e9256440aae4a2ea2b7a1687b3e8e9dc26c3d684322800902310c9a51881985e849422b17cf1aec4783fdd0f230122b64a8f4a8327ecc582fe744099fb70c0b62e94e439108337039c8ac810e31c76bfe6ce61f3c510d58ea68d2f3492686c7211f6fc26a0c63c2edb99f4fd03806019600139ab92a23f71921656fe43e61b672f58071a0f934f63793d70d310b6458a43cfa0e9b8c3fdf6193d0488bf241274423c9cfa958541c487692f4d70db04e9886b3c9e5ae236b50697803bf214e0e7a8e45f9f2e40b1300746089ce6972cb10cb45e260ff64ac9fabde82d16e6c6651d58a03423c098c4d2035aa05b3d9c8fc896ad84145085484820a9e74c0ea0e3508b019d10962afc1454ad5fa327da056d94aa4031457a1adc50011778140afc19a4da394da1f4a2b5b6749c1106dab6fb61a41b4cdcaf811f483a8bb734c9a36b6071a7bc0aa21f04a628e8e0abdc301912620552bc8f4404c7c1481bf40f01708fe681f23de87a070df1c7fc469484ea4505b2752883727af2c907ca7e96229919c52af666753bd97f143d3ba5ca99c231193b16255ae100b70aaa3cd1911f00f2eb472ed80ce4ed15f08bb15ba2db11f32d0be4b5556988f01f3b19833311fcbcc0708304c31c479c4a205f3203221fe50b59db9b83dcde78013d961879a069a65659086d883e30906c54c954f742ce73e126308c7dfe333991fefcd8e55dc61d8f2b325f2eb38d198bcacec8b8789dd0f7d8e783ded32198537110ec2369da453ea40eb72b5b9c483d52abeef61fe06fab22eb17ea882985ee04cda82ba497a30e10226a94375b04e828c173ddbcf95a09700a2b799eb169e38f044bd00e348f60fd137acc754336373c44112e703d6408be8e81050a092739e63554215aa842a540955562594a812aa502554a14aa8ff7faa0451f3b6ece30fabe4c788607f2afb1897444988ffa05bed132fb1727b65b0577894bdb26eafb41bc27049f64abbc1d8dbe3f68a4af79302217ba5a106f35ea1247ba5b1991ef60a75b257793bbf68e7e5f6bd05126d2f126d17126d37126d0989b684445b20d176f68a87499ee761061941b25728c95ea1247b45164332cc7603edcefd3f52ca7fd8947293fc3873cccf3f2cb6ba6cd49f695de81d1dc70a9990e7d5bc01e7f78b20ae444bf09db38428fca8b79755c2978a2823a4e79e1002c2cf493ae400b8ced424bc6640c71d9f057c03e235132708345eb627bdecf60359b4bbecdfb0455b91e8afd2105998b64c3777449de6d46218d03f02b206904f19a189d12e9a108a709acbb3040a27efb07cc1bf42f54d783a479c5f9961953d5eb0b846e0101931c35090d83799ef3e13095cfec36c2998ddcfd4ef1cf4d3793ffd0cfd5c87b37b3af0c43336ff0a5a665f4ed44cae1e12bf6754639726afaf5f3c9bceb17e4a3bafba0b3f8c8bf2e759d115a12bede569dcf168578c82147418233265d681ad285984a853a4b79bf68963d89a2c84511054c1d48eea03b9cecfda932fba94218385c5156c1318a4b9d5e2c1d8c59734942d24d3f0ba01897cc81e7971aed305b3c01aa9be379410a79ce665a07b75b43ad26425aaf29031961040d474543fa7e474b37cdde8c86987b945f667cf9ac474b36cee27550f19311cecee2ee93d464f8fb1936e0cdbcbdbccfe44d48a350e0aca430ae2ccb2e7db1b6bbe0443f44e0b0a976809822c23ceb17ebedd23502f159a192bd1cc1539cd1cd5209a6b37788869e14f9ce48553e55f69e3c906fca0597c89b7f73076a2e2e2d0c1bd1ba4f622151261430387fb46ed4e0673b6ffa0a10579b9a6bede8206dd8206bfdf050dbacedf6b41be1356b5d5ab4a9a503fa46592b74c7a1a45a54683397e06d7117cf0e10682238e4e256470d3d760b58f51d547667a9806c9b9cca36845f75a1d777372301fc65411b7f11d5610d7f07a621ade30db9cbe3b7664a76d91af44428d747e06e5fc44b904e765dbe4da219e91f0ca646c9c4f618a4817715a320f9321c73b53a66f813acc1e26a957b5a01459f2888705882c053c47b8ae08e1fb9af0fb01fdcd5a842495150476bc6cae59eb03840a20571ce2979ab5988df7b422fe102fdb536c5f533ce2fd02c18af37b4f33edcf4c3b3bfea8c2c13f438344b2151c7a9f88b3220e8db48f1d40707654f8158e7224cd64d2ecdfe7e8ab157f865792109fb1ecd8ef2b69cae204e19033879a257eba96a8b0314e0a68427c05e2b22081c0a2c26751e14354c0fe0d41cd96dd31bda2222cb9e86a01d4672bd2029e96e43a1113708521487a9dc46a6840bf4d784f43e74bacd97c432c10da576c88c5865430408c0d891132a74ada106416d56c1a5fed1c307b9aee1df5f7f16e40201809e3d0860cf46e882f980e685db1c376c5798ffad3985f01db7df9864462f8eb3402aae81c154e079baf84a3a391b89b92c205b9854f311ffae47a2611f4c8dd08ce71fd4781ad74fb523a0e27f1a2c08bed1fcc7d4e88b8d4dcc9f1dc178d9297a2667ea89404959cb35c3c2665d75411c174cea17c2b8926c20cd606fbca4f9d3a7525ce3f53943f4b3be61f84af0a8144f60bdbcc3b580305857bb73af90c22b4f02b7b391c8bb2df4e2e60fae3323c7f202c50441f3b8a8ad50c36d75f17d652f54afe2dc650459610c0771ba495d96a2ce780f89b4fed401c816c670515203b890d6a76678beb4c532d6283cad153899a34486f9338aa356873b3a0771313a573b86f16b2dd54f8dfdba0405a9e763540d674de3a4807a4950062d8e0083ecda2e6d804cd157c5a142f76d10df45be78343fa1bd1f0007c7691f8ec3cf1d9f589539e06705e5ce17b41ceb7c26ebe87f9d62448cfa930ccf7360bdf5325bea7f3fecc6afdfc98458eeff9bdc7cc0ac27595c308bca04dcecbb8599209386210bad3980ec8c118c04c06f0c6b9613fad591f94f59be2e841bfb4ee74f4ea6eec3884a8ced32b3a6e3dd1970586ceb9a65f28d8969de465aea9cb5c93195cc13511daed28d81eb8260b7f10a8e50087704dd68dfdfb935be33759b1934eaae74cbc0ecb575a8857511f4b4938b919b22a4b406c18cfe91405b60455c31dab05fcebc65c3a8f3a4be627d17b54c4f37688e7ad2277474bd2797b493a27acbde6d2790b758439951a279d1de1316971e008a7c72fa4a397dd924bde5b9ab413993e20adf6a10b278654396a920bcf4484a7011776c2f3a4248758e7bbde887d6556db579ed8576efbcd9af6552074e7c1474ec6169958e606673af9b3c9a2d05ad02f1aa3084db8bf47e6e07f0e72d776e0f0c4d640003cb155c10641003c196e54c653d0c193215622a62ccb348e36f924fb3a8ef4a0ec435f809a233950ab4e9a71270d1ef49c7c0cd716f114f6a12f153ef4408655f15b345b2cbde939cf8789e7ac3322d99b721aa6f22bf24c8975327dafe9b5588d84a04f2fd377added0c94f2fd3f7d9f54e36d47bcb867a0f6ea8f7b60df54e37d47b7843bd4736d4fbc20df51edd50efed1bea3db6a1de576ca8f7aa4cdff5ba9f66a6ef7a277cad4cdf77fcb0f8bcc98e670ec69ad1db3cdf6351e6722b9e5e8799ae391dbf673a3ea6e30b331d679f419e5d982555496a2ed4f122b717da05c3edce2bf4911f183ad6eb4bda0e5227a0f2837efb5c3e61854db8c7249f50a66824a1af827cc2208d399f30e07cc20a2c69126e69807c42c9c18434eeca27ec4b2b40645fde379f7e1fd8641fd6856157e5139a3c9fd0e459d16445d0436f5674c539543050004cc878e2ba118bb39c1fec90d693256c5d96f0a094244b98bd8504201457e13f134e22f115fa92b9ab77da5bc44d786321d39266724591f5fa496bbd3c80f64343095d24c07befbbbd0fcb7b1f95f73e94bd8f4a7b1f9ecedefb6988bdf7f3bef9847d76a5b9bd0f4f6befc335f63e2cf6de97bd97f136bef7eec6c04f173bf984b6b63b5f4ad4475ba88f63f32724f348719a98dcd24a7da458f82e91264fdd92d47067c7413d0f4eb065bc7e9f3cd73bc873a10cfb36d846a04a32f3bef3706ee609a354e0b3dcd52311019ba03b5762332744c995adefea67ca1d41bed70f2a77a4a3f73a98e1da30fd1e2550ac6e1f5ae5cf0fe52962013295a44f7f57dac817347bef4c39754b5298f465b05ab04db26a0fabf6d65fb55d6bd55664e0ea55dbee5527b963c313bb2a8768d786a87b84b25b73f2cb433d9b7c8e1004fb148434aa48ac5bb7fe90d1b971cf360d67da65b566cdf950469a9719354ea58bd43019335b39d749817655872c24872f4f461c211318cd6b1af9671abd6a9cc284240ec5a3c677d9cedd95d55438f6c26630e57418967398d2f032332a995dcf38fca6d3197ed3fac3e7a73d64d37df5910fe94cd391ffd023c5910fa144fa5d169357dc9c5a7d587ad4311e38049b087b53aa8482a6b4d8e6422bac98c19f089685a437afa4c3ad5eaf1149d6b35831d7f91464551ef30519e441fd028c42045eed568cd701657b40b9fc5eb28492fa50fcbfabd9921c08247e5a1c248b8374a2ea5c68f605e2536e063e66e023ff34d82a0e22f8e95888a5c156f66dbab152fffa35c75a23d85ce2ca9f7d26a9f4c28a24d7bd337e2d209decfa3561ad15412fd664f8ff21e689c23d196f647e8a2b287ebfcbda48f9ee9ea8601c7cd952721f9a7ef1017aad0ebde65e92b52d38c94c5f4b5e78c96d43dde287b30ef8f28ab8765dc05ce519c80a9e67bc51f03c7b8c8d3c4434d8e4d7a292943dcf9eb8944d55e59e2ef1ac19e7f08ac457a6d99cda993be113c9a9478c94eafad9febae751a7c5726cf43724f0e6ad12dd2f64e0cde568849052ab036fd32e3fa32bf0064b6c6c0e813787551f58b5ee4e582d6078257f3e5e138beec1aa0ba0589a59942b78454ccc2fc5c4f2ad4b6d3233d44532c15a667700fc6ee76d5c657923fd01107b526feff5757f77bc6c75c46c6cbe13311b958899918819aba96cd19822da648a689329a24d46a24d52ea8ea78dad114f2bc5d17867388ef69edff9d4f00d033abb8fbe4b6134b4b0d96f7feabe3391f18dfdd1ed3583681ad43c36d7099cd13ebac01976b41338fbbe1605cce4a5b1aeb05a718f260fadf125cdb5224de2ad762137cd2137164e9d901ba2b02ec646402b78cd74d7df15ae6555c32f02b6ef7094c7a1a17e8999c57c4d831abdb1f90aad5e49aa08a41f0197e8523e3b7721c04dd25dd2e0693983ba143bf6f2d831d3ae0b8b19091cabde13a0653d80eeee80c4a59b77429d798afcdfcbed3b9be7526c8c5784ab7985155e61855784bdbc027c416e0ec89d9866474686bb7b8f6028f7457b8452d8ab6ab8bb83f4e8f66ca4c9f1b05e34c99d27e5f8eaa8dc0c44c09bd6248156cecd13535915379792ce7324517379eee77b093450320f2c8f0a0fb896e326e72bd763bd1154cf08aa67047e7e6e81ddaef50a83332e5eecc0399aed80cbdfe7e0f2e71c5cfe7c219e2f94c0ab5c0123d8c33bcd706a707a5db6a18abfec4950e5a42a09749c68c36c579e3719a55dd85ceef5f25188d80d5328f566f71a82ddcf33ae7ab451e74fe92291228f63acc959f5ab4884452f234f1724c27a4637dab9aa9b50b8aa9b565c90d2918b11815252612e7cbe964ba0ce2febf16bc1f156c111e689dbf235932c0c3d3b9c3145f02f20e42436dc85bd329595b0675663cfacc65e87dcf26b843d7a90c450efc165cb529e3e503dc8c4881f5b6062e64c57a1b81124c220006c6725360ce8b23b264fea58ba61c038c764e51a66c1b881093220e4b5449f812cc32f0a05240dd9ee7017bda881bbac47ec1f895e3e734f74c6cd4fbe25cd97a23c9c056f805380441a896a8c28296bc6c01c46826d91e784a81dce06c9f5677a97bccce56d14ccae7c6e0bc43d27f025554e4b7e88a03311959917bc25173ea933a149b7bd50c5eff17565658d9b6bd9c87ce7f25a4af497670b45cd9a5772e98a7eddc9cfcb73ede5a26b972e34b2c6b537b7f5c5e5378977f3fdb72f7fe6ae4b9158f425fa2edd80430b933df4a5cf9c7b1a77e0b291b9e21a1ca2e355b9b7813879242e937ce66973fdd5d852b2d448f7a539c6569fbb34074f9e4efb66ab15c73f22243a9bec16dc50ec4359a3ec3b7e1db804cd3cd1c7200528c82fb922a730730940c810728d6249310a8a3ed34dce4d726e63432a4aaaf3a443f18ced7367c817d041d735da0a274ad4e4a26ac42e767793dae5d174aefd6a205221f050baf717395f5a6a72a7a8765907568c48e436317f654b0a5907961b95b30e7427ebc056f997719c1e9fff9ac70f6bb2fb81172cd9fd47774cd7bb631a7fcdb7fc5373f1e15beb33738da9b4bd98d6e7e61627ebed46ba54bfadb1ac0e2e346e5f6a4cb6e965a3d55a6ca5330be9ad33b737a626f61f6e3796d3c9c585e576ebe0647bb1a5dad38d7471419ac9cf42a693f58585c576babf41a5398c3035d32268738755fe97bde561153fe5b927fc8c24c16bd4e7d37abbdd985f6acbacded09ae1292db7538cd258985215e57eae9260d24cdb69f1ab9597a76aa9b5d85e9c5c9c4bf33633cb2926d2f9654bf9f55843ffecb31b5761ae3efd0be8dfe2fe262d070d96a503356fd509191328cb9884b1f98373ed99899985a9c6ed4af083dfce9c59b8ad68af1ca626e9058d287097d1b75ddf3f4715b7a6757a3fdd6801e5ed162d64f5e0f38b5333b71e5e675c37806b735a03c8af73b6f25d9c9cae2fdc46d868cdccd75b87d3d9c6e1f40dd38d050712aba92f38c0eb2214ebeec6e76d8db65221e132a27f7df4af42ff6285df24546a66e1507d6e662a3d546fcdd417b0262ce5d910251dbbd8fb4a8d60fd1f1463f68300d00700008d010101002034db56c5bd909a835b56443cd98437bc164ef1c1e75129e9912569e6c833dd4e64bbcc9649553a8594d9d6265653ce3bfba9c88d26f893287365bd8f631f03770100bc0878da8d56bd6f1c45149ffb3edfc5568231c611a208a28944c85d9c9395ca14341420f15199b0ccedbebd1dddeeec6666f6ce073505d05007095908410a574e416428a2ab9090900844484041e84082bf8137bb7bfbe5f8f0147bbbefbd79f33e7eef77d37ad47da746aecc0ffe25b82afa41febefa96feb9671ecd0b823bfff4fb8fd617925fd6d7c097ccbf71830ed98bbd2bfdcae6d0f5cdb121d988333e3268a81c5f3035bb34a18251ae8c53f4c6e4ea336d746238543aa4daf0a71c449d530fea5ad2351d30c732f4fad7076d6a2a36a10a4865cd06aa420186c5462055de6a25754dea2bca11201ddfb59a21e3ea5abf3e86993c870f630a6ce4a8bd9be8d4f443aee45600c2631293e2860b13705393c694322557f533955d3c3d1d523dc3b11bd17ed3a18c1b011598ae0221c985758fee27a5e2a08c50d211444e06db171515235065ad11982a39664b6f568272a92b8579145d5ceb3f3ba4123780586a753ef3ed024ce92c913f67fa5cc1be326c01baf2322a5c2e121e7a6735b58027a6b98ccd202c0452cc38d52ecbb8ec62cbc3022f3378baecc1653628e6a525b3c00621c042a37d03f6032668643765dcf2a789d546d98b056e5ab7a7b4927197713012b564ef2d0ed83ca9b520504ea4ee0da2f264f0caabba26e526b8d151a4ba167f2dd078be0ce7a68e9f59f951e9e056c49d3627d5563208d1ec75b2ddd1f7bacd3875316891c5426a5d0ba42958a0836e4a25f0ec961d233cc1ec66100e5d661a1afaa39e416d5ba7e942633853205733af1214a976ece2e00cb63ba985dc784c087b373bd950916a0d3f3ad989cd5c28bd411b4b338e52ad1752ad9bbe05f19b9a05f15b57c0ad9009f060510f8e73106fc2eda640f6f113964a1f317565f4d38ce80a3241cb47bdf0051284046e6122cc6a45c1f577da28511a6271654e740f9911dd256796bbb3790a75614533cd494014caf344207c2b340b0daeaea6c234cb2c9dd318ff1c166fc1d4d652aa6e694bdd914add16be17f96f2212f0efa084c71a8ae2ca74b4de651e3272a9912bc8a24664d388b1a3d926ce3111e8d9cf0b5ae84b77bfe4a839f134121aba303b2b136f82e8c3aac5df115ce250b08b0a41a9a15b69e18b067111d2da226277492acdf8e5f1c4af2309049b94d26e316968717c743b32f22d74d69658462b74e1c9936dc3a108790af6daff82bd1306164d58a0be9405740a8b89a86bfb0c0cdddcbf23a9b6a32f0966c27145a85dc03bc4e54ff13e91fda1936f3fbcfcf2075fbe54a034b2fbfdaf770e3f7f254f53b85e18d7befa389b66b2fbd9ed4bd6bddbf911c5f5c783f71f7e914edc276f0e7e03ebf0b8884d5c07e01d1ea7385cdc7c162024e487578f9da3791e74b8769fffe8689e828790ef3aaf7d7d34cfc18190fb0fde7ee3ee3cd77f5cef7eb377779e761ad7ce8f28c8baaaf3bdffd79f3fe7db17d5c07dfd61be49fa5e76407ffabd5763836d42b2db13dee1ce70ddaa2cbbbb90ff00d1b9a6b90001 +DMLOG ACCEPTED_BLOCK 4 04000000040000000300000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000030000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb2d5b1b639d6ae94fcdd0536b224644931573d1ccb2a0c548613cd1feea18888b0f87ad8b5169aafcab7e8eb69d0ceea2aaf352570f2271f3f0b32d56c69033f40300000000000000010000000000ea305504000000010000000000ea305503000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000000000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f981033b3d4b0000000000ea305500000000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb675f4e11dabc238c75f5bb7f94af11f8a2da5ac47a9bd2ef0745128ca9cb441803d50f502a8b79f80cdb59bd111d43fd15ca3a91fada5710f94e13f574a2efb90000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7001f67171762386651ec8ac67fadb86111980e9d9a4b51b4653752b30a1e2fbe61e01c86e0002e7a3977b7575dcfe13692d29528b15242755453523a0a980ed972a80000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011709e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b463320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4058cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001033b3d4b0000000000ea305500000000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb675f4e11dabc238c75f5bb7f94af11f8a2da5ac47a9bd2ef0745128ca9cb441803d50f502a8b79f80cdb59bd111d43fd15ca3a91fada5710f94e13f574a2efb90000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7001f67171762386651ec8ac67fadb86111980e9d9a4b51b4653752b30a1e2fbe61e01c86e0002e7a3977b7575dcfe13692d29528b15242755453523a0a980ed972a80200d0070000c007010100201ef9fca434f57a1cfd6220d75e983e59a68aa48cefdea52d5824eeced05fee5b42d855865892c17d90e03dc306e6b98cc0b639bfe49ef5004b6f1b22d7c22bad0100cf3b78daed5c0b906457593e8ffb9abe33bb37c9924c665773bb1960121299249bdd3146b37724d95df224068c2f667b677a33d3f3dc9ede256be1ce62565c10ab5051926029a18221c1052b50144251b589a40a10cb08498a58a2f82840108da52588c8fa7fff7feeeddb3d3361c324812a9964bbcf3df79cff9cf39ffffcefd3e1dfc7afb3aaf5cd971e50f4a7f1a1be3afa1afadcf592b73cf448b942bdf7eb975d76e24f4a55fff301adeacbf3a8d177e9f3f729b5cfacaca87d76059fde51fad32bfb943ebacf5b397a94aafc15fc519d952f537c1e75efd4be00ddb85e1f257847734804f62837d454a3571830fad20b82cec34aab15ee22c00cd5985f0b5e621b0b87e3a9fd13076616a62666766c571635fd8dc5e599c589faf272a3d5561a55c9e4a156abb1d09e6835261b33871b2de5a1daafef5fa4260ae501693fb13c5dbfec8a1dca30ec4edda552536a75c5a597495de2ea5a334b8df9a94b778c4a755086d43741f3999e6bcf5cae7c3c7b1d904119565f0f909826bc48f39d986d1c51016ad2e5467b62ffdce2e4ece4747d666162a9deaacf37da8dd6321527671b53b2e260be313fb9744485dce7f6efd62742b373017aa9b5b8b4b8dc984261ead024b5517d8cd51c85ed99f986a06f0bc0d627db84d0526b06152db56616dacb1373329bb3731495565361a8b47bcbedc55683b72fe6aa56e3e0a119aaa91f6a4fab7e546d9289cd1c9e996bdc4eb31d40e539a86c3596170fb5261b137333f333ed65b5096fce5f7b1d138d3bd4e6021cd14c7d6ee69731639ee2394bad06afa5de6e4c1c68d4db875a0d95302a652df2b06566397f3b91379f5267091dd0f3e2c2c454bd5d9f5826d0ea6cae26b85313a57782a1b3ca543a31b938d550e7a0be4218015e810fdebc01aa38b4348569a16e4b07bdd3b4206d6fbc41bde8ac449d9524497f1299e4dcc844e769ad239de841f98be4536b2aa11ca928e216f40f1f26d291a13ffad29eaf97f4c0806fb5d2c1b9764567c74ea9784565fff068f115f669bfbeb4347744bdb4ef6cad321df7fffc2ffce2eb26f64d4e359ab373953fbf57dfe0a9e4c2f83fad4a55f263c94b5295ea577bbbc68f1dfbefc71f387ef7dfdcb3921a7a467572b54fd5279ffccddf7de703afe9d4eeca6bdff7579f569dea0cd5c7bef2d0d74f7dee374a30c65deb8f7cf4df6fedd4fe34d57ef38f1effec7beffddcc32518af6418c71effc4bb9f1aefd45e23b5c7be7157b976b7d4beff5b7ffbd5fb4ae3ed91ea0f7fe3c972e3bda8fdc87fddf78e7bcab5afe2b6a77ee75b5d6daf43edbb9e7cfa9f4f966b6fe2b6bff7175f7bbc5cfb6a19edaffff89d4f7eb434899fe1eac71efae0c7eebeac537bab3ffeb6079e7aea0b6fbdbbabf16bfc54c9024f7df4ae27d42ddeae8c9f9ffadc07bffeabffa6926abceacf2fb5cfb7af0b1504e18ddd1032955c16b7b45d3134ea80cad466aacad488792b3d67c9e19a6ed6cc0e7a92dae3bb6a3655cd6c73335b3a58533ba8823a9a2c69a7ea3a74a7b26ea27daaa950d531bdd6bb54b6b21b6fb3b79d52898e531b1b15efd07ae5c534c66c8ddeec30fdd49946e81f31aa03fed82ed462984c5dad0037be5c9b159a9a4ed5d6aa36bb2cc14f5e5653033a535599635633d70ce8d49ca554bf8ae354c501a87a24f6892528f759c164d54e7b228b6f94897c51cdd6f430218ea6fe79458b88b89850c92b4a78ad92d1217e4cf5085ed18c67934d54f345d51c56f1bb239a21d0394210e8c3ab99d92c7c95acff615a3f57564d9c1aea13259b87525eb997458c6b0fb5cdaacd41506fbb766f9b79a5de5ed1bb7f43bd930df5deb2a1de831beabd6d43bdd30df51ede50ef910df5be7843bd4737d47bfb867a8f6da8f7551bea7d4a7577d7eb7537a5eea6e8fe0875d7dfbdbbeee98ece2afe96b67ac51c65be333a5bb3cc763056d24ca27155f5b2a40a8666a8ec138bc38bd434ab8101bf25987b0754ea8f476f4abd34b854a9e3356f7cecc4f1aa4fef56685ea947efaa5ebff0df4c5fcb737b40b82ff5dc698935e57d775a85e1c0ef9b5585d1316accacbc66b29458b78049084c67784bfd319e6d677734933e9a63d4bcd052cfd4e2cbc340de4e28143c1e717d2235e28fc4fadf41da0ad9101e96ffb492f55b3a809003541a27be3c485f2b3b6d42c3280257f33065cb0019071e2d11d2ed9e7ff9d0bf5e4a2240418aece1f9518f647b8df03d9a5a59f8a94744eca4b477a378cf7349ae10fc78897935377bcb9fa119114672514d611209e164a459f351a675d00c6b415e1e6cd642574e2dc0d216e20990534332a116e1cb4ba3d9e4524214eaa913ad05ad02794ef2e710481b73d02eb4a3b2726e33423433ed1e76987d328012c1e19a44ad1d668a8a24807817931d4302272ae3c821d2414dceadf93bcc764625b54c6ec5968e1f25b4ea37d0c7afbc762bcd0138533c68b10bc01f75bc9877c18e986d3583aff426ea6ff026a12fd9ad8cbb9a547695e8699016b0ad1f3b4145375f5e8e251e96ec8c01685f55e53dd5350310dc2f8f65a4c19a7fcd80ea8c4b74b51bc7a0aa08a485be32ddc4b6d3b14959a5003118c0300483b6408192195215df98ec36864f033ecdb2fb7860fbf273097dc05469dac332a6c20ce8f09298c1eefa7c1868589fc87f048ac1b5a474d091c02c30b17e43ba073d5f8b395225261630c5c97f7474689649ade6672bc23bfe03640af4f8d91bbdbd0328242fab8699ae46a825ec8a66345b0b87a97d95ce9426caf193da90106d2044eb683400e247d38070ed2a8880f3d288940ce61fb2ea963df5093e25411a0a718550433c232bcc2ee86a04faaff6111c621915421f31d3d4cb52ea46bc232676e2f381ae9a4cd8493f33316ed5ac0ef0f27d6123fde062713ac05c2c662ed64fef888bf9690c2e16cb29f5732ef6e147790626ed079199bcaf70311fca6893f9668c616907c0c5bc828bf9391773c3836b11080cd961647c2c691a3841a4256310604d868cd30a5ea4a8a9a0373d8cc80313755a3ae615f06dae4a3a275fd3b123ea0b7698145f3857041e7c8bde6ccb696d5bcd678e436483a3e5e365425f7171b4527a0a70b4405fc5d1eae3f11cb22d112b9d2b8218e11c84a404f361e5ed1110a8f7e50cb0fe9a06f15dc61a62cf7c0a52e2ce55e210c3ccf9c153956cc3c799599a5d8961d6201cf46b5c996a91039ef041fe088419066086d077685f0a2c41f7a2e7a4f34c88f408f7fc80129335aba6065bc703c8887f20f468b39b9b2c46c0de465879f7c096c1779c92edf15e43fed2bcc0216935dbc7410123c98b19aa726c50111bf4c106fd820d1201813f7cd676e436618658038b785e49cd5ea5ce139d9e1fbdf1f4c455ca821b8e8f50c97069944a9a4b63544277cbedce41e97ee205d1e12bd5b97cd6132abd884b8354da824ed4e04a15721dda05453bbf68e7610a32fed89b30f49bc42a3c76eab4baf338550cba8a2f5e7d27ab09fcf4f405771ec7cbe8041ebfb919af0651fe76c89d46a8fc1d7b274ffbf8f1e372f26898e4791e66901104a49dc52520f26c2e017d499799a567b30b84919e78a450c2408dc413d2921296321118de51d2c5eeb1da5f712c19eff141d89bcd06e7693b887904d9fb9e78f0099cc2ec4114aa61de96888c9b79d9e30f3e711131483addc46fdab590d872b0776b2dc47488832bd6c588a30ece25174135d22c0d200240a3901a837335b2ff348ea7c249a75933ddc30a0da411ba3759c723e61b38db52a61b8af0899a2468aadac2262731e46114529a64142d0702f449af9748b72bce1bb44baae6a1f13ccd3a24c9d130f55868f2900ea5210f492b2205572597d0db50b43d1fc74e61b61eb42111c004811806cd28c48c42f424a1958b670df6a3c17e687918891532547a54193f66ac9773a284cf5b8605b174a7a1488419b81c64d6408798e3357f36f30f9dac062c7534e9f92413c313908fb760358631e1f6dccf27681c83004b8009cd5c9591fb8c90b237709f305bb976c038d07c1afb9bc96b879805322c521e7d874dc69fefb04968a445f9a013a291e467552c2a0e243b49fa1b0658274cc3d9e44ad79135a834bc89df1027073dc7a27c79f28509003ab044e734b96d88e52271b07f34d6cf556fc1683736b3a86ac501219e04c626901ad582d96c64fe6435eca022042a4241054f3a6075871a04d88ce824b1d7e012a56a7d993e58ab6c25d2018aabd0d6628088bb40a0d760cda6514aed0fa795adb3a46088b6d5375b8d20da6665fc08fa41d4dd39264d1bdb038d3d60d510782531474785dee180481390aa15647a20263e8ac05f20f80b047fb48f11ef4350b86f4e3ce234242752a8ad1329c49b939f28907c97e96229919c52af666753bd97f143d3ba52a99c231193b16255ae100b70aaa3cd1911f00f2eb472fd80ce4ed35f08bb15ba2db11f32d0be435556988f01f3b19833311fcbcc0708304c31c479c4a205f3203221fe50b59db9b83dcde78013d961879a069a65659086d883e30906c54c954f742ce73e126308c7dfe333991fefcd8e55dc69d8f2b325f2eb38d198bcacec8b8789dd0f7d8e783ded321985b7100ec2369da4d3ea60eb4ab5b9c483d52abeef61fe06fab22eb17ea882985ee04cda82ba497a30e10226a94375b04e828c173ddbcf95a09700a2b799eb169e38f044bd00e348f60fd137acc754336373c44112e703d6408be8e81050a092f39e63554215aa842a540955562594a812aa502554a14aa8ff7faa0451f3b6ece30fabe44788607f32fb18974449887fbf5bed132fb1727b65b0577894bdb26eafb41bc27049f64abbc1d8dbe3f68a4af79302217ba5a106f35ea1247ba5b1991ef60a75b257793bbf68e7e5f6bd05126d2f126d17126d37126d0989b684445b20d176f68a87499ee761061941b25728c95ea1247b45164332cc7603edcefd3f54ca7fd0947293fc2873cccf3f2cb6ba6cd49f6a5de81d1dc70a999017d4bc01e7f78b20ae444bf09db38428fc98b79755c297892823a4e79e1002c2cf493ae400b8ced424bc6e40c71d9f057c03e235132708345eb627bdec8e8359b4bbecdfb0455b91e8afd4105998b64c3777449de1d46218d03f04b206904f19a189d12e9a108a709acbb3040a27efb07cc1bf42f54d783a479c5f9961953d5eb0b846e0101931c35090d83799ef3e13095cfec36c2998ddcfd4ef3cf4d3793ffd0cfd5c87737b3af0c43336ff0a5a665f4ed44cae1d12bf6754639726afaf5f3c9bceb17e5a3bafba0b3f8c8bf2e759d115a12bede569dcf968578c82147418233265d681ad285984a8d3a4b79bf6c9e3d89a2c84511054c1d48ee983b9cecfda932fba94218385c5156c1318a4b9d5e2c1d8c59734942d24d3f08601897cc81e7971aed305b3c01aa9be379510a79ce665a07b75b43ad26425aaf29031961040d4744c3fa7e474ab7cddecc86987b94df667cf9ac474ab6cee27550f19311cecee2ee93d464f8fb1936e0cdbcbdbccfe44d48a350e0aca430ae2ccb217da9b6bbe0443f44e0b0a976809822c23ceb17ea1dd23502f179a192bd1cc5539cd1cd3209aeb37788869e14f9ce28553e55f6ae3c9067cbf597c89b7f73076a2e2e2d0c1bd1ba4f612151261430387fb46ed4e0673b6ffa0a10579b9a6bede8206dd8206bfd7050dbacedf6d41be1356b5d5ab4a9a503fa46592b74c7a1a45a54683397e06d7117cf0e10682238e4e256470d3d760b58f51d547667a9806c9f9cca36845f75a1d777372301fc65411b7f11d5610d7f07a621ade30db9cbe3b7664a76d91af44428d747e06e5fc44b904e765dbe4fa219e91f0ca646c9c4f618a4817715a320f9321c73b53a66f813acc1e26a957b5a01459f2888705882c053c47b8ae08e1fb9af0fb01fdcd5a842495150476bc6cae59eb03840a20571ce2979ab5988df7b422fe102fdb536c5f533ce2fd02c18af37b4f33edcf4c3b3bf1a8c2c13f4b8344b2151c7a9f88b3220e8db48f1d40707654f8158e7224cd64d2ecdfe7e8ab157f865792109fb1ecd8ef2b69cae204e19033879a257eba96a8b0314e0a68427c05e2b22081c0a2c26751e14354c0fe0d41cd96dd31bda2222cb9e86a01d4672bd2029e96e4061113708521487a83c46a6840bf4d784f43e74bacd97c432c10da576c88c5865430408c0d891132a74ada106416d56c1a5feb1c307b9aee1df5f7f16e40201809e3d0860cf46e882f980e685db1c376c5798ffad3985f01db7df9864462f8eb3402aae81c154e079baf84a3a391b89b92c205b9854f311ffae4462611f4c8dd08ce71fd8781ad74fb523a0e27f1a2c08bed1fca7d4e88b8d4dcc9f1dc178d9297a2667ea89404959cb35c3c2665d75411c174cea17c2b8926c20cd606fbca4f9f3e7d35ce3f53943f4b3be61f82af0a8144f60bdbcc3b540305857bb73af90c22b4f02b7b391c8bb2df4e2e62fae3323c7f202c50441f3b8a8ad50c36d75f17d652f54afe2dc650459610c0771ba495d96a2ce780f89b4fed401c816c670515203b890d6a76678beb4c532d6283cad153899a34486f9338aa356873b3a0771313a573b86f16b2dd54f8dfdba0405a9e763540d674de3a4807a4950062d8e0083ecda2e6d804cd157c5a142f76d10df45be78343fa1bd1f0007c7691f8ec3cf1d9f589539e06705e5ce17b41ceb7c26ebe87f9d62448cfa930ccf7360bdf5325bea7f3fecc6afdfc98458eeff9bdc7cc0ac27595c308bca04dcecbb8599209386210bad3980ec8c118c04c06f0c6b9613fad591f94f59be2e841bfb4ee74f4ea6eec3884a8ced32b3a6e3dd1970586ceb9a65f28d8969de465aea9cb5c93195cc13511daed28d81eb8260b7f10a8e50087704dd68dfdfb9303f11badd849a7d473265e87e52b2dc4aba88fa5249cdc0c59952520368ce7748a025b82aae18ed502fe75732e9d479d25f3e3e83d2ae2793bc4f35691bba325e9bcbd249d13d65e73e9bc853ac29c4a8d93ce8ef098b4387084d3e317d2d1cb6ecb25ef6d4dda894c1f9456fbd0851343aa1c35c9856722c2d3800b3be1794a9243acf35d6fc4be32abed2b4fec2bb7fd664dfb2a10baf3e02327638b4c2c7393339dfcd96451682de8178d518426dcdf2373f03f07b96b3b7078626b20009ed8aa608320009e0c372ae329e8e0c9102b115396651a479b7c927d1d477a50f6a12f40cd911ca85527cdb893060f7a4e3e866b8b780afbd0970a1f7a20c3aaf8cd9a2d96def49ce7c3c473d61991ec2d390d53f91579a6c43a99bed7f55aac4642d06796e9bb566fe8e46796e9fbec7a271beabd6543bd0737d47bdb867aa71bea3dbca1de231bea7df1867a8f6ea8f7f60df51edb50efab36d47b55a6ef7addcf30d377bd13be56a6efdb7f507cde64c7330763cde8ad9eefb12873b9154fafc34cd79c8edf331d1fd3f185998eb3cf20cf2ecc92aa243517ea7891db0bed82e176e715fac80f0c1debf5256d07a91350f941bf7d2e9fb0c226dc63924f28533492d057413e6190c69c4f18703e6105963409b734403ea1e460421a77e513f6a51520b22fef9b4fbf0f6cb20febc2b0abf2094d9e4f68f2ac68b222e8a1372bbae21c2a18280026643c71dd88c559ce0f7648ebc912b62e4b78504a9225ccde4202108aabf09f082791f80a7dc9dcd53bed6de226bcb990694933b9aac87afda4b55e1e40fb81a1842e12e0bdf7ddde87e5bd8fca7b1fcade47a5bd0fcf64effd34c4defb79df7cc23ebbd2dcde8767b4f7e11a7b1f167befcbdecb781bdf7b7763e0a78a9d7c425bdb9d2f25eaa32dd4c7b1f9939279a4384d4c6e69a53e522c7c974893a76e496ab8b3e3a09e0727d9325ebf4f9eeb1de4b950867d1b6c2350259979df7e3837f384512af059eeea9188804dd09d2bb19913a2e4cad677f433e58e20dfebfb953bd2d17b1dcc706d987e8f122856b70fadf2e786f214b100994ad2a7bf2b6de40b9abd77a69cba25294cfa0a582dd82659b587557bebafdaaeb56a2b3270f5aa6df7aa93dcb1e1895d9543b46b43d43d42d9ad39f9a5a19e4d3e4f08827d0a421a5524d6ad5b7fd8e8dcb8679b8633edb25ab3e67c2823cd2b8c1aa7d2256a988c99ad9ceba440bbaa431692c39727238e90098ce6358dfc338d5e354e61421287e251e3bb6de7eeca6a2a1c7b613398723a0ccb394c6978851995ccae671c7ed3990cbf69fde1f3d31eb2e9befac88774a6e9c87fe891e2c8875022fd2e8bc92b6e4ead3e2c3dea180f1c824d84bd29554241535a6c73a11556cce04f04cb42d29b57d2e156afd78824eb59ac98eb7c0ab22a8ff9820cf2a07e01462102af762bc6eb80b23da05c7e2f5942497d28fedfd56c490e04123f2d0e92c5413a59752e34fb02f12937031f33f0917f1a6c150711fc742cc4d2602bfb36dd58a97fe39a63ad116c2e71e5cf3e93547a614592ebde19bf16904e76e39ab0d68aa0176b32fcff10f344e19e8c37323fc51514bfdf656da47c774f54300ebe6c29b90f4dbff800bd56875e732fc9da169c64a6af252fbce4f6a16ef1c359077c79455cbb2e60aef20c6405cf33de28789e3dc6461e221a6cf26b5149ca9e674f5ccaa6aa724f9778d68c737845e22bd36c4eedcc9df089e4d423464a75fd6c7fbdeb51a7c5726cf4d725f0e6ad12dd2f64e0cde568849052ab036fd32e3fa32bf0064b6c6c0e813787551f58b5ee4e582d6078257f3e5e138beec1aa0ba0589a59942b78454ccc2fc5c4f2ad4b6d3233d44532c15a667700fc6ee76d5c657923fd01107b526feff5757f77bc6c75c46c6cbe13311b958899918819aba96cd19822da648a689329a24d46a24d52ea8ea78dad114f2bc5d17867388ef69edffed4f04d033abb8fbe4b6134b4b0d96f7deabeb391f18dfdd1ed3583681ad43c36d7099cd13ebac01976b41338fb9e1605cce4a5b1aeb05a718f260fadf125cdb5224de2ad762137cd2137164e9d901ba2b02ec646402b78cd74d7df15ae6555c32f02b66f7794c7a1a17e8999c57c4d831abda1f90aad7e825411483f022ed1a57c76ee42809ba4bba4c1d37206752976ece5b163a65d171633123856bd2740cb7a00dddd01894b37ef843af314f9bf93db7736cfa5d818af0857f30a2bbcc20aaf087b7905f882dc1c903b31cd8e8c0c77f71ec150ee8bf608a5b057d5707707e9d1edd94893e361bd68923b4fcaf1d551b919888037ad4902ad9c9b27a6b22a6e2e259de748a2e6f2dccff71268a0641e581e151e703dc74d2e54aec77a23a89e1154cf08fcfcdc02bb43eb1506675cbcd8817334db0197bfcfc1e5cf39b8fcf9623c5f2c8157b90246b087779ae1d4e0f4ba6c43157fd993a0ca295512e838d186d9ae3c6f324abbb0b9dcebe5a310b11ba650eacdee3504bb9f675cf568a3ce9fd24522451ec75893b3ea5791088b5e469e2e4884f58c6eb4735537a1705537adb820a523172302a5a4c25cfc7c2d97405d58d6e3d782e3ad8223cc13b7e56b2659187a7638638ae05f40c8496cb80b7b652a2b61cfacc69e598dbd0eb9e5d7087bf42089a1be0b972d4b79fa40f52013237e6c818999335d85e24690088300b09d95d830a0cbee983ca963e9a601e31c9395eb9805e30626c88090d7127d06b20cbf2814903464bbc35df4a206eeb21eb17f247af9cc3dd119373ff996345f8af27016bc014e01126924aa31a2a4ac1903731809b6459e13a276381b24d79fe95df27297b75130bbf2b92d10f79cc09754392df92182ce4454665ef0965cf8a4ce8426ddf66215bfc7d79595356eae6523f39dcb6b29d15f9e2d14356b5ec9a52bfa75273f2fcfb5978bae5dbad0c81ad7dedcd61797df24decdf7dfbefc99bb2f4762d197e8bb74030e2d4cf6d0973e73fe19dc81cb46e68a6b70888e57e5de06e2e491b84cf299a7cdf557634bc95223dd97e6185b7deed21c3c793aed9bad561cff8890e86cb2db7043b10f658db2eff875e01234f3441f8314a020bfe48a9cc2cc25002143c8358a25c52828fa4c373937c9b98d0da928a9ce930ec533b6cf9d215f40075dd7682b9c2851938baa11bbd8dd4d6a9747d3b9f6ab814885c043e9de5fe47c69a9c99da2da651d58312291dbc4fc952d29641d586e54ce3ad09dac035be55fc6717a7cfe6b1e3fa8c9ee075fb064f71fde315def8e69fc35dff24fcdc5470ed467e61a53697b31adcfcd2d4ed6db8d74a97e7b63591d5a68dcb1d4986cd3cb46abb5d84a6716d203337734a626f61f693796d3c9c585e576ebd0647bb1a5dad38d7471419ac9cf42a693f58585c576babf41a5398c3035d32268734754fe97bdf961153fe5b927fc8c24c16bd4e7d37abbdd985f6acbac5edf9ae1292db7538cd258985215e57eae9260d24cdb69f1ab9557a66aa9b5d85e9c5c9c4bf33633cb2926d2f9654bf9f55843ffecb31b5761ae3efd0be8dfe2fe262d070d96a503356fd509191328cb9884b1f94373ed99899985a9c61d4af083dfce9c59b8bd68af1ca626e9058d287097d1b75ddf3f471507d23abd9f6eb480f2768b16b27af0f9c5a9990347d619d70de0da9cd100f2eb9cad7c1727a7eb0bb713365a33f3f5d69174b671247dfd7463c181c46aea0b0ef0ba08c5babbf1797ba3ad5448b88ce85f1ffdabd0bf58e13709959a59385c9f9b994a0fd75b33f505ac094b79364449c72ef6be522358ff073748f5fb00d00700008d0101010020691d33c56796914c296f7ed03c742c697e3af1616f1013c3f8242a1aea262db153c76c194aa811b6a4c0332a0d9c959d9dc81c9467f9274f20b41e90570f46c70100ba0878da8d563d6c1c45149efb3fdfc5568231c611a20882221290bb989395ca14341420f15399b08c77dede8d6e77769999bdf3414d0134d44142114290c2955310198ae82a24242402111250103a90e82979b3bbb77f8e0f4fb1b7fbde9b37efe77bdf4deb41f7ed1a91ff3ee3105c15f3207f5f79d3fcdcb18fe605c1ad7ffafd07eb0bc92feb6be02bee5fbb46f7f9f3bde7fa95cd7dd7b7c796e243c1c5d0a2a11ef992ebd9a509959c0a6d9da2b726579e68a3136b44d588541bfe5480ac0bea41dd48baf608ecb10abdfe0b8336b5359f500da4b2e600d5a1048bf121289db75a495d93fa8a1e495023df65cd900b7db55f1fc34c9dc38735053e1ce9bdebe8d4f643a1d55600d2e30a9312960b13705393c69472ad56cd33955d3c3d1d523dc3b11bd17e7b44b9b0022a315d0d52910beb1e3d484a25405ba1a243889c0cb62f6a2a87a0cb5a2bb07572cc96d9ac2515ca540af328bab8da7f729f2adc0072a9d5f9ccb70b30a5b344fe94ed0b0d07da722498caaba870b94844e89dd59481484c7319db415808a49871aa5d9671d9c59687055e66f078d983cb1dd0dc4b4bc6c0012981a1d1810507019734b29b72c1fc6962b551f6c2c04debf6985172e1720156a256fcbdc5019b27b50c023d8ad4bd41549e0c5e7955d7a6c206373a8a54d7e2af051acf97e1dc34f173961f950e6e45dc1973526d258310cd5e27db1d7daf3b5c50178396592ca4d665a06cc903137453698967b79c18e10966378370dfe5b665a03fec59d4714c9a2e34f6671ad46ae6558126d58e531c9cc17627b5501b0f0961ef7a271b2a52ade147273bb1990ba537686369c651aaf542aa75db6710bfe95910bf7525bc1b72091e2cea21700ee24db8dd96c83e7ec252e923a6ae8c7e9a115d412668f9a897be448250201826c2592b0aaebfd3468936108b2b73a27bc88ce82e39b3dc9dcd53a80b2b9a694e02a2509e4702e9b3d02e34b8ba9a0ad32cb3744e63fc7358bc0553b3a554dd3296a62395ba237d2ff2df4424e0df41098f3514c595e918bdcb3d64e45223579045adc8a61163c7b04d9c632230b39f17b4d097e97ec95173e21924344c61765626de04d187558bbf23b8c4a160173582d240b7d2c21703e222a48d45c4ee8a549af1cbc389df4412483e29a5dde2ca32e2f8e87664e43374d656584616baf0e8c9b6e1508422057bed7fc1de0903461316a82f650193c26222eac63e034337f7ef48aaede84b819d705c116a17f00e71f953bc4f647fe8e4db0f2fbff4c1972f16288dec7effebadc3cf5fced314ae67c7b5af3ecea699ec7e76e312bb73233fa2b8feb8f7fefd2fd289fbe48dc16fc00e8f8bd8c47513bcc3e314878b9bcf028484fcf0caf1e8689e071daedda73f3a9aa7e021e4bbceab5f1fcd737020e4eebdb75ebf3dcff51fd73bdfecdd9ea79dc6b5f3230ab2ae9a7ceffef5e7cff9f64535705fbb9f6f92b997dda43ffddeabf1c13621d9ed09ef7067b86e5596dd5dc87f7c54a6310001 DMLOG START_BLOCK 5 DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":108571,"consumed":1},"cpu_usage":{"last_ordinal":1262304004,"value_ex":303261,"consumed":101},"ram_usage":228605} -DMLOG TRX_OP CREATE onblock 7b6d19f4d39f50f3665f7aeb872c0b550624435fd263a62220ab92b0155692cd 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b906033b3d4b0000000000ea30550000000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf13a11ba5589049aa9c0a1c04fa2d9c16fc411bc7cb27f891d81f49284e0d25654680896d5c376d2a5b78bddbaa4758085e15f48a6efa0915c9a90fa4a17a915ad0000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000000 -DMLOG APPLIED_TRANSACTION 5 7b6d19f4d39f50f3665f7aeb872c0b550624435fd263a62220ab92b0155692cd05000000043b3d4b010000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c01006400000000000000000000000000000000000000000001010000010000000000ea3055575756c631524b3d6ea4cabfcd61e1bd000f9df08d134ed2100fcc6b0691542b1e000000000000001e00000000000000010000000000ea30551e0000000000000002020000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b906033b3d4b0000000000ea30550000000000034097ed362ec2a0eecb45779129e26e7b0c11ee9149a27c43f4e71bf13a11ba5589049aa9c0a1c04fa2d9c16fc411bc7cb27f891d81f49284e0d25654680896d5c376d2a5b78bddbaa4758085e15f48a6efa0915c9a90fa4a17a915ad0000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b98c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000000000000000000007b6d19f4d39f50f3665f7aeb872c0b550624435fd263a62220ab92b0155692cd05000000043b3d4b010000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c0000000000000000 +DMLOG TRX_OP CREATE onblock 067d55878f1abc9e2e163fd21dc1448f5ec3ea6fb9d5b3dff020b0f87002291f 0000000000000000000000000000010000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b906033b3d4b0000000000ea305500000000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb675f4e11dabc238c75f5bb7f94af11f8a2da5ac47a9bd2ef0745128ca9cb441803d50f502a8b79f80cdb59bd111d43fd15ca3a91fada5710f94e13f574a2efb90000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7000000 +DMLOG APPLIED_TRANSACTION 5 067d55878f1abc9e2e163fd21dc1448f5ec3ea6fb9d5b3dff020b0f87002291f05000000043b3d4b0100000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f388701006400000000000000000000000000000000000000000001010000010000000000ea30553e58c4392206112764ab65f6ef585bf57918da61211ae2791dd9dd249368b12f1e000000000000001e00000000000000010000000000ea30551e0000000000000002020000000000ea30550000000000ea305500000000221acfa4010000000000ea305500000000a8ed3232b906033b3d4b0000000000ea305500000000000314fa060372f82666849e4d15e6726a494024fe2c682ff988d87f7acb675f4e11dabc238c75f5bb7f94af11f8a2da5ac47a9bd2ef0745128ca9cb441803d50f502a8b79f80cdb59bd111d43fd15ca3a91fada5710f94e13f574a2efb90000000000010000c105161a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea994a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0fe0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff52668dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c438ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4052652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead450715443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb406bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b63320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011afce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb409e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc168cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb700000000000000000000067d55878f1abc9e2e163fd21dc1448f5ec3ea6fb9d5b3dff020b0f87002291f05000000043b3d4b0100000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f38870000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG PERM_OP INS 0 9 {"usage_id":8,"parent":0,"owner":"alice","name":"owner","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[{"key":"EOS6JvuLaCqV8qHbSqUBVRPMo9N7V3vgE8YqHmweG568YmTDJ3opq","weight":1}],"accounts":[{"permission":{"actor":"alice","permission":"eosio.code"},"weight":1}],"waits":[]}} DMLOG PERM_OP INS 0 10 {"usage_id":9,"parent":9,"owner":"alice","name":"active","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[{"key":"EOS8d5yGFrYpdXW1SUmaavRZKm5X7Bp9jK634JABCYPciwTkm7Wv2","weight":1}],"accounts":[{"permission":{"actor":"alice","permission":"eosio.code"},"weight":1}],"waits":[]}} @@ -189,12 +189,12 @@ DMLOG RLIMIT_OP ACCOUNT_LIMITS INS {"owner":"alice","net_weight":-1,"cpu_weight" DMLOG RLIMIT_OP ACCOUNT_USAGE INS {"owner":"alice","net_usage":{"last_ordinal":0,"value_ex":0,"consumed":0},"cpu_usage":{"last_ordinal":0,"value_ex":0,"consumed":0},"ram_usage":0} DMLOG RAM_OP 0 alice account add newaccount alice 2788 2788 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"eosio","net_usage":{"last_ordinal":1262304004,"value_ex":109914,"consumed":233},"cpu_usage":{"last_ordinal":1262304004,"value_ex":314836,"consumed":2101},"ram_usage":228605} -DMLOG APPLIED_TRANSACTION 5 02bd86b2666e134f5c021b789f63f65b7baa48f5f5a72d931dd8dde9a7d4b03705000000043b3d4b010000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c0100d00700001d0000000000000000e8000000000000000001010000010000000000ea30554895e298f1f3e56596649fb49ff53d0f76174ef57ef7c50f28152765cef1f97f1f000000000000001f00000000000000010000000000ea30551f0000000000000002020000000000ea30550000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea30550100000000000000000000000002bd86b2666e134f5c021b789f63f65b7baa48f5f5a72d931dd8dde9a7d4b03705000000043b3d4b010000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c010000000000855c34e40a00000000000000000000000000 +DMLOG APPLIED_TRANSACTION 5 0bda2d937efe57fd3c0243c9c034a648362d76a5e34d16d76720d416f00fb6e705000000043b3d4b0100000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f38870100d00700001d0000000000000000e8000000000000000001010000010000000000ea30554895e298f1f3e56596649fb49ff53d0f76174ef57ef7c50f28152765cef1f97f1f000000000000001f00000000000000010000000000ea30551f0000000000000002020000000000ea30550000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea3055010000000000000000000000000bda2d937efe57fd3c0243c9c034a648362d76a5e34d16d76720d416f00fb6e705000000043b3d4b0100000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f3887010000000000855c34e40a00000000000000000000000000 DMLOG CREATION_OP ROOT 0 DMLOG PERM_OP INS 0 11 {"usage_id":10,"parent":10,"owner":"alice","name":"test1","last_updated":"2020-01-01T00:00:02.000","auth":{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"eosio","permission":"active"},"weight":1}],"waits":[]}} DMLOG RAM_OP 0 11 auth add updateauth_create alice 3108 320 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {"owner":"alice","net_usage":{"last_ordinal":1262304004,"value_ex":834,"consumed":144},"cpu_usage":{"last_ordinal":1262304004,"value_ex":11575,"consumed":2000},"ram_usage":3108} -DMLOG APPLIED_TRANSACTION 5 efde8a208bdb989ae567fa27f7431a6c962e5e80e378f7d6649736e72663264405000000043b3d4b010000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c0100d007000012000000000000000090000000000000000001010000010000000000ea3055f3d881d2f7fbf2f7cb6081aff84e7aca1dd3914a0948ef4fc9422e734e8d4d5720000000000000002000000000000000010000000000855c34010000000000000002020000000000ea30550000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed323201000000000000000000000000efde8a208bdb989ae567fa27f7431a6c962e5e80e378f7d6649736e72663264405000000043b3d4b010000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c010000000000855c34400100000000000000000000000000 +DMLOG APPLIED_TRANSACTION 5 7750e64d23fc2eebf8e4bda38b647bda7a4b3ac5886352325bfb043e4a69326805000000043b3d4b0100000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f38870100d007000012000000000000000090000000000000000001010000010000000000ea3055f3d881d2f7fbf2f7cb6081aff84e7aca1dd3914a0948ef4fc9422e734e8d4d5720000000000000002000000000000000010000000000855c34010000000000000002020000000000ea30550000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed3232010000000000000000000000007750e64d23fc2eebf8e4bda38b647bda7a4b3ac5886352325bfb043e4a69326805000000043b3d4b0100000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f3887010000000000855c34400100000000000000000000000000 DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":4,"value_ex":155642222,"consumed":8891},"average_block_cpu_usage":{"last_ordinal":4,"value_ex":432479225,"consumed":4499},"pending_net_usage":376,"pending_cpu_usage":4100,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1051726,"virtual_cpu_limit":200600} DMLOG RLIMIT_OP STATE UPD {"average_block_net_usage":{"last_ordinal":5,"value_ex":157478537,"consumed":531},"average_block_cpu_usage":{"last_ordinal":5,"value_ex":463041898,"consumed":4529},"pending_net_usage":0,"pending_cpu_usage":0,"total_net_weight":0,"total_cpu_weight":0,"total_ram_bytes":0,"virtual_net_limit":1052778,"virtual_cpu_limit":200800} -DMLOG ACCEPTED_BLOCK 5 05000000050000000400000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000000000001eeaeeb6c4696e5f093d8a5063516c501c4f09ed13c504353c0ebcc2d6a4e7f950400000000000000010000000000ea305505000000010000000000ea305504000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add80100000000000589cf8b9a2ebd6f36abf8da3c8791de1aaa6886ea992fe085d441d31c043b3d4b0000000000ea3055000000000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980ffd67188aa5ab9e25c892a8bdbcea6083f7c8a51db9193a7b30babdd67f562c39be016ffb3e1803472c4c1f018a2d0a491ab8dbb9900cbdee3e93ab6ddfaf5245000000000000001f4761bf12ee89d9a440c876bdf8f7b197850ac79e6b8b6400afc36b78e4a721b247055f9e62f47bf75b3b2f27641d7c26537afaaef9f123a27c824165e8b834f70000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011709e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b468dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4058cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb798c4175db53ed27e7911a1b5adf0e7db0fc96c2cae172cf594dfa9a742ca9e88ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001043b3d4b0000000000ea3055000000000004b58bf64c20650ff24b6cf703f32ae58f326cb07d4f03e53acef7980ffd67188aa5ab9e25c892a8bdbcea6083f7c8a51db9193a7b30babdd67f562c39be016ffb3e1803472c4c1f018a2d0a491ab8dbb9900cbdee3e93ab6ddfaf5245000000000000001f4761bf12ee89d9a440c876bdf8f7b197850ac79e6b8b6400afc36b78e4a721b247055f9e62f47bf75b3b2f27641d7c26537afaaef9f123a27c824165e8b834f70200d00700001d0101001f2c97694974b4ffd21c9a5cfee00552b41f662e37c21a13ebdd00a3a4a7b5f2835a10b313bc58f434d4b3096e5cdf198e3885632bf1b4c7843bce95c8a3d225f30000bd0107e10b5e040020650ff200000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea30550100000000d00700001201010020058f717e2085b56462140ff788394834a09289d1fa9420459d75351f9535141b6a816a148a191be9458fd098b4f61bd2c6c93a443c1ffc52ae332b68ad506daf00006307e10b5e040020650ff200000000010000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed3232010000000001 +DMLOG ACCEPTED_BLOCK 5 05000000050000000400000000000000010000000000ea3055000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add8010000000000017e6444b8d603e9029ab22903cb226eb1d03e2c6f51b27205343eeba1f142a2470400000000000000010000000000ea305505000000010000000000ea305504000000000100000001000240e54a7b27e042b80a810153bec1dd166eef95fa69f6c9886ae283363bc2add801000000000005e24603aa0ad1529c1f753e059b925e8e3fa30ff96e56e0aa0a4f3887043b3d4b0000000000ea3055000000000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f98154d8774d1b305c0fa205651256e43ef98be4bb6bda6c822a37bc842425409afc38653181a96b90fe347c6a606ded3ba8d4af09f0ea99bbe48b452a5e53cdf488000000000000001f65106230635754d38ea7c1dd1c539d9d0f46cde3f86f3b398f154cc6fa8ed19d589159826afd335021326b20ce22e50f91e1298a832a1e358042ff7318fef40b0000000029807708239aa7de914d3ed61e9009ab2280bfbc50f1d9769f27f8341ef261980000000000011709e86cb0accf8d81c9e85d34bea4b925ae936626d00c984e4691186891f5bc160ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b72412652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b447670735c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d674fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c25443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b463320dd4a58212e4d32d1f58926b73ca33a247326c2a5e9fd39268d2384e011a68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a2974286bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a4058cb6dd1e5607208331eb5983141e159c75a597413887e80e8a9a4b715a507eb7ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1dfce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb40001043b3d4b0000000000ea3055000000000004fd709af813af98804402d49f55bc9d1759f03a8bdedb5508c907f98154d8774d1b305c0fa205651256e43ef98be4bb6bda6c822a37bc842425409afc38653181a96b90fe347c6a606ded3ba8d4af09f0ea99bbe48b452a5e53cdf488000000000000001f65106230635754d38ea7c1dd1c539d9d0f46cde3f86f3b398f154cc6fa8ed19d589159826afd335021326b20ce22e50f91e1298a832a1e358042ff7318fef40b0200d00700001d0101002061715f2696e5e4b84292f069dd763e4c51e65aa285e21ca4e1e3af9c4d5093b0728753e43ced27c60ac6b2eb6930f04652b9a81df5a8b12da62c949fd230e99b0000bd0107e10b5e040013af988000000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed32328a010000000000ea30550000000000855c3401000000010002bb30f6894f29bb6fca635b1df728ad77e48fdd6123ce5e4455b0f71e072e7df80100010000000000855c3400804a1401ea305501000001000000010003ebcf44b45a71d4f225768f602d1e2e2b25ef779ee9897fe744bf1a16e85423d50100010000000000855c3400804a1401ea30550100000000d0070000120101002007a5da11a79fba732b5c499e6721367dd53a871258a9867595bb8a9a0b8525911b090cd7f87f25c0229f3b3b25676456ca8e7fc756e259437d886fd256e2b5e800006307e10b5e040013af988000000000010000000000ea30550040cbdaa86c52d5010000000000855c3400000000a8ed3232310000000000855c34000000008090b1ca00000000a8ed32320100000000010000000000ea305500000000a8ed3232010000000001 diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi index 27713f8b5b..a16a65107e 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.abi @@ -4,15 +4,15 @@ "types": [], "structs": [ { - "name": "testg1add", + "name": "testfpexp", "base": "", "fields": [ { - "name": "op1", + "name": "base", "type": "bytes" }, { - "name": "op2", + "name": "exp", "type": "bytes" }, { @@ -26,21 +26,13 @@ ] }, { - "name": "testg1exp", + "name": "testfpmod", "base": "", "fields": [ { - "name": "points", + "name": "s", "type": "bytes" }, - { - "name": "scalars", - "type": "bytes" - }, - { - "name": "num", - "type": "uint32" - }, { "name": "res", "type": "bytes" @@ -52,11 +44,15 @@ ] }, { - "name": "testg1map", + "name": "testfpmul", "base": "", "fields": [ { - "name": "e", + "name": "op1", + "type": "bytes" + }, + { + "name": "op2", "type": "bytes" }, { @@ -70,15 +66,15 @@ ] }, { - "name": "testg1mul", + "name": "testg1add", "base": "", "fields": [ { - "name": "point", + "name": "op1", "type": "bytes" }, { - "name": "scalar", + "name": "op2", "type": "bytes" }, { @@ -92,15 +88,11 @@ ] }, { - "name": "testg2add", + "name": "testg1map", "base": "", "fields": [ { - "name": "op1", - "type": "bytes" - }, - { - "name": "op2", + "name": "e", "type": "bytes" }, { @@ -114,7 +106,7 @@ ] }, { - "name": "testg2exp", + "name": "testg1wsum", "base": "", "fields": [ { @@ -139,6 +131,28 @@ } ] }, + { + "name": "testg2add", + "base": "", + "fields": [ + { + "name": "op1", + "type": "bytes" + }, + { + "name": "op2", + "type": "bytes" + }, + { + "name": "res", + "type": "bytes" + }, + { + "name": "expected_error", + "type": "int32" + } + ] + }, { "name": "testg2map", "base": "", @@ -158,17 +172,21 @@ ] }, { - "name": "testg2mul", + "name": "testg2wsum", "base": "", "fields": [ { - "name": "point", + "name": "points", "type": "bytes" }, { - "name": "scalar", + "name": "scalars", "type": "bytes" }, + { + "name": "num", + "type": "uint32" + }, { "name": "res", "type": "bytes" @@ -208,13 +226,23 @@ ], "actions": [ { - "name": "testg1add", - "type": "testg1add", + "name": "testfpexp", + "type": "testfpexp", + "ricardian_contract": "" + }, + { + "name": "testfpmod", + "type": "testfpmod", "ricardian_contract": "" }, { - "name": "testg1exp", - "type": "testg1exp", + "name": "testfpmul", + "type": "testfpmul", + "ricardian_contract": "" + }, + { + "name": "testg1add", + "type": "testg1add", "ricardian_contract": "" }, { @@ -223,8 +251,8 @@ "ricardian_contract": "" }, { - "name": "testg1mul", - "type": "testg1mul", + "name": "testg1wsum", + "type": "testg1wsum", "ricardian_contract": "" }, { @@ -232,19 +260,14 @@ "type": "testg2add", "ricardian_contract": "" }, - { - "name": "testg2exp", - "type": "testg2exp", - "ricardian_contract": "" - }, { "name": "testg2map", "type": "testg2map", "ricardian_contract": "" }, { - "name": "testg2mul", - "type": "testg2mul", + "name": "testg2wsum", + "type": "testg2wsum", "ricardian_contract": "" }, { diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp index faea7638a6..73cee1c890 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.cpp @@ -33,40 +33,10 @@ void bls_primitives_test::testg2add(const std::vector& op1, const std:: check(0 == std::memcmp(r, res.data(), sizeof(bls_g2)), "bls_g2_add: Result does not match"); } -void bls_primitives_test::testg1mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error) +void bls_primitives_test::testg1wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) { bls_g1 r; - int32_t error = internal_use_do_not_use::bls_g1_mul( - reinterpret_cast(point.data()), - sizeof(bls_g1), - reinterpret_cast(scalar.data()), - sizeof(bls_scalar), - reinterpret_cast(r), - sizeof(bls_g1) - ); - check(error == expected_error, "bls_g1_mul: Error does not match"); - check(0 == std::memcmp(r, res.data(), sizeof(bls_g1)), "bls_g1_mul: Result does not match"); -} - -void bls_primitives_test::testg2mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error) -{ - bls_g2 r; - int32_t error = internal_use_do_not_use::bls_g2_mul( - reinterpret_cast(point.data()), - sizeof(bls_g2), - reinterpret_cast(scalar.data()), - sizeof(bls_scalar), - reinterpret_cast(r), - sizeof(bls_g2) - ); - check(error == expected_error, "bls_g2_mul: Error does not match"); - check(0 == std::memcmp(r, res.data(), sizeof(bls_g2)), "bls_g2_mul: Result does not match"); -} - -void bls_primitives_test::testg1exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) -{ - bls_g1 r; - int32_t error = internal_use_do_not_use::bls_g1_exp( + int32_t error = internal_use_do_not_use::bls_g1_weighted_sum( reinterpret_cast(points.data()), num * sizeof(bls_g1), reinterpret_cast(scalars.data()), @@ -79,10 +49,10 @@ void bls_primitives_test::testg1exp(const std::vector& points, const st check(0 == std::memcmp(r, res.data(), sizeof(bls_g1)), "bls_g1_exp: Result does not match"); } -void bls_primitives_test::testg2exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) +void bls_primitives_test::testg2wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error) { bls_g2 r; - int32_t error = internal_use_do_not_use::bls_g2_exp( + int32_t error = internal_use_do_not_use::bls_g2_weighted_sum( reinterpret_cast(points.data()), num * sizeof(bls_g2), reinterpret_cast(scalars.data()), @@ -136,3 +106,47 @@ void bls_primitives_test::testg2map(const std::vector& e, const std::ve check(error == expected_error, "bls_g2_map: Error does not match"); check(0 == std::memcmp(r, res.data(), sizeof(bls_g2)), "bls_g2_map: Result does not match"); } + +void bls_primitives_test::testfpmul(const std::vector& op1, const std::vector& op2, const std::vector& res, int32_t expected_error) +{ + bls_fp r; + int32_t error = internal_use_do_not_use::bls_fp_mul( + reinterpret_cast(op1.data()), + sizeof(bls_fp), + reinterpret_cast(op2.data()), + sizeof(bls_fp), + reinterpret_cast(r), + sizeof(bls_fp) + ); + check(error == expected_error, "bls_fp_mul: Error does not match"); + check(0 == std::memcmp(r, res.data(), sizeof(bls_fp)), "bls_fp_mul: Result does not match"); +} + +void bls_primitives_test::testfpexp(const std::vector& base, const std::vector& exp, const std::vector& res, int32_t expected_error) +{ + bls_fp r; + int32_t error = internal_use_do_not_use::bls_fp_exp( + reinterpret_cast(base.data()), + sizeof(bls_fp), + reinterpret_cast(exp.data()), + sizeof(bls_scalar_large), + reinterpret_cast(r), + sizeof(bls_fp) + ); + check(error == expected_error, "bls_fp_exp: Error does not match"); + check(0 == std::memcmp(r, res.data(), sizeof(bls_fp)), "bls_fp_exp: Result does not match"); +} + + +void bls_primitives_test::testfpmod(const std::vector& s, const std::vector& res, int32_t expected_error) +{ + bls_fp r; + int32_t error = internal_use_do_not_use::bls_fp_mod( + reinterpret_cast(s.data()), + sizeof(bls_scalar_large), + reinterpret_cast(r), + sizeof(bls_fp) + ); + check(error == expected_error, "bls_fp_mod: Error does not match"); + check(0 == std::memcmp(r, res.data(), sizeof(bls_fp)), "bls_fp_mod: Result does not match"); +} diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp index 7af146e94e..e519f1ae59 100644 --- a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp +++ b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.hpp @@ -2,11 +2,12 @@ #include +using bls_scalar_large = uint8_t[64]; using bls_scalar = uint8_t[32]; using bls_fp = uint8_t[48]; using bls_fp2 = bls_fp[2]; -using bls_g1 = uint8_t[144]; -using bls_g2 = uint8_t[288]; +using bls_g1 = uint8_t[96]; +using bls_g2 = uint8_t[192]; using bls_gt = uint8_t[576]; namespace eosio { @@ -19,16 +20,10 @@ namespace eosio { int32_t bls_g2_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len); __attribute__((eosio_wasm_import)) - int32_t bls_g1_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len); + int32_t bls_g1_weighted_sum(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); __attribute__((eosio_wasm_import)) - int32_t bls_g2_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len); - - __attribute__((eosio_wasm_import)) - int32_t bls_g1_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); - - __attribute__((eosio_wasm_import)) - int32_t bls_g2_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); + int32_t bls_g2_weighted_sum(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len); __attribute__((eosio_wasm_import)) int32_t bls_pairing(const char* g1_points, uint32_t g1_points_len, const char* g2_points, uint32_t g2_points_len, uint32_t n, char* res, uint32_t res_len); @@ -41,6 +36,12 @@ namespace eosio { __attribute__((eosio_wasm_import)) int32_t bls_fp_mod(const char* s, uint32_t s_len, char* res, uint32_t res_len); + + __attribute__((eosio_wasm_import)) + int32_t bls_fp_mul(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len); + + __attribute__((eosio_wasm_import)) + int32_t bls_fp_exp(const char* base, uint32_t base_len, const char* exp, uint32_t exp_len, char* res, uint32_t res_len); } } } @@ -56,16 +57,10 @@ class [[eosio::contract]] bls_primitives_test : public eosio::contract { void testg2add(const std::vector& op1, const std::vector& op2, const std::vector& res, int32_t expected_error); [[eosio::action]] - void testg1mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error); - - [[eosio::action]] - void testg2mul(const std::vector& point, const std::vector& scalar, const std::vector& res, int32_t expected_error); - - [[eosio::action]] - void testg1exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); + void testg1wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); [[eosio::action]] - void testg2exp(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); + void testg2wsum(const std::vector& points, const std::vector& scalars, const uint32_t num, const std::vector& res, int32_t expected_error); [[eosio::action]] void testpairing(const std::vector& g1_points, const std::vector& g2_points, const uint32_t num, const std::vector& res, int32_t expected_error); @@ -75,4 +70,13 @@ class [[eosio::contract]] bls_primitives_test : public eosio::contract { [[eosio::action]] void testg2map(const std::vector& e, const std::vector& res, int32_t expected_error); + + [[eosio::action]] + void testfpmul(const std::vector& op1, const std::vector& op2, const std::vector& res, int32_t expected_error); + + [[eosio::action]] + void testfpexp(const std::vector& base, const std::vector& exp, const std::vector& res, int32_t expected_error); + + [[eosio::action]] + void testfpmod(const std::vector& s, const std::vector& res, int32_t expected_error); }; diff --git a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm index 2e25206893..569831c44a 100755 Binary files a/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm and b/unittests/test-contracts/bls_primitives_test/bls_primitives_test.wasm differ