Compare commits

...

9 Commits

Author SHA1 Message Date
Mayukha Vadari
b226426169 Merge branch 'ripple/wasmi-host-functions' of https://github.com/XRPLF/rippled into mvadari/remove-float-root 2026-08-25 17:02:33 -04:00
Mayukha Vadari
dab3d1f731 fix tests 2026-08-25 16:40:40 -04:00
Mayukha Vadari
bf9d896c1d delete again 2026-08-25 14:26:46 -04:00
Mayukha Vadari
a6eff04e89 Merge branch 'ripple/wasmi-host-functions' of https://github.com/XRPLF/rippled into mvadari/remove-float-root 2026-08-25 14:19:47 -04:00
Mayukha Vadari
ecfa9db625 remove more stuff 2026-08-25 14:12:47 -04:00
Mayukha Vadari
cdefae0a48 whoops 2026-08-25 13:21:18 -04:00
Mayukha Vadari
f541840bb0 Apply suggestion from @xrplf-ai-reviewer[bot]
Co-authored-by: xrplf-ai-reviewer[bot] <266832837+xrplf-ai-reviewer[bot]@users.noreply.github.com>
2026-08-25 12:56:39 -04:00
Mayukha Vadari
6148613c6c Merge branch 'ripple/wasmi-host-functions' into mvadari/remove-float-root 2026-08-25 12:47:46 -04:00
Mayukha Vadari
2174241d51 feat: Remove float_root 2026-08-24 22:41:03 -04:00
23 changed files with 219 additions and 546 deletions

View File

@@ -496,11 +496,6 @@ host_functions! {
#[wasm_name = "float_div"]
fn float_divide(&self, x: &[u8], y: &[u8], mode: i32, out: &mut [u8]) -> HostResult<usize>;
/// The `n`-th root of the float `x` under rounding `mode`.
#[gas = 5500]
#[wasm_name = "float_root"]
fn float_root(&self, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> HostResult<usize>;
/// The float `x` raised to the power `n` under rounding `mode`.
#[gas = 5500]
#[wasm_name = "float_pow"]

View File

@@ -560,14 +560,6 @@ impl HostFunctions for FakeHost {
put(out, &[x[0]])
}
/// A one-float-and-integer operator; `InvalidParams` on an empty operand.
fn float_root(&self, x: &[u8], _n: i32, _mode: i32, out: &mut [u8]) -> HostResult<usize> {
if x.is_empty() {
return Err(HostError::InvalidParams);
}
put(out, &[x[0]])
}
/// The same shape, for exponentiation.
fn float_power(&self, x: &[u8], _n: i32, _mode: i32, out: &mut [u8]) -> HostResult<usize> {
if x.is_empty() {
@@ -824,7 +816,6 @@ fn the_trait_is_implementable() {
assert_eq!(host.float_subtract(&[3; 8], &[4; 8], 0, &mut out), Ok(1));
assert_eq!(host.float_multiply(&[3; 8], &[4; 8], 0, &mut out), Ok(1));
assert_eq!(host.float_divide(&[3; 8], &[4; 8], 0, &mut out), Ok(1));
assert_eq!(host.float_root(&[3; 8], 2, 0, &mut out), Ok(1));
assert_eq!(host.float_power(&[3; 8], 2, 0, &mut out), Ok(1));
assert_eq!(*host.traced.borrow(), ["hello/AsHex/2"]);
@@ -951,7 +942,6 @@ fn the_spec_table_matches_the_declarations() {
("float_sub", 160),
("float_mult", 300),
("float_div", 300),
("float_root", 5500),
("float_pow", 5500),
]
);

View File

@@ -514,10 +514,6 @@ mod ffi {
#[cxx_name = "floatDivide"]
fn float_divide(self: &HostContext, x: &[u8], y: &[u8], mode: i32, out: &mut [u8]) -> i32;
#[namespace = "xrpl"]
#[cxx_name = "floatRoot"]
fn float_root(self: &HostContext, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> i32;
#[namespace = "xrpl"]
#[cxx_name = "floatPower"]
fn float_power(self: &HostContext, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> i32;
@@ -880,10 +876,6 @@ impl HostFunctions for CxxHost<'_> {
bytes_written(self.ctx.float_divide(x, y, mode, out))
}
fn float_root(&self, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> HostResult<usize> {
bytes_written(self.ctx.float_root(x, n, mode, out))
}
fn float_power(&self, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> HostResult<usize> {
bytes_written(self.ctx.float_power(x, n, mode, out))
}

View File

@@ -657,9 +657,6 @@ mod tests {
) -> HostResult<usize> {
unreachable!("no unit test in this module calls the host")
}
fn float_root(&self, _x: &[u8], _n: i32, _mode: i32, _out: &mut [u8]) -> HostResult<usize> {
unreachable!("no unit test in this module calls the host")
}
fn float_power(
&self,
_x: &[u8],

View File

@@ -1169,26 +1169,6 @@ pub(crate) fn register_host_functions(
})
},
),
HostFunctionSpec::FloatRoot => linker.func_wrap(
HOST_MODULE,
op.wasm_name(),
|mut caller: Caller<'_, VmState<'_>>,
in_ptr: i32,
in_len: i32,
n: i32,
out_ptr: i32,
out_len: i32,
mode: i32|
-> Result<i32, wasmi::Error> {
charged(&mut caller, HostFunctionSpec::FloatRoot, |c| {
let out = Region::new(out_ptr, out_len);
let x = Region::new(in_ptr, in_len);
write_buffered(c, out, |host, data, buf| {
host.float_root(x.read(data)?, n, mode, buf)
})
})
},
),
HostFunctionSpec::FloatPower => linker.func_wrap(
HOST_MODULE,
op.wasm_name(),

View File

@@ -382,11 +382,6 @@ fn call_for(op: HostFunctionSpec) -> Call {
"(call $float_div (i32.const 0) (i32.const 8) (i32.const 8) (i32.const 8) (i32.const 16) (i32.const 8) (i32.const 0))",
7,
),
HostFunctionSpec::FloatRoot => (
import::FLOAT_ROOT,
"(call $float_root (i32.const 0) (i32.const 8) (i32.const 2) (i32.const 8) (i32.const 8) (i32.const 0))",
6,
),
HostFunctionSpec::FloatPower => (
import::FLOAT_POW,
"(call $float_pow (i32.const 0) (i32.const 8) (i32.const 2) (i32.const 8) (i32.const 8) (i32.const 0))",

View File

@@ -1011,23 +1011,6 @@ fn float_add_reads_both_operands_and_the_mode() {
);
}
/// A unary operator that reads one float region, an integer, and a mode: all three
/// reach the host, tagged by operator.
#[test]
fn float_root_reads_the_float_the_degree_and_the_mode() {
let host = FakeHost::new().answering_float(support::Answer::filler(8));
let wat = module(
&[import::FLOAT_ROOT, ONE_PAGE],
"(call $float_root (i32.const 0) (i32.const 8) (i32.const 3) (i32.const 64) (i32.const 8) (i32.const 1))",
);
assert_eq!(status(&wat, &host), 8, "the result length");
assert_eq!(
*host.float_unary_ops_asked.borrow(),
vec![("root", vec![0u8; 8], 3, 1)]
);
}
/// A leading scalar parameter reaches the host as declared.
#[test]
fn home_le_field_passes_the_field_selector_through() {

View File

@@ -98,7 +98,7 @@ fn a_disabled_feature_does_not_pass() {
/// Every host function the ABI declares, spelled as a guest imports it. The count
/// is asserted against the ABI so a function added to it cannot be left out here.
const ALL_IMPORTS: [&str; 61] = [
const ALL_IMPORTS: [&str; 60] = [
import::LDGR_INDEX,
import::PARENT_LDGR_TIME,
import::PARENT_LDGR_HASH,
@@ -158,7 +158,6 @@ const ALL_IMPORTS: [&str; 61] = [
import::FLOAT_SUB,
import::FLOAT_MULT,
import::FLOAT_DIV,
import::FLOAT_ROOT,
import::FLOAT_POW,
];

View File

@@ -122,8 +122,7 @@ pub type PaychannelKey = (Vec<u8>, Vec<u8>, i32);
/// `float_multiply`, `float_divide` — as `(operator, x, y, mode)`.
pub type FloatBinaryCall = (&'static str, Vec<u8>, Vec<u8>, i32);
/// One call to a float operator over a float and an integer — `float_root`,
/// `float_power` — as `(operator, x, n, mode)`.
/// One call to a float operator over a float and an integer — `float_power` — as `(operator, x, n, mode)`.
pub type FloatUnaryCall = (&'static str, Vec<u8>, i32, i32);
/// A `HostFunctions` implementation that answers from what the test put in it and
@@ -371,8 +370,7 @@ pub struct FakeHost {
/// Every `(x, y, mode)` the four binary float operators were asked for, tagged by
/// operator name.
pub float_binary_ops_asked: RefCell<Vec<FloatBinaryCall>>,
/// Every `(x, n, mode)` `float_root` and `float_power` were asked for, tagged by
/// operator name.
/// Every `(x, n, mode)` `float_power` was asked for, tagged by operator name.
pub float_unary_ops_asked: RefCell<Vec<FloatUnaryCall>>,
}
@@ -1389,13 +1387,6 @@ impl HostFunctions for FakeHost {
self.float_answer.fill(out)
}
fn float_root(&self, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> HostResult<usize> {
self.float_unary_ops_asked
.borrow_mut()
.push(("root", x.to_vec(), n, mode));
self.float_answer.fill(out)
}
fn float_power(&self, x: &[u8], n: i32, mode: i32, out: &mut [u8]) -> HostResult<usize> {
self.float_unary_ops_asked
.borrow_mut()
@@ -1488,7 +1479,6 @@ pub mod import {
pub const FLOAT_SUB: &str = r#"(import "host_lib" "float_sub" (func $float_sub (param i32 i32 i32 i32 i32 i32 i32) (result i32)))"#;
pub const FLOAT_MULT: &str = r#"(import "host_lib" "float_mult" (func $float_mult (param i32 i32 i32 i32 i32 i32 i32) (result i32)))"#;
pub const FLOAT_DIV: &str = r#"(import "host_lib" "float_div" (func $float_div (param i32 i32 i32 i32 i32 i32 i32) (result i32)))"#;
pub const FLOAT_ROOT: &str = r#"(import "host_lib" "float_root" (func $float_root (param i32 i32 i32 i32 i32 i32) (result i32)))"#;
pub const FLOAT_POW: &str = r#"(import "host_lib" "float_pow" (func $float_pow (param i32 i32 i32 i32 i32 i32) (result i32)))"#;
}

View File

@@ -408,13 +408,6 @@ public:
std::int32_t mode,
rust::Slice<std::uint8_t> out) const noexcept;
[[nodiscard]] std::int32_t
floatRoot(
rust::Slice<std::uint8_t const> x,
std::int32_t n,
std::int32_t mode,
rust::Slice<std::uint8_t> out) const noexcept;
[[nodiscard]] std::int32_t
floatPower(
rust::Slice<std::uint8_t const> x,

View File

@@ -57,9 +57,6 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode);
std::expected<Bytes, HostFunctionError>
floatDivideImpl(Slice const& x, Slice const& y, int32_t mode);
std::expected<Bytes, HostFunctionError>
floatRootImpl(Slice const& x, int32_t n, int32_t mode);
std::expected<Bytes, HostFunctionError>
floatPowerImpl(Slice const& x, int32_t n, int32_t mode);
@@ -454,12 +451,6 @@ public:
return std::unexpected(HostFunctionError::Unimplemented);
}
[[nodiscard]] [[nodiscard]] virtual std::expected<Bytes, HostFunctionError>
floatRoot(Slice const& x, int32_t n, int32_t mode) const
{
return std::unexpected(HostFunctionError::Unimplemented);
}
[[nodiscard]] [[nodiscard]] virtual std::expected<Bytes, HostFunctionError>
floatPower(Slice const& x, int32_t n, int32_t mode) const
{

View File

@@ -280,9 +280,6 @@ public:
std::expected<Bytes, HostFunctionError>
floatDivide(Slice const& x, Slice const& y, int32_t mode) const override;
std::expected<Bytes, HostFunctionError>
floatRoot(Slice const& x, int32_t n, int32_t mode) const override;
std::expected<Bytes, HostFunctionError>
floatPower(Slice const& x, int32_t n, int32_t mode) const override;
};

View File

@@ -1220,19 +1220,6 @@ HostContext::floatDivide(
});
}
std::int32_t
HostContext::floatRoot(
rust::Slice<std::uint8_t const> x,
std::int32_t n,
std::int32_t mode,
rust::Slice<std::uint8_t> out) const noexcept
{
return guarded(hostFunctions_.getJournal(), kHostInternal, [&] {
return invoke<false>(
out, [&] { return hostFunctions_.floatRoot(Slice{x.data(), x.size()}, n, mode); });
});
}
std::int32_t
HostContext::floatPower(
rust::Slice<std::uint8_t const> x,

View File

@@ -383,32 +383,6 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode)
}
}
std::expected<Bytes, HostFunctionError>
floatRootImpl(Slice const& x, int32_t n, int32_t mode)
{
try
{
if (n < 1)
return std::unexpected(HostFunctionError::FloatInputMalformed);
detail::FloatState const rm(mode);
if (!rm)
return std::unexpected(HostFunctionError::FloatInputMalformed);
auto const xx = detail::floatDecode(x);
if (!xx)
return std::unexpected(HostFunctionError::FloatInputMalformed);
return detail::floatEncode(root(*xx, n));
}
// LCOV_EXCL_START
catch (...)
{
return std::unexpected(HostFunctionError::FloatComputationError);
}
// LCOV_EXCL_STOP
}
std::expected<Bytes, HostFunctionError>
floatPowerImpl(Slice const& x, int32_t n, int32_t mode)
{
@@ -515,12 +489,6 @@ WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode)
return wasm_float::floatDivideImpl(x, y, mode);
}
std::expected<Bytes, HostFunctionError>
WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) const
{
return wasm_float::floatRootImpl(x, n, mode);
}
std::expected<Bytes, HostFunctionError>
WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) const
{

View File

@@ -460,12 +460,6 @@ public:
return wasm_float::floatDivideImpl(x, y, mode);
}
[[nodiscard]] std::expected<Bytes, HostFunctionError>
floatRoot(Slice const& x, int32_t n, int32_t mode) const override
{
return wasm_float::floatRootImpl(x, n, mode);
}
[[nodiscard]] std::expected<Bytes, HostFunctionError>
floatPower(Slice const& x, int32_t n, int32_t mode) const override
{

View File

@@ -168,7 +168,7 @@ struct Wasm_test : public beast::unit_test::Suite
auto const codecovWasm = hexToBytes(kCodecovTestsWasmHex);
TestHostFunctions hfs(env);
auto const allowance = 129'986;
auto const allowance = 124'173;
auto re = runEscrowWasm(codecovWasm, hfs, allowance, escrowFunctionName);
checkResult(re, 1, allowance);

View File

@@ -153,24 +153,24 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "xrpl-common-stdlib"
version = "0.8.0"
source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=error-and-trace#b008b097237ce0d1a2dffc72ba39dd9fc50020a9"
version = "0.9.0"
source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#e88dc32a48fac9d0eb6e7239c8a38693221657f6"
dependencies = [
"xrpl-macros",
]
[[package]]
name = "xrpl-escrow-stdlib"
version = "0.1.0"
source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=error-and-trace#b008b097237ce0d1a2dffc72ba39dd9fc50020a9"
version = "0.9.0"
source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#e88dc32a48fac9d0eb6e7239c8a38693221657f6"
dependencies = [
"xrpl-common-stdlib",
]
[[package]]
name = "xrpl-macros"
version = "0.1.0"
source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=error-and-trace#b008b097237ce0d1a2dffc72ba39dd9fc50020a9"
version = "0.9.0"
source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#e88dc32a48fac9d0eb6e7239c8a38693221657f6"
dependencies = [
"bs58",
"proc-macro2",

View File

@@ -15,5 +15,5 @@ opt-level = 's'
panic = "abort"
[dependencies]
xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-common-stdlib", branch = "error-and-trace" }
xrpl-escrow = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-escrow-stdlib", branch = "error-and-trace" }
xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-common-stdlib" }
xrpl-escrow = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-escrow-stdlib" }

View File

@@ -4,7 +4,7 @@
extern crate std;
use core::panic;
use xrpl_escrow::current_tx::escrow_finish::{EscrowFinish, get_current_escrow_finish};
use xrpl_escrow::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish};
use xrpl_std::current_tx::traits::TransactionCommonFields;
use xrpl_std::fields::locator::Locator;
use xrpl_std::host;
@@ -977,22 +977,6 @@ pub extern "C" fn escrow_finish() -> i32 {
"float_div_oob_slice2",
)
});
with_buffer::<2, _, _>(|ptr, len| {
check_result(
unsafe {
host::float_root(
float.as_ptr().wrapping_add(1_000_000_000),
float.len(),
3,
ptr,
len,
FLOAT_ROUNDING_MODES_TO_NEAREST,
)
},
error_codes::POINTER_OUT_OF_BOUNDS,
"float_root_oob_slice",
)
});
with_buffer::<2, _, _>(|ptr, len| {
check_result(
unsafe {

View File

@@ -401,7 +401,7 @@ extern std::string const kAllKeyletsWasmHex =
extern std::string const kCodecovTestsWasmHex =
"0061736d01000000015c0c60067f7f7f7f7f7f017f60027f7f017f60047f7f7f7f017f60037f7f7f017f60077f7f7f"
"7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60057f7f7f7f7f017f60017f017f60057f7f7f7f7f0060047f7f7f7f00"
"60017f006000017f02ee093708686f73745f6c6962057472616365000808686f73745f6c69620a6c6467725f696e64"
"60017f006000017f02d8093608686f73745f6c6962057472616365000808686f73745f6c69620a6c6467725f696e64"
"6578000108686f73745f6c696210706172656e745f6c6467725f74696d65000108686f73745f6c696210706172656e"
"745f6c6467725f68617368000108686f73745f6c696208626173655f666565000108686f73745f6c696211616d656e"
"646d656e745f656e61626c6564000108686f73745f6c69620874785f6669656c64000308686f73745f6c69620e6163"
@@ -420,212 +420,211 @@ extern std::string const kCodecovTestsWasmHex =
"6964000508686f73745f6c696206616d6d5f6964000008686f73745f6c69620d63726564656e7469616c5f69640005"
"08686f73745f6c69620a6d70746f6b656e5f6964000008686f73745f6c696209666c6f61745f636d70000208686f73"
"745f6c696209666c6f61745f616464000408686f73745f6c696209666c6f61745f737562000408686f73745f6c6962"
"0a666c6f61745f6d756c74000408686f73745f6c696209666c6f61745f646976000408686f73745f6c69620a666c6f"
"61745f726f6f74000008686f73745f6c696209666c6f61745f706f77000008686f73745f6c696209657363726f775f"
"6964000008686f73745f6c69620f6d70745f69737375616e63655f6964000008686f73745f6c69620c6e66745f6f66"
"6665725f6964000008686f73745f6c6962086f666665725f6964000008686f73745f6c6962096f7261636c655f6964"
"000008686f73745f6c69620a7061796368616e5f6964000508686f73745f6c6962167065726d697373696f6e65645f"
"646f6d61696e5f6964000008686f73745f6c6962097469636b65745f6964000008686f73745f6c6962087661756c74"
"5f6964000008686f73745f6c69620b64656c65676174655f6964000008686f73745f6c6962126465706f7369745f70"
"7265617574685f6964000008686f73745f6c6962066469645f6964000208686f73745f6c69620a7369676e6572735f"
"69640002030403090a0b05030100110619037f01418080c0000b7f0041da98c0000b7f0041e098c0000b073504066d"
"656d6f727902000d657363726f775f66696e69736800390a5f5f646174615f656e6403010b5f5f686561705f626173"
"6503020ac32e037201017f230041106b22042400024002402000200147044020022003410741014100100020004100"
"480d0120042000ad3703080c020b20042000ac370308200220034101200441086a41081000200441106a24000f0b20"
"042000ac3703080b418080c000410b4101200441086a41081000000b2801017f230041106b2201240020012000ac37"
"030841be91c000410b4101200141086a41081000000ba42d02087f017e230041a0026b2200240041c991c000412341"
"0741014100100020004100360260200041e0006a220141041001410441a090c000410a103720004100360260200141"
"041002410441908bc00041101037200042003703782000420037037020004200370368200042003703602001412010"
"03412041f180c0004110103720004100360260200141041004410441ff83c000410810372000428182848890a0c080"
"013703202000428182848890a0c080013703182000428182848890a0c080013703102000428182848890a0c0800137"
"030841ec91c000410e1005410141fa91c00041111037200041086a41201005410141fa91c000411110372000410036"
"02702000420037036820004200370360024002404181802020014114100622014100480d00200141144b0440417321"
"010c010b20014114460d0141818080807821010b20011038000b2000200029006c3700fd01200020002900673703f8"
"01200020002d00623a002e200020002f01603b012c2000200028006336002f200020002903f8013700332000200029"
"00fd013700382000420037037820004200370370200042003703682000420037036002402000412c6a4114200041e0"
"006a4120100722014120470440200141004e0d0120011038000b200020002d00623a0042200020002f01603b014020"
"00200029006f22083703800220002000280063360043200020002900673700472000200837004f2000200029007737"
"0057200020002d007f3a005f200041406b4120410010084101418b92c0004108103720004100360270200042003703"
"682000420037036041818020200041e0006a220241141009411441d38dc000410d1037200041003602702000420037"
"03682000420037036041014181802020024114100a4114418784c0004108103702404100200041e4006a22046b4103"
"71220320046a220120044d0d0020030440200321050340200441003a0000200441016a2104200541016b22050d000b"
"0b200341016b4107490d000340200441003a0000200441076a41003a0000200441066a41003a0000200441056a4100"
"3a0000200441046a41003a0000200441036a41003a0000200441026a41003a0000200441016a41003a000020044108"
"6a22042001470d000b0b2001413c20036b2203417c716a220420014b0440034020014100360200200141046a220120"
"04490d000b0b024020042003410371220320046a22054f0d002003220104400340200441003a0000200441016a2104"
"200141016b22010d000b0b200341016b4107490d000340200441003a0000200441076a41003a0000200441066a4100"
"3a0000200441056a41003a0000200441046a41003a0000200441036a41003a0000200441026a41003a000020044101"
"6a41003a0000200441086a22042005470d000b0b200041043602a00120004181802036026020004100360288022000"
"420037038002200042003703f80120024104200041f8016a22014114100b411441a280c00041081037200041003602"
"88022000420037038002200042003703f801200220002802a00120014114100c411441d084c000410d103720004100"
"360288022000420037038002200042003703f8014101200220002802a00120014114100d411441b08dc00041081037"
"4189803c100e4120419392c000410a10374189803c100f4120419d92c000410f103741014189803c1010412041ac92"
"c000410a1037200220002802a0011011412041b692c00041101037200220002802a0011012412041c692c000411510"
"374101200220002802a0011013412041db92c000411010372000412c6a220341141014411441eb92c0004108103720"
"0042003703900220004200370388022000420037038002200042003703f801200220002802a0012001412010154120"
"418f84c000410b103741f392c000410c41ff92c000410b418a93c000410e10164101419893c0004109103720002000"
"2903203703c001200020002903183703b801200020002903103703b001200020002903083703a801200041003b0188"
"022000420037038002200042003703f80120034114200041a8016a22054120200141121017411241d18fc000410710"
"3720004100360288022000420037038002200042003703f80120054120200141141018411441ac8fc000410a103720"
"0041003602f801200541202001410410194104419790c0004109103720054120101a410841a193c000410910372005"
"4120101b410a41aa93c000410c1037200041003602f8012005412020014104101c410441ba83c000410a103741b693"
"c000410d410420034114100041b693c000410d410541c393c0004108100041b693c000410d410541cb93c000410810"
"00417f41041003417141d393c00041181037200041003602f8012001417f1003417141a888c0004118103720004100"
"3a00fa01200041003b01f801200141031003417d41e790c000411e1037200041003602f8012001418094ebdc031003"
"417341bd8ec000411d10374102100e416f41eb93c00041191037417f20002802a00110114171418494c00041181037"
"2002417f10114171419c94c0004118103720024181081011417441b494c00041191037200041e094ebdc036a220420"
"002802a0011011417341cd94c000411810372000420037039002200042003703880220004200370380022000420037"
"03f801200341142004410820014120101d417341cc8cc0004114103720004200370390022000420037038802200042"
"0037038002200042003703f801200341142003411420014120101d417141918ec00041161037200042003703900220"
"004200370388022000420037038002200042003703f80120044108200141204100101e4173418b80c0004117103720"
"0042003703900220004200370388022000420037038002200042003703f801200220002802a001200141204100101e"
"417141a485c00041201037200420002802a00141011008417341e594c00041101037200220002802a0014101100841"
"7141f594c00041121037200042003703900220004200370388022000420037038002200042003703f8012004200028"
"02a001200141201007417341a78ec00041161037200042003703900220004200370388022000420037038002200042"
"003703f801200220002802a0012001412010074171418e83c000411810372000420037039002200042003703880220"
"00420037038002200042003703f8012003411420034114200420002802a00120014120101f4173418591c000411d10"
"37200042003703900220004200370388022000420037038002200042003703f8012003411420034114200220002802"
"a00120014120101f4171419581c000411f103720004200370390022000420037038802200042003703800220004200"
"3703f80141c698c0004114200420002802a001200141201020417341dc8ac000411510372000420037039002200042"
"00370388022000420037038002200042003703f80141c698c0004114200220002802a0012001412010204171418e89"
"c000411b1037200042003703900220004200370388022000420037038002200042003703f80141c698c00041144187"
"95c0004114200141201020417141a38ac0004125103720004200370390022000420037038802200042003703800220"
"0042003703f801419b95c000412841c698c00041142001412010204171418887c000412110372000200028013c3602"
"dc01200020002901343702d4012000200029012c3702cc01200041808080083602c801200041003b01f801200041c8"
"016a2207411841c698c0004114200141021020417141be80c000410a10372000422a3703e001200420002802a00141"
"01200041e0016a41081000200041003b01f8014102200141021006416f41b481c00041171037200041003b01f80141"
"02200141021009416f41f68ec000411c1037200041003b01f8014101410220014102100a416f41b586c00041171037"
"4102100e416f41eb93c000411910374102100f416f41c395c000411e1037410141021010416f41e195c00041191037"
"41ec91c0004181081005417441fa95c000411f103741ec91c00041c10010054174419996c000411a1037200041003b"
"01f801200241810820014102100b417441a987c00041161037200041003b01f801200241810820014102100c417441"
"aa90c000411b1037200041003b01f8014101200241810820014102100d417441db88c0004116103720024181081011"
"417441b396c000411e103720024181081012417441d196c00041231037410120024181081013417441f496c000411e"
"1037200241810810144174419297c0004116103741b693c00041810841ff92c000410b418a93c000410e1016417441"
"9893c0004109103741b693c000410d41ff92c000418108418a93c000410e10164174419893c0004109103741b693c0"
"00410d41ff92c000410b418a93c00041810810164174419893c00041091037200041003b01f8012002418108200141"
"021015417441c483c00041191037200041003b01f80141c698c00041810841c698c0004114200141021020417441dd"
"82c00041141037200041003b01f80120034114200341142002418108200141021021417441cc86c000411b10372000"
"41003b01f801200741810820034114200141021022417441c389c000411e103741b693c000410d4107200420002802"
"a0011000200042d487b6f4c7d4b1c0003700ec0141b693c000410d4103200041ec95ebdc036a22054108100041b693"
"c000410d4105200420002802a001100020054108200041ec016a220441081023417341a897c0004114103720044108"
"200541081023417341bc97c00041141037200041003b01f80120054108200441082001410241001024417341e08dc0"
"0041141037200041003b01f801200441082005410820014102410010244173418181c00041141037200041003b01f8"
"0120054108200441082001410241001025417341aa80c00041141037200041003b01f8012004410820054108200141"
"0241001025417341e08cc00041141037200041003b01f80120054108200441082001410241001026417341bb84c000"
"41151037200041003b01f80120044108200541082001410241001026417341c98bc00041151037200041003b01f801"
"20054108200441082001410241001027417341a683c00041141037200041003b01f801200441082005410820014102"
"41001027417341c88ac00041141037200041003b01f80120054108410320014102410010284173419488c000411410"
"37200041003b01f8012005410841032001410241001029417341ff85c0004113103720004200370390022000420037"
"0388022000420037038002200042003703f801200341142003411420014120102a417141c088c000411b1037200042"
"003703900220004200370388022000420037038002200042003703f801200341142003411420014120102b417141bc"
"82c00041211037200042003703900220004200370388022000420037038002200042003703f8012003411420034114"
"20014120102c417141928dc000411e1037200042003703900220004200370388022000420037038002200042003703"
"f801200341142003411420014120102d417141928fc000411a10372000420037039002200042003703880220004200"
"37038002200042003703f801200341142003411420014120102e417141b88dc000411b103720004200370390022000"
"4200370388022000420037038002200042003703f80120034114200341142003411420014120102f417141a291c000"
"411c1037200042003703900220004200370388022000420037038002200042003703f8012003411420034114200141"
"201030417141ef81c00041281037200042003703900220004200370388022000420037038002200042003703f80120"
"03411420034114200141201031417141b68fc000411b10372000420037039002200042003703880220004200370380"
"02200042003703f8012003411420034114200141201032417141a989c000411a1037200220002802a0014100100841"
"7141d097c000411b1037200041003b01f80120034114200220002802a001200141021017417141de87c000411a1037"
"200041003b01f801200220002802a001200141021018417141e285c000411d1037200041003b01f801200220002802"
"a001200141021019417141da8ec000411c1037200220002802a001101a417141eb97c000411c1037200220002802a0"
"01101b4171418798c000411f1037200041003602f801200220002802a00120014104101c417141f48dc000411d1037"
"200041003b01f801200220002802a001200141021007417141ff89c00041241037200041808080083602f401200041"
"003b01f801200220002802a001200041f4016a2205410420014102101d417141f48cc000411e1037200041003b01f8"
"01200220002802a00122062003411420022006200141021021417141dd84c00041241037200041003b01f801200341"
"14200220002802a001220620022006200141021021417141cb81c00041241037200041003b01f801200220002802a0"
"0120034114200141021033417141dd83c00041221037200041003b01f80120034114200220002802a0012001410210"
"33417141de8bc00041221037200041003b01f801200220002802a00120034114200141021034417141c880c0004129"
"1037200041003b01f80120034114200220002802a001200141021034417141a08bc00041291037200041003b01f801"
"200220002802a001200141021035417141f887c000411c1037200041003b01f801200220002802a001200541042001"
"4102102a417141f18ac000411f1037200041003b01f801200220002802a00120034114418795c00041142001410210"
"1f4171419286c00041231037200041003b01f80120034114200220002802a001418795c000411420014102101f4171"
"418185c00041231037200041003b01f801200220002802a0012005410420014102102b4171419782c0004125103720"
"0041003b01f80120074118200220002802a001200141021022417141ac8cc00041201037200041003b01f801200220"
"002802a0012005410420014102102c417141c590c00041221037200041003b01f801200220002802a0012005410420"
"014102102d417141e189c000411e1037200041003b01f801200220002802a0012005410420014102102e417141bf87"
"c000411f1037200041003b01f801200220002802a001200341142005410420014102102f417141e786c00041211037"
"200041003b01f80120034114200220002802a0012005410420014102102f4171419a84c00041211037200041003b01"
"f801200220002802a00120054104200141021030417141808cc000412c1037200041003b01f801200220002802a001"
"200141021036417141f78fc00041201037200041003b01f801200220002802a00120054104200141021031417141d8"
"8fc000411f1037200041003b01f801200220002802a00120054104200141021032417141c485c000411e1037200041"
"003b01f801200220002802a00141a698c0004120200141021017417141f182c000411d103741b693c000410d410420"
"0220002802a001100041b6a7abdd03410d410741a698c0004120100041b6a7abdd03410d410320044108100041b6a7"
"abdd03410d410420034114100041b6a7abdd03410d410541cb93c00041081000200220002802a00141072002418108"
"1000200042013703f8012002418108410120014108100041b693c000418108410320044108100041b693c000418108"
"410420034114100041b693c000418108410541cb93c0004108100041b693c000410d4105200220002802a001100020"
"0041003b019e02200220002802a001200341142000419e026a41021022417141f188c000411d103741b693c000410d"
"41e300200220002802a0011000410141004104200341141000200041a0026a240041010f0b000b0bb1180200418080"
"c0000b9b1554455354204641494c4544666c6f61745f66726f6d5f75696e745f6c656e5f6f6f6274785f696e6e6572"
"666c6f61745f7375625f6f6f625f736c69636531616d6d5f69645f6d70746465706f7369745f707265617574685f69"
"645f77726f6e675f73697a655f6163636f756e745f696431706172656e745f6c6467725f68617368666c6f61745f61"
"64645f6f6f625f736c6963653274727573746c696e655f69645f77726f6e675f6c656e5f63757272656e637974785f"
"6669656c645f696e76616c69645f736669656c6463726564656e7469616c5f69645f77726f6e675f73697a655f6163"
"636f756e745f6964327065726d697373696f6e65645f646f6d61696e5f69645f77726f6e675f73697a655f75696e74"
"33326d70745f69737375616e63655f69645f77726f6e675f73697a655f6163636f756e745f69646d70745f69737375"
"616e63655f69645f77726f6e675f73697a655f75696e743332616d6d5f69645f746f6f5f6269675f736c6963656e66"
"745f7572695f77726f6e675f73697a655f6163636f756e745f69646163636f756e74726f6f745f69645f77726f6e67"
"5f6c656e666c6f61745f6469765f6f6f625f736c696365316e66745f73657269616c7368613531325f68616c665f74"
"6f6f5f6269675f736c69636564656c65676174655f69645f77726f6e675f73697a655f6163636f756e745f69643162"
"6173655f6665656c655f6669656c647368613531325f68616c667061796368616e5f69645f77726f6e675f73697a65"
"5f6163636f756e745f696432666c6f61745f6d756c745f6f6f625f736c69636531686f6d655f6c655f696e6e657263"
"726564656e7469616c5f69645f77726f6e675f73697a655f6163636f756e745f69643174727573746c696e655f6964"
"5f77726f6e675f73697a655f6163636f756e745f696432666c6f61745f66726f6d5f75696e745f77726f6e675f6c65"
"6e5f75696e7436347661756c745f69645f77726f6e675f73697a655f6163636f756e745f69646e66745f6973737565"
"725f77726f6e675f73697a655f75696e74323536666c6f61745f706f775f6f6f625f736c69636574727573746c696e"
"655f69645f77726f6e675f73697a655f6163636f756e745f6964316c655f6669656c645f696e76616c69645f736669"
"656c6463726564656e7469616c5f69645f746f6f5f6269675f736c6963657061796368616e5f69645f77726f6e675f"
"73697a655f6163636f756e745f696431616d6d5f69645f6c656e5f77726f6e675f7872705f63757272656e63795f6c"
"656e74785f696e6e65725f746f6f5f6269675f736c6963656f7261636c655f69645f77726f6e675f73697a655f6163"
"636f756e745f69646e66745f7572695f77726f6e675f73697a655f75696e743235366469645f69645f77726f6e675f"
"73697a655f6163636f756e745f6964666c6f61745f726f6f745f6f6f625f736c696365706172656e745f6c6467725f"
"686173685f6e65675f6c656e657363726f775f69645f77726f6e675f73697a655f75696e7433326c655f696e6e6572"
"5f746f6f5f6269675f736c6963656d70746f6b656e5f69645f6d707469645f77726f6e675f6c656e677468616d6d5f"
"69645f6c656e5f77726f6e675f6c656e5f6173736574327661756c745f69645f77726f6e675f73697a655f75696e74"
"33326d70746f6b656e5f69645f746f6f5f6269675f736c6963655f6d707469646f666665725f69645f77726f6e675f"
"73697a655f6163636f756e745f69646163636f756e74726f6f745f69645f77726f6e675f73697a655f6163636f756e"
"745f6964616d6d5f69645f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e666c6f61745f"
"6469765f6f6f625f736c69636532616d6d5f69645f6c656e5f6f6f625f617373657432657363726f775f69645f7772"
"6f6e675f73697a655f6163636f756e745f6964706172656e745f6c6467725f74696d656465706f7369745f70726561"
"7574685f69645f77726f6e675f73697a655f6163636f756e745f696432666c6f61745f6d756c745f6f6f625f736c69"
"63653264656c65676174655f69645f77726f6e675f73697a655f6163636f756e745f6964327065726d697373696f6e"
"65645f646f6d61696e5f69645f77726f6e675f73697a655f6163636f756e745f69646d70746f6b656e5f69645f7772"
"6f6e675f73697a655f6163636f756e745f6964636865636b5f69645f6f6f625f6c656e5f753332666c6f61745f7375"
"625f6f6f625f736c69636532636865636b5f69645f77726f6e675f73697a655f6163636f756e745f69646e66745f6f"
"666665725f69645f77726f6e675f73697a655f75696e7433326c655f696e6e65726f7261636c655f69645f77726f6e"
"675f73697a655f75696e743332686f6d655f6c655f6669656c64666c6f61745f6164645f6f6f625f736c696365316e"
"66745f73657269616c5f77726f6e675f73697a655f75696e74323536636865636b5f69645f77726f6e675f6c656e5f"
"7533326163636f756e74726f6f745f69645f6c656e5f6f6f62706172656e745f6c6467725f686173685f6c656e5f74"
"6f6f5f6c6f6e676e66745f7461786f6e5f77726f6e675f73697a655f75696e74323536686f6d655f6c655f6669656c"
"645f696e76616c69645f736669656c646f666665725f69645f77726f6e675f73697a655f75696e7433326e66745f69"
"73737565727469636b65745f69645f77726f6e675f73697a655f75696e7433326e66745f7572697469636b65745f69"
"645f77726f6e675f73697a655f6163636f756e745f69647369676e6572735f69645f77726f6e675f73697a655f6163"
"636f756e745f69646e66745f7461786f6e6c6467725f696e646578686f6d655f6c655f696e6e65725f746f6f5f6269"
"675f736c6963656e66745f6f666665725f69645f77726f6e675f73697a655f6163636f756e745f6964706172656e74"
"5f6c6467725f686173685f6275665f746f6f5f736d616c6c74727573746c696e655f69645f6c656e5f6f6f625f6375"
"7272656e63797061796368616e5f69645f77726f6e675f73697a655f75696e7433326572726f725f636f64653d2424"
"242424205354415254494e47205741534d20455845435554494f4e202424242424746573745f616d656e646d656e74"
"616d656e646d656e745f656e61626c656463616368655f6c6574785f6172725f6c656e686f6d655f6c655f6172725f"
"6c656e6c655f6172725f6c656e74785f696e6e65725f6172725f6c656e686f6d655f6c655f696e6e65725f6172725f"
"6c656e6c655f696e6e65725f6172725f6c656e7365745f6461746174657374206d6573736167657465737420707562"
"6b657974657374207369676e6174757265636865636b5f7369676e66745f666c6167736e66745f786665725f666565"
"74657374696e67207472616365400000000000005f4000000000000000706172656e745f6c6467725f686173685f6e"
"65675f70747274785f6172725f6c656e5f696e76616c69645f736669656c6474785f696e6e65725f6172725f6c656e"
"5f6e65675f70747274785f696e6e65725f6172725f6c656e5f6e65675f6c656e74785f696e6e65725f6172725f6c65"
"6e5f746f6f5f6c6f6e6774785f696e6e65725f6172725f6c656e5f7074725f6f6f6263616368655f6c655f7074725f"
"6f6f6263616368655f6c655f77726f6e675f6c656e55534430303030303030303030303030303030300041c395c000"
"0b8303686f6d655f6c655f6172725f6c656e5f696e76616c69645f736669656c646c655f6172725f6c656e5f696e76"
"616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d656e64"
"6d656e745f656e61626c65645f746f6f5f6c6f6e6774785f696e6e65725f6172725f6c656e5f746f6f5f6269675f73"
"6c696365686f6d655f6c655f696e6e65725f6172725f6c656e5f746f6f5f6269675f736c6963656c655f696e6e6572"
"5f6172725f6c656e5f746f6f5f6269675f736c6963657365745f646174615f746f6f5f6269675f736c696365666c6f"
"61745f636d705f6f6f625f736c69636531666c6f61745f636d705f6f6f625f736c6963653263616368655f6c655f77"
"726f6e675f73697a655f75696e743235366e66745f666c6167735f77726f6e675f73697a655f75696e743235366e66"
"745f786665725f6665655f77726f6e675f73697a655f75696e74323536303030303030303030303030303030303030"
"3030303030303030303030303031004d0970726f64756365727302086c616e6775616765010452757374000c70726f"
"6365737365642d6279010572757374631d312e39352e30202835393830373631366520323032362d30342d31342900"
"2c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874";
"0a666c6f61745f6d756c74000408686f73745f6c696209666c6f61745f646976000408686f73745f6c696209666c6f"
"61745f706f77000008686f73745f6c696209657363726f775f6964000008686f73745f6c69620f6d70745f69737375"
"616e63655f6964000008686f73745f6c69620c6e66745f6f666665725f6964000008686f73745f6c6962086f666665"
"725f6964000008686f73745f6c6962096f7261636c655f6964000008686f73745f6c69620a7061796368616e5f6964"
"000508686f73745f6c6962167065726d697373696f6e65645f646f6d61696e5f6964000008686f73745f6c69620974"
"69636b65745f6964000008686f73745f6c6962087661756c745f6964000008686f73745f6c69620b64656c65676174"
"655f6964000008686f73745f6c6962126465706f7369745f707265617574685f6964000008686f73745f6c69620664"
"69645f6964000208686f73745f6c69620a7369676e6572735f69640002030403090a0b05030100110619037f014180"
"80c0000b7f0041c698c0000b7f0041d098c0000b073504066d656d6f727902000d657363726f775f66696e69736800"
"380a5f5f646174615f656e6403010b5f5f686561705f6261736503020aa22e037201017f230041106b220424000240"
"02402000200147044020022003410741014100100020004100480d0120042000ad3703080c020b20042000ac370308"
"200220034101200441086a41081000200441106a24000f0b20042000ac3703080b418080c000410b4101200441086a"
"41081000000b2801017f230041106b2201240020012000ac37030841aa91c000410b4101200141086a41081000000b"
"832d02087f017e230041a0026b2200240041b591c0004123410741014100100020004100360260200041e0006a2201"
"41041001410441888ec000410a103620004100360260200141041002410441a683c000411010362000420037037820"
"0042003703702000420037036820004200370360200141201003412041a185c0004110103620004100360260200141"
"041004410441d888c000410810362000428182848890a0c080013703202000428182848890a0c08001370318200042"
"8182848890a0c080013703102000428182848890a0c0800137030841d891c000410e1005410141e691c00041111036"
"200041086a41201005410141e691c00041111036200041003602702000420037036820004200370360024002404181"
"802020014114100622014100480d00200141144b0440417321010c010b20014114460d0141808080807821010b2001"
"1037000b2000200029006c3700fd01200020002900673703f801200020002d00623a002e200020002f01603b012c20"
"00200028006336002f200020002903f801370033200020002900fd0137003820004200370378200042003703702000"
"42003703682000420037036002402000412c6a4114200041e0006a4120100722014120470440200141004e0d012001"
"1037000b200020002d00623a0042200020002f01603b01402000200029006f22083703800220002000280063360043"
"200020002900673700472000200837004f20002000290077370057200020002d007f3a005f200041406b4120410010"
"08410141f791c0004108103620004100360270200042003703682000420037036041818020200041e0006a22024114"
"1009411441a68fc000410d103620004100360270200042003703682000420037036041014181802020024114100a41"
"1441bf8cc0004108103602404100200041e4006a22046b410371220320046a220120044d0d00200304402003210503"
"40200441003a0000200441016a2104200541016b22050d000b0b200341016b4107490d000340200441003a00002004"
"41076a41003a0000200441066a41003a0000200441056a41003a0000200441046a41003a0000200441036a41003a00"
"00200441026a41003a0000200441016a41003a0000200441086a22042001470d000b0b2001413c20036b2203417c71"
"6a220420014b0440034020014100360200200141046a22012004490d000b0b024020042003410371220320046a2205"
"4f0d002003220104400340200441003a0000200441016a2104200141016b22010d000b0b200341016b4107490d0003"
"40200441003a0000200441076a41003a0000200441066a41003a0000200441056a41003a0000200441046a41003a00"
"00200441036a41003a0000200441026a41003a0000200441016a41003a0000200441086a22042005470d000b0b2000"
"41043602a00120004181802036026020004100360288022000420037038002200042003703f80120024104200041f8"
"016a22014114100b4114418388c0004108103620004100360288022000420037038002200042003703f80120022000"
"2802a00120014114100c411441e085c000410d103620004100360288022000420037038002200042003703f8014101"
"200220002802a00120014114100d4114418b86c000410810364189803c100e412041ff91c000410a10364189803c10"
"0f4120418992c000410f103641014189803c10104120419892c000410a1036200220002802a0011011412041a292c0"
"0041101036200220002802a0011012412041b292c000411510364101200220002802a0011013412041c792c0004110"
"10362000412c6a220341141014411441d792c000410810362000420037039002200042003703880220004200370380"
"02200042003703f801200220002802a001200141201015412041db82c000410b103641df92c000410c41eb92c00041"
"0b41f692c000410e10164101418493c00041091036200020002903203703c001200020002903183703b80120002000"
"2903103703b001200020002903083703a801200041003b0188022000420037038002200042003703f8012003411420"
"0041a8016a220541202001411210174112418c84c00041071036200041003602880220004200370380022000420037"
"03f801200541202001411410184114419386c000410a1036200041003602f80120054120200141041019410441c48a"
"c0004109103620054120101a4108418d93c0004109103620054120101b410a419693c000410c1036200041003602f8"
"012005412020014104101c410441818fc000410a103641a293c000410d410420034114100041a293c000410d410541"
"af93c0004108100041a293c000410d410541b793c00041081000417f41041003417141bf93c0004118103620004100"
"3602f8012001417f1003417141e686c00041181036200041003a00fa01200041003b01f801200141031003417d41f8"
"80c000411e1036200041003602f8012001418094ebdc0310034173419790c000411d10364102100e416f41d793c000"
"41191036417f20002802a0011011417141f093c000411810362002417f10114171418894c000411810362002418108"
"1011417441a094c00041191036200041e094ebdc036a220420002802a0011011417341b994c0004118103620004200"
"3703900220004200370388022000420037038002200042003703f801200341142004410820014120101d417341e283"
"c00041141036200042003703900220004200370388022000420037038002200042003703f801200341142003411420"
"014120101d417141eb84c00041161036200042003703900220004200370388022000420037038002200042003703f8"
"0120044108200141204100101e417341ea8ec000411710362000420037039002200042003703880220004200370380"
"02200042003703f801200220002802a001200141204100101e4171418185c00041201036200420002802a001410110"
"08417341d194c00041101036200220002802a00141011008417141e194c00041121036200042003703900220004200"
"370388022000420037038002200042003703f801200420002802a0012001412010074173418b8bc000411610362000"
"42003703900220004200370388022000420037038002200042003703f801200220002802a001200141201007417141"
"b683c00041181036200042003703900220004200370388022000420037038002200042003703f80120034114200341"
"14200420002802a00120014120101f417341c78cc000411d1036200042003703900220004200370388022000420037"
"038002200042003703f8012003411420034114200220002802a00120014120101f417141e489c000411f1036200042"
"003703900220004200370388022000420037038002200042003703f80141b298c0004114200420002802a001200141"
"201020417341a688c00041151036200042003703900220004200370388022000420037038002200042003703f80141"
"b298c0004114200220002802a001200141201020417141c787c000411b103620004200370390022000420037038802"
"2000420037038002200042003703f80141b298c000411441f394c0004114200141201020417141bb85c00041251036"
"200042003703900220004200370388022000420037038002200042003703f801418795c000412841b298c000411420"
"0141201020417141c98bc000412110362000200028013c3602dc01200020002901343702d4012000200029012c3702"
"cc01200041808080083602c801200041003b01f801200041c8016a2207411841b298c0004114200141021020417141"
"b185c000410a10362000422a3703e001200420002802a0014101200041e0016a41081000200041003b01f801410220"
"0141021006416f41af80c00041171036200041003b01f8014102200141021009416f419787c000411c103620004100"
"3b01f8014101410220014102100a416f41e682c000411710364102100e416f41d793c000411910364102100f416f41"
"af95c000411e1036410141021010416f41cd95c0004119103641d891c0004181081005417441e695c000411f103641"
"d891c00041c10010054174418596c000411a1036200041003b01f801200241810820014102100b417441f683c00041"
"161036200041003b01f801200241810820014102100c4174418b88c000411b1036200041003b01f801410120024181"
"0820014102100d4174419384c00041161036200241810810114174419f96c000411e103620024181081012417441bd"
"96c00041231036410120024181081013417441e096c000411e103620024181081014417441fe96c0004116103641a2"
"93c00041810841eb92c000410b41f692c000410e10164174418493c0004109103641a293c000410d41eb92c0004181"
"0841f692c000410e10164174418493c0004109103641a293c000410d41eb92c000410b41f692c00041810810164174"
"418493c00041091036200041003b01f8012002418108200141021015417441fe86c00041191036200041003b01f801"
"41b298c00041810841b298c0004114200141021020417441b58bc00041141036200041003b01f80120034114200341"
"142002418108200141021021417441c082c000411b1036200041003b01f80120074181082003411420014102102241"
"7441da80c000411e103641a293c000410d4107200420002802a0011000200042d487b6f4c7d4b1c0003700ec0141a2"
"93c000410d4103200041ec95ebdc036a22054108100041a293c000410d4105200420002802a0011000200541082000"
"41ec016a2204410810234173419497c0004114103620044108200541081023417341a897c00041141036200041003b"
"01f80120054108200441082001410241001024417341ac82c00041141036200041003b01f801200441082005410820"
"01410241001024417341ce83c00041141036200041003b01f80120054108200441082001410241001025417341a18b"
"c00041141036200041003b01f80120044108200541082001410241001025417341c680c00041141036200041003b01"
"f80120054108200441082001410241001026417341cd8ac00041151036200041003b01f80120044108200541082001"
"410241001026417341c781c00041151036200041003b01f80120054108200441082001410241001027417341b387c0"
"0041141036200041003b01f801200441082005410820014102410010274173419d86c00041141036200041003b01f8"
"0120054108410320014102410010284173419681c00041131036200042003703900220004200370388022000420037"
"038002200042003703f8012003411420034114200141201029417141ea8bc000411b10362000420037039002200042"
"00370388022000420037038002200042003703f801200341142003411420014120102a417141e287c0004121103620"
"0042003703900220004200370388022000420037038002200042003703f801200341142003411420014120102b4171"
"41a981c000411e1036200042003703900220004200370388022000420037038002200042003703f801200341142003"
"411420014120102c417141b48ec000411a103620004200370390022000420037038802200042003703800220004200"
"3703f801200341142003411420014120102d4171418b8fc000411b1036200042003703900220004200370388022000"
"420037038002200042003703f80120034114200341142003411420014120102e417141ce8ec000411c103620004200"
"3703900220004200370388022000420037038002200042003703f801200341142003411420014120102f417141e08d"
"c00041281036200042003703900220004200370388022000420037038002200042003703f801200341142003411420"
"0141201030417141b186c000411b1036200042003703900220004200370388022000420037038002200042003703f8"
"012003411420034114200141201031417141b490c000411a1036200220002802a00141001008417141bc97c000411b"
"1036200041003b01f80120034114200220002802a001200141021017417141cc86c000411a1036200041003b01f801"
"200220002802a001200141021018417141858cc000411d1036200041003b01f801200220002802a001200141021019"
"417141ce90c000411c1036200220002802a001101a417141d797c000411c1036200220002802a001101b417141f397"
"c000411f1036200041003602f801200220002802a00120014104101c417141a28cc000411d1036200041003b01f801"
"200220002802a0012001410210074171418b80c00041241036200041808080083602f401200041003b01f801200220"
"002802a001200041f4016a2205410420014102101d4171419f8dc000411e1036200041003b01f801200220002802a0"
"0122062003411420022006200141021021417141d28fc00041241036200041003b01f80120034114200220002802a0"
"01220620022006200141021021417141dc81c00041241036200041003b01f801200220002802a00120034114200141"
"021032417141838ac00041221036200041003b01f80120034114200220002802a001200141021032417141a984c000"
"41221036200041003b01f801200220002802a00120034114200141021033417141fd82c00041291036200041003b01"
"f80120034114200220002802a001200141021033417141e28ac00041291036200041003b01f801200220002802a001"
"2001410210344171418089c000411c1036200041003b01f801200220002802a00120054104200141021029417141b3"
"8fc000411f1036200041003b01f801200220002802a0012003411441f394c000411420014102101f417141c189c000"
"41231036200041003b01f80120034114200220002802a00141f394c000411420014102101f417141bd8dc000412310"
"36200041003b01f801200220002802a0012005410420014102102a4171419c89c00041251036200041003b01f80120"
"074118200220002802a001200141021022417141cb84c00041201036200041003b01f801200220002802a001200541"
"0420014102102b417141928ec00041221036200041003b01f801200220002802a0012005410420014102102c417141"
"ed85c000411e1036200041003b01f801200220002802a0012005410420014102102d417141a58ac000411f10362000"
"41003b01f801200220002802a001200341142005410420014102102e417141f68fc00041211036200041003b01f801"
"20034114200220002802a0012005410420014102102e417141ea90c00041211036200041003b01f801200220002802"
"a0012005410420014102102f4171418082c000412c1036200041003b01f801200220002802a0012001410210354171"
"41e088c00041201036200041003b01f801200220002802a001200541042001410210304171418b91c000411f103620"
"0041003b01f801200220002802a00120054104200141021031417141818dc000411e1036200041003b01f801200220"
"002802a001419298c0004120200141021017417141e48cc000411d103641a293c000410d4104200220002802a00110"
"0041a2a7abdd03410d4107419298c0004120100041a2a7abdd03410d410320044108100041a2a7abdd03410d410420"
"034114100041a2a7abdd03410d410541b793c00041081000200220002802a001410720024181081000200042013703"
"f8012002418108410120014108100041a293c000418108410320044108100041a293c0004181084104200341141000"
"41a293c000418108410541b793c0004108100041a293c000410d4105200220002802a0011000200041003b019e0220"
"0220002802a001200341142000419e026a41021022417141bb88c000411d103641a293c000410d41e3002002200028"
"02a0011000410141004104200341141000200041a0026a240041010f0b000b0b9d180200418080c0000b8715544553"
"54204641494c45446163636f756e74726f6f745f69645f77726f6e675f73697a655f6163636f756e745f696474785f"
"6669656c645f696e76616c69645f736669656c64666c6f61745f7375625f6f6f625f736c696365326d70746f6b656e"
"5f69645f746f6f5f6269675f736c6963655f6d70746964706172656e745f6c6467725f686173685f6275665f746f6f"
"5f736d616c6c666c6f61745f706f775f6f6f625f736c6963656e66745f6f666665725f69645f77726f6e675f73697a"
"655f75696e743332666c6f61745f6d756c745f6f6f625f736c6963653263726564656e7469616c5f69645f77726f6e"
"675f73697a655f6163636f756e745f6964327065726d697373696f6e65645f646f6d61696e5f69645f77726f6e675f"
"73697a655f6163636f756e745f6964666c6f61745f6164645f6f6f625f736c6963653163726564656e7469616c5f69"
"645f746f6f5f6269675f736c6963657368613531325f68616c666c655f6669656c645f696e76616c69645f73666965"
"6c646465706f7369745f707265617574685f69645f77726f6e675f73697a655f6163636f756e745f69643170617265"
"6e745f6c6467725f74696d656163636f756e74726f6f745f69645f77726f6e675f6c656e666c6f61745f6164645f6f"
"6f625f736c69636532636865636b5f69645f6f6f625f6c656e5f75333274785f696e6e65725f746f6f5f6269675f73"
"6c6963656e66745f7572696c655f696e6e65725f746f6f5f6269675f736c69636564656c65676174655f69645f7772"
"6f6e675f73697a655f6163636f756e745f6964326d70746f6b656e5f69645f77726f6e675f73697a655f6163636f75"
"6e745f6964636865636b5f69645f77726f6e675f6c656e5f753332666c6f61745f66726f6d5f75696e745f77726f6e"
"675f6c656e5f75696e743634706172656e745f6c6467725f68617368616d6d5f69645f6d7074616d6d5f69645f6c65"
"6e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e686f6d655f6c655f696e6e65726f666665725f"
"69645f77726f6e675f73697a655f6163636f756e745f69646c655f696e6e65726e66745f697373756572666c6f6174"
"5f6469765f6f6f625f736c696365327469636b65745f69645f77726f6e675f73697a655f75696e7433326e66745f75"
"72695f77726f6e675f73697a655f75696e74323536706172656e745f6c6467725f686173685f6e65675f6c656e7368"
"613531325f68616c665f746f6f5f6269675f736c696365686f6d655f6c655f6669656c645f696e76616c69645f7366"
"69656c64666c6f61745f6469765f6f6f625f736c69636531616d6d5f69645f6c656e5f77726f6e675f6c656e5f6173"
"736574326d70745f69737375616e63655f69645f77726f6e675f73697a655f75696e74333274785f696e6e6572686f"
"6d655f6c655f696e6e65725f746f6f5f6269675f736c696365616d6d5f69645f6c656e5f6f6f625f6173736574326d"
"70746f6b656e5f69645f6d707469645f77726f6e675f6c656e677468626173655f6665657369676e6572735f69645f"
"77726f6e675f73697a655f6163636f756e745f69646469645f69645f77726f6e675f73697a655f6163636f756e745f"
"69646d70745f69737375616e63655f69645f77726f6e675f73697a655f6163636f756e745f696474727573746c696e"
"655f69645f77726f6e675f73697a655f6163636f756e745f69643174727573746c696e655f69645f77726f6e675f6c"
"656e5f63757272656e637964656c65676174655f69645f77726f6e675f73697a655f6163636f756e745f6964316f72"
"61636c655f69645f77726f6e675f73697a655f6163636f756e745f69646e66745f7461786f6e666c6f61745f6d756c"
"745f6f6f625f736c696365316465706f7369745f707265617574685f69645f77726f6e675f73697a655f6163636f75"
"6e745f6964326163636f756e74726f6f745f69645f6c656e5f6f6f62666c6f61745f7375625f6f6f625f736c696365"
"31616d6d5f69645f746f6f5f6269675f736c696365616d6d5f69645f6c656e5f77726f6e675f7872705f6375727265"
"6e63795f6c656e657363726f775f69645f77726f6e675f73697a655f75696e7433326e66745f6973737565725f7772"
"6f6e675f73697a655f75696e743235366e66745f73657269616c5f77726f6e675f73697a655f75696e743235366c65"
"5f6669656c6474727573746c696e655f69645f6c656e5f6f6f625f63757272656e63796e66745f7572695f77726f6e"
"675f73697a655f6163636f756e745f69647661756c745f69645f77726f6e675f73697a655f6163636f756e745f6964"
"636865636b5f69645f77726f6e675f73697a655f6163636f756e745f696474727573746c696e655f69645f77726f6e"
"675f73697a655f6163636f756e745f6964327065726d697373696f6e65645f646f6d61696e5f69645f77726f6e675f"
"73697a655f75696e7433326c6467725f696e6465786e66745f6f666665725f69645f77726f6e675f73697a655f6163"
"636f756e745f69646f666665725f69645f77726f6e675f73697a655f75696e7433327061796368616e5f69645f7772"
"6f6e675f73697a655f75696e743332666c6f61745f66726f6d5f75696e745f6c656e5f6f6f626e66745f7365726961"
"6c6f7261636c655f69645f77726f6e675f73697a655f75696e743332686f6d655f6c655f6669656c64657363726f77"
"5f69645f77726f6e675f73697a655f6163636f756e745f696463726564656e7469616c5f69645f77726f6e675f7369"
"7a655f6163636f756e745f6964317061796368616e5f69645f77726f6e675f73697a655f6163636f756e745f696431"
"706172656e745f6c6467725f686173685f6c656e5f746f6f5f6c6f6e677661756c745f69645f77726f6e675f73697a"
"655f75696e7433326e66745f7461786f6e5f77726f6e675f73697a655f75696e743235367061796368616e5f69645f"
"77726f6e675f73697a655f6163636f756e745f6964327469636b65745f69645f77726f6e675f73697a655f6163636f"
"756e745f69646572726f725f636f64653d2424242424205354415254494e47205741534d20455845435554494f4e20"
"2424242424746573745f616d656e646d656e74616d656e646d656e745f656e61626c656463616368655f6c6574785f"
"6172725f6c656e686f6d655f6c655f6172725f6c656e6c655f6172725f6c656e74785f696e6e65725f6172725f6c65"
"6e686f6d655f6c655f696e6e65725f6172725f6c656e6c655f696e6e65725f6172725f6c656e7365745f6461746174"
"657374206d65737361676574657374207075626b657974657374207369676e6174757265636865636b5f7369676e66"
"745f666c6167736e66745f786665725f66656574657374696e67207472616365400000000000005f40000000000000"
"00706172656e745f6c6467725f686173685f6e65675f70747274785f6172725f6c656e5f696e76616c69645f736669"
"656c6474785f696e6e65725f6172725f6c656e5f6e65675f70747274785f696e6e65725f6172725f6c656e5f6e6567"
"5f6c656e74785f696e6e65725f6172725f6c656e5f746f6f5f6c6f6e6774785f696e6e65725f6172725f6c656e5f70"
"74725f6f6f6263616368655f6c655f7074725f6f6f6263616368655f6c655f77726f6e675f6c656e55534430303030"
"303030303030303030303030300041af95c0000b8303686f6d655f6c655f6172725f6c656e5f696e76616c69645f73"
"6669656c646c655f6172725f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c6564"
"5f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e6774785f696e6e65"
"725f6172725f6c656e5f746f6f5f6269675f736c696365686f6d655f6c655f696e6e65725f6172725f6c656e5f746f"
"6f5f6269675f736c6963656c655f696e6e65725f6172725f6c656e5f746f6f5f6269675f736c6963657365745f6461"
"74615f746f6f5f6269675f736c696365666c6f61745f636d705f6f6f625f736c69636531666c6f61745f636d705f6f"
"6f625f736c6963653263616368655f6c655f77726f6e675f73697a655f75696e743235366e66745f666c6167735f77"
"726f6e675f73697a655f75696e743235366e66745f786665725f6665655f77726f6e675f73697a655f75696e743235"
"363030303030303030303030303030303030303030303030303030303030303031004d0970726f6475636572730208"
"6c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e39352e302028353938"
"30373631366520323032362d30342d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d"
"676c6f62616c732b087369676e2d657874";
extern std::string const kBadAlignWasmHex =
"0061736d01000000011b046000017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f60000002260203656e760f666c"

View File

@@ -398,12 +398,6 @@ struct MockHostFunctions : HostFunctions
(Slice const& x, Slice const& y, std::int32_t mode),
(const, override));
MOCK_METHOD(
(std::expected<Bytes, HostFunctionError>),
floatRoot,
(Slice const& x, std::int32_t n, std::int32_t mode),
(const, override));
MOCK_METHOD(
(std::expected<Bytes, HostFunctionError>),
floatPower,

View File

@@ -1,87 +0,0 @@
#include <xrpl/tx/wasm/WasmCommon.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <tx/wasm/HostContextFixture.h>
#include <tx/wasm/MockHostFunctions.h>
#include <cstdint>
#include <expected>
#include <stdexcept>
namespace xrpl::test {
// Every input slice passes straight through to the host, unlike `invokeWithAccount`'s
// twenty-byte check or `parseUint64`'s eight: nothing here is validated, so there is no D
// axis. `n` and `mode` carry different values, so a call that swapped them would fail to
// match.
struct FloatRootCall : HostContextTest
{
Bytes const x{'r', 'o', 'o', 't', '-', 'x'};
std::int32_t const n = 3;
std::int32_t const mode = 11;
};
TEST_F(FloatRootCall, OperandNAndModeAreForwardedResultIsWritten)
{
Bytes const result{4, 5, 6};
EXPECT_CALL(host, floatRoot(BytesAre("root-x"), n, mode)).WillOnce(testing::Return(result));
OutRegion out{32};
EXPECT_EQ(
hostContext.floatRoot(bytesOf(x), n, mode, out.slice()),
static_cast<std::int32_t>(result.size()));
EXPECT_TRUE(out.holds(bytesOf(result)));
}
TEST_F(FloatRootCall, HostErrorBecomesContractReturnValue)
{
EXPECT_CALL(host, floatRoot(BytesAre("root-x"), n, mode))
.WillOnce(testing::Return(std::unexpected(HostFunctionError::FloatComputationError)));
OutRegion out{32};
EXPECT_EQ(
hostContext.floatRoot(bytesOf(x), n, mode, out.slice()),
hfErrorToInt(HostFunctionError::FloatComputationError));
EXPECT_FALSE(out.wasWritten());
}
TEST_F(FloatRootCall, HostExceptionBecomesInternalFatalAndIsLogged)
{
EXPECT_CALL(host, floatRoot(BytesAre("root-x"), n, mode))
.WillOnce(testing::Throw(std::runtime_error{"float root came apart"}));
OutRegion out{32};
EXPECT_EQ(
hostContext.floatRoot(bytesOf(x), n, mode, out.slice()),
hfErrorToInt(HostFunctionError::InternalFatal));
EXPECT_THAT(logged(), testing::HasSubstr("float root came apart"));
EXPECT_THAT(logged(), testing::HasSubstr("floatRoot"));
}
// The out-region contract: write only if the whole value fits, and return the true length
// either way.
TEST_F(FloatRootCall, ShortOutRegionWritesNothingAndReturnsTrueLength)
{
Bytes const result{4, 5, 6};
EXPECT_CALL(host, floatRoot(BytesAre("root-x"), n, mode)).WillOnce(testing::Return(result));
OutRegion out{result.size() - 1};
EXPECT_EQ(
hostContext.floatRoot(bytesOf(x), n, mode, out.slice()),
static_cast<std::int32_t>(result.size()));
EXPECT_FALSE(out.wasWritten());
}
// No length rule exists at this layer: a differently sized operand still reaches the host
// rather than being refused.
TEST_F(FloatRootCall, OddSizedOperandReachesHostUnchanged)
{
Bytes const shortX{0x2a};
EXPECT_CALL(host, floatRoot(testing::_, n, mode)).WillOnce(testing::Return(Bytes{1}));
OutRegion out{32};
EXPECT_EQ(hostContext.floatRoot(bytesOf(shortX), n, mode, out.slice()), 1);
}
} // namespace xrpl::test

View File

@@ -1,68 +0,0 @@
#include <xrpl/basics/Slice.h>
#include <xrpl/tx/wasm/WasmCommon.h>
#include <gtest/gtest.h>
#include <tx/wasm/FloatFixture.h>
#include <tx/wasm/RealHostFixture.h>
namespace xrpl::test {
struct FloatRootImpl : FloatTest
{
};
TEST_F(FloatRootImpl, BadModeIsMalformed)
{
expectError(
makeHost()->floatRoot(slice(FloatTest::kOne), 2, -1),
HostFunctionError::FloatInputMalformed);
}
TEST_F(FloatRootImpl, MalformedInput)
{
expectError(makeHost()->floatRoot(Slice{}, 3, 0), HostFunctionError::FloatInputMalformed);
}
TEST_F(FloatRootImpl, NegativeDegreeIsMalformed)
{
expectError(
makeHost()->floatRoot(slice(FloatTest::kOne), -2, 0),
HostFunctionError::FloatInputMalformed);
}
TEST_F(FloatRootImpl, RootOfZeroIsZero)
{
expectValue(makeHost()->floatRoot(slice(FloatTest::kIntZero), 2, 0), FloatTest::kIntZero);
}
TEST_F(FloatRootImpl, FirstRootIsIdentity)
{
expectValue(makeHost()->floatRoot(slice(FloatTest::kMaxIOU), 1, 0), FloatTest::kMaxIOU);
}
TEST_F(FloatRootImpl, SquareRootOfHundredIsTen)
{
auto h = makeHost();
auto const hundred = h->floatFromMantExp(100, 0, 0);
ASSERT_TRUE(hundred.has_value());
expectValue(h->floatRoot(slice(*hundred), 2, 0), FloatTest::kTen);
}
TEST_F(FloatRootImpl, CubeRootOfThousandIsTen)
{
auto h = makeHost();
auto const thousand = h->floatFromMantExp(1000, 0, 0);
ASSERT_TRUE(thousand.has_value());
expectValue(h->floatRoot(slice(*thousand), 3, 0), FloatTest::kTen);
}
TEST_F(FloatRootImpl, SquareRootOfHundredthIsTenth)
{
auto h = makeHost();
auto const hundredth = h->floatFromMantExp(1, -2, 0);
auto const tenth = h->floatFromMantExp(1, -1, 0);
ASSERT_TRUE(hundredth.has_value() && tenth.has_value());
expectValue(h->floatRoot(slice(*hundredth), 2, 0), *tenth);
}
} // namespace xrpl::test