From 1c632766683864e927467f78d422108979a89e79 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Mon, 28 Jul 2025 17:12:23 -0400 Subject: [PATCH 1/9] dep: add dlc, dlc-messages, & dlc-trie to dlcdevkit --- Cargo.lock | 115 +- Cargo.toml | 2 +- ddk-node/Cargo.toml | 9 +- ddk/Cargo.toml | 18 +- dlc-messages/CHANGELOG.md | 35 + dlc-messages/Cargo.toml | 28 + dlc-messages/Readme.md | 3 + dlc-messages/src/channel.rs | 589 + dlc-messages/src/compatibility_tests.rs | 752 + dlc-messages/src/contract_msgs.rs | 316 + dlc-messages/src/lib.rs | 742 + dlc-messages/src/message_handler.rs | 385 + dlc-messages/src/oracle_msgs.rs | 645 + dlc-messages/src/segmentation/mod.rs | 130 + .../src/segmentation/segment_reader.rs | 244 + dlc-messages/src/ser_impls.rs | 683 + dlc-messages/src/ser_macros.rs | 266 + dlc-messages/src/serde_utils.rs | 74 + dlc-messages/src/test_inputs/accept_msg.json | 1465 ++ .../src/test_inputs/dlc_fee_test.json | 12362 +++++++++++++++ .../src/test_inputs/dlc_fee_test_scripts.json | 57 + dlc-messages/src/test_inputs/dlc_test.json | 2766 ++++ dlc-messages/src/test_inputs/dlc_tx_test.json | 2899 ++++ dlc-messages/src/test_inputs/offer_msg.json | 163 + .../src/test_inputs/offer_msg_disjoint.json | 352 + .../test_inputs/offer_msg_with_dlc_input.json | 171 + .../src/test_inputs/segment_chunk_msg.json | 12635 ++++++++++++++++ .../src/test_inputs/segment_start_msg.json | 4022 +++++ dlc-messages/src/test_inputs/sign_msg.json | 383 + dlc-trie/CHANGELOG.md | 38 + dlc-trie/Cargo.toml | 22 + dlc-trie/Readme.md | 3 + dlc-trie/src/combination_iterator.rs | 100 + dlc-trie/src/digit_decomposition.rs | 653 + dlc-trie/src/digit_trie.rs | 760 + dlc-trie/src/lib.rs | 358 + dlc-trie/src/multi_oracle.rs | 840 + dlc-trie/src/multi_oracle_trie.rs | 426 + dlc-trie/src/multi_oracle_trie_with_diff.rs | 295 + dlc-trie/src/multi_trie.rs | 1035 ++ dlc-trie/src/test_utils.rs | 22 + dlc-trie/src/utils.rs | 207 + dlc/CHANGELOG.md | 41 + dlc/Cargo.toml | 27 + dlc/Readme.md | 5 + dlc/benches/Readme.md | 9 + dlc/benches/benchmarks.rs | 458 + dlc/src/channel/mod.rs | 973 ++ dlc/src/dlc_input.rs | 136 + dlc/src/lib.rs | 1716 +++ dlc/src/secp_utils.rs | 109 + dlc/src/util.rs | 258 + payouts/Cargo.toml | 13 +- 53 files changed, 50765 insertions(+), 50 deletions(-) create mode 100644 dlc-messages/CHANGELOG.md create mode 100644 dlc-messages/Cargo.toml create mode 100644 dlc-messages/Readme.md create mode 100644 dlc-messages/src/channel.rs create mode 100644 dlc-messages/src/compatibility_tests.rs create mode 100644 dlc-messages/src/contract_msgs.rs create mode 100644 dlc-messages/src/lib.rs create mode 100644 dlc-messages/src/message_handler.rs create mode 100644 dlc-messages/src/oracle_msgs.rs create mode 100644 dlc-messages/src/segmentation/mod.rs create mode 100644 dlc-messages/src/segmentation/segment_reader.rs create mode 100644 dlc-messages/src/ser_impls.rs create mode 100644 dlc-messages/src/ser_macros.rs create mode 100644 dlc-messages/src/serde_utils.rs create mode 100644 dlc-messages/src/test_inputs/accept_msg.json create mode 100644 dlc-messages/src/test_inputs/dlc_fee_test.json create mode 100644 dlc-messages/src/test_inputs/dlc_fee_test_scripts.json create mode 100644 dlc-messages/src/test_inputs/dlc_test.json create mode 100644 dlc-messages/src/test_inputs/dlc_tx_test.json create mode 100644 dlc-messages/src/test_inputs/offer_msg.json create mode 100644 dlc-messages/src/test_inputs/offer_msg_disjoint.json create mode 100644 dlc-messages/src/test_inputs/offer_msg_with_dlc_input.json create mode 100644 dlc-messages/src/test_inputs/segment_chunk_msg.json create mode 100644 dlc-messages/src/test_inputs/segment_start_msg.json create mode 100644 dlc-messages/src/test_inputs/sign_msg.json create mode 100644 dlc-trie/CHANGELOG.md create mode 100644 dlc-trie/Cargo.toml create mode 100644 dlc-trie/Readme.md create mode 100644 dlc-trie/src/combination_iterator.rs create mode 100644 dlc-trie/src/digit_decomposition.rs create mode 100644 dlc-trie/src/digit_trie.rs create mode 100644 dlc-trie/src/lib.rs create mode 100644 dlc-trie/src/multi_oracle.rs create mode 100644 dlc-trie/src/multi_oracle_trie.rs create mode 100644 dlc-trie/src/multi_oracle_trie_with_diff.rs create mode 100644 dlc-trie/src/multi_trie.rs create mode 100644 dlc-trie/src/test_utils.rs create mode 100644 dlc-trie/src/utils.rs create mode 100644 dlc/CHANGELOG.md create mode 100644 dlc/Cargo.toml create mode 100644 dlc/Readme.md create mode 100644 dlc/benches/Readme.md create mode 100644 dlc/benches/benchmarks.rs create mode 100644 dlc/src/channel/mod.rs create mode 100644 dlc/src/dlc_input.rs create mode 100644 dlc/src/lib.rs create mode 100644 dlc/src/secp_utils.rs create mode 100644 dlc/src/util.rs diff --git a/Cargo.lock b/Cargo.lock index dfc22c9f..05385437 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -963,9 +963,9 @@ dependencies = [ "chrono", "ddk-manager", "ddk-payouts", - "dlc", - "dlc-messages", - "dlc-trie", + "dlc 0.7.1", + "dlc-messages 0.7.1", + "dlc-trie 0.7.1", "hex", "hmac", "kormir", @@ -998,9 +998,9 @@ dependencies = [ "bitcoincore-rpc-json", "criterion", "ddk", - "dlc", - "dlc-messages", - "dlc-trie", + "dlc 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", + "dlc-messages 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", + "dlc-trie 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", "env_logger 0.9.3", "futures", "hex-conservative 0.1.2", @@ -1024,8 +1024,8 @@ dependencies = [ "ddk", "ddk-manager", "ddk-payouts", - "dlc", - "dlc-messages", + "dlc 0.7.1", + "dlc-messages 0.7.1", "hex", "homedir", "inquire", @@ -1047,9 +1047,9 @@ dependencies = [ "anyhow", "bitcoin", "ddk-manager", - "dlc", - "dlc-messages", - "dlc-trie", + "dlc 0.7.1", + "dlc-messages 0.7.1", + "dlc-trie 0.7.1", "serde", "serde_json", "thiserror 2.0.12", @@ -1090,22 +1090,71 @@ dependencies = [ [[package]] name = "dlc" version = "0.7.1" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#e3896372c84d6c69c1ed30895e18b835ae93c71c" dependencies = [ "bitcoin", "miniscript", + "rayon", "secp256k1-sys", "secp256k1-zkp", "serde", ] +[[package]] +name = "dlc" +version = "0.7.1" +source = "git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates#1cdefcafc422ed0609327634a75bc00dc67d1fd7" +dependencies = [ + "bitcoin", + "miniscript", + "secp256k1-sys", + "secp256k1-zkp", + "serde", +] + +[[package]] +name = "dlc" +version = "0.7.1" +source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#d215bc76bcaa14c5662e6a98b6ab14bf27925417" +dependencies = [ + "bitcoin", + "miniscript", + "secp256k1-sys", + "secp256k1-zkp", + "serde", +] + +[[package]] +name = "dlc-messages" +version = "0.7.1" +dependencies = [ + "bitcoin", + "dlc 0.7.1", + "dlc-messages 0.7.1", + "lightning", + "secp256k1-zkp", + "serde", + "serde_json", +] + [[package]] name = "dlc-messages" version = "0.7.1" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#e3896372c84d6c69c1ed30895e18b835ae93c71c" +source = "git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates#1cdefcafc422ed0609327634a75bc00dc67d1fd7" dependencies = [ "bitcoin", - "dlc", + "dlc 0.7.1 (git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates)", + "lightning", + "secp256k1-zkp", + "serde", +] + +[[package]] +name = "dlc-messages" +version = "0.7.1" +source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#d215bc76bcaa14c5662e6a98b6ab14bf27925417" +dependencies = [ + "bitcoin", + "dlc 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", "lightning", "secp256k1-zkp", "serde", @@ -1114,10 +1163,21 @@ dependencies = [ [[package]] name = "dlc-trie" version = "0.7.1" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#e3896372c84d6c69c1ed30895e18b835ae93c71c" dependencies = [ "bitcoin", - "dlc", + "dlc 0.7.1", + "rayon", + "secp256k1-zkp", + "serde", +] + +[[package]] +name = "dlc-trie" +version = "0.7.1" +source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#d215bc76bcaa14c5662e6a98b6ab14bf27925417" +dependencies = [ + "bitcoin", + "dlc 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", "rayon", "secp256k1-zkp", "serde", @@ -1534,6 +1594,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + [[package]] name = "hashbrown" version = "0.14.5" @@ -1998,12 +2064,11 @@ dependencies = [ [[package]] name = "kormir" version = "0.4.4" -source = "git+https://github.com/bennyhodl/kormir?branch=rust-dlc-bitcoin-amount#6b179ea44757f8d03def7dac3e210cd598b64e78" dependencies = [ "base64 0.13.1", "bitcoin", - "dlc", - "dlc-messages", + "dlc 0.7.1 (git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates)", + "dlc-messages 0.7.1 (git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates)", "hex", "lightning", "log", @@ -2051,8 +2116,11 @@ checksum = "767f388e50251da71f95a3737d6db32c9729f9de6427a54fa92bb994d04d793f" dependencies = [ "bech32 0.9.1", "bitcoin", + "hashbrown 0.13.2", + "libm", "lightning-invoice", "lightning-types", + "possiblyrandom", ] [[package]] @@ -2691,6 +2759,15 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "possiblyrandom" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b122a615d72104fb3d8b26523fdf9232cd8ee06949fb37e4ce3ff964d15dffd" +dependencies = [ + "getrandom", +] + [[package]] name = "powerfmt" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 97469f67..e9385222 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "2" -members = ["ddk", "payouts", "ddk-node", "ddk-manager"] +members = ["ddk", "dlc", "dlc-messages", "dlc-trie", "payouts", "ddk-node", "ddk-manager"] diff --git a/ddk-node/Cargo.toml b/ddk-node/Cargo.toml index 12e604d4..3010fcab 100644 --- a/ddk-node/Cargo.toml +++ b/ddk-node/Cargo.toml @@ -11,13 +11,8 @@ edition = "2021" ddk = { version = "0.0.18", path = "../ddk", features = ["postgres", "kormir", "nostr"] } ddk-manager = { version = "0.7.6", path = "../ddk-manager", features = ["use-serde"] } ddk-payouts = { version = "0.0.16", path = "../payouts" } - -# dlc = { version = "0.7.1", features = ["use-serde"] } -# dlc-messages = { version = "0.7.1", features = [ "use-serde"] } -# dlc = { path = "../../rust-dlc/dlc", features = ["use-serde"] } -# dlc-messages = { path = "../../rust-dlc/dlc-messages", features = [ "use-serde"] } -dlc = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } -dlc-messages = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = [ "use-serde"] } +dlc = { path = "../dlc", features = ["use-serde"] } +dlc-messages = { path = "../dlc-messages", features = [ "use-serde"] } bitcoin = { version = "0.32.2", features = ["rand", "serde"] } diff --git a/ddk/Cargo.toml b/ddk/Cargo.toml index 4509a8da..8930f916 100644 --- a/ddk/Cargo.toml +++ b/ddk/Cargo.toml @@ -25,17 +25,9 @@ postgres = ["dep:sqlx", "sqlx/postgres"] [dependencies] ddk-manager = { path = "../ddk-manager", version = "0.7.6", features = ["use-serde"] } - -# dlc = { version = "0.7.1", features = ["use-serde"] } -# dlc-messages = { version = "0.7.1", features = [ "use-serde"] } -# dlc-trie = { version = "0.7.1", features = ["use-serde"] } -# dlc = { path = "../../rust-dlc/dlc", features = ["use-serde"] } -# dlc-messages = { path = "../../rust-dlc/dlc-messages", features = [ "use-serde"] } -# dlc-trie = { path = "../../rust-dlc/dlc-trie", features = ["use-serde"] } -dlc = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } -dlc-messages = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = [ "use-serde"] } -dlc-trie = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } - +dlc = { path = "../dlc", features = ["use-serde"] } +dlc-messages = { path = "../dlc-messages", features = [ "use-serde"] } +dlc-trie = { path = "../dlc-trie", features = ["use-serde"] } bitcoin = { version = "0.32.2", features = ["rand", "serde"] } bdk_esplora = { version = "0.20.1", features = ["blocking-https", "async-https", "tokio"] } @@ -68,8 +60,8 @@ lightning-net-tokio = { version = "0.0.125", optional = true } # oracle feature reqwest = { version = "0.12.9", features = ["json"], optional = true } # kormir = "0.4.4" -# kormir = { path = "../../kormir/kormir" } -kormir = { git = "https://github.com/bennyhodl/kormir", branch = "rust-dlc-bitcoin-amount" } +kormir = { path = "../../kormir/kormir" } +# kormir = { git = "https://github.com/bennyhodl/kormir", branch = "rust-dlc-bitcoin-amount" } hmac = "0.12.1" sha2 = "0.10" nostr-database = { version = "0.40.0", optional = true } diff --git a/dlc-messages/CHANGELOG.md b/dlc-messages/CHANGELOG.md new file mode 100644 index 00000000..95fea988 --- /dev/null +++ b/dlc-messages/CHANGELOG.md @@ -0,0 +1,35 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.5.0] - 2024-07-11 + +### Fixed +- serialization of `f64` +- `use-serde` feature +- `Reject` message + +### Changed +- updated bitcoin, lightning and secp256k1_zkp dependencies +- `read_dlc_message` is no public +- implement `std::error::Error` for `Error` struct + +### Added +- support for `no-std` +- `nonces` method for `OracleAttestation` + +## [0.3.0] - 2022-10-28 + +### Changed +- `dlc` crate version update + +## [0.2.0] - 2022-06-06 + +### Changed +- contract id computation function removed from crate. +- serialization format according to the DLC specifications. + +### Fixed +- vulnerability on deserialization of vectors. diff --git a/dlc-messages/Cargo.toml b/dlc-messages/Cargo.toml new file mode 100644 index 00000000..a2346c65 --- /dev/null +++ b/dlc-messages/Cargo.toml @@ -0,0 +1,28 @@ +[package] +authors = ["Crypto Garage"] +description = "Structs and serialization for the Discreet Log Contract (DLC) protocol." +homepage = "https://github.com/p2pderivatives/rust-dlc" +license-file = "../LICENSE" +name = "dlc-messages" +repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/dlc-messages" +version = "0.7.1" + +[features] +default = ["std"] +std = ["dlc/std", "bitcoin/std", "lightning/std"] +no-std = ["dlc/no-std", "lightning/no-std"] +use-serde = ["serde", "secp256k1-zkp/serde", "bitcoin/serde"] + +[dependencies] +bitcoin = { version = "0.32.2", default-features = false } +dlc = { version = "0.7.1", path = "../dlc", default-features = false } +lightning = { version = "0.0.125", default-features = false } +secp256k1-zkp = {version = "0.11.0"} +serde = {version = "1.0", features = ["derive"], optional = true} + +[dev-dependencies] +bitcoin = { version = "0.32.2", default-features = false, features = ["serde"] } +dlc-messages = {path = "./", default-features = false, features = ["use-serde"]} +secp256k1-zkp = {version = "0.11.0", features = ["serde", "global-context"]} +serde = {version = "1.0", features = ["derive"]} +serde_json = "1.0" diff --git a/dlc-messages/Readme.md b/dlc-messages/Readme.md new file mode 100644 index 00000000..4228791a --- /dev/null +++ b/dlc-messages/Readme.md @@ -0,0 +1,3 @@ +# DLC Messages + +This crate provide the representation of DLC messages and functions to enable their serialization. \ No newline at end of file diff --git a/dlc-messages/src/channel.rs b/dlc-messages/src/channel.rs new file mode 100644 index 00000000..cadaeaa9 --- /dev/null +++ b/dlc-messages/src/channel.rs @@ -0,0 +1,589 @@ +//! Contains messages used for the establishment and update of DLC channels. + +use bitcoin::{Amount, ScriptBuf}; +use dlc::Error; +use lightning::ln::msgs::DecodeError; +use lightning::util::ser::{Readable, Writeable, Writer}; +use secp256k1_zkp::{ + ecdsa::Signature, EcdsaAdaptorSignature, PublicKey, Secp256k1, SecretKey, Verification, +}; + +use crate::FundingSignatures; +use crate::{ + contract_msgs::ContractInfo, + ser_impls::{read_ecdsa_adaptor_signature, write_ecdsa_adaptor_signature}, + CetAdaptorSignatures, FundingInput, NegotiationFields, +}; + +/// Contains information about a party wishing to enter into a DLC with +/// another party. The contained information is sufficient for any other party +/// to create a set of transactions representing the contract and its terms. +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +pub struct OfferChannel { + /// The version of the protocol used by the sending peer. + pub protocol_version: u32, + /// Indicates options and features selected for the offered contract. + pub contract_flags: u8, + /// The identifier of the chain on which the contract takes place. + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + pub chain_hash: [u8; 32], + /// A random nonce identifying the contract until the fund transaction + /// is created. + pub temporary_contract_id: [u8; 32], + /// A random nonce identifying the channel until the fund transaction is + /// created. + pub temporary_channel_id: [u8; 32], + /// Information about the contract established during channel creation. + pub contract_info: ContractInfo, + /// The public key used by the offer party in the 2 of 2 funding output. + pub funding_pubkey: PublicKey, + /// The base point that will be used by the offer party for revocation. + pub revocation_basepoint: PublicKey, + /// The base point that will be used by the offer party for generating + /// adaptor signatures to revocable transactions. + pub publish_basepoint: PublicKey, + /// The base point that will be used by the offer party in the 2 of 2 output + /// of buffer transactions. + pub own_basepoint: PublicKey, + /// The first per update point of the offer party. + pub first_per_update_point: PublicKey, + /// Script used by the offer party to receive their payout on channel close. + pub payout_spk: ScriptBuf, + /// Serial id used to order outputs. + pub payout_serial_id: u64, + /// The collateral input by the offer party in the channel. + pub offer_collateral: Amount, + /// The inputs that the offer party will use to fund the channel. + pub funding_inputs: Vec, + /// The script that the offer party to receive their change. + pub change_spk: ScriptBuf, + /// Serial id used to order outputs. + pub change_serial_id: u64, + /// Serial id used to order outputs. + pub fund_output_serial_id: u64, + /// The fee rate proposed by the offer party for the channel transactions. + pub fee_rate_per_vb: u64, + /// Lock time for the CETs. + pub cet_locktime: u32, + /// Lock time for the refund transaction. + pub refund_locktime: u32, + /// The nSequence value to use for the CETs. + pub cet_nsequence: u32, +} + +impl_dlc_writeable!(OfferChannel, { + (protocol_version, writeable), + (contract_flags, writeable), + (chain_hash, writeable), + (temporary_contract_id, writeable), + (temporary_channel_id, writeable), + (contract_info, writeable), + (funding_pubkey, writeable), + (revocation_basepoint, writeable), + (publish_basepoint, writeable), + (own_basepoint, writeable), + (first_per_update_point, writeable), + (payout_spk, writeable), + (payout_serial_id, writeable), + (offer_collateral, writeable), + (funding_inputs, vec), + (change_spk, writeable), + (change_serial_id, writeable), + (fund_output_serial_id, writeable), + (fee_rate_per_vb, writeable), + (cet_locktime, writeable), + (refund_locktime, writeable), + (cet_nsequence, writeable) +}); + +impl OfferChannel { + /// Returns whether the message satisfies validity requirements. + pub fn validate( + &self, + secp: &Secp256k1, + min_timeout_interval: u32, + max_timeout_interval: u32, + min_cet_nsequence: u32, + max_cet_nsequence: u32, + ) -> Result<(), Error> { + let closest_maturity_date = self.contract_info.get_closest_maturity_date(); + let valid_dates = self.cet_locktime <= closest_maturity_date + && closest_maturity_date + min_timeout_interval <= self.refund_locktime + && self.refund_locktime <= closest_maturity_date + max_timeout_interval + && self.cet_nsequence >= min_cet_nsequence + && self.cet_nsequence <= max_cet_nsequence; + if !valid_dates { + return Err(Error::InvalidArgument); + } + + match &self.contract_info { + ContractInfo::SingleContractInfo(s) => s.contract_info.oracle_info.validate(secp)?, + ContractInfo::DisjointContractInfo(d) => { + for c in &d.contract_infos { + c.oracle_info.validate(secp)?; + } + } + } + + Ok(()) + } +} + +/// Contains information about a party wishing to accept a DLC offer. The contained +/// information is sufficient for the offering party to re-build the set of +/// transactions representing the contract and its terms, and guarantees the offering +/// party that they can safely provide signatures for their funding input. +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +pub struct AcceptChannel { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The temporary id of the channel. + pub temporary_channel_id: [u8; 32], + /// The collateral input by the accept party. + pub accept_collateral: Amount, + /// The [`PublicKey`] used for the fund output by the accept party. + pub funding_pubkey: PublicKey, + /// The [`PublicKey`] used for deriving revocation points by the accept party. + pub revocation_basepoint: PublicKey, + /// The [`PublicKey`] used for deriving publish points by the accept party. + pub publish_basepoint: PublicKey, + /// The [`PublicKey`] used for deriving own points by the accept party. + pub own_basepoint: PublicKey, + /// The initial per update point used by the accept party. + pub first_per_update_point: PublicKey, + /// The script pubkey for the accept party to receive their payout. + pub payout_spk: ScriptBuf, + /// The serial id of the payout output used to order transaction outputs. + pub payout_serial_id: u64, + /// The set of inputs used by the accept party to fund the channel. + pub funding_inputs: Vec, + /// The script pubkey used by the accept party to receive back their change. + pub change_spk: ScriptBuf, + /// The serial id of the change output used to order transaction outputs. + pub change_serial_id: u64, + /// The adaptor signatures for all CETs generated by the accept party. + pub cet_adaptor_signatures: CetAdaptorSignatures, + /// The adaptor signature for the buffer transaction generated by the accept + /// party. + pub buffer_adaptor_signature: EcdsaAdaptorSignature, + /// The refund signature generated by the accept party. + pub refund_signature: Signature, + /// Fields used to negotiate parameters with the counter party. + pub negotiation_fields: Option, +} + +impl_dlc_writeable!(AcceptChannel, { + (temporary_channel_id, writeable), + (accept_collateral, writeable), + (funding_pubkey, writeable), + (revocation_basepoint, writeable), + (publish_basepoint, writeable), + (own_basepoint, writeable), + (first_per_update_point, writeable), + (payout_spk, writeable), + (payout_serial_id, writeable), + (funding_inputs, vec), + (change_spk, writeable), + (change_serial_id, writeable), + (cet_adaptor_signatures, writeable), + (buffer_adaptor_signature, {cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature}), + (refund_signature, writeable), + (negotiation_fields, option) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to finalize the setup of a DLC channel. +pub struct SignChannel { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The adaptor signatures for all CETs generated by the offer party. + pub cet_adaptor_signatures: CetAdaptorSignatures, + /// The adaptor signature for the buffer transaction generated by the offer + /// party. + pub buffer_adaptor_signature: EcdsaAdaptorSignature, + /// The refund signature generated by the offer party. + pub refund_signature: Signature, + /// The signatures for the offer party's inputs. + pub funding_signatures: FundingSignatures, +} + +impl_dlc_writeable!(SignChannel, { + (channel_id, writeable), + (cet_adaptor_signatures, writeable), + (buffer_adaptor_signature, {cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature}), + (refund_signature, writeable), + (funding_signatures, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to offer a settlement of the channel by on of the parties. +pub struct SettleOffer { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The payout offered to the receiving party. + pub counter_payout: Amount, + /// The per update point to be used by the sending party to setup the next + /// channel state. + pub next_per_update_point: PublicKey, +} + +impl_dlc_writeable!(SettleOffer, { + (channel_id, writeable), + (counter_payout, writeable), + (next_per_update_point, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to accept a previously received settlement offer. +pub struct SettleAccept { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The per update point to be used by the sending party to setup the next + /// channel state. + pub next_per_update_point: PublicKey, + /// The adaptor signature for the settle transaction generated by the sending + /// party. + pub settle_adaptor_signature: EcdsaAdaptorSignature, +} + +impl_dlc_writeable!(SettleAccept, { + (channel_id, writeable), + (next_per_update_point, writeable), + (settle_adaptor_signature, {cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature}) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to confirm the settlement of a channel. +pub struct SettleConfirm { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The pre-image of the per update point used by the sending party during + /// the establishment of the previous channel state. + pub prev_per_update_secret: SecretKey, + /// The adaptor signature for the settlement transaction generated by the + /// sending party. + pub settle_adaptor_signature: EcdsaAdaptorSignature, +} + +impl_dlc_writeable!(SettleConfirm, { + (channel_id, writeable), + (prev_per_update_secret, writeable), + (settle_adaptor_signature, {cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature}) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to finalize the settlement of a channel. +pub struct SettleFinalize { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The pre-image of the per update point used by the sending party during + /// the establishment of the previous channel state. + pub prev_per_update_secret: SecretKey, +} + +impl_dlc_writeable!(SettleFinalize, { + (channel_id, writeable), + (prev_per_update_secret, writeable) +}); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to offer to establish a new contract within the channel. +pub struct RenewOffer { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The temporary id of the offered contract. + pub temporary_contract_id: [u8; 32], + /// The proposed payout for the receiving party for the previous channel + /// state. + pub counter_payout: Amount, + /// The per update point to be used by the sending party to setup the next + /// channel state. + pub next_per_update_point: PublicKey, + /// Information about the offered contract. + pub contract_info: ContractInfo, + /// Lock time for the CETs. + pub cet_locktime: u32, + /// Lock time for the refund transaction. + pub refund_locktime: u32, + /// The nSequence value to use for the CETs. + pub cet_nsequence: u32, +} + +impl_dlc_writeable!(RenewOffer, { + (channel_id, writeable), + (temporary_contract_id, writeable), + (counter_payout, writeable), + (next_per_update_point, writeable), + (contract_info, writeable), + (cet_locktime, writeable), + (refund_locktime, writeable), + (cet_nsequence, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to accept the establishment of a new contract within a channel. +pub struct RenewAccept { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The per update point to be used by the sending party to setup the next + /// channel state. + pub next_per_update_point: PublicKey, + /// The adaptor signatures for all CETs generated by the offer party. + pub cet_adaptor_signatures: CetAdaptorSignatures, + /// The refund signature generated by the offer party. + pub refund_signature: Signature, +} + +impl_dlc_writeable!(RenewAccept, { + (channel_id, writeable), + (next_per_update_point, writeable), + (cet_adaptor_signatures, writeable), + (refund_signature, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to confirm the establishment of a new contract within a channel. +pub struct RenewConfirm { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The adaptor signature for the buffer transaction generated by the offer + /// party. + pub buffer_adaptor_signature: EcdsaAdaptorSignature, + /// The adaptor signatures for all CETs generated by the offer party. + pub cet_adaptor_signatures: CetAdaptorSignatures, + /// The refund signature generated by the offer party. + pub refund_signature: Signature, +} + +impl_dlc_writeable!(RenewConfirm, { + (channel_id, writeable), + (buffer_adaptor_signature, {cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature}), + (cet_adaptor_signatures, writeable), + (refund_signature, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to finalize the establishment of a new contract within a channel. +pub struct RenewFinalize { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The pre image of the per update point used by the sending party to setup + /// the previous channel state. + pub per_update_secret: SecretKey, + /// The adaptor signature for the buffer transaction generated by the accept + /// party. + pub buffer_adaptor_signature: EcdsaAdaptorSignature, +} + +impl_dlc_writeable!(RenewFinalize, { + (channel_id, writeable), + (per_update_secret, writeable), + (buffer_adaptor_signature, {cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature}) + +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to finalize the establishment of a new contract within a channel. +pub struct RenewRevoke { + #[cfg_attr( + feature = "serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The pre image of the per update point used by the sending party to setup + /// the previous channel state. + pub per_update_secret: SecretKey, +} + +impl_dlc_writeable!(RenewRevoke, { + (channel_id, writeable), + (per_update_secret, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to offer to collaboratively close a channel. +pub struct CollaborativeCloseOffer { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], + /// The proposed payout for the receiving party to close the channel with. + pub counter_payout: Amount, + /// The signature of the sending party for the closing transaction. + pub close_signature: Signature, +} + +impl_dlc_writeable!(CollaborativeCloseOffer, { + (channel_id, writeable), + (counter_payout, writeable), + (close_signature, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Message used to reject an received offer. +pub struct Reject { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the channel referred to by the message. + pub channel_id: [u8; 32], +} + +impl_dlc_writeable!(Reject, { (channel_id, writeable) }); diff --git a/dlc-messages/src/compatibility_tests.rs b/dlc-messages/src/compatibility_tests.rs new file mode 100644 index 00000000..6704e5b3 --- /dev/null +++ b/dlc-messages/src/compatibility_tests.rs @@ -0,0 +1,752 @@ +extern crate bitcoin; +extern crate bitcoin_test_utils; +extern crate dlc; +extern crate lightning; +extern crate secp256k1; + +use super::{ + AcceptDlc, ContractInfo, ContractOutcome, FundingInput, FundingSignature, FundingSignatures, + OfferDlc, OracleInfo, SignDlc, WitnessElement, +}; +use bitcoin::consensus::encode::Decodable; +use bitcoin::SigHashType; +use bitcoin::{Address, OutPoint, Script, Transaction, Txid, VarInt}; +use bitcoin_test_utils::*; +use dlc::{DlcTransactions, OracleInfo as DlcOracleInfo, PartyParams, Payout, TxInputInfo}; +use lightning::ln::wire::{write, Encode}; +use lightning::util::ser::Writeable; +use secp256k1::{ + ecdsa_adaptor::{AdaptorProof, AdaptorSignature}, + schnorrsig::Signature as SchnorrSignature, + Message, PublicKey, Secp256k1, SecretKey, Signature, Signing, +}; +use std::str::FromStr; + +const BITCOIN_CHAINHASH: [u8; 32] = [ + 0x06, 0x22, 0x6e, 0x46, 0x11, 0x1a, 0x0b, 0x59, 0xca, 0xaf, 0x12, 0x60, 0x43, 0xeb, 0x5b, 0xbf, + 0x28, 0xc3, 0x4f, 0x3a, 0x5e, 0x33, 0x2a, 0x1f, 0xc7, 0xb2, 0xb7, 0x3c, 0xf1, 0x88, 0x91, 0x0f, +]; + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct FeeTestParams { + inputs: FeeTestInputs, + offer_funding_fee: u64, + offer_closing_fee: u64, + accept_funding_fee: u64, + accept_closing_fee: u64, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct FeeTestInputs { + offer_inputs: Vec, + accept_inputs: Vec, + #[serde(rename = "offerPayoutSPKLen")] + local_payout_spk_len: usize, + #[serde(rename = "offerChangeSPKLen")] + offer_change_spk_len: usize, + #[serde(rename = "acceptPayoutSPKLen")] + accept_payout_spk_len: usize, + #[serde(rename = "acceptChangeSPKLen")] + accept_change_spk_len: usize, + fee_rate: u64, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct FeeTestOfferInputs { + redeem_script_len: usize, + max_witness_len: usize, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct FeeTestScript { + byte_len: usize, + script: String, + description: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestParams { + fee_rate: u64, + contract_info: Vec, + contract_maturity_bound: u32, + contract_timeout: u32, + oracle_info: OracleInfo, + oracle_signature: SchnorrSignature, + real_outcome: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestInputs { + params: TestParams, + offer_params: TestPartyParams, + accept_params: TestPartyParams, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestCase { + inputs: TestInputs, + txs: Option, + unsigned_txs: Option, + signed_txs: Option, + offer: Option, + accept: Option, + sign: Option, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestContractOutcomeInfo { + outcome: String, + pre_image: String, + local_payout: u64, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestFundingInputInfo { + tx: String, + idx: u32, + max_witness_len: u16, + input_keys: Vec, + redeem_script: Option, + script_witness: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestPartyParams { + collateral: u64, + funding_input_txs: Vec, + change_address: Address, + funding_priv_key: SecretKey, + payout_address: Address, +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "camelCase")] +struct TestDlcTxs { + funding_tx: String, + cets: Vec, + refund_tx: String, +} + +impl From<&TestContractOutcomeInfo> for ContractOutcome { + fn from(info: &TestContractOutcomeInfo) -> ContractOutcome { + ContractOutcome { + outcome: info.pre_image.clone(), + local_payout: info.local_payout, + } + } +} + +fn assert_unsigned_txs_equal(expected: &TestDlcTxs, actual: &DlcTransactions) { + assert_eq!(expected.funding_tx, tx_to_string(&actual.fund)); + assert!(expected + .cets + .iter() + .map(|x| tx_from_string(&x)) + .zip(actual.cets.iter()) + .all(|(a, b)| a.txid() == b.txid())); + assert_eq!( + tx_from_string(&expected.refund_tx).txid(), + actual.refund.txid(), + ); +} + +fn assert_signed_txs_equal(expected: &TestDlcTxs, actual: &DlcTransactions) { + assert_eq!(expected.funding_tx, tx_to_string(&actual.fund)); + for i in 0..expected.cets.len() { + assert_eq!(expected.cets[i], tx_to_string(&actual.cets[i])); + } + assert_eq!(expected.refund_tx, tx_to_string(&actual.refund)); +} + +fn parse_redeem_script(input: &Option) -> Script { + match input { + None => Script::new(), + Some(s) => { + let hex = str_to_hex(s); + Script::from(hex) + } + } +} + +fn get_funding_params( + txs: &[TestFundingInputInfo], +) -> (Vec, Vec>, u64) { + let mut funding_inputs = Vec::::with_capacity(txs.len()); + let mut sks = Vec::>::new(); + let mut total_value = 0; + for tx_info in txs { + let mut tx_hex = Vec::::new(); + tx_hex.resize(tx_info.tx.len() / 2, 0); + from_hex(&tx_info.tx, &mut tx_hex).unwrap(); + let tx = ::bitcoin::Transaction::consensus_decode(&tx_hex[..]).unwrap(); + let output = &tx.output[tx_info.idx as usize]; + funding_inputs.push(FundingInput { + prev_tx: str_to_hex(&tx_info.tx), + prev_tx_vout: tx_info.idx, + max_witness_len: tx_info.max_witness_len, + sequence: 0xffffffff, + redeem_script: parse_redeem_script(&tx_info.redeem_script), + }); + sks.push(tx_info.input_keys.clone()); + total_value += output.value; + } + + (funding_inputs, sks, total_value) +} + +fn get_party_params( + secp: &Secp256k1, + params: &TestPartyParams, + serial_id: u64, +) -> (PartyParams, Vec, Vec>) { + let (fund_inputs, sks, total_value) = get_funding_params(¶ms.funding_input_txs); + let inputs: Vec = fund_inputs.iter().map(|x| x.into()).collect(); + ( + PartyParams { + fund_pubkey: PublicKey::from_secret_key(secp, ¶ms.funding_priv_key), + change_script_pubkey: params.change_address.script_pubkey(), + change_serial_id: serial_id, + payout_script_pubkey: params.payout_address.script_pubkey(), + payout_serial_id: serial_id, + inputs, + collateral: params.collateral, + input_amount: total_value, + }, + fund_inputs, + sks, + ) +} + +fn get_payout(info: &TestContractOutcomeInfo, total_collateral: u64) -> Payout { + Payout { + offer: info.local_payout, + accept: total_collateral - info.local_payout, + } +} + +fn get_contract_info(contract_outcome_infos: &Vec) -> ContractInfo { + let outcomes = contract_outcome_infos + .into_iter() + .map(|x| ContractOutcome::from(x)) + .collect(); + + ContractInfo { outcomes } +} + +fn parse_script_witness(input: &Vec) -> Vec> { + let nb_elements = VarInt::consensus_decode(&input[..]).unwrap(); + let mut remaining: Vec = input.iter().cloned().skip(nb_elements.len()).collect(); + let mut res = Vec::>::new(); + for _ in 0..nb_elements.0 { + let size = VarInt::consensus_decode(&remaining[..]).unwrap(); + remaining.drain(0..size.len() as usize); + res.push(remaining.drain(0..size.0 as usize).collect()); + } + + res +} + +fn get_fund_input_witness( + secp: &Secp256k1, + fund_tx: &Transaction, + info: &TxInputInfo, + input: &FundingInput, + sk: &Vec, + witness: &Vec, + input_index: usize, +) -> Vec> { + let prev_tx = Transaction::consensus_decode(&input.prev_tx[..]).unwrap(); + let prev_tx_output = &prev_tx.output[info.outpoint.vout as usize]; + let script_pubkey = &prev_tx_output.script_pubkey; + let witness_stack = parse_script_witness(&witness); + if script_pubkey.is_v0_p2wpkh() { + vec![ + dlc::util::get_sig_for_p2wpkh_input( + &secp, + &sk[0], + fund_tx, + input_index, + prev_tx_output.value, + SigHashType::All, + ), + PublicKey::from_secret_key(secp, &sk[0]) + .serialize() + .to_vec(), + ] + } else if script_pubkey.is_v0_p2wsh() || info.redeem_script.is_witness_program() { + let sigs = sk + .iter() + .map(|x| { + dlc::util::get_sig_for_tx_input( + &secp, + fund_tx, + input_index, + &Script::from(witness_stack[0].clone()), + prev_tx.output[info.outpoint.vout as usize].value, + SigHashType::All, + &x, + ) + }) + .collect::>>(); + let mut res = vec![Vec::new()]; + res.extend(sigs); + res.extend(witness_stack); + res + } else { + panic!("Unsupported redeem script type"); + } +} + +fn get_fund_input_witnesses( + secp: &Secp256k1, + fund_tx: &Transaction, + witnesses: &Vec>, + params: &PartyParams, + inputs: &Vec, + sks: &Vec>, + index_start: usize, +) -> Vec { + params + .inputs + .iter() + .enumerate() + .map(|(i, x)| { + let witness_stack = get_fund_input_witness( + secp, + &fund_tx, + &x, + &inputs[i], + &sks[i], + &witnesses[i], + i + index_start, + ); + FundingSignature { + witness_elements: witness_stack + .into_iter() + .map(|x| WitnessElement { witness: x }) + .collect(), + } + }) + .collect() +} + +fn get_funding_signatures( + secp: &Secp256k1, + fund_tx: &Transaction, + test_party_params: &TestPartyParams, + party_params: &PartyParams, + inputs: &Vec, + sks: &Vec>, + index_start: usize, +) -> Vec { + let offer_fund_input_witnesses = test_party_params + .funding_input_txs + .iter() + .map(|x| str_to_hex(&x.script_witness)) + .collect(); + get_fund_input_witnesses( + secp, + fund_tx, + &offer_fund_input_witnesses, + party_params, + inputs, + sks, + index_start, + ) +} + +fn get_cets_and_refund_sigs( + secp: &Secp256k1, + cets: &Vec, + refund_tx: &Transaction, + oracle_infos: &Vec, + fund_sk: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: u64, + messages: &Vec>>, +) -> (Vec<(AdaptorSignature, AdaptorProof)>, Signature) { + ( + dlc::create_cet_adaptor_sigs_from_oracle_info( + secp, + cets, + oracle_infos, + fund_sk, + funding_script_pubkey, + fund_output_value, + messages, + ) + .unwrap(), + dlc::util::get_raw_sig_for_tx_input( + &secp, + refund_tx, + 0, + funding_script_pubkey, + fund_output_value, + fund_sk, + ), + ) +} + +fn assert_msg_eq(expected_str: &str, actual: M) { + let mut actual_hex = Vec::new(); + write(&actual, &mut actual_hex).unwrap(); + let expected_hex = str_to_hex(expected_str); + assert_eq!(expected_hex, actual_hex); +} + +fn test_single(case: TestCase, secp: &secp256k1::Secp256k1) { + let params = &case.inputs.params; + let (offer_params, offer_inputs, offer_input_sks) = + get_party_params(&secp, &case.inputs.offer_params, 1); + let (accept_params, accept_inputs, accept_input_sks) = + get_party_params(&secp, &case.inputs.accept_params, 2); + + let total_collateral = offer_params.collateral + accept_params.collateral; + + let outcomes: Vec> = params + .contract_info + .iter() + .map(|x| str_to_hex(&x.outcome)) + .collect(); + let contract_info = get_contract_info(¶ms.contract_info); + + let payouts = ¶ms + .contract_info + .iter() + .map(|x| get_payout(x, total_collateral)) + .collect::>(); + + let dlc_txs = dlc::create_dlc_transactions( + &offer_params, + &accept_params, + payouts, + params.contract_timeout, + params.fee_rate, + 0, + params.contract_maturity_bound, + 0, + ) + .unwrap(); + + let mut fund_tx = dlc_txs.fund.clone(); + let mut refund_tx = dlc_txs.refund.clone(); + let funding_script_pubkey = + dlc::make_funding_redeemscript(&offer_params.fund_pubkey, &accept_params.fund_pubkey); + let offer_funding_witnesses = get_funding_signatures( + secp, + &fund_tx, + &case.inputs.offer_params, + &offer_params, + &offer_inputs, + &offer_input_sks, + 0, + ); + let accept_funding_witnesses = get_funding_signatures( + secp, + &fund_tx, + &case.inputs.accept_params, + &accept_params, + &accept_inputs, + &accept_input_sks, + offer_inputs.len(), + ); + + let fund_output_value = fund_tx.output[0].value; + let offer_fund_sk = case.inputs.offer_params.funding_priv_key; + let accept_fund_sk = case.inputs.accept_params.funding_priv_key; + let oracle_pub_key = params.oracle_info.public_key; + let oracle_nonce = params.oracle_info.nonce; + let msgs: Vec<_> = outcomes + .iter() + .map(|x| vec![vec![secp256k1::Message::from_slice(x).unwrap()]]) + .collect(); + let oracle_infos = vec![DlcOracleInfo { + public_key: oracle_pub_key, + nonces: vec![oracle_nonce], + }]; + + let (offer_cets_sigs, offer_refund_sig) = get_cets_and_refund_sigs( + secp, + &dlc_txs.cets, + &refund_tx, + &oracle_infos, + &offer_fund_sk, + &funding_script_pubkey, + fund_output_value, + &msgs, + ); + let (accept_cets_sigs, accept_refund_sig) = get_cets_and_refund_sigs( + secp, + &dlc_txs.cets, + &refund_tx, + &oracle_infos, + &accept_fund_sk, + &funding_script_pubkey, + fund_output_value, + &msgs, + ); + + let actual_outcome_index = params + .contract_info + .iter() + .position(|x| x.outcome == case.inputs.params.real_outcome) + .unwrap(); + + let fund_tx_id = fund_tx.txid(); + for i in 0..fund_tx.input.len() { + fund_tx.input[i].witness = match i { + i if i < offer_funding_witnesses.len() => offer_funding_witnesses[i] + .witness_elements + .iter() + .map(|x| x.witness.clone()) + .collect(), + _ => accept_funding_witnesses[i - offer_funding_witnesses.len()] + .witness_elements + .iter() + .map(|x| x.witness.clone()) + .collect(), + } + } + let mut offer_final_cet = dlc_txs.cets[actual_outcome_index].clone(); + + dlc::sign_cet( + secp, + &mut offer_final_cet, + &accept_cets_sigs[actual_outcome_index].0, + &vec![vec![case.inputs.params.oracle_signature]], + &offer_fund_sk, + &accept_params.fund_pubkey, + &funding_script_pubkey, + fund_tx.output[0].value, + ) + .expect("Error signing CET"); + + let mut accept_final_cet = dlc_txs.cets[actual_outcome_index].clone(); + + dlc::sign_cet( + secp, + &mut accept_final_cet, + &offer_cets_sigs[actual_outcome_index].0, + &vec![vec![case.inputs.params.oracle_signature]], + &accept_fund_sk, + &offer_params.fund_pubkey, + &funding_script_pubkey, + fund_tx.output[0].value, + ) + .expect("Error signing CET"); + + dlc::util::sign_multi_sig_input( + &secp, + &mut refund_tx, + &offer_refund_sig, + &PublicKey::from_secret_key(&secp, &offer_fund_sk), + &accept_fund_sk, + &funding_script_pubkey, + fund_tx.output[0].value, + 0, + ); + + let signed_dlc_txs = DlcTransactions { + fund: fund_tx, + cets: vec![offer_final_cet, accept_final_cet], + refund: refund_tx, + funding_script_pubkey, + }; + + let offer = OfferDlc { + contract_flags: 0, + chain_hash: BITCOIN_CHAINHASH, + oracle_info: OracleInfo { + public_key: params.oracle_info.public_key, + nonce: params.oracle_info.nonce, + }, + funding_pubkey: offer_params.fund_pubkey, + payout_spk: case.inputs.offer_params.payout_address.script_pubkey(), + total_collateral: case.inputs.offer_params.collateral, + change_spk: case.inputs.offer_params.change_address.script_pubkey(), + contract_info, + contract_maturity_bound: params.contract_maturity_bound, + contract_timeout: params.contract_timeout, + fee_rate_per_vb: params.fee_rate, + funding_inputs: offer_inputs, + }; + + let temporary_contract_id = offer.get_hash().unwrap(); + + let accept = AcceptDlc { + funding_inputs: accept_inputs, + change_spk: case.inputs.accept_params.change_address.script_pubkey(), + payout_spk: case.inputs.accept_params.payout_address.script_pubkey(), + funding_pubkey: accept_params.fund_pubkey, + cet_adaptor_signatures: accept_cets_sigs.into(), + refund_signature: accept_refund_sig, + temporary_contract_id, + total_collateral: accept_params.collateral, + }; + + let sign = SignDlc { + cet_adaptor_signatures: offer_cets_sigs.into(), + contract_id: super::compute_contract_id(fund_tx_id, 0, temporary_contract_id), + funding_signatures: FundingSignatures { + funding_signatures: offer_funding_witnesses, + }, + refund_signature: offer_refund_sig, + }; + + // Assert + + let unsigned_txs = case.unsigned_txs.unwrap(); + assert_unsigned_txs_equal(&unsigned_txs, &dlc_txs); + + let signed_txs = case.signed_txs.unwrap(); + assert_signed_txs_equal(&signed_txs, &signed_dlc_txs); + + assert_msg_eq(&case.offer.unwrap(), offer); + assert_msg_eq(&case.accept.unwrap(), accept); + assert_msg_eq(&case.sign.unwrap(), sign); +} + +#[test] +fn test_dlc_fees() { + let content = include_str!("./test_inputs/dlc_fee_test.json"); + let content_test_scripts = include_str!("./test_inputs/dlc_fee_test_scripts.json"); + let test_cases: Vec = serde_json::from_str(&content).unwrap(); + let test_scripts: Vec = serde_json::from_str(&content_test_scripts).unwrap(); + + let get_test_script = |len: usize| -> Script { + let script_str = test_scripts + .iter() + .find(|x| x.byte_len == len) + .unwrap() + .script + .clone(); + let mut script_hex = Vec::new(); + script_hex.resize(script_str.len() / 2, 0); + from_hex(&script_str, &mut script_hex).unwrap(); + Script::from(script_hex) + }; + + let get_redeem_script = |len: usize| -> Script { + if len == 0 { + Script::new() + } else { + let mut res = Vec::new(); + res.resize(len, 0); + Script::from(res) + } + }; + + let get_inputs = |test_inputs: Vec| -> Vec { + test_inputs + .iter() + .map(|x| TxInputInfo { + outpoint: OutPoint { + txid: Txid::from_str( + "83266d6b22a9babf6ee469b88fd0d3a0c690525f7c903aff22ec8ee44214604f", + ) + .unwrap(), + vout: 0, + }, + max_witness_len: x.max_witness_len, + redeem_script: get_redeem_script(x.redeem_script_len), + serial_id: 0, + }) + .collect() + }; + + let get_party_params = |change_spk_len: usize, + payout_spk_len: usize, + inputs: Vec| + -> PartyParams { + PartyParams { + fund_pubkey: PublicKey::from_str( + "03c06fd4dee6502848b937840019effbab0856a227d984785367b079969471a6ed", + ) + .unwrap(), + collateral: 100000, + change_script_pubkey: get_test_script(change_spk_len), + change_serial_id: 0, + payout_script_pubkey: get_test_script(payout_spk_len), + payout_serial_id: 0, + inputs: get_inputs(inputs), + input_amount: 110000, + } + }; + + for case in test_cases { + let offer_party_params = get_party_params( + case.inputs.offer_change_spk_len, + case.inputs.local_payout_spk_len, + case.inputs.offer_inputs, + ); + let accept_party_params = get_party_params( + case.inputs.accept_change_spk_len, + case.inputs.accept_payout_spk_len, + case.inputs.accept_inputs, + ); + let (_, offer_fund_fee, offer_close_fee) = offer_party_params + .get_change_output_and_fees(case.inputs.fee_rate) + .unwrap(); + let (_, accept_fund_fee, accept_close_fee) = accept_party_params + .get_change_output_and_fees(case.inputs.fee_rate) + .unwrap(); + + assert_eq!(case.offer_funding_fee, offer_fund_fee); + assert_eq!(case.offer_closing_fee, offer_close_fee); + assert_eq!(case.accept_funding_fee, accept_fund_fee); + assert_eq!(case.accept_closing_fee, accept_close_fee); + } +} + +#[test] +fn test_dlc_txs() { + let secp = Secp256k1::new(); + let content = include_str!("./test_inputs/dlc_tx_test.json"); + let test_cases: Vec = serde_json::from_str(&content).unwrap(); + + for test_case in test_cases { + let params = test_case.inputs.params; + let (offer_params, _, _) = get_party_params(&secp, &test_case.inputs.offer_params, 1); + let (accept_params, _, _) = get_party_params(&secp, &test_case.inputs.accept_params, 2); + let total_collateral = offer_params.collateral + accept_params.collateral; + let txs = dlc::create_dlc_transactions( + &offer_params, + &accept_params, + ¶ms + .contract_info + .iter() + .map(|x| get_payout(x, total_collateral)) + .collect::>(), + params.contract_timeout, + params.fee_rate, + 0, + params.contract_maturity_bound, + 0, + ) + .unwrap(); + let test_txs = test_case.txs.unwrap(); + + assert_unsigned_txs_equal(&test_txs, &txs); + } +} + +#[test] +fn test_tlv_vectors() { + let secp = secp256k1::Secp256k1::new(); + let content = include_str!("./test_inputs/dlc_test.json"); + let test_cases: Vec = serde_json::from_str(&content).unwrap(); + + for case in test_cases { + test_single(case, &secp); + } +} diff --git a/dlc-messages/src/contract_msgs.rs b/dlc-messages/src/contract_msgs.rs new file mode 100644 index 00000000..8347444f --- /dev/null +++ b/dlc-messages/src/contract_msgs.rs @@ -0,0 +1,316 @@ +//! Structure containing information about contract details. + +use bitcoin::Amount; +use lightning::ln::msgs::DecodeError; +use lightning::util::ser::{Readable, Writeable, Writer}; +use oracle_msgs::OracleInfo; + +#[derive(Clone, PartialEq, Debug, Eq)] +#[cfg_attr( + any(test, feature = "use-serde"), + derive(serde::Deserialize, serde::Serialize), + serde(rename_all = "camelCase") +)] +/// Represents a single outcome of a DLC contract and the associated offer party +/// payout. +pub struct ContractOutcome { + /// The outcome represented as a string. + pub outcome: String, + /// The payout of the offer party for the outcome. + pub offer_payout: Amount, +} + +impl_dlc_writeable!(ContractOutcome, {(outcome, string), (offer_payout, writeable)}); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains information about the contract outcomes, payouts and oracles. +pub enum ContractInfo { + /// A contract that is based on a single event. + SingleContractInfo(SingleContractInfo), + /// A contract that is based on multiple events. + DisjointContractInfo(DisjointContractInfo), +} + +impl_dlc_writeable_enum!(ContractInfo, + (0, SingleContractInfo), (1, DisjointContractInfo);;; +); + +impl ContractInfo { + /// Returns the total collateral locked inside the contract. + pub fn get_total_collateral(&self) -> Amount { + match self { + ContractInfo::SingleContractInfo(v0) => v0.total_collateral, + ContractInfo::DisjointContractInfo(v1) => v1.total_collateral, + } + } + + /// Return the smallet maturity date amongst all events and oracle announcements + /// used in the contract. + pub fn get_closest_maturity_date(&self) -> u32 { + match self { + ContractInfo::SingleContractInfo(s) => { + s.contract_info.oracle_info.get_closest_maturity_date() + } + ContractInfo::DisjointContractInfo(d) => d + .contract_infos + .iter() + .map(|x| x.oracle_info.get_closest_maturity_date()) + .min() + .expect("to have at least one element"), + } + } +} + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information for a contract based on a single event. +pub struct SingleContractInfo { + /// The total collateral locked in the contract. + pub total_collateral: Amount, + /// Information about the contract outcomes, payout and oracles. + pub contract_info: ContractInfoInner, +} + +impl_dlc_writeable!(SingleContractInfo, { (total_collateral, writeable), (contract_info, writeable) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information for a contract based on a multiple events. +pub struct DisjointContractInfo { + /// The total collateral locked in the contract. + pub total_collateral: Amount, + /// Information about the contract outcomes, payout and oracles. + pub contract_infos: Vec, +} + +impl_dlc_writeable!(DisjointContractInfo, { (total_collateral, writeable), (contract_infos, vec)}); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Payout and oracle information for a contract. +pub struct ContractInfoInner { + /// Payout information for the contract. + pub contract_descriptor: ContractDescriptor, + /// Oracle information for the contract. + pub oracle_info: OracleInfo, +} + +impl_dlc_writeable!(ContractInfoInner, { (contract_descriptor, writeable), (oracle_info, writeable) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about the outcomes and payouts of a contract. +pub enum ContractDescriptor { + /// Used for contract based on enumerated outcomes. + EnumeratedContractDescriptor(EnumeratedContractDescriptor), + /// Used for contract based on numerical outcomes. + NumericOutcomeContractDescriptor(NumericOutcomeContractDescriptor), +} + +impl_dlc_writeable_enum!( + ContractDescriptor, (0, EnumeratedContractDescriptor), (1, NumericOutcomeContractDescriptor);;; +); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about outcomes and payouts for a contract based on enumerated +/// outcome event. +pub struct EnumeratedContractDescriptor { + /// The payouts for the different outcomes. + pub payouts: Vec, +} + +impl_dlc_writeable!(EnumeratedContractDescriptor, { (payouts, vec) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about outcomes and payouts for a contract based on numerical +/// outcome event. +pub struct NumericOutcomeContractDescriptor { + /// The number of digits used by the oracle with smallest number of digits. + pub num_digits: u16, + /// The function representing the payout depending on the outcomes. + pub payout_function: PayoutFunction, + /// The rounding intervals to be applied to the payouts. + pub rounding_intervals: RoundingIntervals, +} + +impl_dlc_writeable!(NumericOutcomeContractDescriptor, { (num_digits, writeable), (payout_function, writeable), (rounding_intervals, writeable) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Function representing the payouts based on the outcomes of a numerical contract. +pub struct PayoutFunction { + /// The pieces that make up the function. + pub payout_function_pieces: Vec, + /// The right most point of the function. + pub last_endpoint: PayoutPoint, +} + +impl_dlc_writeable!(PayoutFunction, {(payout_function_pieces, vec), (last_endpoint, writeable)}); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// A piece of a [`PayoutFunction`]. +pub struct PayoutFunctionPiece { + /// The left end point of the piece. + pub end_point: PayoutPoint, + /// The function describing the curve for this piece. + pub payout_curve_piece: PayoutCurvePiece, +} + +impl_dlc_writeable!(PayoutFunctionPiece, { (end_point, writeable), (payout_curve_piece, writeable) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Representations of functions describing the payout curve over a given interval. +pub enum PayoutCurvePiece { + /// Used for curves represented as polynomial functions. + PolynomialPayoutCurvePiece(PolynomialPayoutCurvePiece), + /// Used for curves represented as hyperbola functions. + HyperbolaPayoutCurvePiece(HyperbolaPayoutCurvePiece), +} + +impl_dlc_writeable_enum!(PayoutCurvePiece, + (0, PolynomialPayoutCurvePiece), + (1, HyperbolaPayoutCurvePiece);;; +); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// A payout curve represented by a polynomial function. +pub struct PolynomialPayoutCurvePiece { + /// The points to be used to interpolate the polynomial. + pub payout_points: Vec, +} + +impl_dlc_writeable!(PolynomialPayoutCurvePiece, { (payout_points, vec) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// A point on a payout curve. +pub struct PayoutPoint { + /// The event outcome for this point (X coordinate). + pub event_outcome: u64, + /// The payout for this point (Y coordinate). + pub outcome_payout: Amount, + /// Extra precision to be applied when computing the payout. + pub extra_precision: u16, +} + +impl_dlc_writeable!(PayoutPoint, { (event_outcome, writeable), (outcome_payout, writeable), (extra_precision, writeable) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// A payout curve represented as an hyperbola. +pub struct HyperbolaPayoutCurvePiece { + /// Whether to use the positive or negative piece represented by this + /// hyperbola. + pub use_positive_piece: bool, + /// Parameter to the hyperbola curve. + pub translate_outcome: f64, + /// Parameter to the hyperbola curve. + pub translate_payout: f64, + /// Parameter to the hyperbola curve. + pub a: f64, + /// Parameter to the hyperbola curve. + pub b: f64, + /// Parameter to the hyperbola curve. + pub c: f64, + /// Parameter to the hyperbola curve. + pub d: f64, +} + +impl_dlc_writeable!(HyperbolaPayoutCurvePiece, { + (use_positive_piece, writeable), + (translate_outcome, float), + (translate_payout, float), + (a, float), + (b, float), + (c, float), + (d, float) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Rounding interval to be applied to an interval to increase the set of points +/// with common payouts. +pub struct RoundingInterval { + /// The beggining of the interval on which to apply the associated rounding. + pub begin_interval: u64, + /// The modulus to apply for the rounding. + pub rounding_mod: u64, +} + +impl_dlc_writeable!(RoundingInterval, { (begin_interval, writeable), (rounding_mod, writeable) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// A set of [`RoundingInterval`]. +pub struct RoundingIntervals { + /// The intervals to be used to round payouts. + pub intervals: Vec, +} + +impl_dlc_writeable!(RoundingIntervals, { (intervals, vec) }); diff --git a/dlc-messages/src/lib.rs b/dlc-messages/src/lib.rs new file mode 100644 index 00000000..543df452 --- /dev/null +++ b/dlc-messages/src/lib.rs @@ -0,0 +1,742 @@ +//! Data structure and functions related to peer communication. + +// Coding conventions +#![forbid(unsafe_code)] +#![deny(non_upper_case_globals)] +#![deny(non_camel_case_types)] +#![deny(non_snake_case)] +#![deny(unused_mut)] +#![deny(dead_code)] +#![deny(unused_imports)] +#![deny(missing_docs)] + +extern crate bitcoin; +extern crate dlc; +extern crate lightning; +extern crate secp256k1_zkp; +#[macro_use] +pub mod ser_macros; +pub mod ser_impls; + +#[cfg(any(test, feature = "use-serde"))] +extern crate serde; + +#[cfg(test)] +extern crate serde_json; + +pub mod channel; +pub mod contract_msgs; +pub mod message_handler; +pub mod oracle_msgs; +pub mod segmentation; + +#[cfg(any(test, feature = "use-serde"))] +pub mod serde_utils; + +use std::fmt::Display; + +use crate::ser_impls::{read_ecdsa_adaptor_signature, write_ecdsa_adaptor_signature}; +use bitcoin::{consensus::Decodable, OutPoint, Transaction}; +use bitcoin::{Amount, ScriptBuf}; +use channel::{ + AcceptChannel, CollaborativeCloseOffer, OfferChannel, Reject, RenewAccept, RenewConfirm, + RenewFinalize, RenewOffer, RenewRevoke, SettleAccept, SettleConfirm, SettleFinalize, + SettleOffer, SignChannel, +}; +use contract_msgs::ContractInfo; +use dlc::dlc_input::DlcInputInfo; +use dlc::{Error, TxInputInfo}; +use lightning::ln::msgs::DecodeError; +use lightning::ln::wire::Type; +use lightning::util::ser::{Readable, Writeable, Writer}; +use secp256k1_zkp::Verification; +use secp256k1_zkp::{ecdsa::Signature, EcdsaAdaptorSignature, PublicKey, Secp256k1}; +use segmentation::{SegmentChunk, SegmentStart}; + +macro_rules! impl_type { + ($const_name: ident, $type_name: ident, $type_val: expr) => { + /// The type prefix for an [`$type_name`] message. + pub const $const_name: u16 = $type_val; + + impl Type for $type_name { + fn type_id(&self) -> u16 { + $const_name + } + } + }; +} + +impl_type!(OFFER_TYPE, OfferDlc, 42778); +impl_type!(ACCEPT_TYPE, AcceptDlc, 42780); +impl_type!(SIGN_TYPE, SignDlc, 42782); +impl_type!(OFFER_CHANNEL_TYPE, OfferChannel, 43000); +impl_type!(ACCEPT_CHANNEL_TYPE, AcceptChannel, 43002); +impl_type!(SIGN_CHANNEL_TYPE, SignChannel, 43004); +impl_type!(SETTLE_CHANNEL_OFFER_TYPE, SettleOffer, 43006); +impl_type!(SETTLE_CHANNEL_ACCEPT_TYPE, SettleAccept, 43008); +impl_type!(SETTLE_CHANNEL_CONFIRM_TYPE, SettleConfirm, 43010); +impl_type!(SETTLE_CHANNEL_FINALIZE_TYPE, SettleFinalize, 43012); +impl_type!(RENEW_CHANNEL_OFFER_TYPE, RenewOffer, 43014); +impl_type!(RENEW_CHANNEL_ACCEPT_TYPE, RenewAccept, 43016); +impl_type!(RENEW_CHANNEL_CONFIRM_TYPE, RenewConfirm, 43018); +impl_type!(RENEW_CHANNEL_FINALIZE_TYPE, RenewFinalize, 43020); +impl_type!(RENEW_CHANNEL_REVOKE_TYPE, RenewRevoke, 43026); +impl_type!( + COLLABORATIVE_CLOSE_OFFER_TYPE, + CollaborativeCloseOffer, + 43022 +); +impl_type!(REJECT, Reject, 43024); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains information about a DLC input to be used in a funding transaction. +pub struct DlcInput { + /// The local funding public key. + pub local_fund_pubkey: PublicKey, + /// The remote funding public key. + pub remote_fund_pubkey: PublicKey, + /// Contract id of the DLC input. + pub contract_id: [u8; 32], +} + +impl_dlc_writeable!(DlcInput, { + (local_fund_pubkey, writeable), + (remote_fund_pubkey, writeable), + (contract_id, writeable) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains information about a specific input to be used in a funding transaction, +/// as well as its corresponding on-chain UTXO. +pub struct FundingInput { + /// Serial id used for input ordering in the funding transaction. + pub input_serial_id: u64, + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_string" + ) + )] + /// The previous transaction used by the associated input in serialized format. + pub prev_tx: Vec, + /// The vout of the output used by the associated input. + pub prev_tx_vout: u32, + /// The sequence number to use for the input. + pub sequence: u32, + /// The maximum witness length that can be used to spend the previous UTXO. + pub max_witness_len: u16, + /// The redeem script of the previous UTXO. + pub redeem_script: ScriptBuf, + /// The optional sub-type of including a DLC input. + pub dlc_input: Option, +} + +impl_dlc_writeable!(FundingInput, { + (input_serial_id, writeable), + (prev_tx, vec), + (prev_tx_vout, writeable), + (sequence, writeable), + (max_witness_len, writeable), + (redeem_script, writeable), + (dlc_input, option) +}); + +impl From<&FundingInput> for TxInputInfo { + fn from(funding_input: &FundingInput) -> TxInputInfo { + TxInputInfo { + outpoint: OutPoint { + txid: Transaction::consensus_decode(&mut funding_input.prev_tx.as_slice()) + .expect("Transaction Decode Error") + .compute_txid(), + vout: funding_input.prev_tx_vout, + }, + max_witness_len: (funding_input.max_witness_len as usize), + redeem_script: funding_input.redeem_script.clone(), + serial_id: funding_input.input_serial_id, + } + } +} + +impl From<&FundingInput> for DlcInputInfo { + fn from(funding_input: &FundingInput) -> Self { + let fund_tx = Transaction::consensus_decode(&mut funding_input.prev_tx.as_slice()).unwrap(); + Self { + fund_tx: fund_tx.clone(), + fund_vout: funding_input.prev_tx_vout, + local_fund_pubkey: funding_input.dlc_input.as_ref().unwrap().local_fund_pubkey, + remote_fund_pubkey: funding_input.dlc_input.as_ref().unwrap().remote_fund_pubkey, + fund_amount: fund_tx.output[funding_input.prev_tx_vout as usize].value, + max_witness_len: funding_input.max_witness_len as usize, + input_serial_id: funding_input.input_serial_id, + contract_id: funding_input.dlc_input.as_ref().unwrap().contract_id, + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains an adaptor signature for a CET input and its associated DLEQ proof. +pub struct CetAdaptorSignature { + /// The signature. + pub signature: EcdsaAdaptorSignature, +} + +impl_dlc_writeable!(CetAdaptorSignature, { + (signature, { cb_writeable, write_ecdsa_adaptor_signature, read_ecdsa_adaptor_signature }) +}); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains a list of adaptor signature for a number of CET inputs. +pub struct CetAdaptorSignatures { + /// The set of signatures. + pub ecdsa_adaptor_signatures: Vec, +} + +impl From<&[EcdsaAdaptorSignature]> for CetAdaptorSignatures { + fn from(signatures: &[EcdsaAdaptorSignature]) -> Self { + CetAdaptorSignatures { + ecdsa_adaptor_signatures: signatures + .iter() + .map(|x| CetAdaptorSignature { signature: *x }) + .collect(), + } + } +} + +impl From<&CetAdaptorSignatures> for Vec { + fn from(signatures: &CetAdaptorSignatures) -> Vec { + signatures + .ecdsa_adaptor_signatures + .iter() + .map(|x| x.signature) + .collect::>() + } +} + +impl_dlc_writeable!(CetAdaptorSignatures, { (ecdsa_adaptor_signatures, vec) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains the witness elements to use to make a funding transaction input valid. +pub struct FundingSignature { + /// The set of witness elements. + pub witness_elements: Vec, +} + +impl_dlc_writeable!(FundingSignature, { (witness_elements, vec) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains a list of witness elements to satisfy the spending conditions of +/// funding inputs. +pub struct FundingSignatures { + /// The set of funding signatures. + pub funding_signatures: Vec, +} + +impl_dlc_writeable!(FundingSignatures, { (funding_signatures, vec) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains serialized data representing a single witness stack element. +pub struct WitnessElement { + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_string" + ) + )] + /// The serialized witness data. + pub witness: Vec, +} + +impl_dlc_writeable!(WitnessElement, { (witness, vec) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Fields used to negotiate contract information. +pub enum NegotiationFields { + /// Negotiation for single event based contract. + Single(SingleNegotiationFields), + /// Negotiation for multiple event based contract. + Disjoint(DisjointNegotiationFields), +} + +impl_dlc_writeable_enum!(NegotiationFields, (0, Single), (1, Disjoint);;;); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Negotiation fields for contract based on a single event. +pub struct SingleNegotiationFields { + /// Proposed rounding intervals. + rounding_intervals: contract_msgs::RoundingIntervals, +} + +impl_dlc_writeable!(SingleNegotiationFields, { (rounding_intervals, writeable) }); + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Negotiation fields for contract based on multiple events. +pub struct DisjointNegotiationFields { + /// The negotiation fields for each contract event. + negotiation_fields: Vec, +} + +impl_dlc_writeable!(DisjointNegotiationFields, { (negotiation_fields, vec) }); + +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Contains information about a party wishing to enter into a DLC with +/// another party. The contained information is sufficient for any other party +/// to create a set of transactions representing the contract and its terms. +pub struct OfferDlc { + /// The version of the protocol used by the peer. + pub protocol_version: u32, + /// Feature flags to be used for the offered contract. + pub contract_flags: u8, + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The identifier of the chain on which the contract will be settled. + pub chain_hash: [u8; 32], + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// Temporary contract id to identify the contract. + pub temporary_contract_id: [u8; 32], + /// Information about the contract event, payouts and oracles. + pub contract_info: ContractInfo, + /// The public key of the offerer to be used to lock the collateral. + pub funding_pubkey: PublicKey, + /// The SPK where the offerer will receive their payout. + pub payout_spk: ScriptBuf, + /// Serial id to order CET outputs. + pub payout_serial_id: u64, + /// Collateral of the offer party. + pub offer_collateral: Amount, + /// Inputs used by the offer party to fund the contract. + pub funding_inputs: Vec, + /// The SPK where the offer party will receive their change. + pub change_spk: ScriptBuf, + /// Serial id to order funding transaction outputs. + pub change_serial_id: u64, + /// Serial id to order funding transaction outputs. + pub fund_output_serial_id: u64, + /// The fee rate to use to compute transaction fees for this contract. + pub fee_rate_per_vb: u64, + /// The lock time for the CETs. + pub cet_locktime: u32, + /// The lock time for the refund transactions. + pub refund_locktime: u32, +} + +impl OfferDlc { + /// Returns the total collateral locked in the contract. + pub fn get_total_collateral(&self) -> Amount { + match &self.contract_info { + ContractInfo::SingleContractInfo(single) => single.total_collateral, + ContractInfo::DisjointContractInfo(disjoint) => disjoint.total_collateral, + } + } + + /// Returns whether the message satisfies validity requirements. + pub fn validate( + &self, + secp: &Secp256k1, + min_timeout_interval: u32, + max_timeout_interval: u32, + ) -> Result<(), Error> { + match &self.contract_info { + ContractInfo::SingleContractInfo(s) => s.contract_info.oracle_info.validate(secp)?, + ContractInfo::DisjointContractInfo(d) => { + if d.contract_infos.len() < 2 { + return Err(Error::InvalidArgument); + } + + for c in &d.contract_infos { + c.oracle_info.validate(secp)?; + } + } + } + + let closest_maturity_date = self.contract_info.get_closest_maturity_date(); + let valid_dates = self.cet_locktime <= closest_maturity_date + && closest_maturity_date + min_timeout_interval <= self.refund_locktime + && self.refund_locktime <= closest_maturity_date + max_timeout_interval; + if !valid_dates { + return Err(Error::InvalidArgument); + } + + Ok(()) + } +} + +impl_dlc_writeable!(OfferDlc, { + (protocol_version, writeable), + (contract_flags, writeable), + (chain_hash, writeable), + (temporary_contract_id, writeable), + (contract_info, writeable), + (funding_pubkey, writeable), + (payout_spk, writeable), + (payout_serial_id, writeable), + (offer_collateral, writeable), + (funding_inputs, vec), + (change_spk, writeable), + (change_serial_id, writeable), + (fund_output_serial_id, writeable), + (fee_rate_per_vb, writeable), + (cet_locktime, writeable), + (refund_locktime, writeable) +}); + +/// Contains information about a party wishing to accept a DLC offer. The contained +/// information is sufficient for the offering party to re-build the set of +/// transactions representing the contract and its terms, and guarantees the offering +/// party that they can safely provide signatures for their funding input. +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +pub struct AcceptDlc { + /// The version of the protocol used by the peer. + pub protocol_version: u32, + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The temporary contract id for the contract. + pub temporary_contract_id: [u8; 32], + /// The collateral input by the accept party. + pub accept_collateral: Amount, + /// The public key of the accept party to be used to lock the collateral. + pub funding_pubkey: PublicKey, + /// The SPK where the accept party will receive their payout. + pub payout_spk: ScriptBuf, + /// Serial id to order CET outputs. + pub payout_serial_id: u64, + /// Inputs used by the accept party to fund the contract. + pub funding_inputs: Vec, + /// The SPK where the accept party will receive their change. + pub change_spk: ScriptBuf, + /// Serial id to order funding transaction outputs. + pub change_serial_id: u64, + /// The set of adaptor signatures from the accept party. + pub cet_adaptor_signatures: CetAdaptorSignatures, + /// The refund signature of the accept party. + pub refund_signature: Signature, + /// The negotiation fields from the accept party. + pub negotiation_fields: Option, +} + +impl_dlc_writeable!(AcceptDlc, { + (protocol_version, writeable), + (temporary_contract_id, writeable), + (accept_collateral, writeable), + (funding_pubkey, writeable), + (payout_spk, writeable), + (payout_serial_id, writeable), + (funding_inputs, vec), + (change_spk, writeable), + (change_serial_id, writeable), + (cet_adaptor_signatures, writeable), + (refund_signature, writeable), + (negotiation_fields, option) +}); + +/// Contains all the required signatures for the DLC transactions from the offering +/// party. +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +pub struct SignDlc { + /// The version of the protocol used by the peer. + pub protocol_version: u32, + #[cfg_attr( + feature = "use-serde", + serde( + serialize_with = "crate::serde_utils::serialize_hex", + deserialize_with = "crate::serde_utils::deserialize_hex_array" + ) + )] + /// The id of the contract referred to by this message. + pub contract_id: [u8; 32], + /// The set of adaptor signatures from the offer party. + pub cet_adaptor_signatures: CetAdaptorSignatures, + /// The refund signature from the offer party. + pub refund_signature: Signature, + /// The set of funding signatures from the offer party. + pub funding_signatures: FundingSignatures, +} + +impl_dlc_writeable!(SignDlc, { + (protocol_version, writeable), + (contract_id, writeable), + (cet_adaptor_signatures, writeable), + (refund_signature, writeable), + (funding_signatures, writeable) +}); + +#[allow(missing_docs)] +#[derive(Debug, Clone)] +pub enum Message { + Offer(OfferDlc), + Accept(AcceptDlc), + Sign(SignDlc), + OfferChannel(OfferChannel), + AcceptChannel(AcceptChannel), + SignChannel(SignChannel), + SettleOffer(SettleOffer), + SettleAccept(SettleAccept), + SettleConfirm(SettleConfirm), + SettleFinalize(SettleFinalize), + RenewOffer(RenewOffer), + RenewAccept(RenewAccept), + RenewConfirm(RenewConfirm), + RenewFinalize(RenewFinalize), + RenewRevoke(RenewRevoke), + CollaborativeCloseOffer(CollaborativeCloseOffer), + Reject(Reject), +} + +macro_rules! impl_type_writeable_for_enum { + ($type_name: ident, {$($variant_name: ident),*}) => { + impl Type for $type_name { + fn type_id(&self) -> u16 { + match self { + $($type_name::$variant_name(v) => v.type_id(),)* + } + } + } + + impl Writeable for $type_name { + fn write(&self, writer: &mut W) -> Result<(), ::lightning::io::Error> { + match self { + $($type_name::$variant_name(v) => v.write(writer),)* + } + } + } + }; +} + +impl_type_writeable_for_enum!(Message, +{ + Offer, + Accept, + Sign, + OfferChannel, + AcceptChannel, + SignChannel, + SettleOffer, + SettleAccept, + SettleConfirm, + SettleFinalize, + RenewOffer, + RenewAccept, + RenewConfirm, + RenewFinalize, + RenewRevoke, + CollaborativeCloseOffer, + Reject +}); + +#[derive(Debug, Clone)] +/// Wrapper for DLC related message and segmentation related messages. +pub enum WireMessage { + /// Message related to establishment of a DLC contract. + Message(Message), + /// Message indicating an incoming segmented message. + SegmentStart(SegmentStart), + /// Message providing a chunk of a segmented message. + SegmentChunk(SegmentChunk), +} + +impl Display for WireMessage { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let name = match self { + Self::Message(_) => "Message", + Self::SegmentStart(_) => "SegmentStart", + Self::SegmentChunk(_) => "SegmentChunk", + }; + f.write_str(name) + } +} + +impl_type_writeable_for_enum!(WireMessage, { Message, SegmentStart, SegmentChunk }); + +#[cfg(test)] +mod tests { + use secp256k1_zkp::SECP256K1; + + use super::*; + + macro_rules! roundtrip_test { + ($type: ty, $input: ident) => { + let msg: $type = serde_json::from_str(&$input).unwrap(); + test_roundtrip(msg); + }; + } + + fn test_roundtrip(msg: T) { + let mut buf = Vec::new(); + msg.write(&mut buf).expect("Error writing message"); + let mut cursor = lightning::io::Cursor::new(buf); + let deser = Readable::read(&mut cursor).expect("Error reading message"); + assert_eq!(msg, deser); + } + + #[test] + fn offer_msg_roundtrip() { + let input = include_str!("./test_inputs/offer_msg.json"); + roundtrip_test!(OfferDlc, input); + } + + #[test] + fn accept_msg_roundtrip() { + let input = include_str!("./test_inputs/accept_msg.json"); + roundtrip_test!(AcceptDlc, input); + } + + #[test] + fn sign_msg_roundtrip() { + let input = include_str!("./test_inputs/sign_msg.json"); + roundtrip_test!(SignDlc, input); + } + + #[test] + fn valid_offer_message_passes_validation() { + let input = include_str!("./test_inputs/offer_msg.json"); + let valid_offer: OfferDlc = serde_json::from_str(input).unwrap(); + valid_offer + .validate(SECP256K1, 86400 * 7, 86400 * 14) + .expect("to validate valid offer messages."); + } + + #[test] + fn valid_offer_message_passes_with_dlc_input() { + let input = include_str!("./test_inputs/offer_msg_with_dlc_input.json"); + let valid_offer: OfferDlc = serde_json::from_str(input).unwrap(); + + for input in &valid_offer.funding_inputs { + assert!(input.dlc_input.is_some()); + } + valid_offer + .validate(SECP256K1, 86400 * 7, 86400 * 14) + .expect("to validate valid offer messages."); + } + + #[test] + fn invalid_offer_messages_fail_validation() { + let input = include_str!("./test_inputs/offer_msg.json"); + let offer: OfferDlc = serde_json::from_str(input).unwrap(); + + let mut invalid_maturity = offer.clone(); + invalid_maturity.cet_locktime += 3; + + let mut too_short_timeout = offer.clone(); + too_short_timeout.refund_locktime -= 100; + + let mut too_long_timeout = offer; + too_long_timeout.refund_locktime -= 100; + + for invalid in &[invalid_maturity, too_short_timeout, too_long_timeout] { + invalid + .validate(SECP256K1, 86400 * 7, 86400 * 14) + .expect_err("Should not pass validation of invalid offer message."); + } + } + + #[test] + fn disjoint_contract_offer_messages_fail_validation() { + let input = include_str!("./test_inputs/offer_msg_disjoint.json"); + let offer: OfferDlc = serde_json::from_str(input).unwrap(); + + let mut no_contract_input = offer.clone(); + no_contract_input.contract_info = + ContractInfo::DisjointContractInfo(contract_msgs::DisjointContractInfo { + total_collateral: Amount::ONE_BTC, + contract_infos: vec![], + }); + + let mut single_contract_input = offer.clone(); + single_contract_input.contract_info = + if let ContractInfo::DisjointContractInfo(d) = offer.contract_info { + let mut single = d; + single.contract_infos.remove(1); + ContractInfo::DisjointContractInfo(single) + } else { + panic!("Expected disjoint contract info."); + }; + + for invalid in &[no_contract_input, single_contract_input] { + invalid + .validate(SECP256K1, 86400 * 7, 86400 * 14) + .expect_err("Should not pass validation of invalid offer message."); + } + } +} diff --git a/dlc-messages/src/message_handler.rs b/dlc-messages/src/message_handler.rs new file mode 100644 index 00000000..bca8f118 --- /dev/null +++ b/dlc-messages/src/message_handler.rs @@ -0,0 +1,385 @@ +//! Struct used to help send and receive DLC related messages. + +use std::{ + collections::{HashMap, VecDeque}, + fmt::Display, + sync::Mutex, +}; + +use lightning::ln::features::{InitFeatures, NodeFeatures}; +use lightning::{ + io::Cursor, + ln::{ + msgs::{DecodeError, LightningError}, + peer_handler::CustomMessageHandler, + wire::{CustomMessageReader, Type}, + }, + util::ser::{Readable, Writeable, MAX_BUF_SIZE}, +}; +use secp256k1_zkp::PublicKey; + +use crate::{ + segmentation::{get_segments, segment_reader::SegmentReader}, + Message, WireMessage, +}; + +/// MessageHandler is used to send and receive messages through the custom +/// message handling mechanism of the LDK. It also handles message segmentation +/// by splitting large messages when sending and re-constructing them when +/// receiving. +pub struct MessageHandler { + msg_events: Mutex>, + msg_received: Mutex>, + segment_readers: Mutex>, +} + +impl Default for MessageHandler { + fn default() -> Self { + Self::new() + } +} + +impl MessageHandler { + /// Creates a new instance of a [`MessageHandler`] + pub fn new() -> Self { + MessageHandler { + msg_events: Mutex::new(VecDeque::new()), + msg_received: Mutex::new(Vec::new()), + segment_readers: Mutex::new(HashMap::new()), + } + } + + /// Returns the messages received by the message handler and empty the + /// receiving buffer. + pub fn get_and_clear_received_messages(&self) -> Vec<(PublicKey, Message)> { + let mut ret = Vec::new(); + std::mem::swap(&mut *self.msg_received.lock().unwrap(), &mut ret); + ret + } + + /// Send a message to the peer with given node id. Not that the message is not + /// sent right away, but only when the LDK + /// [`lightning::ln::peer_handler::PeerManager::process_events`] is next called. + pub fn send_message(&self, node_id: PublicKey, msg: Message) { + if msg.serialized_length() > MAX_BUF_SIZE { + let (seg_start, seg_chunks) = get_segments(msg.encode(), msg.type_id()); + let mut msg_events = self.msg_events.lock().unwrap(); + msg_events.push_back((node_id, WireMessage::SegmentStart(seg_start))); + for chunk in seg_chunks { + msg_events.push_back((node_id, WireMessage::SegmentChunk(chunk))); + } + } else { + self.msg_events + .lock() + .unwrap() + .push_back((node_id, WireMessage::Message(msg))); + } + } + + /// Returns whether the message handler has any message to be sent. + pub fn has_pending_messages(&self) -> bool { + !self.msg_events.lock().unwrap().is_empty() + } +} + +macro_rules! handle_read_dlc_messages { + ($msg_type:ident, $buffer:ident, $(($type_id:ident, $variant:ident)),*) => {{ + let decoded = match $msg_type { + $( + $crate::$type_id => Message::$variant(Readable::read($buffer)?), + )* + _ => return Ok(None), + }; + Ok(Some(WireMessage::Message(decoded))) + }}; +} + +/// Parses a DLC message from a buffer. +pub fn read_dlc_message( + msg_type: u16, + buffer: &mut R, +) -> Result, DecodeError> { + handle_read_dlc_messages!( + msg_type, + buffer, + (OFFER_TYPE, Offer), + (ACCEPT_TYPE, Accept), + (SIGN_TYPE, Sign), + (OFFER_CHANNEL_TYPE, OfferChannel), + (ACCEPT_CHANNEL_TYPE, AcceptChannel), + (SIGN_CHANNEL_TYPE, SignChannel), + (SETTLE_CHANNEL_OFFER_TYPE, SettleOffer), + (SETTLE_CHANNEL_ACCEPT_TYPE, SettleAccept), + (SETTLE_CHANNEL_CONFIRM_TYPE, SettleConfirm), + (SETTLE_CHANNEL_FINALIZE_TYPE, SettleFinalize), + (RENEW_CHANNEL_OFFER_TYPE, RenewOffer), + (RENEW_CHANNEL_ACCEPT_TYPE, RenewAccept), + (RENEW_CHANNEL_CONFIRM_TYPE, RenewConfirm), + (RENEW_CHANNEL_FINALIZE_TYPE, RenewFinalize), + (COLLABORATIVE_CLOSE_OFFER_TYPE, CollaborativeCloseOffer), + (REJECT, Reject) + ) +} + +/// Implementation of the `CustomMessageReader` trait is required to decode +/// custom messages in the LDK. +impl CustomMessageReader for MessageHandler { + type CustomMessage = WireMessage; + fn read( + &self, + msg_type: u16, + buffer: &mut R, + ) -> Result, DecodeError> { + let decoded = match msg_type { + crate::segmentation::SEGMENT_START_TYPE => { + WireMessage::SegmentStart(Readable::read(buffer)?) + } + crate::segmentation::SEGMENT_CHUNK_TYPE => { + WireMessage::SegmentChunk(Readable::read(buffer)?) + } + _ => return read_dlc_message(msg_type, buffer), + }; + + Ok(Some(decoded)) + } +} + +/// Implementation of the `CustomMessageHandler` trait is required to handle +/// custom messages in the LDK. +impl CustomMessageHandler for MessageHandler { + fn peer_connected( + &self, + _their_node_id: &PublicKey, + _msg: &lightning::ln::msgs::Init, + _inbound: bool, + ) -> Result<(), ()> { + Ok(()) + } + + fn peer_disconnected(&self, _their_node_id: &PublicKey) {} + + fn handle_custom_message( + &self, + msg: WireMessage, + org: &PublicKey, + ) -> Result<(), LightningError> { + let mut segment_readers = self.segment_readers.lock().unwrap(); + let segment_reader = segment_readers.entry(*org).or_default(); + + if segment_reader.expecting_chunk() { + match msg { + WireMessage::SegmentChunk(s) => { + if let Some(msg) = segment_reader + .process_segment_chunk(s) + .map_err(|e| to_ln_error(e, "Error processing segment chunk"))? + { + let mut buf = Cursor::new(msg); + let message_type = ::read(&mut buf).map_err(|e| { + to_ln_error(e, "Could not reconstruct message from segments") + })?; + if let WireMessage::Message(m) = self + .read(message_type, &mut buf) + .map_err(|e| { + to_ln_error(e, "Could not reconstruct message from segments") + })? + .expect("to have a message") + { + self.msg_received.lock().unwrap().push((*org, m)); + } else { + return Err(to_ln_error( + "Unexpected message type", + &message_type.to_string(), + )); + } + } + return Ok(()); + } + _ => { + // We were expecting a segment chunk but received something + // else, we reset the state. + segment_reader.reset(); + } + } + } + + match msg { + WireMessage::Message(m) => self.msg_received.lock().unwrap().push((*org, m)), + WireMessage::SegmentStart(s) => segment_reader + .process_segment_start(s) + .map_err(|e| to_ln_error(e, "Error processing segment start"))?, + WireMessage::SegmentChunk(_) => { + return Err(LightningError { + err: "Received a SegmentChunk while not expecting one.".to_string(), + action: lightning::ln::msgs::ErrorAction::DisconnectPeer { msg: None }, + }); + } + }; + Ok(()) + } + + fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { + self.msg_events.lock().unwrap().drain(..).collect() + } + + fn provided_node_features(&self) -> NodeFeatures { + NodeFeatures::empty() + } + + fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { + InitFeatures::empty() + } +} + +#[inline] +fn to_ln_error(e: T, msg: &str) -> LightningError { + LightningError { + err: format!("{} :{}", msg, e), + action: lightning::ln::msgs::ErrorAction::DisconnectPeer { msg: None }, + } +} + +#[cfg(test)] +mod tests { + use secp256k1_zkp::{SecretKey, SECP256K1}; + + use crate::{ + segmentation::{SegmentChunk, SegmentStart}, + AcceptDlc, OfferDlc, SignDlc, + }; + + use super::*; + + fn some_pk() -> PublicKey { + PublicKey::from_secret_key( + SECP256K1, + &SecretKey::from_slice(&secp256k1_zkp::constants::ONE).unwrap(), + ) + } + + macro_rules! read_test { + ($type: ty, $input: ident) => { + let msg: $type = serde_json::from_str(&$input).unwrap(); + handler_read_test(msg); + }; + } + + fn handler_read_test(msg: T) { + let mut buf = Vec::new(); + msg.type_id() + .write(&mut buf) + .expect("Error writing type id"); + msg.write(&mut buf).expect("Error writing message"); + let handler = MessageHandler::new(); + let mut reader = Cursor::new(&mut buf); + let message_type = + ::read(&mut reader).expect("to be able to read the type prefix."); + handler + .read(message_type, &mut reader) + .expect("to be able to read the message") + .expect("to have a message"); + } + + #[test] + fn read_offer_test() { + let input = include_str!("./test_inputs/offer_msg.json"); + read_test!(OfferDlc, input); + } + + #[test] + fn read_accept_test() { + let input = include_str!("./test_inputs/accept_msg.json"); + read_test!(AcceptDlc, input); + } + + #[test] + fn read_sign_test() { + let input = include_str!("./test_inputs/sign_msg.json"); + read_test!(SignDlc, input); + } + + #[test] + fn read_segment_start_test() { + let input = include_str!("./test_inputs/segment_start_msg.json"); + read_test!(SegmentStart, input); + } + + #[test] + fn read_segment_chunk_test() { + let input = include_str!("./test_inputs/segment_chunk_msg.json"); + read_test!(SegmentChunk, input); + } + + #[test] + fn read_unknown_message_returns_none() { + let handler = MessageHandler::new(); + let mut buf = &[0u8; 10]; + let mut reader = Cursor::new(&mut buf); + let message_type = 0; + + assert!(handler + .read(message_type, &mut reader) + .expect("should not error on unknown messages") + .is_none()); + } + + #[test] + fn send_regular_message_test() { + let input = include_str!("./test_inputs/offer_msg.json"); + let msg: OfferDlc = serde_json::from_str(input).unwrap(); + let handler = MessageHandler::new(); + handler.send_message(some_pk(), Message::Offer(msg)); + assert_eq!(handler.msg_events.lock().unwrap().len(), 1); + } + + #[test] + fn send_large_message_segmented_test() { + let input = include_str!("./test_inputs/accept_msg.json"); + let msg: AcceptDlc = serde_json::from_str(input).unwrap(); + let handler = MessageHandler::new(); + handler.send_message(some_pk(), Message::Accept(msg)); + assert!(handler.msg_events.lock().unwrap().len() > 1); + } + + #[test] + fn is_empty_after_clearing_msg_events_test() { + let input = include_str!("./test_inputs/accept_msg.json"); + let msg: AcceptDlc = serde_json::from_str(input).unwrap(); + let handler = MessageHandler::new(); + handler.send_message(some_pk(), Message::Accept(msg)); + handler.get_and_clear_pending_msg(); + assert!(!handler.has_pending_messages()); + } + + #[test] + fn send_message_with_dlc_input_test() { + let input = include_str!("./test_inputs/offer_msg_with_dlc_input.json"); + let msg: OfferDlc = serde_json::from_str(input).unwrap(); + let handler = MessageHandler::new(); + handler.send_message(some_pk(), Message::Offer(msg)); + handler.get_and_clear_pending_msg(); + assert!(!handler.has_pending_messages()); + } + + #[test] + #[ignore = "Need to regenerate the segment start and chunk messages for an accept contract with optional funding input"] + fn rebuilds_segments_properly_test() { + let input1 = include_str!("./test_inputs/segment_start_msg.json"); + let input2 = include_str!("./test_inputs/segment_chunk_msg.json"); + let segment_start: SegmentStart = serde_json::from_str(input1).unwrap(); + let segment_chunk: SegmentChunk = serde_json::from_str(input2).unwrap(); + + let handler = MessageHandler::new(); + handler + .handle_custom_message(WireMessage::SegmentStart(segment_start), &some_pk()) + .expect("to be able to process segment start"); + handler + .handle_custom_message(WireMessage::SegmentChunk(segment_chunk), &some_pk()) + .expect("to be able to process segment start"); + let msg = handler.get_and_clear_received_messages(); + assert_eq!(1, msg.len()); + if let (_, Message::Accept(_)) = msg[0] { + } else { + panic!("Expected an accept message"); + } + } +} diff --git a/dlc-messages/src/oracle_msgs.rs b/dlc-messages/src/oracle_msgs.rs new file mode 100644 index 00000000..5b470c89 --- /dev/null +++ b/dlc-messages/src/oracle_msgs.rs @@ -0,0 +1,645 @@ +//! Structs containing oracle information. + +use crate::ser_impls::{ + read_as_tlv, read_i32, read_schnorr_pubkey, read_schnorrsig, read_strings_u16, write_as_tlv, + write_i32, write_schnorr_pubkey, write_schnorrsig, write_strings_u16, +}; +use bitcoin::hashes::Hash; +use dlc::{Error, OracleInfo as DlcOracleInfo}; +use lightning::ln::msgs::DecodeError; +use lightning::ln::wire::Type; +use lightning::util::ser::{Readable, Writeable, Writer}; +use secp256k1_zkp::Verification; +use secp256k1_zkp::{schnorr::Signature, Message, Secp256k1, XOnlyPublicKey}; +#[cfg(feature = "use-serde")] +use serde::{Deserialize, Serialize}; + +/// The type of the announcement struct. +pub const ANNOUNCEMENT_TYPE: u16 = 55332; +/// The type of the attestation struct. +pub const ATTESTATION_TYPE: u16 = 55400; + +#[derive(Clone, Eq, PartialEq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about an oracle used in a contract. +pub enum OracleInfo { + /// Used when a contract uses a single oracle. + Single(SingleOracleInfo), + /// Used when a contract uses multiple oracles. + Multi(MultiOracleInfo), +} + +impl<'a> OracleInfo { + /// Returns the first event descriptor. + pub fn get_first_event_descriptor(&'a self) -> &'a EventDescriptor { + match self { + OracleInfo::Single(single) => &single.oracle_announcement.oracle_event.event_descriptor, + OracleInfo::Multi(multi) => { + &multi.oracle_announcements[0].oracle_event.event_descriptor + } + } + } +} + +impl OracleInfo { + /// Returns the closest maturity date amongst all events + pub fn get_closest_maturity_date(&self) -> u32 { + match self { + OracleInfo::Single(s) => s.oracle_announcement.oracle_event.event_maturity_epoch, + OracleInfo::Multi(m) => m + .oracle_announcements + .iter() + .map(|x| x.oracle_event.event_maturity_epoch) + .min() + .expect("to have at least one event"), + } + } + + /// Checks that the info satisfies the validity conditions. + pub fn validate(&self, secp: &Secp256k1) -> Result<(), Error> { + match self { + OracleInfo::Single(s) => s.oracle_announcement.validate(secp)?, + OracleInfo::Multi(m) => { + for o in &m.oracle_announcements { + o.validate(secp)?; + } + } + }; + + Ok(()) + } +} + +impl_dlc_writeable_enum!( + OracleInfo, (0, Single), (1, Multi);;; +); + +#[derive(Clone, Eq, PartialEq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Structure containing information about an oracle to be used as external +/// data source for a DLC contract. +pub struct SingleOracleInfo { + /// The oracle announcement from the oracle. + pub oracle_announcement: OracleAnnouncement, +} + +impl_dlc_writeable!(SingleOracleInfo, { + (oracle_announcement, {cb_writeable, write_as_tlv, read_as_tlv }) +}); + +#[derive(Clone, Eq, PartialEq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about oracles used in multi oracle based contracts. +pub struct MultiOracleInfo { + /// The threshold to be used for the contract (e.g. 2 of 3). + pub threshold: u16, + /// The set of oracle announcements. + pub oracle_announcements: Vec, + /// The parameters to be used when allowing differences between oracle + /// outcomes in numerical outcome contracts. + pub oracle_params: Option, +} + +impl_dlc_writeable!(MultiOracleInfo, { + (threshold, writeable), + (oracle_announcements, {vec_cb, write_as_tlv, read_as_tlv}), + (oracle_params, option) +}); + +#[derive(Clone, Eq, PartialEq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +/// Parameter describing allowed differences between oracles in numerical outcome +/// contracts. +pub struct OracleParams { + /// The maximum allowed difference between oracle expressed as a power of 2. + pub max_error_exp: u16, + /// The minimum allowed difference that should be supported by the contract + /// expressed as a power of 2. + pub min_fail_exp: u16, + /// Whether to maximize coverage of the interval between [`Self::max_error_exp`] + /// and [`Self::min_fail_exp`]. + pub maximize_coverage: bool, +} + +impl_dlc_writeable!(OracleParams, { + (max_error_exp, writeable), + (min_fail_exp, writeable), + (maximize_coverage, writeable) +}); + +#[derive(Clone, Eq, PartialEq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +/// An oracle announcement that describe an event and the way that an oracle will +/// attest to it. +pub struct OracleAnnouncement { + /// The signature enabling verifying the origin of the announcement. + pub announcement_signature: Signature, + /// The public key of the oracle. + pub oracle_public_key: XOnlyPublicKey, + /// The description of the event and attesting. + pub oracle_event: OracleEvent, +} + +impl Type for OracleAnnouncement { + fn type_id(&self) -> u16 { + ANNOUNCEMENT_TYPE + } +} + +impl OracleAnnouncement { + /// Returns whether the announcement satisfy validity checks. + pub fn validate(&self, secp: &Secp256k1) -> Result<(), Error> { + let mut event_hex = Vec::new(); + self.oracle_event + .write(&mut event_hex) + .expect("Error writing oracle event"); + + let hash = bitcoin::hashes::sha256::Hash::hash(&event_hex); + let msg = Message::from_digest(hash.to_byte_array()); + secp.verify_schnorr(&self.announcement_signature, &msg, &self.oracle_public_key)?; + self.oracle_event.validate() + } +} + +impl_dlc_writeable!(OracleAnnouncement, { + (announcement_signature, {cb_writeable, write_schnorrsig, read_schnorrsig}), + (oracle_public_key, {cb_writeable, write_schnorr_pubkey, read_schnorr_pubkey}), + (oracle_event, {cb_writeable, write_as_tlv, read_as_tlv}) +}); + +impl From<&OracleAnnouncement> for DlcOracleInfo { + fn from(input: &OracleAnnouncement) -> DlcOracleInfo { + DlcOracleInfo { + public_key: input.oracle_public_key, + nonces: input.oracle_event.oracle_nonces.clone(), + } + } +} + +#[derive(Clone, Eq, PartialEq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about an event and the way that the oracle will attest to it. +pub struct OracleEvent { + /// The nonces that the oracle will use to attest to the event outcome. + pub oracle_nonces: Vec, + /// The expected maturity of the contract. + // TODO(tibo): should validate that with the contract maturity. + pub event_maturity_epoch: u32, + /// The description of the event. + pub event_descriptor: EventDescriptor, + /// The id of the event. + pub event_id: String, +} + +impl OracleEvent { + /// Returns whether the event passes validity checks. + pub fn validate(&self) -> Result<(), Error> { + let expected_nb_nonces = match &self.event_descriptor { + EventDescriptor::EnumEvent(_) => 1, + EventDescriptor::DigitDecompositionEvent(d) => { + if d.is_signed { + d.nb_digits as usize + 1 + } else { + d.nb_digits as usize + } + } + }; + + if expected_nb_nonces == self.oracle_nonces.len() { + Ok(()) + } else { + Err(Error::InvalidArgument) + } + } +} + +impl Type for OracleEvent { + fn type_id(&self) -> u16 { + 55330 + } +} + +impl_dlc_writeable!(OracleEvent, { + (oracle_nonces, {vec_u16_cb, write_schnorr_pubkey, read_schnorr_pubkey}), + (event_maturity_epoch, writeable), + (event_descriptor, writeable), + (event_id, string) +}); + +#[derive(Clone, PartialEq, Eq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +/// Description of an event. +pub enum EventDescriptor { + /// Used for events based on enumerated outcomes. + EnumEvent(EnumEventDescriptor), + /// Used for event based on numerical outcomes. + DigitDecompositionEvent(DigitDecompositionEventDescriptor), +} + +impl_dlc_writeable_enum_as_tlv!(EventDescriptor, (55302, EnumEvent), (55306, DigitDecompositionEvent);); + +#[derive(Clone, PartialEq, Eq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +/// Describes the outcomes of an event as an enumeration. +pub struct EnumEventDescriptor { + /// The possible outcomes of the event. + pub outcomes: Vec, +} + +impl_dlc_writeable!(EnumEventDescriptor, { + (outcomes, {cb_writeable, write_strings_u16, read_strings_u16}) +}); + +#[derive(Clone, PartialEq, Eq, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +/// Describes the outcomes of a numerical outcome event. +pub struct DigitDecompositionEventDescriptor { + /// The base in which the outcome will be represented. + pub base: u16, + /// Whether the outcome value is signed. + pub is_signed: bool, + /// The unit in which the outcome is represented. + pub unit: String, + /// The precision used to represent the event outcome. + pub precision: i32, + /// The number of digits used to represent the event outcome. + // TODO:(tibo) should validate that nb_digits == nb_nonces + pub nb_digits: u16, +} + +impl_dlc_writeable!(DigitDecompositionEventDescriptor, { + (base, writeable), + (is_signed, writeable), + (unit, string), + (precision, {cb_writeable, write_i32, read_i32}), + (nb_digits, writeable) +}); + +/// An attestation from an oracle providing signatures over an outcome value. +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct OracleAttestation { + /// The identifier of the announcement. + pub event_id: String, + /// The public key of the oracle. + pub oracle_public_key: XOnlyPublicKey, + /// The signatures over the event outcome. + pub signatures: Vec, + /// The set of strings representing the outcome value. + pub outcomes: Vec, +} + +impl OracleAttestation { + /// Returns whether the attestation satisfy validity checks. + pub fn validate( + &self, + secp: &Secp256k1, + announcement: &OracleAnnouncement, + ) -> Result<(), Error> { + if self.outcomes.len() != self.signatures.len() { + return Err(Error::InvalidArgument); + } + + if self.oracle_public_key != announcement.oracle_public_key { + return Err(Error::InvalidArgument); + } + + self.signatures + .iter() + .zip(self.outcomes.iter()) + .try_for_each(|(sig, outcome)| { + let hash = bitcoin::hashes::sha256::Hash::hash(outcome.as_bytes()); + let msg = Message::from_digest(hash.to_byte_array()); + secp.verify_schnorr(sig, &msg, &self.oracle_public_key) + .map_err(|_| Error::InvalidArgument)?; + + Ok::<(), dlc::Error>(()) + })?; + + if !self + .signatures + .iter() + .zip(announcement.oracle_event.oracle_nonces.iter()) + .all(|(sig, nonce)| sig.encode()[..32] == nonce.serialize()) + { + return Err(Error::InvalidArgument); + } + + Ok(()) + } + /// Returns the nonces used by the oracle to sign the event outcome. + /// This is used for finding the matching oracle announcement. + pub fn nonces(&self) -> Vec { + self.signatures + .iter() + .map(|s| XOnlyPublicKey::from_slice(&s[0..32]).expect("valid signature")) + .collect() + } +} + +impl Type for OracleAttestation { + fn type_id(&self) -> u16 { + ATTESTATION_TYPE + } +} + +impl_dlc_writeable!(OracleAttestation, { + (event_id, string), + (oracle_public_key, {cb_writeable, write_schnorr_pubkey, read_schnorr_pubkey}), + (signatures, {vec_u16_cb, write_schnorrsig, read_schnorrsig}), + (outcomes, {cb_writeable, write_strings_u16, read_strings_u16}) +}); + +#[cfg(test)] +mod tests { + use super::*; + use bitcoin::bip32::{ChildNumber, Xpriv}; + use bitcoin::Network; + use secp256k1_zkp::rand::Fill; + use secp256k1_zkp::SecretKey; + use secp256k1_zkp::{rand::thread_rng, Message, SECP256K1}; + use secp256k1_zkp::{schnorr::Signature as SchnorrSignature, Keypair, XOnlyPublicKey}; + + fn enum_descriptor() -> EnumEventDescriptor { + EnumEventDescriptor { + outcomes: vec!["1".to_string(), "2".to_string(), "3".to_string()], + } + } + + fn digit_descriptor() -> DigitDecompositionEventDescriptor { + DigitDecompositionEventDescriptor { + base: 2, + is_signed: false, + unit: "kg/sats".to_string(), + precision: 1, + nb_digits: 10, + } + } + + fn signed_digit_descriptor() -> DigitDecompositionEventDescriptor { + DigitDecompositionEventDescriptor { + base: 2, + is_signed: true, + unit: "kg/sats".to_string(), + precision: 1, + nb_digits: 10, + } + } + + fn some_schnorr_pubkey() -> XOnlyPublicKey { + let key_pair = Keypair::new(SECP256K1, &mut thread_rng()); + XOnlyPublicKey::from_keypair(&key_pair).0 + } + + fn digit_event(nb_nonces: usize) -> OracleEvent { + OracleEvent { + oracle_nonces: (0..nb_nonces).map(|_| some_schnorr_pubkey()).collect(), + event_maturity_epoch: 10, + event_descriptor: EventDescriptor::DigitDecompositionEvent(digit_descriptor()), + event_id: "test".to_string(), + } + } + + fn signed_digit_event(nb_nonces: usize) -> OracleEvent { + OracleEvent { + oracle_nonces: (0..nb_nonces).map(|_| some_schnorr_pubkey()).collect(), + event_maturity_epoch: 10, + event_descriptor: EventDescriptor::DigitDecompositionEvent(signed_digit_descriptor()), + event_id: "test-signed".to_string(), + } + } + + fn enum_event(nb_nonces: usize) -> OracleEvent { + OracleEvent { + oracle_nonces: (0..nb_nonces).map(|_| some_schnorr_pubkey()).collect(), + event_maturity_epoch: 10, + event_descriptor: EventDescriptor::EnumEvent(enum_descriptor()), + event_id: "test".to_string(), + } + } + + fn create_nonce_key() -> (SecretKey, XOnlyPublicKey) { + let mut nonce_seed = [0u8; 32]; + nonce_seed.try_fill(&mut thread_rng()).unwrap(); + let nonce_priv = Xpriv::new_master(Network::Bitcoin, &nonce_seed) + .unwrap() + .derive_priv(SECP256K1, &[ChildNumber::from_normal_idx(1).unwrap()]) + .unwrap() + .private_key; + + let nonce_xpub = nonce_priv.x_only_public_key(SECP256K1).0; + + (nonce_priv, nonce_xpub) + } + + #[test] + fn valid_oracle_announcement_passes_validation_test() { + let key_pair = Keypair::new(SECP256K1, &mut thread_rng()); + let oracle_pubkey = XOnlyPublicKey::from_keypair(&key_pair).0; + let events = [digit_event(10), signed_digit_event(11), enum_event(1)]; + for event in events { + let mut event_hex = Vec::new(); + event + .write(&mut event_hex) + .expect("Error writing oracle event"); + let hash = bitcoin::hashes::sha256::Hash::hash(&event_hex); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = SECP256K1.sign_schnorr(&msg, &key_pair); + let valid_announcement = OracleAnnouncement { + announcement_signature: sig, + oracle_public_key: oracle_pubkey, + oracle_event: event, + }; + + valid_announcement + .validate(SECP256K1) + .expect("a valid announcement."); + } + } + + #[test] + fn invalid_oracle_announcement_fails_validation_test() { + let key_pair = Keypair::new(SECP256K1, &mut thread_rng()); + let oracle_pubkey = XOnlyPublicKey::from_keypair(&key_pair).0; + let events = [digit_event(9), signed_digit_event(10), enum_event(2)]; + for event in events { + let mut event_hex = Vec::new(); + event + .write(&mut event_hex) + .expect("Error writing oracle event"); + let hash = bitcoin::hashes::sha256::Hash::hash(&event_hex); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = SECP256K1.sign_schnorr(&msg, &key_pair); + let invalid_announcement = OracleAnnouncement { + announcement_signature: sig, + oracle_public_key: oracle_pubkey, + oracle_event: event, + }; + + invalid_announcement + .validate(SECP256K1) + .expect_err("invalid announcement should fail validation."); + } + } + + #[test] + fn invalid_oracle_announcement_signature_fails_validation_test() { + let key_pair = Keypair::new(SECP256K1, &mut thread_rng()); + let oracle_pubkey = XOnlyPublicKey::from_keypair(&key_pair).0; + let event = digit_event(10); + let mut event_hex = Vec::new(); + event + .write(&mut event_hex) + .expect("Error writing oracle event"); + let hash = bitcoin::hashes::sha256::Hash::hash(&event_hex); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = SECP256K1.sign_schnorr(&msg, &key_pair); + let mut sig_hex = *sig.as_ref(); + sig_hex[10] = sig_hex[10].checked_add(1).unwrap_or(0); + let sig = SchnorrSignature::from_slice(&sig_hex).unwrap(); + let invalid_announcement = OracleAnnouncement { + announcement_signature: sig, + oracle_public_key: oracle_pubkey, + oracle_event: event, + }; + + assert!(invalid_announcement.validate(SECP256K1).is_err()); + } + + #[test] + fn valid_oracle_attestation() { + let key_pair = Keypair::new(SECP256K1, &mut thread_rng()); + let oracle_pubkey = XOnlyPublicKey::from_keypair(&key_pair).0; + let (nonce_secret, nonce_xpub) = create_nonce_key(); + + let oracle_event = OracleEvent { + event_id: "test".to_string(), + event_maturity_epoch: 10, + oracle_nonces: vec![nonce_xpub], + event_descriptor: EventDescriptor::EnumEvent(enum_descriptor()), + }; + + let mut event_hex = Vec::new(); + oracle_event + .write(&mut event_hex) + .expect("Error writing oracle event"); + let hash = bitcoin::hashes::sha256::Hash::hash(&event_hex); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = SECP256K1.sign_schnorr(&msg, &key_pair); + + let valid_announcement = OracleAnnouncement { + oracle_public_key: oracle_pubkey, + announcement_signature: sig, + oracle_event, + }; + + let hash = bitcoin::hashes::sha256::Hash::hash("1".as_bytes()); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = dlc::secp_utils::schnorrsig_sign_with_nonce( + SECP256K1, + &msg, + &key_pair, + &nonce_secret.secret_bytes(), + ); + + let attestation = OracleAttestation { + event_id: "test".to_string(), + oracle_public_key: oracle_pubkey, + signatures: vec![sig], + outcomes: vec!["1".to_string()], + }; + + let validation = attestation.validate(SECP256K1, &valid_announcement); + + assert!(validation.is_ok()) + } + + #[test] + fn invalid_attestation_incorrect_nonce() { + let key_pair = Keypair::new(SECP256K1, &mut thread_rng()); + let oracle_pubkey = XOnlyPublicKey::from_keypair(&key_pair).0; + let (_, nonce_xpub) = create_nonce_key(); + let (incorrect_nonce_secret, _) = create_nonce_key(); + + let oracle_event = OracleEvent { + event_id: "test".to_string(), + event_maturity_epoch: 10, + oracle_nonces: vec![nonce_xpub], + event_descriptor: EventDescriptor::EnumEvent(enum_descriptor()), + }; + + let mut event_hex = Vec::new(); + oracle_event + .write(&mut event_hex) + .expect("Error writing oracle event"); + let hash = bitcoin::hashes::sha256::Hash::hash(&event_hex); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = SECP256K1.sign_schnorr(&msg, &key_pair); + + let valid_announcement = OracleAnnouncement { + oracle_public_key: oracle_pubkey, + announcement_signature: sig, + oracle_event, + }; + + let hash = bitcoin::hashes::sha256::Hash::hash("1".as_bytes()); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = dlc::secp_utils::schnorrsig_sign_with_nonce( + SECP256K1, + &msg, + &key_pair, + &incorrect_nonce_secret.secret_bytes(), + ); + + let attestation = OracleAttestation { + event_id: "test".to_string(), + oracle_public_key: oracle_pubkey, + signatures: vec![sig], + outcomes: vec!["1".to_string()], + }; + + let validation = attestation.validate(SECP256K1, &valid_announcement); + + assert!(validation.is_err()) + } +} diff --git a/dlc-messages/src/segmentation/mod.rs b/dlc-messages/src/segmentation/mod.rs new file mode 100644 index 00000000..85ce7a01 --- /dev/null +++ b/dlc-messages/src/segmentation/mod.rs @@ -0,0 +1,130 @@ +//! Module used when working with message segmentation. + +use lightning::ln::msgs::DecodeError; +use lightning::ln::wire::Type; +use lightning::util::ser::{Readable, Writeable, Writer}; + +/// The type of the [`SegmentStart`] message. +pub const SEGMENT_START_TYPE: u16 = 42900; + +/// The type of the [`SegmentChunk`] message. +pub const SEGMENT_CHUNK_TYPE: u16 = 42902; + +/// Maximum allowed size by noise protocol: +pub const MAX_DATA_SIZE: usize = 65535; + +// Max data size - 2 for wrapper type - 5 for bigsize length prefix - 2 for nb segments +const MAX_START_DATA_SIZE: usize = 65526; + +// Max data size - 2 for wrapper type - 5 for bigsize length prefix +const MAX_CHUNK_SIZE: usize = 65528; + +const MAX_SEGMENTS: usize = 1000; + +pub mod segment_reader; + +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +#[derive(Clone, Debug, PartialEq, Eq)] +/// Message indicating that an incoming message has been split and needs to be +/// reconstructed. +pub struct SegmentStart { + /// The number of segments into which the large message has been split. + pub nb_segments: u16, + /// The data for the first segment. + pub data: Vec, +} + +impl_dlc_writeable!(SegmentStart, { + (nb_segments, writeable), + (data, writeable) +}); + +impl Type for SegmentStart { + fn type_id(&self) -> u16 { + SEGMENT_START_TYPE + } +} + +#[cfg_attr( + feature = "use-serde", + derive(serde::Serialize, serde::Deserialize), + serde(rename_all = "camelCase") +)] +#[derive(Clone, Debug, PartialEq, Eq)] +/// Message providing a chunk of a split message. +pub struct SegmentChunk { + /// The data to be appended to previously received chunks. + pub data: Vec, +} + +impl_dlc_writeable!(SegmentChunk, { (data, writeable) }); + +impl Type for SegmentChunk { + fn type_id(&self) -> u16 { + SEGMENT_CHUNK_TYPE + } +} + +/// Split the given data into multiple segments, pre-pending the message type +/// to enable decoding on the receiving side. +pub fn get_segments(mut data: Vec, msg_type: u16) -> (SegmentStart, Vec) { + debug_assert!(data.len() > MAX_DATA_SIZE); + + let len_minus_start = data.len() - MAX_START_DATA_SIZE + 2; + let mut nb_segments = (len_minus_start / MAX_CHUNK_SIZE + 1) as u16; + + if len_minus_start % MAX_CHUNK_SIZE != 0 { + nb_segments += 1; + } + + debug_assert!(nb_segments > 1); + + let mut start_data = Vec::with_capacity(MAX_START_DATA_SIZE); + msg_type + .write(&mut start_data) + .expect("to be able to write the type prefix"); + start_data.append(&mut data.drain(..MAX_START_DATA_SIZE - 2).collect()); + + debug_assert_eq!(MAX_START_DATA_SIZE, start_data.len()); + + let segment_start = SegmentStart { + nb_segments, + data: start_data, + }; + + let mut segments = Vec::with_capacity((nb_segments as usize) - 1); + + for _ in 1..(nb_segments as usize) { + let to_take = usize::min(data.len(), MAX_CHUNK_SIZE); + segments.push(SegmentChunk { + data: data.drain(..to_take).collect(), + }); + } + + (segment_start, segments) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_segments() { + let data_size = MAX_START_DATA_SIZE + 2 * MAX_CHUNK_SIZE + 1234; + let mut data = Vec::new(); + data.resize(data_size, 1); + + let (segment_start, segment_chunks) = get_segments(data, 2); + + assert_eq!(4, segment_start.nb_segments); + assert_eq!(MAX_START_DATA_SIZE, segment_start.data.len()); + assert_eq!(3, segment_chunks.len()); + assert_eq!(MAX_CHUNK_SIZE, segment_chunks[0].data.len()); + assert_eq!(MAX_CHUNK_SIZE, segment_chunks[1].data.len()); + assert_eq!(1236, segment_chunks[2].data.len()); + } +} diff --git a/dlc-messages/src/segmentation/segment_reader.rs b/dlc-messages/src/segmentation/segment_reader.rs new file mode 100644 index 00000000..6cedcb1a --- /dev/null +++ b/dlc-messages/src/segmentation/segment_reader.rs @@ -0,0 +1,244 @@ +//! Module helping with processing message segmentation related messages. + +use super::{SegmentChunk, SegmentStart, MAX_CHUNK_SIZE, MAX_SEGMENTS, MAX_START_DATA_SIZE}; + +/// Struct helping with processing message segmentation related messages. +pub struct SegmentReader { + cur_data: Vec, + remaining_segments: u16, +} + +#[derive(Debug)] +/// An error that occured while processing message segmentation related messages. +pub enum Error { + /// The reader is in a state that is invalid. + InvalidState(String), + /// A parameter received by the reader was not in accordance with its state. + InvalidParameter(String), +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match *self { + Error::InvalidState(ref s) => write!(f, "Invalid state {}", s), + Error::InvalidParameter(ref s) => write!(f, "Invalid parameters were provided: {}", s), + } + } +} + +#[cfg(not(feature = "no-std"))] +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::InvalidState(_) => None, + Error::InvalidParameter(_) => None, + } + } +} + +impl Default for SegmentReader { + fn default() -> Self { + Self::new() + } +} + +impl SegmentReader { + /// Returns a new instance of [`Self`]. + pub fn new() -> Self { + SegmentReader { + cur_data: Vec::new(), + remaining_segments: 0, + } + } + + /// Reset the state of the reader + pub fn reset(&mut self) { + self.cur_data = Vec::new(); + self.remaining_segments = 0; + } + + /// Whether the reader is waiting for an incoming chunk. + pub fn expecting_chunk(&self) -> bool { + self.remaining_segments != 0 + } + + /// Process a [`super::SegmentStart`] message. + pub fn process_segment_start(&mut self, segment_start: SegmentStart) -> Result<(), Error> { + if !self.cur_data.is_empty() { + return Err(Error::InvalidState( + "Received segment start while cur data buffer is not empty.".to_string(), + )); + } + + if segment_start.nb_segments < 2 || segment_start.nb_segments > (MAX_SEGMENTS as u16) { + return Err(Error::InvalidParameter( + "Segment start must specify at least two chunks and maximum a thousand." + .to_string(), + )); + } + + if segment_start.data.len() < MAX_START_DATA_SIZE { + return Err(Error::InvalidParameter( + "Segment start data should be filled to its maximum capacity.".to_string(), + )); + } + + let SegmentStart { nb_segments, data } = segment_start; + + self.remaining_segments = nb_segments - 1; + + self.cur_data = data; + + Ok(()) + } + + /// Process a [`super::SegmentChunk`] message. + pub fn process_segment_chunk( + &mut self, + mut segment_chunk: SegmentChunk, + ) -> Result>, Error> { + if self.cur_data.is_empty() { + return Err(Error::InvalidState( + "Received segment chunk while cur data buffer is empty.".to_string(), + )); + } + + if self.remaining_segments > 1 && segment_chunk.data.len() != MAX_CHUNK_SIZE { + return Err(Error::InvalidParameter( + "Receive non final segment chunk that was not not filled.".to_string(), + )); + } + + self.cur_data.append(&mut segment_chunk.data); + self.remaining_segments -= 1; + + if self.remaining_segments == 0 { + let mut res = Vec::new(); + std::mem::swap(&mut self.cur_data, &mut res); + Ok(Some(res)) + } else { + Ok(None) + } + } +} + +#[cfg(test)] +mod tests { + use crate::segmentation::MAX_DATA_SIZE; + + use super::*; + + fn segments() -> (SegmentStart, Vec) { + let mut buf = Vec::new(); + buf.resize(MAX_DATA_SIZE * 4, 1); + super::super::get_segments(buf, 2) + } + + #[test] + fn read_segments_test() { + let mut segment_reader = SegmentReader::new(); + let (segment_start, segment_chunks) = segments(); + + assert!(!segment_reader.expecting_chunk()); + + segment_reader + .process_segment_start(segment_start) + .expect("to be able to process the segment start"); + + assert!(segment_reader.expecting_chunk()); + + for chunk in segment_chunks { + assert!(segment_reader.expecting_chunk()); + segment_reader + .process_segment_chunk(chunk) + .expect("to be able to process the segment chunk"); + } + + assert!(!segment_reader.expecting_chunk()); + } + + #[test] + fn chunk_no_start_fails_test() { + let mut segment_reader = SegmentReader::new(); + let (_, mut segment_chunks) = segments(); + segment_reader + .process_segment_chunk(segment_chunks.pop().unwrap()) + .expect_err("Should not process a chunk without having had a start first."); + } + + #[test] + fn start_not_finished_previous_fails_test() { + let mut segment_reader = SegmentReader::new(); + let (segment_start, segment_chunks) = segments(); + let (segment_start2, _) = segments(); + segment_reader + .process_segment_start(segment_start) + .expect("to be able to process the first segment start"); + segment_reader + .process_segment_chunk(segment_chunks[0].clone()) + .expect("to be able to process the segment chunk"); + segment_reader + .process_segment_start(segment_start2) + .expect_err("should not process new start before finishing previous segment"); + } + + #[test] + fn start_reset_start_accepted_test() { + let mut segment_reader = SegmentReader::new(); + let (segment_start, _) = segments(); + let (segment_start2, _) = segments(); + segment_reader + .process_segment_start(segment_start) + .expect("to be able to process the first segment start"); + segment_reader.reset(); + segment_reader + .process_segment_start(segment_start2) + .expect("to be able to process the same segment start after reset"); + } + + #[test] + fn too_few_chunk_in_start_fails_test() { + let mut segment_reader = SegmentReader::new(); + let (mut segment_start, _) = segments(); + segment_start.nb_segments = 1; + segment_reader + .process_segment_start(segment_start) + .expect_err("should not accept segment with less than 2 elements"); + } + + #[test] + fn too_many_chunks_in_start_fails_test() { + let mut segment_reader = SegmentReader::new(); + let (mut segment_start, _) = segments(); + segment_start.nb_segments = 1001; + segment_reader + .process_segment_start(segment_start) + .expect_err("should not accept segments with more than 1000 elements"); + } + + #[test] + fn segment_start_not_full_fails_test() { + let mut segment_reader = SegmentReader::new(); + let (mut segment_start, _) = segments(); + segment_start.data.pop(); + + segment_reader + .process_segment_start(segment_start) + .expect_err("Should error on non full segment start message."); + } + + #[test] + fn non_final_chunk_not_full_fails_test() { + let mut segment_reader = SegmentReader::new(); + let (segment_start, mut segment_chunks) = segments(); + segment_reader + .process_segment_start(segment_start) + .expect("to be able to process the segment start"); + + segment_chunks[0].data.pop(); + + segment_reader + .process_segment_chunk(segment_chunks[0].clone()) + .expect_err("should not accept not full segment that is not the last one"); + } +} diff --git a/dlc-messages/src/ser_impls.rs b/dlc-messages/src/ser_impls.rs new file mode 100644 index 00000000..953706fc --- /dev/null +++ b/dlc-messages/src/ser_impls.rs @@ -0,0 +1,683 @@ +//! Set of utility functions to help with serialization. + +use bitcoin::Address; +use bitcoin::Network; +use bitcoin::SignedAmount; +use dlc::dlc_input::DlcInputInfo; +use dlc::{EnumerationPayout, PartyParams, Payout, TxInputInfo}; +use lightning::io::Read; +use lightning::ln::msgs::DecodeError; +use lightning::ln::wire::Type; +use lightning::util::ser::{Readable, Writeable, Writer}; +use secp256k1_zkp::{ffi::ECDSA_ADAPTOR_SIGNATURE_LENGTH, EcdsaAdaptorSignature}; +use std::collections::HashMap; +use std::hash::Hash; + +const MAX_VEC_SIZE: u64 = 1000000; + +/// Taken from rust-lightning: +/// +/// Lightning TLV uses a custom variable-length integer called BigSize. It is similar to Bitcoin's +/// variable-length integers except that it is serialized in big-endian instead of little-endian. +/// +/// Like Bitcoin's variable-length integer, it exhibits ambiguity in that certain values can be +/// encoded in several different ways, which we must check for at deserialization-time. Thus, if +/// you're looking for an example of a variable-length integer to use for your own project, move +/// along, this is a rather poor design. +pub struct BigSize(pub u64); +impl Writeable for BigSize { + #[inline] + fn write(&self, writer: &mut W) -> Result<(), lightning::io::Error> { + match self.0 { + 0..=0xFC => (self.0 as u8).write(writer), + 0xFD..=0xFFFF => { + 0xFDu8.write(writer)?; + (self.0 as u16).write(writer) + } + 0x10000..=0xFFFFFFFF => { + 0xFEu8.write(writer)?; + (self.0 as u32).write(writer) + } + _ => { + 0xFFu8.write(writer)?; + self.0.write(writer) + } + } + } +} +impl Readable for BigSize { + #[inline] + fn read(reader: &mut R) -> Result { + let n: u8 = Readable::read(reader)?; + match n { + 0xFF => { + let x: u64 = Readable::read(reader)?; + if x < 0x100000000 { + Err(DecodeError::InvalidValue) + } else { + Ok(BigSize(x)) + } + } + 0xFE => { + let x: u32 = Readable::read(reader)?; + if x < 0x10000 { + Err(DecodeError::InvalidValue) + } else { + Ok(BigSize(x as u64)) + } + } + 0xFD => { + let x: u16 = Readable::read(reader)?; + if x < 0xFD { + Err(DecodeError::InvalidValue) + } else { + Ok(BigSize(x as u64)) + } + } + n => Ok(BigSize(n as u64)), + } + } +} + +/// Writes a given string to the given writer, prefixing the string length as +/// a BigSize value. +pub fn write_string(input: &str, writer: &mut W) -> Result<(), lightning::io::Error> { + let len = BigSize(input.len() as u64); + len.write(writer)?; + let bytes = input.as_bytes(); + + for b in bytes { + b.write(writer)?; + } + + Ok(()) +} + +/// Reads a string from the given reader. +pub fn read_string(reader: &mut R) -> Result { + let len: BigSize = Readable::read(reader)?; + + if len.0 > MAX_VEC_SIZE { + return Err(DecodeError::InvalidValue); + } + + let mut buf = Vec::with_capacity(len.0 as usize); + + for _ in 0..len.0 { + let b: u8 = Readable::read(reader)?; + buf.push(b); + } + + let res = match String::from_utf8(buf) { + Ok(s) => s, + Err(_) => return Err(DecodeError::InvalidValue), + }; + + Ok(res) +} + +/// Writes a set of strings to the given writer. +pub fn write_strings( + inputs: &[String], + writer: &mut W, +) -> Result<(), lightning::io::Error> { + BigSize(inputs.len() as u64).write(writer)?; + for s in inputs { + write_string(s, writer)?; + } + + Ok(()) +} + +/// Reads a set of strings from the given reader. +pub fn read_strings(reader: &mut R) -> Result, DecodeError> { + let len: BigSize = lightning::util::ser::Readable::read(reader)?; + if len.0 > MAX_VEC_SIZE { + return Err(DecodeError::InvalidValue); + } + let mut res = Vec::::new(); + for _ in 0..len.0 { + res.push(read_string(reader)?); + } + + Ok(res) +} + +/// Writes a set of strings to the given writer, using `u16` prefixes, compared +/// to [`write_strings`] which uses `BigSize` prefixes. +pub fn write_strings_u16( + inputs: &[String], + writer: &mut W, +) -> Result<(), lightning::io::Error> { + (inputs.len() as u16).write(writer)?; + for s in inputs { + write_string(s, writer)?; + } + + Ok(()) +} + +/// Reads a set of string from the given reader, assuming `u16` prefixes, compared +/// to [`read_strings`] which assumes `BigSize` prefixes. +pub fn read_strings_u16( + reader: &mut R, +) -> Result, lightning::ln::msgs::DecodeError> { + let len: u16 = lightning::util::ser::Readable::read(reader)?; + let mut res = Vec::::new(); + for _ in 0..len { + res.push(read_string(reader)?); + } + + Ok(res) +} + +/// Writes an `f64` value to the given writer. +pub fn write_f64( + input: f64, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + for b in input.to_be_bytes() { + b.write(writer)?; + } + + Ok(()) +} + +/// Reads an `f64` value from the given reader. +pub fn read_f64( + reader: &mut R, +) -> Result { + let mut buf = [0u8; 8]; + for b in &mut buf { + *b = Readable::read(reader)?; + } + Ok(f64::from_be_bytes(buf)) +} + +/// Writes a [`secp256k1_zkp::schnorrsig::Signature`] value to the given writer. +pub fn write_schnorrsig( + signature: &secp256k1_zkp::schnorr::Signature, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + signature.as_ref().write(writer) +} + +/// Reads a [`secp256k1_zkp::schnorrsig::Signature`] value from the given reader. +pub fn read_schnorrsig( + reader: &mut R, +) -> Result { + let buf: [u8; 64] = Readable::read(reader)?; + match secp256k1_zkp::schnorr::Signature::from_slice(&buf) { + Ok(sig) => Ok(sig), + Err(_) => Err(lightning::ln::msgs::DecodeError::InvalidValue), + } +} + +/// Writes a set of [`secp256k1_zkp::schnorrsig::Signature`] to the given writer. +pub fn write_schnorr_signatures( + signatures: &[secp256k1_zkp::schnorr::Signature], + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + (signatures.len() as u16).write(writer)?; + for signature in signatures { + write_schnorrsig(signature, writer)?; + } + Ok(()) +} + +/// Reads a set of [`secp256k1_zkp::schnorrsig::Signature`] from the given reader. +pub fn read_schnorr_signatures( + reader: &mut R, +) -> Result, lightning::ln::msgs::DecodeError> { + let len: u16 = Readable::read(reader)?; + let byte_size = (len as usize) + .checked_mul(secp256k1_zkp::constants::SCHNORR_SIGNATURE_SIZE) + .ok_or(lightning::ln::msgs::DecodeError::BadLengthDescriptor)?; + if byte_size > lightning::util::ser::MAX_BUF_SIZE { + return Err(lightning::ln::msgs::DecodeError::BadLengthDescriptor); + } + let mut ret = Vec::with_capacity(len as usize); + for _ in 0..len { + ret.push(read_schnorrsig(reader)?); + } + Ok(ret) +} + +/// Writes a schnorr public key to the given writer. +pub fn write_schnorr_pubkey( + pubkey: &secp256k1_zkp::XOnlyPublicKey, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + pubkey.serialize().write(writer) +} + +/// Reads a schnorr public key from the given reader. +pub fn read_schnorr_pubkey( + reader: &mut R, +) -> Result { + let buf: [u8; 32] = Readable::read(reader)?; + match secp256k1_zkp::XOnlyPublicKey::from_slice(&buf) { + Ok(sig) => Ok(sig), + Err(_) => Err(lightning::ln::msgs::DecodeError::InvalidValue), + } +} + +/// Writes a set of schnorr public keys to the given writer. +pub fn write_schnorr_pubkeys( + pubkeys: &[secp256k1_zkp::XOnlyPublicKey], + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + (pubkeys.len() as u16).write(writer)?; + for pubkey in pubkeys { + write_schnorr_pubkey(pubkey, writer)?; + } + Ok(()) +} + +/// Reads a set of schnorr public keys from the given reader. +pub fn read_schnorr_pubkeys( + reader: &mut R, +) -> Result, DecodeError> { + let len: u16 = Readable::read(reader)?; + let byte_size = (len as usize) + .checked_mul(secp256k1_zkp::constants::SCHNORR_PUBLIC_KEY_SIZE) + .ok_or(DecodeError::BadLengthDescriptor)?; + if byte_size > lightning::util::ser::MAX_BUF_SIZE { + return Err(DecodeError::BadLengthDescriptor); + } + let mut ret = Vec::with_capacity(len as usize); + for _ in 0..len { + ret.push(read_schnorr_pubkey(reader)?); + } + Ok(ret) +} + +/// Writes a vector of writeable to the given writer. +pub fn write_vec(input: &Vec, writer: &mut W) -> Result<(), ::lightning::io::Error> +where + T: Writeable, +{ + write_vec_cb(input, writer, &::write) +} + +/// Reads a vector of writeable from the given reader. +pub fn read_vec(reader: &mut R) -> Result, DecodeError> +where + T: Readable, +{ + read_vec_cb(reader, &Readable::read) +} + +/// Writes a vector of values to the given writer using the provided callback to +/// serialize each value. +pub fn write_vec_cb( + input: &Vec, + writer: &mut W, + cb: &F, +) -> Result<(), ::lightning::io::Error> +where + F: Fn(&T, &mut W) -> Result<(), ::lightning::io::Error>, +{ + BigSize(input.len() as u64).write(writer)?; + for s in input { + cb(s, writer)?; + } + Ok(()) +} + +/// Reads a vector of values from the given reader using the provided callback to +/// deserialize each value. +pub fn read_vec_cb( + reader: &mut R, + cb: &F, +) -> Result, DecodeError> +where + F: Fn(&mut R) -> Result, +{ + let len: BigSize = Readable::read(reader)?; + if len.0 > MAX_VEC_SIZE { + return Err(DecodeError::InvalidValue); + } + let mut res = Vec::::new(); + for _ in 0..len.0 { + res.push(cb(reader)?); + } + + Ok(res) +} + +/// Writes a vector of values to the given writer. This function differs from +/// [`write_vec`] in that it uses `u16` prefixes to give the length of the vector +/// instead of a `BigSize`. +pub fn write_vec_u16( + input: &[T], + writer: &mut W, +) -> Result<(), ::lightning::io::Error> +where + T: Writeable, +{ + write_vec_u16_cb(input, writer, &::write) +} + +/// Reads a vector of values from the given reader. This function differs from +/// [`read_vec`] in that it uses `u16` prefixes to read the length of the vector +/// instead of a `BigSize`. +pub fn read_vec_u16(reader: &mut R) -> Result, DecodeError> +where + T: Readable, +{ + read_vec_u16_cb(reader, &Readable::read) +} + +/// Writes a vector of values to the given writer using the provided callback to +/// serialize each value. This function differs from [`write_vec_cb`] in that it +/// uses `u16` prefixes to give the length of the vector instead of a `BigSize`. +pub fn write_vec_u16_cb( + input: &[T], + writer: &mut W, + cb: &F, +) -> Result<(), ::lightning::io::Error> +where + F: Fn(&T, &mut W) -> Result<(), ::lightning::io::Error>, +{ + (input.len() as u16).write(writer)?; + for s in input { + cb(s, writer)?; + } + Ok(()) +} + +/// Reads a vector of values from the given reader using the provided callback to +/// deserialize each value. This function differs from [`read_vec_cb`] in that it +/// uses `u16` prefixes to read the length of the vector instead of a `BigSize`. +pub fn read_vec_u16_cb( + reader: &mut R, + cb: &F, +) -> Result, DecodeError> +where + F: Fn(&mut R) -> Result, +{ + let len: u16 = Readable::read(reader)?; + let mut res = Vec::::new(); + for _ in 0..len { + res.push(cb(reader)?); + } + + Ok(res) +} + +/// Writes a usize value as a u64 to the given writer. +pub fn write_usize(i: &usize, writer: &mut W) -> Result<(), ::lightning::io::Error> { + ::write(&(*i as u64), writer) +} + +/// Reads a usize value as a u64 from the given reader. +pub fn read_usize(reader: &mut R) -> Result { + let i: u64 = Readable::read(reader)?; + Ok(i as usize) +} + +/// Writes an option of a [`lightning::util::ser::Writeable`] value to the given writer. +pub fn write_option( + t: &Option, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> +where + T: Writeable, +{ + write_option_cb(t, writer, &::write) +} + +/// Reads an option of a [`lightning::util::ser::Writeable`] value from the given reader. +pub fn read_option(reader: &mut R) -> Result, DecodeError> +where + T: Readable, +{ + read_option_cb(reader, &::read) +} + +/// Writes an option using the provided callback to serialize the inner value (if any). +pub fn write_option_cb( + t: &Option, + writer: &mut W, + cb: &F, +) -> Result<(), ::lightning::io::Error> +where + F: Fn(&T, &mut W) -> Result<(), ::lightning::io::Error>, +{ + match t { + Some(t) => { + 1_u8.write(writer)?; + cb(t, writer) + } + None => 0_u8.write(writer), + } +} + +/// Reads an option using the provided callback to deserialize the inner value (if any). +pub fn read_option_cb( + reader: &mut R, + cb: &F, +) -> Result, DecodeError> +where + F: Fn(&mut R) -> Result, +{ + let prefix: u8 = Readable::read(reader)?; + let res = match prefix { + 0 => None, + 1 => Some(cb(reader)?), + _ => return Err(DecodeError::InvalidValue), + }; + Ok(res) +} + +/// Writes a [`bitcoin::util::address::Address`] value to the given writer. +/// +/// https://docs.rs/bitcoin/0.30.2/bitcoin/address/struct.Address.html +/// +/// Parsed addresses do not always have one network. The problem is that legacy testnet, regtest and +/// signet addresse use the same prefix instead of multiple different ones. When parsing, +/// such addresses are always assumed to be testnet addresses (the same is true for bech32 signet addresses). +/// +/// Only checks if the address is Mainnet. +pub fn write_address( + address: &Address, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + address.script_pubkey().write(writer)?; + let unchecked_address = address.as_unchecked(); + + const NETWORKS: [Network; 4] = [ + Network::Bitcoin, + Network::Testnet, + Network::Signet, + Network::Regtest, + ]; + + let mut net: u8 = 0; + + for (i, n) in NETWORKS.iter().enumerate() { + if unchecked_address.is_valid_for_network(*n) { + net = i as u8; + break; + } + } + + net.write(writer) +} + +/// Reads a [`bitcoin::util::address::Address`] value from the given reader. +pub fn read_address(reader: &mut R) -> Result { + let script: bitcoin::ScriptBuf = Readable::read(reader)?; + let net: u8 = Readable::read(reader)?; + let network = match net { + 0 => Network::Bitcoin, + 1 => Network::Testnet, + 2 => Network::Signet, + 3 => Network::Regtest, + _ => return Err(DecodeError::InvalidValue), + }; + Ok(bitcoin::Address::from_script(&script, network).unwrap()) +} + +/// Writes an [`secp256k1_zkp::EcdsaAdaptorSignature`] to the given writer. +pub fn write_ecdsa_adaptor_signature( + sig: &EcdsaAdaptorSignature, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + for x in sig.as_ref() { + x.write(writer)?; + } + Ok(()) +} + +/// Reads an [`secp256k1_zkp::EcdsaAdaptorSignature`] from the given reader. +pub fn read_ecdsa_adaptor_signature( + reader: &mut R, +) -> Result { + let mut buf: Vec = Vec::with_capacity(ECDSA_ADAPTOR_SIGNATURE_LENGTH); + + for _ in 0..ECDSA_ADAPTOR_SIGNATURE_LENGTH { + buf.push(Readable::read(reader)?); + } + EcdsaAdaptorSignature::from_slice(&buf).map_err(|_| DecodeError::InvalidValue) +} + +/// Writes a set of [`secp256k1_zkp::EcdsaAdaptorSignature`] to the given writer. +#[allow(clippy::ptr_arg)] // Need to have Vec to work with callbacks. +pub fn write_ecdsa_adaptor_signatures( + sig: &Vec, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + write_vec_cb(sig, writer, &write_ecdsa_adaptor_signature) +} + +/// Reads a set of [`secp256k1_zkp::EcdsaAdaptorSignature`] from the given reader. +pub fn read_ecdsa_adaptor_signatures( + reader: &mut R, +) -> Result, DecodeError> { + read_vec_cb(reader, &read_ecdsa_adaptor_signature) +} + +/// Writes an `i32` value to the given writer. +pub fn write_i32(i: &i32, writer: &mut W) -> Result<(), ::lightning::io::Error> { + i.to_be_bytes().write(writer) +} + +/// Reads an `i32` value from the given reader. +pub fn read_i32(reader: &mut R) -> Result { + let v: [u8; 4] = Readable::read(reader)?; + Ok(i32::from_be_bytes(v)) +} +/// Writes a `SignedAmount` value to the given writer. +pub fn write_signed_amount( + i: &SignedAmount, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + let i = i.to_sat().to_be_bytes(); + for b in i { + b.write(writer)?; + } + Ok(()) +} + +/// Reads a `SignedAmount` value from the given reader. +pub fn read_signed_amount( + reader: &mut R, +) -> Result { + let mut v = [0u8; 8]; + for x in &mut v { + *x = Readable::read(reader)?; + } + let signed_amount = i64::from_be_bytes(v); + Ok(SignedAmount::from_sat(signed_amount)) +} + +/// Writes a [`lightning::util::ser::Writeable`] value to the given writer as a TLV. +pub fn write_as_tlv( + e: &T, + writer: &mut W, +) -> Result<(), ::lightning::io::Error> { + BigSize(e.type_id() as u64).write(writer)?; + BigSize(e.serialized_length() as u64).write(writer)?; + e.write(writer) +} + +/// Read a [`lightning::util::ser::Writeable`] value from the given reader as a TLV. +pub fn read_as_tlv(reader: &mut R) -> Result { + // TODO(tibo): consider checking type here. + // This retrieves type as BigSize. Will be u16 once specs are updated. + let _: BigSize = Readable::read(reader)?; + // This retrieves the length, will be removed once oracle specs are updated. + let _: BigSize = Readable::read(reader)?; + Readable::read(reader) +} + +/// Writes a [`HashMap`]. +pub fn write_hash_map( + input: &HashMap, + writer: &mut W, +) -> Result<(), lightning::io::Error> +where + T: Writeable, + V: Writeable, +{ + (input.len() as u64).write(writer)?; + + for (key, value) in input.iter() { + key.write(writer)?; + value.write(writer)?; + } + + Ok(()) +} + +/// Reads a [`HashMap`]. +pub fn read_hash_map(reader: &mut R) -> Result, DecodeError> +where + T: Readable + Hash + Eq, + V: Readable, +{ + let len: u64 = Readable::read(reader)?; + let mut map = HashMap::new(); + for _ in 0..len { + let key: T = Readable::read(reader)?; + let value: V = Readable::read(reader)?; + map.insert(key, value); + } + + Ok(map) +} + +impl_dlc_writeable_external!(Payout, payout, { (offer, writeable), (accept, writeable) }); +impl_dlc_writeable_external!(EnumerationPayout, enum_payout, { (outcome, string), (payout, { cb_writeable, payout::write, payout::read} )}); +impl_dlc_writeable_external!(TxInputInfo, tx_input_info, { (outpoint, writeable), (max_witness_len, usize), (redeem_script, writeable), (serial_id, writeable)}); +impl_dlc_writeable_external!(DlcInputInfo, dlc_input_info, { (fund_tx, writeable), (fund_vout, writeable), (local_fund_pubkey, writeable), (remote_fund_pubkey, writeable), (fund_amount, writeable), (max_witness_len, usize), (input_serial_id, writeable), (contract_id, writeable)}); +impl_dlc_writeable_external!(PartyParams, party_params, { + (fund_pubkey, writeable), + (change_script_pubkey, writeable), + (change_serial_id, writeable), + (payout_script_pubkey, writeable), + (payout_serial_id, writeable), + (inputs, { vec_cb, tx_input_info::write, tx_input_info::read }), + (dlc_inputs, { vec_cb, dlc_input_info::write, dlc_input_info::read }), + (input_amount, writeable), + (collateral, writeable) +}); + +#[cfg(test)] +mod tests { + use lightning::io::Cursor; + + use super::{read_f64, write_f64}; + + #[test] + fn f64_serialize_round_trip() { + let original = 2.3; + let mut ser = Vec::new(); + write_f64(original, &mut ser).unwrap(); + let deser = read_f64(&mut Cursor::new(&ser)).unwrap(); + + assert_eq!(original, deser); + } +} diff --git a/dlc-messages/src/ser_macros.rs b/dlc-messages/src/ser_macros.rs new file mode 100644 index 00000000..2c883c61 --- /dev/null +++ b/dlc-messages/src/ser_macros.rs @@ -0,0 +1,266 @@ +//! Set of macro to help implementing the [`lightning::util::ser::Writeable`] trait. + +/// Writes a field to a writer. +#[macro_export] +macro_rules! field_write { + ($stream: expr, $field: expr, writeable) => { + $field.write($stream)?; + }; + ($stream: expr, $field: expr, {cb_writeable, $w_cb: expr, $r_cb: expr}) => { + $w_cb(&$field, $stream)?; + }; + ($stream: expr, $field: expr, string) => { + $crate::ser_impls::write_string(&$field, $stream)?; + }; + ($stream: expr, $field: expr, vec) => { + $crate::ser_impls::write_vec(&$field, $stream)?; + }; + ($stream: expr, $field: expr, {vec_cb, $w_cb: expr, $r_cb: expr}) => { + $crate::ser_impls::write_vec_cb(&$field, $stream, &$w_cb)?; + }; + ($stream: expr, $field: expr, {vec_u16_cb, $w_cb: expr, $r_cb: expr}) => { + $crate::ser_impls::write_vec_u16_cb(&$field, $stream, &$w_cb)?; + }; + ($stream: expr, $field: expr, float) => { + $crate::ser_impls::write_f64($field, $stream)?; + }; + ($stream: expr, $field: expr, usize) => { + $crate::ser_impls::write_usize(&$field, $stream)?; + }; + ($stream: expr, $field: expr, SignedAmount) => { + $crate::ser_impls::write_signed_amount(&$field, $stream)?; + }; + ($stream: expr, $field: expr, {option_cb, $w_cb: expr, $r_cb: expr}) => { + $crate::ser_impls::write_option_cb(&$field, $stream, &$w_cb)?; + }; + ($stream: expr, $field: expr, option) => { + $crate::ser_impls::write_option(&$field, $stream)?; + }; +} + +/// Reads a field from a reader. +#[macro_export] +macro_rules! field_read { + ($stream: expr, writeable) => { + Readable::read($stream)? + }; + ($stream: expr, {cb_writeable, $w_cb: expr, $r_cb: expr}) => { + $r_cb($stream)? + }; + ($stream: expr, string) => { + $crate::ser_impls::read_string($stream)? + }; + ($stream: expr, vec) => { + $crate::ser_impls::read_vec($stream)? + }; + ($stream: expr, {vec_cb, $w_cb: expr, $r_cb: expr}) => { + $crate::ser_impls::read_vec_cb($stream, &$r_cb)? + }; + ($stream: expr, {vec_u16_cb, $w_cb: expr, $r_cb: expr}) => { + $crate::ser_impls::read_vec_u16_cb($stream, &$r_cb)? + }; + ($stream: expr, float) => { + $crate::ser_impls::read_f64($stream)? + }; + ($stream: expr, usize) => { + $crate::ser_impls::read_usize($stream)? + }; + ($stream: expr, SignedAmount) => { + $crate::ser_impls::read_signed_amount($stream)? + }; + ($stream: expr, {option_cb, $w_cb: expr, $r_cb: expr}) => { + $crate::ser_impls::read_option_cb($stream, &$r_cb)? + }; + ($stream: expr, option) => { + $crate::ser_impls::read_option($stream)? + }; +} + +/// Implements the [`lightning::util::ser::Writeable`] trait for a struct available +/// in this crate. +#[macro_export] +macro_rules! impl_dlc_writeable { + ($st:ident, {$(($field: ident, $fieldty: tt)), *} ) => { + impl Writeable for $st { + fn write(&self, w: &mut W) -> Result<(), ::lightning::io::Error> { + $( + field_write!(w, self.$field, $fieldty); + )* + Ok(()) + } + } + + impl Readable for $st { + fn read(r: &mut R) -> Result { + Ok(Self { + $( + $field: field_read!(r, $fieldty), + )* + }) + } + } + }; +} + +/// Implements the [`lightning::util::ser::Writeable`] trait for a struct external +/// to this crate. +#[macro_export] +macro_rules! impl_dlc_writeable_external { + ($st: ident $(< $gen: ident $(< $gen2: ident >)?> )? , $name: ident, {$(($field: ident, $fieldty: tt)), *} ) => { + /// Module containing write and read functions for $name + pub mod $name { + use super::*; + use lightning::ln::msgs::DecodeError; + use lightning::util::ser::Writer; + /// Function to write $name + pub fn write($name: &$st<$($gen$(<$gen2>)?)?>, w: &mut W) -> Result<(), ::lightning::io::Error> { + $( + field_write!(w, $name.$field, $fieldty); + )* + Ok(()) + } + + /// Function to read $name + pub fn read(r: &mut R) -> Result<$st<$($gen$(<$gen2>)?)?>, DecodeError> { + Ok($st { + $( + $field: field_read!(r, $fieldty), + )* + }) + } + } + }; +} + +/// Implements the [`lightning::util::ser::Writeable`] trait for an enum external +/// to this crate. +#[macro_export] +macro_rules! impl_dlc_writeable_external_enum { + ($st:ident $(<$gen: ident>)?, $name: ident, $(($variant_id: expr, $variant_name: ident, $variant_mod: ident)), * ) => { + mod $name { + use super::*; + + pub fn write($name: &$st$(<$gen>)?, w: &mut W) -> Result<(), ::lightning::io::Error> { + match $name { + $($st::$variant_name(ref field) => { + let id : u8 = $variant_id; + id.write(w)?; + $variant_mod::write(field, w)?; + }),* + }; + Ok(()) + } + + pub fn read(r: &mut R) -> Result<$st$(<$gen>)?, DecodeError> { + let id: u8 = Readable::read(r)?; + match id { + $($variant_id => { + Ok($st::$variant_name($variant_mod::read(r)?)) + }),* + _ => { + Err(DecodeError::UnknownRequiredFeature) + }, + } + } + } + }; +} + +/// Implements the [`lightning::util::ser::Writeable`] trait for an enum as a TLV. +#[macro_export] +macro_rules! impl_dlc_writeable_enum_as_tlv { + ($st:ident, $(($variant_id: expr, $variant_name: ident)), *;) => { + impl Writeable for $st { + fn write(&self, w: &mut W) -> Result<(), ::lightning::io::Error> { + match self { + $($st::$variant_name(ref field) => { + $crate::ser_impls::BigSize($variant_id as u64).write(w)?; + $crate::ser_impls::BigSize(field.serialized_length() as u64).write(w)?; + field.write(w)?; + }),* + }; + Ok(()) + } + } + + impl Readable for $st { + fn read(r: &mut R) -> Result { + let id: $crate::ser_impls::BigSize = Readable::read(r)?; + match id.0 { + $($variant_id => { + let _ : $crate::ser_impls::BigSize = Readable::read(r)?; + Ok($st::$variant_name(Readable::read(r)?)) + }),* + _ => { + Err(DecodeError::UnknownRequiredFeature) + }, + } + } + } + }; +} + +/// Implements the [`lightning::util::ser::Writeable`] trait for an enum. +#[macro_export] +macro_rules! impl_dlc_writeable_enum { + ($st:ident, $(($tuple_variant_id: expr, $tuple_variant_name: ident)), *; + $(($variant_id: expr, $variant_name: ident, {$(($field: ident, $fieldty: tt)),*})), *; + $(($external_variant_id: expr, $external_variant_name: ident, $write_cb: expr, $read_cb: expr)), *; + $(($simple_variant_id: expr, $simple_variant_name: ident)), *) => { + impl Writeable for $st { + fn write(&self, w: &mut W) -> Result<(), ::lightning::io::Error> { + match self { + $($st::$tuple_variant_name(ref field) => { + let id : u8 = $tuple_variant_id; + id.write(w)?; + field.write(w)?; + }),* + $($st::$variant_name { $(ref $field),* } => { + let id : u8 = $variant_id; + id.write(w)?; + $( + field_write!(w, $field, $fieldty); + )* + }),* + $($st::$external_variant_name(ref field) => { + let id : u8 = $external_variant_id; + id.write(w)?; + $write_cb(field, w)?; + }),* + $($st::$simple_variant_name => { + let id : u8 = $simple_variant_id; + id.write(w)?; + }),* + }; + Ok(()) + } + } + + impl Readable for $st { + fn read(r: &mut R) -> Result { + let id: u8 = Readable::read(r)?; + match id { + $($tuple_variant_id => { + Ok($st::$tuple_variant_name(Readable::read(r)?)) + }),* + $($variant_id => { + Ok($st::$variant_name { + $( + $field: field_read!(r, $fieldty) + ),* + }) + }),* + $($external_variant_id => { + Ok($st::$external_variant_name($read_cb(r)?)) + }),* + $($simple_variant_id => { + Ok($st::$simple_variant_name) + }),* + _ => { + Err(DecodeError::UnknownRequiredFeature) + }, + } + } + } + }; +} diff --git a/dlc-messages/src/serde_utils.rs b/dlc-messages/src/serde_utils.rs new file mode 100644 index 00000000..a176f23c --- /dev/null +++ b/dlc-messages/src/serde_utils.rs @@ -0,0 +1,74 @@ +//! Utility functions to serialize hexadecimal values as strings in json. + +use std::fmt::Write; + +/// Serialize an hexadecimal value. +pub fn serialize_hex(hex: &[u8], s: S) -> Result +where + S: serde::Serializer, +{ + if s.is_human_readable() { + let string = hex.iter().fold(String::new(), |mut s, e| { + write!(s, "{:02x}", e).unwrap(); + s + }); + assert!(string.len() % 2 == 0); + s.serialize_str(&string) + } else { + s.serialize_bytes(hex) + } +} + +/// Deserialize an hexadecimal value represented as an array. +pub fn deserialize_hex_array<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error> +where + D: serde::de::Deserializer<'de>, +{ + if deserializer.is_human_readable() { + let string: String = serde::de::Deserialize::deserialize(deserializer)?; + let mut hex = [0u8; 32]; + from_hex(&string, &mut hex).map_err(serde::de::Error::custom)?; + Ok(hex) + } else { + serde::de::Deserialize::deserialize(deserializer) + } +} + +/// Deserialize an hexadecimal value represented as a string. +pub fn deserialize_hex_string<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::de::Deserializer<'de>, +{ + if deserializer.is_human_readable() { + let string: String = serde::de::Deserialize::deserialize(deserializer)?; + let mut hex = vec![0; string.len() / 2]; + from_hex(&string, &mut hex).map_err(serde::de::Error::custom)?; + Ok(hex) + } else { + serde::de::Deserialize::deserialize(deserializer) + } +} + +fn from_hex(hex: &str, target: &mut [u8]) -> Result { + if hex.len() % 2 == 1 || hex.len() > target.len() * 2 { + return Err("Invalid hex length".to_string()); + } + + let mut b = 0; + let mut idx = 0; + for c in hex.bytes() { + b <<= 4; + match c { + b'A'..=b'F' => b |= c - b'A' + 10, + b'a'..=b'f' => b |= c - b'a' + 10, + b'0'..=b'9' => b |= c - b'0', + _ => return Err("Invalid hex character".to_string()), + } + if (idx & 1) == 1 { + target[idx / 2] = b; + b = 0; + } + idx += 1; + } + Ok(idx / 2) +} diff --git a/dlc-messages/src/test_inputs/accept_msg.json b/dlc-messages/src/test_inputs/accept_msg.json new file mode 100644 index 00000000..4d3d9b86 --- /dev/null +++ b/dlc-messages/src/test_inputs/accept_msg.json @@ -0,0 +1,1465 @@ +{ + "protocolVersion": 1, + "temporaryContractId": "c9073a50b4a8c559c02d48b28d076fef3db735bab20c98ca7d7e0f6409405384", + "acceptCollateral": 100000000, + "fundingPubkey": "030eb98559aec1531b03397b8d045c0b5107e0c514225bae5f05f2b86d1ce03b5d", + "payoutSpk": "001422eb1cebb0aeef383c394cd9669f80ec95378a5b", + "payoutSerialId": 152339738678655715, + "fundingInputs": [ + { + "inputSerialId": 7480404873312070677, + "prevTx": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a01000000160014fa629251f1e2819891505a9bb0c37997cd21aa9e0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "prevTxVout": 0, + "sequence": 4294967295, + "maxWitnessLen": 107, + "redeemScript": "" + } + ], + "changeSpk": "001436f54d1fa7b965c5998f41a4e41de3d1618c386d", + "changeSerialId": 12375127465805661256, + "cetAdaptorSignatures": { + "ecdsaAdaptorSignatures": [ + { + "signature": "0303c51491301f4170485c54bceee3e51a39615afe352c4fd9fc49ad20ed468cd403318b163b5a211bffb354082f049a54e998944487a3eea53fd0b3fae908957e9c2b52b33c79e66dad0ea651d4653a98e53ef78226d47e6f0587fc0936eb3564616b7f459686491414cd5b8e49ec02a0de0121274890e6dad9013adf467b7bd6f8cfd52e03d5af61fb6bee8add25ced626fc74651dad8bfbb1651cb208c8408aef" + }, + { + "signature": "03eba0e45eeb36a493b26b40f9a5e412e15ee17a15922ad8498185837801fc5ca003f5c73bfc2c4afde24a0f10fa52d057b183e88ee663618a0e48f952f8553c3feee162e162eb183fe3368af046646318fec92bf2e404e9b7e9d9da1f8e507d5b74a5addef184030179b4526af23015529caf485211d9ae7144288a6e1ce0f01d31f4f30d9141fec366328947691e41fedb16463d415cc895dac602548f2123af19" + }, + { + "signature": "0262efc7e21f8ddb97772cc512316a4ca22139f36511abf69eea4b2df89a25525503c49e73a4c24bf2f636816d593b7825f97fa2f9b0fb739b231440f755b9fda5825ac693c815130ed1c5fe8cb438310eac96134effc715917b8ae8bc5f414ea774436ecddf789a734922935deb33df2f0e61f01107491f2612fb6f4354dc4470f1c55d1ceac6cee23b17e3c346f2a19de89502e2703c46d212931c9418f20bb8d8" + }, + { + "signature": "03f377756545c7b18edf8d56ffdbf564d14c1e9d46d192a989095780a2f1b6714102400d6b2861bff212cff6a4183db4564368451b7df97b6adf74aee671ef9359e18f07067eaea42095037cc64b4b15085f6b53fdd8c9f007d4432e891b201b2e0fe43e92db93c8d38f5f0e06f5b1f28bf69627c9013a17bc68e8e3fc15606476d8e33163c7c65882cf7bade269bbceec07c22963a04a29cd8e22e191ee62d9a09b" + }, + { + "signature": "03425492adcb0efcec1167ef2cf15018b0b0c5e6d0e386c409de6dacbdd7ad8eaf03485a9bdb1d3639cad9f70c59a20e4fe518b9ee508b2d963088c03152f10017727a6ba5c41157e5ecae8e22200b4eded979a3c1fe3ec02b003c1ba960eeab5d153c05a8171b828e1366f510155583d460b3d7ad447433282fb52d205de169ad453186072ea2cbb5b0545c0b2ac1d34de3550f3177224094337525cd46282755ef" + }, + { + "signature": "038b6443a3896509d7472031e00cae08b10c4151bf42926f16eb4e2e37d39054d2032659a42b85276d9398a285323858e5235a4dab639e84900b7910ac775318dc6146f7d72473464d8377c59311e30cf908a428245b82e01201a9f87664d3018751a3d84749395548747d6fbd4e423e24646eb2cf7a72b89ec8bb129cb2083a7433ad11a44268c9cddc143bd376a7d90df6e4694a5dd3f341361172f7181ddd8a8d" + }, + { + "signature": "02b775422a321ca705b11e71fd6902d565c637aeedfaba4cc80b2a8ea3456b524a030b5e9603fcb080350ef761a53fa53d5e65777c44e723e7910297bc3885872c266c2e42d40928cffa4458d48dc3f0cc7231af622013994b68aacc0bf25fcccb60a82f34a5388812f12fe3ac9865c35e2dd12c61263a630ab9858b750c1e17e59bcb4d8ff832711238a6d6e0d052ad87a83ab0e7d83414a92bcb1a05348967a4d4" + }, + { + "signature": "0286c3716c9cd7afb75b9091ebac76fc3bf887ada41b20dcea6cabf8f401032f9602b6644a45fa5d6abdc40d6fe26f220c7ae02cb5fa4d821b75322c59ef80e0971f873d6ac555b39f12da8ad98f68152e31d61958c62c3d3327d2fec5546e8b7ff1c046bd06c6557e70717d4610f6d6de532e1addeccf01fbe893ea9deef026eedd72da43428a5a68dc8481659178500e9bee6b3d47cf6199a3166f758909e27cb7" + }, + { + "signature": "02aa44bb080456bfe65aa8eb983c930f3484c0b2cc0425b2e4d9a5d03a39226f2f02971c4d0042856dff7af319aeccdc34abcf30ef7ff34aad9b594484463c20ada7e1fae89ceefef4f2c827c9f39575ab57b91dca2e24f6ae12c057f3db7c46a5d014ba2aee3ec8abbf5e66f7b82882cf2ca1f919c1dd2d7a21e7e8a71591aa2d922df7657f713479bbb888ceee850a89674f54b3ef8c7b64076c2d8c9399d5798c" + }, + { + "signature": "022058e69c219ca350af323e696122127410262f077e4a35f57e25dd46b95acc9c02e22735442f27156ce4e1060298aeaeec84193fc5f5b286f5ea48a5604ab2d0e8ea9fe1604912314f8cc77e469f9248ff989a954da14940f8c91aea78160c5b471e06ef67d1eb79319a93af231e4726fc8e346dd54f8e57ef0a83c9c11c6addcedd21bca7fe0e9197d204383fceb4e94f466e8be3f186383a2b5fde941e8e44c2" + }, + { + "signature": "03773d10fe9d98b68971b1e102dfd9c9ba9c67b863e279c5ecc97304f5655d5d4f0338189ae69b6feeda0a7766421d4f0addbdb27968a70a0b6ecbba5ee0e9af01b4ce1746c34f98cdb265cb39afcf25647a277fbeac8b3107a67bf77640420a25b0183e0be38ed757819acbf5cd36db59a90867f801aad750f3e2f21a0c229c977768e61b4df5ae8931643ebaf58a59026fde0639f0ba6ba375ccc8466f50cd5ec1" + }, + { + "signature": "03a60e39d437be778e9e8d928aeef1ed8b14503f7e6629bb4e05baeedcf10f9cbd0385888187c193bb64d9acaf3a49577e946c8225c9fe5f9e12c027bc8f1c14f88fbc0ae4c2ae94fb31847b17d2abe6e211100f4c1721c7cfb5e0ab0347075ab4a43c15754578c78f98d4c2102f0a1e890f63cdee73f587e43ec070995da45c92faf48c45b9043532dd1d01c3c6f6bde6523ca415566f9dd3f15124ce0310b4db6a" + }, + { + "signature": "038987ceac2918bf22b41477385964cc9a7cdd72b78af4385e08ae72fb6152bf10036cb5764fad778e4bd60bcce4d5da441256eea96e3622731f3072007f05e9cc7db720f4372cb58b3ed474758e3aa812bd4e83805d447d34f53b0dd5d7012f9f88b7308041c7dc11b3e0a367be0b90e03f9a5a98b9182d22dc48fc3e9afa37da1ddd334e68e4a122210fa7e98a80236a84a043280bc9c5fa8fa5ccce58514c9549" + }, + { + "signature": "0229345aeb5d6f10e210f5e7fa12cdaeab71e55c926bba94c31391b65b0754c711038829fb59b014a3d68b5c3aef968e94cac411e2d7ae6b3600cd688c96b12284d8659f55ff87552ddce1795bc9d36e3bbc05b4286e5d4bbd2d6966c2a841f3acc3ca57bcfea577476673210fdbd1cfac94388df88953581d5d16411bdbb2615e0a3b0e0456b05845271fffb6f6a55f9162013a3b2628f61d9409e00ad21f5be574" + }, + { + "signature": "03ac496b78bdbf1147a07190d73f41991ad6428b5cffa90db7a472414736ffd42c033f98cd196d865c4177c261b133c9717b2112e79aebabcd46a452c3a3675fe4954007fade5b9c77321c77ed9075f575bddc6fa4cb7d0254ad52b0aaa78a2a9f334ab23d1e3d55dcc50c0b569b33c34c47d057407050f3324f9fffaaf2e5329e8a99826e4041dc58e162466ece8d19d3bae1e2ba9407583988ab3228aab5b8c117" + }, + { + "signature": "0260a56fadcc0b139ae199e2538ea5eff47c7fec4bd3ccb9ce12eed5c11c05fa630362b1b4adea5b1cc0e2535e62d16ed1a8b629f75dddaedc71651ecbd4ed38525c9229205d72d71daa181988fdf784eaf22cdb0bc069255f5744ce6e732115bc69f9d9db5ea9335970d08b75784edd515d613f1c8002bb5ab4e94c2be246284bd6999512c523d124452d864a8fd923feeb1c90c7268e175ae6ba37607b24296f74" + }, + { + "signature": "02f00e6c805da4cb385bcf342674575fd9a632b88a3d449a9eff32ebf32de0490802030065d708912ab378e851e3d71224a517baa2f7752b422cb8ba60c8e208717ca30c4cdc32d7f3d1288bc98144e20038209b1bdb404eebfb6fc072f1206d9aadd4979e95dd7517374657386c3dc9e81933bd47bd657319f07dd29b63fdf2fc957719a81e5664f960954aaed5d1fcc06002fcbd72f712f55866124e6286fbd5f9" + }, + { + "signature": "03c36d76a3e04b9542f2e7a013fad50ca317114f1a73fe33f1ab4ae7bdd96395bb022619536db0d5cc9977a26693f54d5c530bd864af7a49976c6a124a69db15c1b91d0e91517ada9d2f386474267bfd9b46e8768922d0dab36e66212ea578add47b5a22a7ce5e0ce91966409491df41b724ad2a6b1929081da82b31fcc1e61a33cecb74e513c5ede341f2abb579517bf4bcc98a4d89bece056145b5ab41018d75e2" + }, + { + "signature": "029b2ec03ad05d0c32fe90965183258e8b0a534479f155a0524e542a19d1523bf9020f038f235b726474e3b4501702c3e52a055c39a2105d0cc12a2965f63f9449d9e833ae48901afcd2683952d8ca68bb61175f199bf43d3c1d03134ce23e30223efe3dee0bf44ca9fa49cd640f2f5a548b7d995b6bea53059a1f646f9e31b07ae8cc569a05bbab3b70f209344ea6e05b33a4bf508b99cf2c33c9807893150639fc" + }, + { + "signature": "024bca51dc5105137c48f973db1bdf8a1221d6ad2c4319df688fc5fc9b5fa84a310317303a504e028cf89b815ed8a93cafd7070a51511958b6834b36b046e4253130cb079453f37d7a6b2317e42d3d6ca9f181a339f7389f4e85078f43679dd429a0826f01e64d794865de703fcebf59bdafa6645a6a91ba00b39b88cc8d82395b1ec4e9c9a807c58146ca5da1660b76859dc0672ebeff66172eb1b1f5a9345823fa" + }, + { + "signature": "03ddc67cb2a0ea930f15382f38dcba8b31b5040f647e88b973872ec2fcd1fdddb30269ef3c2bad04a75cb0c758840ebe227985c3623f40c2c025818adf218048154da9646a1960fbafb910b3df693c6cc016003414a08ceec372e414bccaffcea3485510709fc655072c6a4d906983bcda6f41382343e0cbfe93f9bd349a9de3eb28e6c4f7b9149b22d8ed2f7e4bc4d4439b7b85c38d884ecaafcbafd7325c9d1273" + }, + { + "signature": "031dabb45d00140f35337367c55139360888339d219e047948387e30bcfb678ea802cba105d738bfa6fbdfcc4ce03b324471d2343cf2ee6958a0346adde7a77fb76d9326aa16c3b48ea04cdf8e6dd484cd38e6330cdd5681f4740262442428c46d01271454caf220a98bdf7ab62dd6408b5d7fabf8ad43d3a8c1463ae655ac7fc0e6b1a6edadf356352bb677e5ae0285c7d69782be6eb0233f3817f66a17ca665a8f" + }, + { + "signature": "03780089934d336d597b57f255f8092d7c90b0b9f65e7cf1b7dafa36d861e0256f03ae3b7a9ee26739d9a8d097d0b7bb6a12eb76eaf898e873b0dd1f81a92495cd236546910295ab5429e51a4934e92b0a6552ded658ef315119f8faf4314851ed68623325ba9e1a5e8f7c093e2603328a347d093fe8651fa74abd66be8173a719c0dfd975b633b697bfad4f10cc9be9da904924bb0160fc125f2af54e0a0b122ab8" + }, + { + "signature": "031fbf53d7b4aa170f40a9cbbe97fec761179ecf0b8370312dcb9c672cfc2fa9a802406c28e534ad45510d7b6379b85c7b127780b016962d6d1e8d55e5b7e2c1951ae49968e62951b13429ebd7989bac91f15b4b48a0675f1958bb28331b2f9a0d390468a7bfa449e402dbe07a5dc985ddc9d5b2327bcbb2adcd6b9406a7f45b0b73fad11c0b92524a74666d0817b00c4aceed64bab24ca6c634e11209feb8f5e09b" + }, + { + "signature": "020a4b38ec49e9f01393a7b811a0c487132303465b93408adafc5721c74474f3750214dcf51c7d3692a3b77378439bf433c6dc743078ba5aa8d25361a145f1355c874a85861e86f5f616f663669f5cd07ed2511177370c46eee245b0161705cc8cd921dcdfdac91744aeb50ca16192dd7a6b130ea3e4a1cce672ca66f965187bb15684b63d10048d2660de97b528fc03c32ec2fbb97aee4ec4d5fcbf7fe8ab063f4a" + }, + { + "signature": "0347858c84dbaa6bd58d3b255178c19d6c02009964b1fc9806d5c2af874991225e03a45e2e0e6cb4703b4924d2f0c245235473201a0b4c2c739c8d6c99b4a1c3676dd258642822142c5e336b6833becf80fedd104cd3b6b7b5fc0d5fba7742864029ff61f9b39e9e7f5890c935786d9ef054d3bb79008ae996c80bb5dc0f2b6f8bf1bb8f2478c1e4ee9807ad9f026976402437b7f6727b2aa138af09f4cd1159c8f1" + }, + { + "signature": "03287c8617c9cf6e2961985920714a6bac60f483d55bce3d6b077155d515bcab6e03b4ac97aedf6c87206d9f8cf74e688f0a5d87dc5650e3ee2e8e1cae5ab47837c471368130705c48bbe1bd94474ff7ff7eb32dad782aec3f06e3fb4ce47e2a0bfbd3ac103fdff65c707bb8723ecb96701180729ccfe0ebc7a60b8038b9dd0779746424710af6bcc82777a2d0828d90dc5a787b0ad7ed101812dbfc730b02f4a68e" + }, + { + "signature": "030abe1975033c5b7004419ddb8e74ab05412f713c7611a8f85e0a287b905b53fb027d1a13859660125087c2a9d2ae8ce1ad2f34e64bdb257a26b3adb141954937824ee516cb915545f6f40dc555a2498a45e1f188eb3b8a1c22ab224d58348d62463289491fd62b3adb9cf4516181edd53d74426c95ccdc8b51a422b66f3fd9a1dd674cd77fb3cd23a22c4c42d855616cc10c8c4415d2ec81ec5bfdcbc8d1a46b16" + }, + { + "signature": "039605699991051c9fa54b1015772e6cbe78d329712d957dd31627c53ddc27e16f02ec53e09dd49e57988093079b7f21669cef9a95d790c1dea95e2e8016ba611a9097ddcea578f9eb910290564d17a36ce1f4c6d1776593fca55d98c63346888a783c7b050dfdd16d28e0f422e63603b2da729d774c8fc83a6023dc71abaf76ac159ffc402002bdc6ccb1faa8d5099049f53d2d7cc97a35d03a9cc9730afa535919" + }, + { + "signature": "02db39efd702d5dc5cf8c04336f19bb5553a717dc8973608b0693cdc3f5ee62dee0370e02a3ec75a83d8d673306b8e3718405c0cca07e00497afa7b86d0bb91ea504ca7ce977303f3274f793e434fe05015a4387765feabc24c702e0eea7f623fdff4721b7e58ac4b0c102368d2f481631a056f665bab4342d29da6bd9e90df45a7f608c05756f160a2fda15f3d6d8dd36daad85db6ac1d064a4bd8cd115ba5ad643" + }, + { + "signature": "0287c96ffc2b8dab164afad70327da64eca08c5f13bf79ca03ffab2ac091fe3f4e03485624fd9880330cdf3cfddde575647b74ec6f5f466615c5605cacf67da5e92f2e6d4794a845e8e7b64e33b55ad742d5b604bee6a68c9c623248a7bb956d5526cc527de00e7a5b0a23a8d09c850d61e473878d551ddc201b4bcaa7b82664f24d9ed282373dfb9f3dfda207de53bcc8d86acf2c8e3cb252086ad3c4e29172a39f" + }, + { + "signature": "03c29d615d0921dcc5652445f19ff94c8f4e0870e9b65195f6207214a196560a4d031457383f1573286721b28185f2fe16dc0861eb437d979851d3af90e744aad2cadf8a98e28c2620391ab2610e6045863c6ff376fe1f548b2a02b773d85f1b9784d289c387f71001e34548bfe385aa60cf8d905cb8c0924bdbed9b7abee17443ff60a6ab95408c1e269a056116c61e056eb9aea47a6d1cfa84be0a8f409bdb7afe" + }, + { + "signature": "03e7a08bc312eb4aaa5cc78f71b6b46ad7d279d69576fde08cf5626093e21297f203d896215418352eb7fcf9fc3d85546b79a329c3c25d87039b24ad003876d23c16fad79c4fe99fb0bf024f9ca18e48ee4ae1c99e91a72a93b29321e834c75dd5b5ab5e09e8fa81685f64d41dd2c59377a8d914707ef4965b4c364d1982a9681a42fad566d01d445a74729cb331c665a3c9cd7fb94efefccf61074f5c997c2fae55" + }, + { + "signature": "02490844a3e075d720a3fbb6ffd523a7f70657137dc70198703b02970e8a0c7edb038c3a00eddbb18f539f0ff5d17dd070504acde6700181251f576c11623f2ec51d229b594d782f3ba3bbcf2e9b54eca5c7a14edac0540d2e209290edb6d997ff0b3333ac2ccba6e8e432ae715c6e31e53e06cb48aca35503a9ebdfca034ee62e158878f5d2d440607187d11ca0ae6dde5748070a1b172e8f4b4ad38725260868fb" + }, + { + "signature": "02a5102eb2f24c5e0d1875b7a16384c52cc9d4b5122827e947320b36601930d9d0036aab9cae518f903ac1607cfe4cfa4eb79affaa3424e074ef43332988beb34d83e78f6eba5d792359733ee0dc34461a0dd0cea26aa06fa2280b60557c2cf6bfd4d70a032261d95cb9d2f583bf802056f03fb17a02893f6ce6bf456ed08eeb6e4783b8ea13133fb7a6aa0646d5e3e970e73162d4a23296b642d00aeea776d657e1" + }, + { + "signature": "03eda7ee170bdb33634cc9cd7097f82bda42758fb04ae3b8c26789d050de52f7c602db880c6e31026abeb76841a4cfbf0c11ee15316656db322e9b7eae0fc890f8943d21ceaa0664e416f44f8c99039b29d990f08c3d617eec2d99d44eadeeea1526040d316576c7b9567be7e6baaf978c7b03d20e694fe443bbad0646ba2b886e3fc22b1cde75094b856b51eb698b88c2143f94dd41d583d8cb0b1dd3082935b8e1" + }, + { + "signature": "02fdabf7f2a41584de6ad73a74ea5059fcfc34ce9ff657916658e01e6be302686e02a352ab550887f0ab35f508866c04b063ec5882c2c9a6e7fb8e13984d6f3d43d42c441e21eff6525f58b7af4e8d2db35fadbf88f619721daff44ad47de409a62559e0aa6476cb21badd5bdf57e4edb2a7eeb1ac42f047bc2e5fff7dfba14ea8c1aee112dc4b939c6685cccd8212f271ac1a6c6a11a2f1bbb2d3daae88c2ca3e7c" + }, + { + "signature": "03238dfc607ff0f4e1fdde582e2deae89b12e2abc8cba338034d87321ce5af7cb6025b1cee83a752334c84f37af399586e292d18f390477dea73bdec5a6a135d9c6725946fb8115be2279c02b3cdb9a13a7177566c4a951174c9ff06df89c4b758ab8b9c61235efeb6f2b41254047f0b35d75b239608aafaf8bd87819bb8eccba2a15ee713080c53a8784f1c9fcc5229e710e70896181154693d29602126ec638237" + }, + { + "signature": "020e128991408d1e084163eac5e79c91c0d73abdea654d6fae97c6b3b2700e7a4a02ff7681971a8c8d43cbcfcf1f69300ee6825d6f4c9ee02497d7dbdcf80d93c409dacb66427dfc7430c5463cbb2e361abdd0ed2cb35f3704a7e4afb755fe40352f0486b0b647d8f9b7abbc009e0114c70a4bb4e13049cf68db92c14afcf83899f738b4dc37d5d24956c13c598bee053c3d371a3f76a8e25e80f53696427486b1ae" + }, + { + "signature": "03af54d8082a41a2c477714234dbafe66badae60ed8b0927ca93bc54d1c2058df30269882b61448c09675661b5925dcb52e1add5769879c2ff3deb2ea3dd8a6278e043cdc1d6b7e653c78e3759525ff5110395e3a50c9432582590cacd8d5e55e36409124e14bd5ff45ccda50b06fc5d925816a6228565abd0068f6a12ab750e57232fef856d8e036c017fd05aa0388a517e3ee595d50a675e18a7d8ef555b13c845" + }, + { + "signature": "03aae92b85b4a425da56b18b367867f7cf8d5488ef19bd8a662300bae25b89dcfd025046aef043200503db8bd8ddf6914027eb71b5623554db7aa4d143b85d203506026024bd719a5282c9217e7e763c3ff8f0237b251fbb290860c17fa755fd6f873e8211c5dcabfe36fffdc31f9027e771e800d5dd9c071bdb55bf68dd016768cf34826445b100395ce252f99b812f4f1573b18e073ce0646a2460ad18732df38c" + }, + { + "signature": "02f034e249c1b60a98b7a7ef128fbb0cc9aef331b9d03f847080bd9c0fb3847a3c029f2703ff1197f7134c26dc7384f5a9b0f9eeebdba11ba9559bf375da4b0a92f764fed7c19be11d7773265ff194e09715d002bb0b8711105ab75df9c34e9a2a973439060de9d88963e1c435901cd1e4aa637a1604ce64576c10c040b39fe5e73b4ffc6d7d303e3e9d6cb84ce489b3b72fcaae6083d77d11c319dedecfd9d03caf" + }, + { + "signature": "021b8a0008cff9ba8b11b7b03df816fbaa83ac47128685fa77ed39a479af4c30e1033b9616327e6514f49c3ae526e20ab5ee9b438d8338865921f825d26eeb0ea9f188199ce07b0f012f1de4d519d0bca8403ba660b3c718908c0e0b0a7c858888b02fa2ccbd761f4816c1eddd275f0f9fa01e371bc61f4ec33acad9c52b9a608ac37a6ebddfa8eb4eb917bd0b109c676077e82aa6a548d1484de3b5c431bc4d4919" + }, + { + "signature": "0204049ae0920c5c2785b96f0f5e0b6420e492421307e7805b0e1c0bd3abfcaf9202b9069cdc9e676f6f5e67cbfb766def4427f6d64af911cabdff0eba298d0a46ece832265d4e1727baaf7a49163e5b5a327171dcd136f9c4124a75dc4e79e6d923a465d52b85aa5b2b742dd4fb30d9d72d8ba3cbc770c7a692a44a6635828c53d6421c998ebb3eeaeb1ff21c9fac73629b15c551e6e73982a71480a83d5398c358" + }, + { + "signature": "038a66f8a73c93dda6815a84842978f19cfcb607e54dc1892dfd14efd2ac7301950260ff8cc7ca0e71537a6144cd20c77b88bae4b87ea949433d6015f1f8ec1b340407584c314824fbfb71a563a7edee221ed637a0b5c5383b226766ba4d0ab3aa94c2b3f1a4f51a9261e462293e4af379f198215266958b31137ac1f6a3e5bda220b8fbcdaa17fa10a02a19a761411c95042937e58ff77c703078b861dd8dbda580" + }, + { + "signature": "03f3cf7ff31c71122df9a12c36ac39dfd30a60032f160b1cd95a3d84bed4151c89026c215c0857bc2403f35a5c3baca856d50650dcc2b0226ea7bdc0cd9352ded2f1fcb029b6888f40ec63ffef8711b7031491aa3286db571ae0882bec7f27cdab39b466994751132656f1de96fc5b166c4d8c5ad457f1bad4b636d2df54b6b6944ac6ae8d77486f98dfc160f29f408dcfd7ddb53cb6456c88c8a74528b8961328d4" + }, + { + "signature": "03b83bead644420bdf883dae811c30dd2f7dcf0763bf748feb695cf51b5f92f2b502b130c31ded0e6328de5adf3e1c169545d206202de00f1d86661e9d3cb658275245ec0478bfc3421a9e0c8bbb5372da0d410c6c8420a2dd46002345a4d26c7fff4f9cb39d208eeb5c253385d9ecd8ad6c3b88430832028e3d03b62f51d4a22095d4214c768150c19b89d0fd1c5786e23b52cfc8d5228f16ff7ed9f126c12e1d68" + }, + { + "signature": "035864d007729b2ba0b4fec92453fe6aceea7f9af0c82462c358c1a7b5a9235430037f904ea501da12348b9d8a130ac5f16f863dc402d68278f677812d0b6400efe32e9c1487c99f3030c60f2c3bed053155eeceb3d0e9c1975c1663d114a1d21c49f79a794e720ce95880ecf4e69981da0f6af72b05f57e71ebc472043b462fcb5ce5ee84cffa0e1cd3e840dace9e2cbad22693014782bc00b38161d07f93b57927" + }, + { + "signature": "038365833757ed5b160c4596f32bb3dc85d1df3ac8dc2b3b13ffc8ebc0a970570002a93256106b0dfe69a08d68dc4b8d9f4994afdee432409b2f6fe2243d2ff6506cdd44bf528da1b14570280b37c43853062a30f1419b976b3647e531ba5df13f3b7260eb63c1a60d659615833b8e16966170fbc1937352d4fee86a1980d57a54cbfda405f6f6139839a8ec841347a8f0c9bc1efa7b00ee62d6bd38f826e557694a" + }, + { + "signature": "02a2b2d85c4811f95f79f4345785c61e2910bf5489a053b32f1f9dc34c799b76cb039cd6abebb82de5611abeee033da9a42f0e935aaf4a60494d1d1f9b2a91463a932b0d7e6f2926dde954aaaae6f50ced974bbfc5e0de7b5e8daa77d61849a99751ab2abbd8e9aa4305044c77c3b4b8af1e221522a08f8b013ac14696b30b3667e6cda402d32635eb75fd3739765b19a192a4ecb320422456a1e4d259ca01555b29" + }, + { + "signature": "0237e63149b7f87c3aaf8345fdaa92d239fbd3c4ae239d604b1a59a90e48eb19370295fbb4b7c838e9da750944c736b705c5498642b55c5f9190c7eab685e22edb54ac994dd98ab29deb9cbe8cbdcf2598753faf8cc94623c44b1e77a0954dc37694ebee532c3f220ca47d22d51066afe7fda721b14695df76ebbdaf581bd52a251b8b4706a0d622c22835bc2c0e446b50d8b5757e6d935c1ccf547cc4b4834e7de0" + }, + { + "signature": "0363954ff5ed0f9dc7e747d4edcb899947a1f19a2f2e3fca5acaf657c50ddad57f027f39bf6a1620545de927e7ac75bfdd37865d76525f751bb4f12bac0f922360e0afa0380a038637fec99f3141eda07976692e201b06e46e3ffe851918d1a2a62e5a161cd63f6f1936367f5efac40e886603e1b8c5e235712b535e036fbcaaf810ba09988233223ca037e602bc764293dc8a1fe0fb34e0dbc1bb96546c81e006ce" + }, + { + "signature": "03a30f6b2c9597ffd72a1e50224087dcac3a49ffb7c2925bb69a007b987362271802dba721d777e2710daff34b23badb51c19d4d90895d13c5c08da6069483edb542ad37569e2cfdb0146da4aa10f71479f56938b641e42b601c2adb499e45feb2be81f5906f2272051878947b95838af61d6f92e1b9f2d4f65a8f3b4198483b9246ddef5cfea713a47ac8c3a6cffb6cf3b5c8eb4756e275795cc94a9ce18c7111a3" + }, + { + "signature": "02e8740a33e65c021292e0c536b3a28500c507dabdbfaa31ce0cf7f006fdb1424303d48f6819a45b2232140da5f0d60040fcb7f04a76b9717167a9242254c0ea075bcafe7963e70dcc833511c98353cd4a2b811052c8006c6b1e9669e0f5ddded17a14d6c011bf78bd72ca794aee181cbc08c74b8299d7f353afc3149cb54e705498e87e74bf34adebee7bc5c64ea68e86668d1291ec2aa025658be028c3b1009b07" + }, + { + "signature": "030c18d757d7a1a9bce0ab05eb376790fad39ca54b352a6fa3737c05b16bc7b0cd03108f248488340c6db2ee40c9db0b1498a463417662ba35326776536015774406f4c047b65eb18a762aff9d67ef26b5eec9ad4db2132216cb38a6cdb778b4bbe75efd12e7755aaf6789c0c90d7347be6931678620bf65bed6bb6e5640fe2cb0a004fa0aa5edb9c6b51e3454355d0e7d5188736071240b332bb73241d9e7d4c8e9" + }, + { + "signature": "02171e5d0ccfd2e1787eef37d882db7c0a1ba0935ec3516ebbe73f3c897020beed0294edd53970421640bd0ab780487faf3cc51c2ee46ee7b57c7b8f6e1730a2d99afa981c04018d7b7dd416fcfd48c4905c76623b5649a21df45b625089c9fb2b0c9edb088dc3718c5d8cb72f6ab208ae2b9d7e7c7680e662a9c9e9fdc4952586913fcb65835239fbf78e26c1b7e8f3bcf6dd0117834a66c7f19f717e8cc3322538" + }, + { + "signature": "03cd7811e8a88c4612ed3d87307ebbde16ed4245a5172be3ade052ef8a084ab424032d7119ad56070c698b99a4fbb38b82ba1774dd50e735ca28384179c1ee205f86d3134bde0374a7338ac781889bb4eaa3625253986998f93765decac0a40ffaac2d2e0ece7bf66fa4e7516adbe0f160e9c4e65184154a641b8c8af33fb1ab3ad79943a55f6544a4a126f5ad959845831e80300008ad8293a447ce58530383f1ca" + }, + { + "signature": "03b78da2ce2a4eb52ffd51509fe12c53a0be7370f4c24e9d95e07a34ad28a05d0d0257ed1c3feebd5ed7c9745c4726c101c62bc3e44f22f3e16ebb81191a4cf511217f5a1f41b54ec0ad5b9c575e8456c732efd2a5e8993af37b34a33c12cb324198db9259f04666258a3478437ff0ad0e86041fee95c79e31bc43fc58c4ba400650b4064d5c52e86fb7869580cbee23a24b878e1ec1848431829d5f6842c3cea963" + }, + { + "signature": "032c3db6ca40049f2743711ebcfd838e5a6473b9ae13c3f65ccb2d40800253fbbd023eb9b03029f4a20a1451e5802cfd7c292962709ae4b8acf4b8eae6b794f2f36afc2f214404bfa22c8b1d8abc3302dfb9b91b1ae31cbd60f1d5e6401cbbc2ccc031054dc931a2102f51c2ca3d27a8b27a1cd0f43d8605c52d88f2139977402acc15e76542d097ef928c51502a2029cd89af2961a211bbdce15d61296b1084768a" + }, + { + "signature": "0335a38c29dedff0245c6267f5c2dbab18c541730bf35a07219d9f547f653fd2ef02bc7482bc838c7b73cdcc6fa8a7825e349e050653f001c01b2f3066680033531e395255aa00097b7f3ff976e8437f40147dcbbabd5137401b1b01166d7b41b43bba2f4a22de2f4be0074c1a3f856ac85b41a88912f382fa4c25a3605c2f5dff49776ad0ff434a474ad79988e5f62f1f93803048fc05fad892905ee61188fdcf36" + }, + { + "signature": "027d9a0f7eaa63db0f2df1ba2ad1b8c6e91b8d006b13b5afd5ca8dcd0538b9f7fa033081c68aea534eb674065415c1e1b95518fb4a000f2b6e95222884dfbffb9e811d0d1623568fb1fa07591ffe62df0030d46ba0f53f56f691d056e4210af35b7637a7d845754647d61abe372b8aa8cb7b03b95bdac5966ebb4d2ffa77e106d6666ebcc7da8efdebdd95be7763681a8bd7e7a2d8f5d5dbf0a13f8dad1304a994f4" + }, + { + "signature": "026106341c9f50f35d39821892e366b0e8b9ca84fd7f6cd580c249ee7dd9deca7e02924cf4cc93ae37c0cdf0b00e4c7fcdc640ad4dff6bba7cb227e8f5d861c0243a57ba67c857d284924a68c27b20bf542e3f1e77ca4288ce5c0bd69068ad06926d47fe56d3109e54a15addd0e3a647bed460ba27a5cb186d097d4593370ebb4b4392d2395b0df7a4854086e3bc5bcf8d87ff5efe08d6654288e90bc1ec9fccddee" + }, + { + "signature": "02fd40b2af97c72a3408d9814a0f8d556ce99dcba4ef41b617173dda57540251950254a42191c82049ac9f9e80c2e507289bd19a938baa48b081648e14a87316f7b9f92ddd3263054bcb9f64647bbc7def4dff370ffd0d796e1eb6d4f7f15c5e634d07d2b425efb4c47dec0d6d323256d63748bc2843ea51500a591290aeef2a35c54139840add72aadb2da51a94a50b15975bdc0dd1ac0e4437e8b1e5720fceffc4" + }, + { + "signature": "02ecc3a6f4d45fb8a659b9482f3e41890d8e3f3e741fa07a6edfcd74e165471bf703442e93c3011b7cc3a4559e7a3662d299bc0c78a19d0d132a2978adceb4c1b2d930c6175022e55db10f22702b3fc8fe9d81842ec0e7d189ab9aaf8295fc1b2cb224e0e056c2681e3f4d874de9e0624c5b3bce85cad4ffe24c96e5589c5bf31329fc3375b54e202367c13245097625a4aed407711d1e37ce10164e7c779f4fb8ff" + }, + { + "signature": "0297a536a106ee55c8e9c73b731a377f1459abff1310608f02b985d9950a25bcb403bc7331b0b6cbfe4f0124b23bd3d1b453fbefc4fe8e3c8aa9381256ec2a50489a72d4e23afecb6b920c2428d903c77c59748e0402e1ef06597b2cf9f52fe5792bbbec98a2092af2a2c470d53f845df33c1ddc639ba4e86e12b4afdc63b0b59f384d085a8514d4aa127c6d21c98538ffcadec13ef3e947da779d20a6a1a56af2a3" + }, + { + "signature": "02d3c7b48715408585570cfc88431c2a0bbe4732d50dea59373ff449500c11ecb70283007c9686f8d10fdd1ab22ad7b18f56134380bf87ab6ee94071c6732b5c26cba232bf3be6bb4d08d8a7c695683d52f916660ac7606a3d85d7863480923f54cee3d56739010ec06751fb1b9badba062d0cec08bce30d474facfc56fe095905883ab27c38cc761ad991486ea34ff1874d03b70f5f268ec55dc392f5752a68cdd2" + }, + { + "signature": "0250bc7d7286300cf45bad96aaf4b4d0d774cd7fb7af19592fa8b4231091de47a702b48b11ccc3dce525617e981980987b008f71452253e42d701a62ba6e839c2dceb36e0c317ff7cac8d15b03c3ef429357feb467d04659fd47ddc879d303b404ba18593a1bc01a6c19c36a45ef20827fbb7f1a6b52752332760b2755310e977b90ea2d47c425b3e89ce5352f8014048b84448ee1fb3a9b241dadc2fe1ac78c2e7a" + }, + { + "signature": "02e675706a659d611397332521eb38059d2bd20d9a474172b2b2f68cce60c772550385f2256b9fe0f1836533d3805fc0df70757e4995c10e85aa34d7b8541916174b29f5e3c3c5162c48b92dafd9c0882083b228790a59f1373af6b1c5ee28a0d2f74b4c0d78fca6836832877886cc75bf333fbea1308f4273d8232ef1445fca7665ee19f7728ddf57678b7ea44096b1fc10d862fa00fee532477b10027dd49a8f7f" + }, + { + "signature": "026a18b5d7777c2b30cf23137b475c91fdf7d4696705eb5bd0d55e45fa02bb945a02f1f6520340c96e32a75b99e0d5477eb4bdbd969ced07d9e0e5d733ce754169246c7cf05a00b0c140ca8607647b3c9302cf8bebcf7ce1ab6d893b34b078f25008eb3e5837f3ad831ccc20d59bcb1b90e57b70a13f3fad76a0541fa001f9f2d7cc63b5b7bd0cfb861f921394e938ea97ba056ac29c767c33cf36e6699eb67bed72" + }, + { + "signature": "023bd25dbc087bf7e0ad94fb16a504f6b9906288c6bc6406e293c200819b1105b103bd3cbeb2eebe1a07545d608524d5dcec337806f568141824e21fe666560b779a9868d40b807bc1ef111e3f58eb014fbe364476c7dc9c246b712bb77743f9c3451d275f15c94cca2bab8c5d0d9c5d46ee70d71eaf2986172d5a021d459dd4588a0636022784328bf36244ac5b18734040c3c1ad9c197521fdcaaedbe11dbe60e9" + }, + { + "signature": "0356604d7a123f621e6c71e056b4748791d95ae00244ae0f5a77fc630d48484a1002a75e8aa510a4904d2759778841d13db8d451670dc7c04dc4de3e7885c15727807864549ca815a9accc998a31bd7ab6e45e3e4f975132e1c3a7e72e3dac39e8d83af82d5fd23a020632d5e5184fad907109e943f80c9be9c5503dff1ec25c162daf92dfc510a9acbe5cb5146e4083eba562331524755fb77a02b63bd4ba642010" + }, + { + "signature": "03e7706f879f7c143f1834e53438baa087fb33ae2debb0a48b856b3bb4f537aaca03fb619e24ed90cae9bb916c168cbef1f77296a2b15095bdea246bf35f5621b50758045110378313ced45a0d2c23220dfaad256b7eb2768fcbd5aca8c01295a99df261e76b7c15e75847356e213c17b3048dd592106fffb32260d3c3bccf015774418cc711ec336b37ad434b78cab33d8af738c36cce8e0651a6301c657f3918ec" + }, + { + "signature": "03aadc1801889f9855b4cf0c0e25c6ca90bd4c442ffc3311bd0a4956c7692f650f020d631b842155004ad30491169214704fe070f4106bb132976c7743032fd9d2d21f6ae52b35ace707894e4359ddaec830bff67a74c35e234c2cd96248ff4b2f6dbb7f1add414d6455fdc2624c36ba196523d1de6f6043d63a854c8642a1c68927eae6ab0d617a2e47a80702dd2a837732d4d110288d486e1e26f8cfaab64b1f35" + }, + { + "signature": "02b0ab7e95e763d42c62dd857445d6ca0d0607573292d18f27cfe8b431e2111289034b8dd8138dd45484294658314b67250396aee45f74c2a9844e95db6139acfc016afd29978464f5e9203bd2e90675d6da196a14c93c53efcf4e72f43b915a822f89ddde58224adefa7ccbd23819d779cfaa3e81a33da639cc4f68e8a97ef706f3401083b8b6f3f4c2b58789010bb2f7f8f74aa34688271e7056cc94a2a78fce19" + }, + { + "signature": "0335aa3ee4060dcc7198469da52dbb3e651108aaae209075755767326db2b61b93036d5910aec22d7a80a042a5fbfe9277e19fbf3d443cf009afef0d81d91b6e41d5619e74ac64f6f9ea594373c0c57e8a0b64f34f4cbec3a0a0c30efda9598a04ee2397c3516684fd9e3f6ebe4d8c80255589d29cc6dfaa2eb40f3ba109bcef56facd5974091ff3a5a88f42a9d3c72688d6791859e923ffd5477820bd48dabd0160" + }, + { + "signature": "035ddbc0e00e537fe2dbe2069f97c47fcdecc5103cf51f125d61b1d37d5236d43d03f2b226630148a65e58f3ee0f6d3a876292de679f6db0553f47f72fe4d893802f1693aaadab7b4658d5adb4c57637cb168a2e4c7023625e8c87cc9161b7212c1b0f23ebbab613cbd92199ab24b9ae3ab21d1f2015d58cfa74792587be21d41f83adecc45e830109417aec5f6128356f91fed7719bc4e47db855c4405f6eda8449" + }, + { + "signature": "02e2ab0565e5fe33fd40833893569df2f0673ffd0967b3395c83087e6a3605455202b3c840f5f5b02af14efb96d9b415bb271e9e52d3632ff3b0b18181b65b470986ff40ae346fb8c7b25f1ac31cff40da40227f03153eedafffa93a73cd8b57381fcf81aaa4ed3a0f0037d1f522ddef88ffd11ec6521bcf7627a281f386ce0adaedf2ecca4adaf8c074c976cedd3f97d8570dca0aad78dae9856f16fae2aed5a815" + }, + { + "signature": "03d2c31bce896f6385c4fa5a122c7b13b2e1b1866433e22b135d32fdac4d33473103a03a971fc681768ad7e26b30b682e18815161778ea0759cb3ab6dd587fd5aee8fbb6399c2046232c62cb6a94066d5e88c6e8ba8ef1d960ce1d2cb159be46c925ac9d03080de51a05b20c08057e39bd90e4022793f1d9db173f7dbd6ae203910ac64c7b0344ef9acc5adec53dd72b073b00eb509f4279423f0dd61e60936e374f" + }, + { + "signature": "03db3e64d3cd2230a8c42d465619f11f0c87f94b1a2aa04c5211577ff7e26b739e0203b53e57a583a7b26d5acdb9a9d8058b889a9a7e4a450b2e8ee7b729a19d56912a7f7e4c702c9ece4d2f73cc1296ce4439fb14bc87f3026c615e0594fb9fe5c656c5dfc8f0f5cbc6349edb4e2802b80b88f9310e92c78182d2ddc3bc236bfb7f6acde890ced2131b214b416a24f06db7066eda26795f3a5e20b65ba587510c02" + }, + { + "signature": "03575c19332733e7b72249d034510eba65d389cb30163677b137aa16ea2aaaade4034303095ea4a31bb7de798d1d2848fc604985f7f05f8f39a75bdedf8c5759a510e1c6c3bd36756db6cada04ec1fe82b3e70d631aa2dcc05b469f077a53b2fc7e16fcae52c8c38e15c5b2623cb276d37bb5555c2d465fb80e8a76d457104fe4aaa3ad4be34ec69415ff5a9417cea4d35a9ea5a5e8c1a4dc4c573d007f42eca74a8" + }, + { + "signature": "03e024d8ce876f4a9d421409759a8b812b4b6060ba7ed9528249ef2b51b893db0e02c6f5802a3dfc76bb754dfa75b554a86bd74089b2f7875b2c09bd004950e253fd8231c61977f80be801c68fa06bc0312422c3339ae7a533cea2788d779942be3172d50e12b06cb87a91fc23fa0cc8352b3a1ab6849f136f3bde9e60124ecae5c20bcc942a3f70043051b3e5bbbeca3401ddcded259b05bb53fc6576994473e131" + }, + { + "signature": "027f44ff122d7555c2563172d6dea4d2edb5caf05bf01525d13b75b9a0fb2762cd037a5ce9f34ed2c777d35af21500ddf629e25aa73648d8aeec8da72bed570caeabbf1fae4a4d718e051c6634bb08a77654a70c38f410dd91120c5ce3560dae58f192797b9eea3fd04ca94387f2671ccf74eac579251aa1b9c995a54dba04356b73692333d0bc90a3b24a9a0a1420be5a6da8972cdd2fe3353082499f199dcb4fec" + }, + { + "signature": "02dc9fa3462402240743941699546a0dd22be44f9776540fd921b65227694e24da02d02d5bbb123fe6c88d4d593cebeb7b336ccf2a4ac91de9ea5623e1f76a39aefa0320e45cdbb75faafdff8d5d91020e5a385d0f8b13e9e12d73d2b02c4f02899820b4b48294b5e5fea9432cb2518e7b226a72396b6b3f1e8a8c6b7c05c4fd633cdc0337d98589d24b9ac4307b6d9ce526c1d58a5f6e0d99fc285aff18e8f93c13" + }, + { + "signature": "022a725a04e0e034922cdf4fd6ff76b477fc745464ecc4978df304de36845a2d9f03a4aa2925631d6f5c6ef712efcff5dc34ec65463afb498c420754b84b3ff513c19f661a7998c84ecbea160054dc76f1ba1513c16c29c25d4cdc0d3942c79cbd953b6ad1f23573373ed3758a82f32f9a215cdbb9073a74cf49a36957053d4d5f3d9ecd9039bed20d86ea90cb4d5706afe6920972cf4d8d62e074f1a64847e30d8c" + }, + { + "signature": "023ecffc0fb5998ef4fb295a4c1f21659c3d5573424d8c59f254391adbf61bdbae03312fe9bc16335f38fd376b97d15e68d941a31ae8f66346695410fcd9414f78b91831a61aae1a05701330d01c61dfb526bb5e0afc615314daefb2a414d89a46845ba385ad3c410c86a6f6919e1137269c45fd6fa291f9cca29d38f04317364e4dae1dc0b8e06112238f50d897871c2fdc5746f132974f23d5a533cefffa9a62a1" + }, + { + "signature": "0326a5205aa8fc63a5da05427727d5fca1ed5e24e3962eb24e37e6b47f1946967103e1c8828eddb94bea5525ef76cf6300b478526eb314cab3bdec59d4efec2123c35375718daa4381965e20a9429507dc250403551b0d1e18ea1868a4b93622307eff86b7ca9503f71cfc912466b6e825817d842e9e7c831fa6561c9ad27fc13ac42662a55349c86feaffac86a1d77f1b4ec8d9bc8f98c4ba7658ccb310a2c511d5" + }, + { + "signature": "0280b1cb35f977d89266386a5ff9cf8024c4819f0d0d402161856623650124c0cf02a8271b76dad303d1c72da5a0db62567063ecdc1151d21f33f52241cf2099408eca6d6714f52725bf5e392d12c22253137ca61eeeb8aadd950b82aee14eefba112019f413877d53624ba6ac3c01f466a385b0d0ab34e7ad00adb9befb06361576413fc937445bcbb01246775ae5dcc3312dc531acb3c4ba2926ea76d623096fe8" + }, + { + "signature": "02b456751657a73528f961677fb683cb3602d658d9d04350fdb6c1063dba427b6d031f929caafc712c100536ac0aff2fc59fc581c79f0267281f4c6373a3be135ab050b7d255364e2e551a124ef762d37616a2c9c54606d96a6f141c7c82dd6bfbd240cdc442c37a9179af5bd45d7b1f2654f89f7744bab7b8ef4e69532167a3318ca3859ecfb1749884d3ca17dd3e88bca5c0fb1e00be38d6237f6ece011e7a0bba" + }, + { + "signature": "026ba035d3ef3a5f6381a3c80f44c7d46100e65754b41688da9f8349c94685153d03ef41489e7b04dedf170f36448074bbadbd13235862e634fd6e3e90d30dcca72287fdea7f69ec736f61c7a677a1b3aed9e5b8b06cc786898a125061f3e3a6487495d4ff8c17b276f0a2b0beb1b920c3a663f62d512485382637dbd926906b52285a675bab574bf4ee3c40cd2afbf7069b739589ec89b377762f8baf17095b0cec" + }, + { + "signature": "02cb81ba606602da0f7a6524db89d9857bd297accd8da477151d807be3ac91a6fb03348b6b66ee935fa93c34a24cb93dc0d52397cd32ee18f43762933a742ddb812e5f434bbef3c867c3f64b57dedc844c701e4ad650110b558a167d268921b75b1d67d5f6f4d75cead0ccf2d6f1c1fd9e091e73810c2553d9e68deaa193e9b557d1ecf32a379e75ea555f68f245f0be6e4920cf52ad311a1cf0289351aacb2bf25c" + }, + { + "signature": "02e390eb77a64967982ca4acff6f632742caf5030689eb8057ad520a4d699d9c6e022b4b7200a321c762c5016845cfc8aae23450433043fd5bb976a7a9db3eb1a362dc1a5ecdc3b2dbaf597daf0bf69e76122de7d5f0d82e2f882ac91bf0a84f3c6de7dca752c2c39f302d3fcac0227c4053298d3d96bf1736c0ed4069215d9df49b88c34db6fa4f1a3403b437b1ce489d8a48ab89aedebbbc7e1e0647d7bdda3bb4" + }, + { + "signature": "02ddd0be22acd22b59cfe93e7b122c73a93f1e02f42c1c6bc3b3246f1bb18f2bb302022ba74b56faa21476c6d3265765ebab8f68f44f174922448dfb1f1ee0cba5b515a512095e0992681451c44f1a90158600305d836533a3ae22a7a1ab8737f1a18de8f46cf26fe369f631df46d5adfff684fcd1250dca208d10fa3992eda6704ea6c7ed91daafdba804d1d907d30c66fd127d900d6c4e298552a1feedd85ade22" + }, + { + "signature": "022ea17afc9fe79b5e34ab54d9d7481231fca8d92dd5562951e3a5ae8d26b0532c0236cc16a227b33e4ce63d18ec875bc1de41407ba2a6e131e458ec8d608a5b0554367682462ad095fac1d477c7e24d5bd3c200370f17b7dab5471f644623328d960b93faaef4333abde9f61695ef486879054f5702c8a45aed9dfbf855e567d93b64bddff07d1e19c139cebfaa9449b1bc0df5d34b020accf34fa2987403f09709" + }, + { + "signature": "02266062e102f23241a1714c7424a2ebe0e69a2567cdbbcfb0e75739ce1a3327e60397cd3ea6fa434afe259d6bf60d729331d6236b2991252c72048fab69f6d4a6df99b1f59e43f43f3c2b07409a58207c65e8f244c039e6c1b539eb8e4c86e97c7a484f74ee0c7aeae4554240aa394e6de8e631daa53a896673691249cb6389acb4a9ce03a94e5e4aa02921833cc086865895372070716a1c2873c5e38ca03f2654" + }, + { + "signature": "030b4908e6ae2f0c90b7612276b369252a5d1a01e9c5a6c1db32d7de0ada4ede9c0357ecca8675d89c1bcd582b3587c88e1587cd9657bf20dd2954dd9cfdefcd7bdff926c93754808f630723f2acd81c3fe791fc70e10eaf25c47cd61134745156d145df059f966fc94ddb3ca01e336d78609de8a18d694904563679ecf5857e15aeac22a5deb5ea2a85ceaacac4f96492d03c80cd0cd8bb703264f5f7bd9bfcf803" + }, + { + "signature": "036519216a2ad7bebf1e70b12d98e3c16bf326f44e1b1c69d231e9a5d1a0b6d38e027ba0e9864f39476f076ef4ec11aa1b21b1ef5391ef4c8c63eed31753551a0816fd839a80648ff2f3a50930ef84175b163bd69125ffda9adbe3590c6ea9b26c1f74f12a31b2f7d155436e95b86dd2b1fbea62ee2682f1428f1c8d5f530cd5c34b325ca4f8596c0cf877999beae01d5a9e9910f2144263c33a250bbb4151f91bec" + }, + { + "signature": "02247827bff8fcf068e888738d09be330fbd0ac27607b7476e6a440734069dd6690364a0ee53cfa0df54cca68f1e12cb92900f6de81f7e0cf5198df42f374aef88b1bca5841e61d19fdd0944f01cf38c08337cf29ec603421544dc82fb8058014ccef0a5fe060cba1e424947571e1dece50f12538a757695114ebcd7ad223c650447defc43af7707a1dc750825aadcf925dbae5dbd1f29e516ca9f64010364c46eef" + }, + { + "signature": "03df01c7873630c17588627968d7fcb8c280f7a0874fb904049ba5fa755e98681e037ef36b2fd83b98bac6990e6d52ef555f3b8baced1f4b2292054d76768e035d407e588aed91e4f59bb20c1e2ad14eec1ada8fa03eeb12cd9088842ab395845d31f998b48373a38b323c44ca1a57d9b9014039de88b215f5b54ee8170fae27991675f2db3673371bec8534eb630d774d1305072916038cca8aa0a1740541fe943a" + }, + { + "signature": "035b8f78a76ae7b03e8f466f1999982492609832803e26dbf3d97db6b62eb847070375806e6562447bc022122389696c837d8908933d3d85716f51940e754f366cca74904219e2e707e9720304bad19d42401d6ee3c1d6d74a66656d8df05bc40576ca6c17484279d291a0f8e18f98314b97c4aee1cc21ff5bb6084bba097724cbad95091e77392a50709ca0ba398671497f84f50cf80f6a5a3d763f129a4f237a94" + }, + { + "signature": "034d37551bbed3c642cb1f13ce151b07f3c5627abbd7ea823517a67532d5f1b1250340602c3c631c0d0299777712ee03bb0246e5839f0a4fc4c41ac750283f1d157fb7500c143e390ecdefea92888e20a487c2223a981dd23e73ffedeb9d99f47e5ce75f2b492d8f1393104c6655e9e73aa621f12a38d9f65e22d2539bf1c55711213e3bad77668d2e82ea2a0710bc805eb923b8b39959f3f032e3f36f4079278bc8" + }, + { + "signature": "032528c57ee33a4c6f8db0327e92f7d275f96cfbd3b8633451b7a3c419d6774b4703226ff163b786d44ba35fad8026f0b36040cc937cb508556be3943bf69b170b958e5bf034b4d14ed91355385d116d776b75bc60b429b27fd2fcedbc659ef8d2ce375899f1bdc63c621a9796c033bf156302b22d0aebdebe2cf164d79e8539a26983071b847ae4c56832f6c02f3fa8383aef45985f3d324d16ae80a9558ba97806" + }, + { + "signature": "03b063d78c059067d6504d5a741afe4289ea230a08a6c8900059d4d41e221b2bc00388aafbb8cb4add361e98001abd938040471154cdf8abd79cd61061110cc7e6ed2f814c7fbd5ebb923a05461a76b4508801f022bf548d0b3698d114113ce44a3b0d18af0723975df20950986b20c0b833292a28490e6e932ff1bea9b1cfcfa961ab16ba697d8622ed9c367e32c3ae8a00bf475f1f7045cc9ab116b0137e69b5e4" + }, + { + "signature": "02415ce55c258596484cfffbf0cfdb94865e280eb6191281106d3d23f75c237cfc03b0c38fabb52673cd928d06e7ad59c76509bee703dde507d1c3e978849ebc14fbbf10408d4ae490809a18df0c5e2e77bde9194de07a565fba5f9e3933c09b02b25bad6161177c86d2280bd539ba4b2e003062a1b9dd4ab86bb099776abfa6ef7bb8807c6aa1b6f5483d0d9d97f0d97023a64fce71892ed1d1db8f5c0f36f7b6f2" + }, + { + "signature": "0204bce60baa331c5ff1e6fb7d0cd733c9a75ba0b2a277b2ba5de4dadbcd16d2e9035b4dc7ef8f9a3f83878d8a1e4203f0cff88644c85045b751b6140df70a11633c9d9142bbe1e18de436d46cdc55665ad8c73ebf4982de997cd8f2020d2f59d977348fdcb2feba82f82d9bd50a06ae924d41dbe85da2ab259aacc633f1ac781099cda89de252de79834c2bd8e4a5fab1c13e258e96b0db0add35ab1e2efad0925a" + }, + { + "signature": "03b9c79ca1d81a3a784726179f4e2c58aeffc674568ec3da5d74e1e39f9442dc1202dea953eafd5ba5cc8a27d910d265e072d950a610422cf7bcb93e417ab68e734fa7ba63af2246140eb14d976997d88c4098144ebee6b4b7b9a5894e8420baddab8a26623d76c41c98ec9d6e49bdc42d894a645feda454dbe50a4f5a6518c240dea713cd3d5831909d1ec4cd5f5444f7e5bf688cd26c73ce72c3312c04ca34e972" + }, + { + "signature": "02bdae4b2f6c7a5728d9566ff03e81becefb6b0c96f27eee23a7488827ff096ca90305dbdcd545503f46951e1c9b5176529b2831e4633648e52424f3241acef5384cd212b8f2ae977c241997b940e62d372f1a14e25686e17dfb53a2a74d8a295812e179e2fa3d06dd795087bf92baaa379e2e7888a0caeafccfc0c0462e09555e0e3e8e70619abe4c242fe756f6afd803123a4c96c404695fc32780259880160123" + }, + { + "signature": "0345fb03c6f9f1944859d3e1497c6a9634adc773dd1216cff8814613735942637b03966a9d2d6f7bfcd9513c00b8e3f2da8af0c371ff3a4e769caccf9abc1048ccfee7e2b461f2e42a9b4fc89f83a4cff0b11cf4e23e9d1b0808d184d4158280c03fa7ff6a4247d3c27e72cfec55a56c8ba1149a15bad44ab6cd7935b3e46c98a3cc281c692d867c15fc52ea7062a7779bf76e0d63c8e819e0b38a72ee59f729089c" + }, + { + "signature": "038445e68001a29b226d8125af0476298f1f05b723c63a75cd1ba55721b86aed1a031acb18189dc6284e38820035ea7630f63803347cc7b5cff474ea62850966d7a3da874b2b4a05bc9f43d69fa07ee9f7e66c16a3c504f19c21722ec55f7d8a6dc46cc09d3339c1a9bcaad045fef6b2f96c71df3923a7395f8096d42923bb76335635eecbade078d470db89ae08b1ce65b24e75f1eedabe4b991d89a28c3bb5ad96" + }, + { + "signature": "027ea502d06229f888f291a710e9b3bfde53fdb759d85ede18481d3704de78db3702dd7fb65d65dc70e0a4029f2b39c63073827ea90b4bb94bd2b91aa00fd9c283d3e9c4444ca9737fcd83dea93c967ff2d2ff2347e49fa7d0cf61f138a5ec920c8a13d8eb7830e737f4a6904fba67c125d4d851eee65e3f740070058144bf9c8ca0502e21500160fdde3f8e1b4a8c70400018799e64c050b63ee9593b79232d295e" + }, + { + "signature": "02b16548096721da187256c6de59b506ed2e06c0afabcdfb51222d96b9d755fabc032dae132f2e8ea49257fdae96a65a1c90b7a8d94107b5cff360541a76606586b75d0fd4f5da796687d812a7b1b7bcd04d5650aceb65efa642a210d0aaf802f2aba9f5c01d950dacab75ed16e0679ec96b410eaae6c3b5c61145067f8838c4b0e8ecd26fa49688e8986333eb1d7d4cb547c9d8015587c34731c124c822f9174daa" + }, + { + "signature": "0357594e1895ebf950588b575b98bff57316e499637d056493f917f1d9817c97910239994c939864639ead1400cd4b53061834e037bda00fedbb1935590223c4ad4d61841bef54c7bd255a99bcb55d7ab47b71d2dffdd6d229dd384f24541aeecb48c4ab001422146f6a07229b0aab8764ebf50a865b27bbcc6d63d5d21336432ff376a57ced3f5eb5258dc1ed85fe8eee417368b0ac80e824ef333236374d250369" + }, + { + "signature": "02b0765bb098c368162a76c0f6c97349c4849d846c3c69ba17be6d01288f3c365b023ceab4d11eb829cff14350d1bf709c8ff49e1833adfd26e5fc50643330398b3d8e034c94fddc93a97fe6fdacb2635ecbd27ec0114ac357c7a121ed925f7e06f15e37602d501afeee3dab789bf451222d326f5f9798acf24b97fcfbcef84e24654d95f91eafe19bc0f07b8a77fe22de81c93165d2d167181fbd1fd6c1fd4b2d3f" + }, + { + "signature": "021f235643cbd93965ca6936235f6b5971d8c6e05f1f09c39d0a8c67284b8d1556028a7209337fd2e2b20f0fae7d174dbef5bed022a0c76348f74b5cc9e3fd09826d9f412f43fd38762fb9b5021492d413dd33237516c11d678cf865c2df6bb4f87fdec0706a04faa7208013fa7b94d0f3569f0ba405d6f608537e0b7efbcd7ab8b8f72e03e095d1e78e873d4401628b79091b130e53c2531b176f69d90b0b938c24" + }, + { + "signature": "03be9416732a86583acbf277d4e96a7345075c556b1e0acb1096bfbc3d96a9831003ad591c26ee0ea1e65536e8ec28f832ed3ca69cd71b04870fad6512d418f619cbc2f9dfe61c9adbc7cac5a351c070528a24d68c073102a6fec70c87667d112503a456192b61e72477bf15ba81c4e4604bbbbefcfa49193a110a6874644bd7a2150bc9b50f6a87601598a0da357bfe5bbeef9c8f7dbab1a5b522a33e8acc39664c" + }, + { + "signature": "02d240d31465e971122484c921ade5f0a3ce2bea579717115500bd01ff67a08aa002daeab8cd98c051c41d345e35b46e8bde151b3672512827e11ca9d3c1762c263ec919d76e58058e74e036822de6f668fbac9f32d42eab15d5c8bd06e2eaeee2f1db55082f980bee0084c2fe870f556e1ff336ebf0051355b082e07fb7535db3d9b97e340a0e711305c9c9a11eb08448b3096e4457cbc9a06fa323f70d84b0d63f" + }, + { + "signature": "03c1fb8b4fd7b2da38dea2212e39048141a66eed17bae26485bb979bd9eefc029303d537a6b89498c2e661cba1bf7fd5f0796346ab539b585bc81a5c03dae917d73f2f3785b9bddf87cab6ed6bf8db8a9e0299ec6212878df378c3d5a9b0daf13aafee79daaf08f612d93a9a43a4194cde2fe33e8814d72ea32abc6d097a4cdda596c909f66458b8db812b8f2d5b1559761b83fd29144337fc5a62c57ba978caa8ef" + }, + { + "signature": "03171c6ea4c9db7bef409232b9f12f111bc9579c685972a5471a7958e705d748cc03793917a53f2b73e8b6252943e5838bf9651193e17daa0413aebced6e129b712d6b086c14bdeff8041f61d7be7122896eb777efdda563c76b7c7f302e4446f9bfdab972fd101c8303c9d7f7d0c7db927f3e40286288048702c0a46b7408bd54be6871e6bfc812bad7200262d30b9116d90c0e5ead055b4abdadfab53d9944e2f1" + }, + { + "signature": "02eee518913e53b271ac562b69991975fef49b6fd4bb176de8bcb1b453415e508202b992ca2c47cdfc19346db6eacfa74f347fcc5bb9a63d8637198bb15c83d5763d7bed506b994ddac5d45fa5a1249819aae311ca4ff32232be4b079a9f8cd9547dbea87b4a734804a4a98455a914d4b7a473095b215fb81a3d9bf39e137e2e7e3fd6e3bf0c3ee7576ee52f9c2f2ff1d031d53143e62cd2fafbdbf62799f9e2a6e4" + }, + { + "signature": "0329247252f24928360c01dd637432dcabdc2f86a08e23ff7b0d1f20f01bbccbec020b47bece5c8c97e0df8c6162acb4aa38a820aa058e244b06a44917cca736f142ff21af3dbcdc31ea0f8813c5e8402691f917e9ac0f4e30eed25a2c456edd24ef1ca2cb67d52cff58a8feec563cb09411d50195877f4cd3b0a279fdbc9501b18916b7e11d7abf709d66136cbce3263065d5580ce30649b90dc2ce4bb5f338c286" + }, + { + "signature": "023eec66a4f1ecb4de7c22c37648731378ede724f51a4ded08480bf1f8d6f89950020d317d749f0b5f17f842c57a2f105c43bdac1d46e678e393bea5f61adb11bfef2e044fc64b9ba1046e668018f13bf97c944b8890583beb672edeffc6e9e51610980f05bf8a265de7efea3e193c7952d4bbf9c18b072157208c1962e812f86d50c1085e1ab2c6326a99c6fca5e7c4e0a0f9bfd37c308f4e768a2698fcae306733" + }, + { + "signature": "0303c51491301f4170485c54bceee3e51a39615afe352c4fd9fc49ad20ed468cd403318b163b5a211bffb354082f049a54e998944487a3eea53fd0b3fae908957e9c2b52b33c79e66dad0ea651d4653a98e53ef78226d47e6f0587fc0936eb3564616b7f459686491414cd5b8e49ec02a0de0121274890e6dad9013adf467b7bd6f8cfd52e03d5af61fb6bee8add25ced626fc74651dad8bfbb1651cb208c8408aef" + }, + { + "signature": "03eba0e45eeb36a493b26b40f9a5e412e15ee17a15922ad8498185837801fc5ca003f5c73bfc2c4afde24a0f10fa52d057b183e88ee663618a0e48f952f8553c3feee162e162eb183fe3368af046646318fec92bf2e404e9b7e9d9da1f8e507d5b74a5addef184030179b4526af23015529caf485211d9ae7144288a6e1ce0f01d31f4f30d9141fec366328947691e41fedb16463d415cc895dac602548f2123af19" + }, + { + "signature": "0262efc7e21f8ddb97772cc512316a4ca22139f36511abf69eea4b2df89a25525503c49e73a4c24bf2f636816d593b7825f97fa2f9b0fb739b231440f755b9fda5825ac693c815130ed1c5fe8cb438310eac96134effc715917b8ae8bc5f414ea774436ecddf789a734922935deb33df2f0e61f01107491f2612fb6f4354dc4470f1c55d1ceac6cee23b17e3c346f2a19de89502e2703c46d212931c9418f20bb8d8" + }, + { + "signature": "03f377756545c7b18edf8d56ffdbf564d14c1e9d46d192a989095780a2f1b6714102400d6b2861bff212cff6a4183db4564368451b7df97b6adf74aee671ef9359e18f07067eaea42095037cc64b4b15085f6b53fdd8c9f007d4432e891b201b2e0fe43e92db93c8d38f5f0e06f5b1f28bf69627c9013a17bc68e8e3fc15606476d8e33163c7c65882cf7bade269bbceec07c22963a04a29cd8e22e191ee62d9a09b" + }, + { + "signature": "03425492adcb0efcec1167ef2cf15018b0b0c5e6d0e386c409de6dacbdd7ad8eaf03485a9bdb1d3639cad9f70c59a20e4fe518b9ee508b2d963088c03152f10017727a6ba5c41157e5ecae8e22200b4eded979a3c1fe3ec02b003c1ba960eeab5d153c05a8171b828e1366f510155583d460b3d7ad447433282fb52d205de169ad453186072ea2cbb5b0545c0b2ac1d34de3550f3177224094337525cd46282755ef" + }, + { + "signature": "038b6443a3896509d7472031e00cae08b10c4151bf42926f16eb4e2e37d39054d2032659a42b85276d9398a285323858e5235a4dab639e84900b7910ac775318dc6146f7d72473464d8377c59311e30cf908a428245b82e01201a9f87664d3018751a3d84749395548747d6fbd4e423e24646eb2cf7a72b89ec8bb129cb2083a7433ad11a44268c9cddc143bd376a7d90df6e4694a5dd3f341361172f7181ddd8a8d" + }, + { + "signature": "02b775422a321ca705b11e71fd6902d565c637aeedfaba4cc80b2a8ea3456b524a030b5e9603fcb080350ef761a53fa53d5e65777c44e723e7910297bc3885872c266c2e42d40928cffa4458d48dc3f0cc7231af622013994b68aacc0bf25fcccb60a82f34a5388812f12fe3ac9865c35e2dd12c61263a630ab9858b750c1e17e59bcb4d8ff832711238a6d6e0d052ad87a83ab0e7d83414a92bcb1a05348967a4d4" + }, + { + "signature": "0286c3716c9cd7afb75b9091ebac76fc3bf887ada41b20dcea6cabf8f401032f9602b6644a45fa5d6abdc40d6fe26f220c7ae02cb5fa4d821b75322c59ef80e0971f873d6ac555b39f12da8ad98f68152e31d61958c62c3d3327d2fec5546e8b7ff1c046bd06c6557e70717d4610f6d6de532e1addeccf01fbe893ea9deef026eedd72da43428a5a68dc8481659178500e9bee6b3d47cf6199a3166f758909e27cb7" + }, + { + "signature": "02aa44bb080456bfe65aa8eb983c930f3484c0b2cc0425b2e4d9a5d03a39226f2f02971c4d0042856dff7af319aeccdc34abcf30ef7ff34aad9b594484463c20ada7e1fae89ceefef4f2c827c9f39575ab57b91dca2e24f6ae12c057f3db7c46a5d014ba2aee3ec8abbf5e66f7b82882cf2ca1f919c1dd2d7a21e7e8a71591aa2d922df7657f713479bbb888ceee850a89674f54b3ef8c7b64076c2d8c9399d5798c" + }, + { + "signature": "022058e69c219ca350af323e696122127410262f077e4a35f57e25dd46b95acc9c02e22735442f27156ce4e1060298aeaeec84193fc5f5b286f5ea48a5604ab2d0e8ea9fe1604912314f8cc77e469f9248ff989a954da14940f8c91aea78160c5b471e06ef67d1eb79319a93af231e4726fc8e346dd54f8e57ef0a83c9c11c6addcedd21bca7fe0e9197d204383fceb4e94f466e8be3f186383a2b5fde941e8e44c2" + }, + { + "signature": "03773d10fe9d98b68971b1e102dfd9c9ba9c67b863e279c5ecc97304f5655d5d4f0338189ae69b6feeda0a7766421d4f0addbdb27968a70a0b6ecbba5ee0e9af01b4ce1746c34f98cdb265cb39afcf25647a277fbeac8b3107a67bf77640420a25b0183e0be38ed757819acbf5cd36db59a90867f801aad750f3e2f21a0c229c977768e61b4df5ae8931643ebaf58a59026fde0639f0ba6ba375ccc8466f50cd5ec1" + }, + { + "signature": "03a60e39d437be778e9e8d928aeef1ed8b14503f7e6629bb4e05baeedcf10f9cbd0385888187c193bb64d9acaf3a49577e946c8225c9fe5f9e12c027bc8f1c14f88fbc0ae4c2ae94fb31847b17d2abe6e211100f4c1721c7cfb5e0ab0347075ab4a43c15754578c78f98d4c2102f0a1e890f63cdee73f587e43ec070995da45c92faf48c45b9043532dd1d01c3c6f6bde6523ca415566f9dd3f15124ce0310b4db6a" + }, + { + "signature": "038987ceac2918bf22b41477385964cc9a7cdd72b78af4385e08ae72fb6152bf10036cb5764fad778e4bd60bcce4d5da441256eea96e3622731f3072007f05e9cc7db720f4372cb58b3ed474758e3aa812bd4e83805d447d34f53b0dd5d7012f9f88b7308041c7dc11b3e0a367be0b90e03f9a5a98b9182d22dc48fc3e9afa37da1ddd334e68e4a122210fa7e98a80236a84a043280bc9c5fa8fa5ccce58514c9549" + }, + { + "signature": "0229345aeb5d6f10e210f5e7fa12cdaeab71e55c926bba94c31391b65b0754c711038829fb59b014a3d68b5c3aef968e94cac411e2d7ae6b3600cd688c96b12284d8659f55ff87552ddce1795bc9d36e3bbc05b4286e5d4bbd2d6966c2a841f3acc3ca57bcfea577476673210fdbd1cfac94388df88953581d5d16411bdbb2615e0a3b0e0456b05845271fffb6f6a55f9162013a3b2628f61d9409e00ad21f5be574" + }, + { + "signature": "03ac496b78bdbf1147a07190d73f41991ad6428b5cffa90db7a472414736ffd42c033f98cd196d865c4177c261b133c9717b2112e79aebabcd46a452c3a3675fe4954007fade5b9c77321c77ed9075f575bddc6fa4cb7d0254ad52b0aaa78a2a9f334ab23d1e3d55dcc50c0b569b33c34c47d057407050f3324f9fffaaf2e5329e8a99826e4041dc58e162466ece8d19d3bae1e2ba9407583988ab3228aab5b8c117" + }, + { + "signature": "0260a56fadcc0b139ae199e2538ea5eff47c7fec4bd3ccb9ce12eed5c11c05fa630362b1b4adea5b1cc0e2535e62d16ed1a8b629f75dddaedc71651ecbd4ed38525c9229205d72d71daa181988fdf784eaf22cdb0bc069255f5744ce6e732115bc69f9d9db5ea9335970d08b75784edd515d613f1c8002bb5ab4e94c2be246284bd6999512c523d124452d864a8fd923feeb1c90c7268e175ae6ba37607b24296f74" + }, + { + "signature": "02f00e6c805da4cb385bcf342674575fd9a632b88a3d449a9eff32ebf32de0490802030065d708912ab378e851e3d71224a517baa2f7752b422cb8ba60c8e208717ca30c4cdc32d7f3d1288bc98144e20038209b1bdb404eebfb6fc072f1206d9aadd4979e95dd7517374657386c3dc9e81933bd47bd657319f07dd29b63fdf2fc957719a81e5664f960954aaed5d1fcc06002fcbd72f712f55866124e6286fbd5f9" + }, + { + "signature": "03c36d76a3e04b9542f2e7a013fad50ca317114f1a73fe33f1ab4ae7bdd96395bb022619536db0d5cc9977a26693f54d5c530bd864af7a49976c6a124a69db15c1b91d0e91517ada9d2f386474267bfd9b46e8768922d0dab36e66212ea578add47b5a22a7ce5e0ce91966409491df41b724ad2a6b1929081da82b31fcc1e61a33cecb74e513c5ede341f2abb579517bf4bcc98a4d89bece056145b5ab41018d75e2" + }, + { + "signature": "029b2ec03ad05d0c32fe90965183258e8b0a534479f155a0524e542a19d1523bf9020f038f235b726474e3b4501702c3e52a055c39a2105d0cc12a2965f63f9449d9e833ae48901afcd2683952d8ca68bb61175f199bf43d3c1d03134ce23e30223efe3dee0bf44ca9fa49cd640f2f5a548b7d995b6bea53059a1f646f9e31b07ae8cc569a05bbab3b70f209344ea6e05b33a4bf508b99cf2c33c9807893150639fc" + }, + { + "signature": "024bca51dc5105137c48f973db1bdf8a1221d6ad2c4319df688fc5fc9b5fa84a310317303a504e028cf89b815ed8a93cafd7070a51511958b6834b36b046e4253130cb079453f37d7a6b2317e42d3d6ca9f181a339f7389f4e85078f43679dd429a0826f01e64d794865de703fcebf59bdafa6645a6a91ba00b39b88cc8d82395b1ec4e9c9a807c58146ca5da1660b76859dc0672ebeff66172eb1b1f5a9345823fa" + }, + { + "signature": "03ddc67cb2a0ea930f15382f38dcba8b31b5040f647e88b973872ec2fcd1fdddb30269ef3c2bad04a75cb0c758840ebe227985c3623f40c2c025818adf218048154da9646a1960fbafb910b3df693c6cc016003414a08ceec372e414bccaffcea3485510709fc655072c6a4d906983bcda6f41382343e0cbfe93f9bd349a9de3eb28e6c4f7b9149b22d8ed2f7e4bc4d4439b7b85c38d884ecaafcbafd7325c9d1273" + }, + { + "signature": "031dabb45d00140f35337367c55139360888339d219e047948387e30bcfb678ea802cba105d738bfa6fbdfcc4ce03b324471d2343cf2ee6958a0346adde7a77fb76d9326aa16c3b48ea04cdf8e6dd484cd38e6330cdd5681f4740262442428c46d01271454caf220a98bdf7ab62dd6408b5d7fabf8ad43d3a8c1463ae655ac7fc0e6b1a6edadf356352bb677e5ae0285c7d69782be6eb0233f3817f66a17ca665a8f" + }, + { + "signature": "03780089934d336d597b57f255f8092d7c90b0b9f65e7cf1b7dafa36d861e0256f03ae3b7a9ee26739d9a8d097d0b7bb6a12eb76eaf898e873b0dd1f81a92495cd236546910295ab5429e51a4934e92b0a6552ded658ef315119f8faf4314851ed68623325ba9e1a5e8f7c093e2603328a347d093fe8651fa74abd66be8173a719c0dfd975b633b697bfad4f10cc9be9da904924bb0160fc125f2af54e0a0b122ab8" + }, + { + "signature": "031fbf53d7b4aa170f40a9cbbe97fec761179ecf0b8370312dcb9c672cfc2fa9a802406c28e534ad45510d7b6379b85c7b127780b016962d6d1e8d55e5b7e2c1951ae49968e62951b13429ebd7989bac91f15b4b48a0675f1958bb28331b2f9a0d390468a7bfa449e402dbe07a5dc985ddc9d5b2327bcbb2adcd6b9406a7f45b0b73fad11c0b92524a74666d0817b00c4aceed64bab24ca6c634e11209feb8f5e09b" + }, + { + "signature": "020a4b38ec49e9f01393a7b811a0c487132303465b93408adafc5721c74474f3750214dcf51c7d3692a3b77378439bf433c6dc743078ba5aa8d25361a145f1355c874a85861e86f5f616f663669f5cd07ed2511177370c46eee245b0161705cc8cd921dcdfdac91744aeb50ca16192dd7a6b130ea3e4a1cce672ca66f965187bb15684b63d10048d2660de97b528fc03c32ec2fbb97aee4ec4d5fcbf7fe8ab063f4a" + }, + { + "signature": "0347858c84dbaa6bd58d3b255178c19d6c02009964b1fc9806d5c2af874991225e03a45e2e0e6cb4703b4924d2f0c245235473201a0b4c2c739c8d6c99b4a1c3676dd258642822142c5e336b6833becf80fedd104cd3b6b7b5fc0d5fba7742864029ff61f9b39e9e7f5890c935786d9ef054d3bb79008ae996c80bb5dc0f2b6f8bf1bb8f2478c1e4ee9807ad9f026976402437b7f6727b2aa138af09f4cd1159c8f1" + }, + { + "signature": "03287c8617c9cf6e2961985920714a6bac60f483d55bce3d6b077155d515bcab6e03b4ac97aedf6c87206d9f8cf74e688f0a5d87dc5650e3ee2e8e1cae5ab47837c471368130705c48bbe1bd94474ff7ff7eb32dad782aec3f06e3fb4ce47e2a0bfbd3ac103fdff65c707bb8723ecb96701180729ccfe0ebc7a60b8038b9dd0779746424710af6bcc82777a2d0828d90dc5a787b0ad7ed101812dbfc730b02f4a68e" + }, + { + "signature": "030abe1975033c5b7004419ddb8e74ab05412f713c7611a8f85e0a287b905b53fb027d1a13859660125087c2a9d2ae8ce1ad2f34e64bdb257a26b3adb141954937824ee516cb915545f6f40dc555a2498a45e1f188eb3b8a1c22ab224d58348d62463289491fd62b3adb9cf4516181edd53d74426c95ccdc8b51a422b66f3fd9a1dd674cd77fb3cd23a22c4c42d855616cc10c8c4415d2ec81ec5bfdcbc8d1a46b16" + }, + { + "signature": "039605699991051c9fa54b1015772e6cbe78d329712d957dd31627c53ddc27e16f02ec53e09dd49e57988093079b7f21669cef9a95d790c1dea95e2e8016ba611a9097ddcea578f9eb910290564d17a36ce1f4c6d1776593fca55d98c63346888a783c7b050dfdd16d28e0f422e63603b2da729d774c8fc83a6023dc71abaf76ac159ffc402002bdc6ccb1faa8d5099049f53d2d7cc97a35d03a9cc9730afa535919" + }, + { + "signature": "02db39efd702d5dc5cf8c04336f19bb5553a717dc8973608b0693cdc3f5ee62dee0370e02a3ec75a83d8d673306b8e3718405c0cca07e00497afa7b86d0bb91ea504ca7ce977303f3274f793e434fe05015a4387765feabc24c702e0eea7f623fdff4721b7e58ac4b0c102368d2f481631a056f665bab4342d29da6bd9e90df45a7f608c05756f160a2fda15f3d6d8dd36daad85db6ac1d064a4bd8cd115ba5ad643" + }, + { + "signature": "0287c96ffc2b8dab164afad70327da64eca08c5f13bf79ca03ffab2ac091fe3f4e03485624fd9880330cdf3cfddde575647b74ec6f5f466615c5605cacf67da5e92f2e6d4794a845e8e7b64e33b55ad742d5b604bee6a68c9c623248a7bb956d5526cc527de00e7a5b0a23a8d09c850d61e473878d551ddc201b4bcaa7b82664f24d9ed282373dfb9f3dfda207de53bcc8d86acf2c8e3cb252086ad3c4e29172a39f" + }, + { + "signature": "03c29d615d0921dcc5652445f19ff94c8f4e0870e9b65195f6207214a196560a4d031457383f1573286721b28185f2fe16dc0861eb437d979851d3af90e744aad2cadf8a98e28c2620391ab2610e6045863c6ff376fe1f548b2a02b773d85f1b9784d289c387f71001e34548bfe385aa60cf8d905cb8c0924bdbed9b7abee17443ff60a6ab95408c1e269a056116c61e056eb9aea47a6d1cfa84be0a8f409bdb7afe" + }, + { + "signature": "03e7a08bc312eb4aaa5cc78f71b6b46ad7d279d69576fde08cf5626093e21297f203d896215418352eb7fcf9fc3d85546b79a329c3c25d87039b24ad003876d23c16fad79c4fe99fb0bf024f9ca18e48ee4ae1c99e91a72a93b29321e834c75dd5b5ab5e09e8fa81685f64d41dd2c59377a8d914707ef4965b4c364d1982a9681a42fad566d01d445a74729cb331c665a3c9cd7fb94efefccf61074f5c997c2fae55" + }, + { + "signature": "02490844a3e075d720a3fbb6ffd523a7f70657137dc70198703b02970e8a0c7edb038c3a00eddbb18f539f0ff5d17dd070504acde6700181251f576c11623f2ec51d229b594d782f3ba3bbcf2e9b54eca5c7a14edac0540d2e209290edb6d997ff0b3333ac2ccba6e8e432ae715c6e31e53e06cb48aca35503a9ebdfca034ee62e158878f5d2d440607187d11ca0ae6dde5748070a1b172e8f4b4ad38725260868fb" + }, + { + "signature": "02a5102eb2f24c5e0d1875b7a16384c52cc9d4b5122827e947320b36601930d9d0036aab9cae518f903ac1607cfe4cfa4eb79affaa3424e074ef43332988beb34d83e78f6eba5d792359733ee0dc34461a0dd0cea26aa06fa2280b60557c2cf6bfd4d70a032261d95cb9d2f583bf802056f03fb17a02893f6ce6bf456ed08eeb6e4783b8ea13133fb7a6aa0646d5e3e970e73162d4a23296b642d00aeea776d657e1" + }, + { + "signature": "03eda7ee170bdb33634cc9cd7097f82bda42758fb04ae3b8c26789d050de52f7c602db880c6e31026abeb76841a4cfbf0c11ee15316656db322e9b7eae0fc890f8943d21ceaa0664e416f44f8c99039b29d990f08c3d617eec2d99d44eadeeea1526040d316576c7b9567be7e6baaf978c7b03d20e694fe443bbad0646ba2b886e3fc22b1cde75094b856b51eb698b88c2143f94dd41d583d8cb0b1dd3082935b8e1" + }, + { + "signature": "02fdabf7f2a41584de6ad73a74ea5059fcfc34ce9ff657916658e01e6be302686e02a352ab550887f0ab35f508866c04b063ec5882c2c9a6e7fb8e13984d6f3d43d42c441e21eff6525f58b7af4e8d2db35fadbf88f619721daff44ad47de409a62559e0aa6476cb21badd5bdf57e4edb2a7eeb1ac42f047bc2e5fff7dfba14ea8c1aee112dc4b939c6685cccd8212f271ac1a6c6a11a2f1bbb2d3daae88c2ca3e7c" + }, + { + "signature": "03238dfc607ff0f4e1fdde582e2deae89b12e2abc8cba338034d87321ce5af7cb6025b1cee83a752334c84f37af399586e292d18f390477dea73bdec5a6a135d9c6725946fb8115be2279c02b3cdb9a13a7177566c4a951174c9ff06df89c4b758ab8b9c61235efeb6f2b41254047f0b35d75b239608aafaf8bd87819bb8eccba2a15ee713080c53a8784f1c9fcc5229e710e70896181154693d29602126ec638237" + }, + { + "signature": "020e128991408d1e084163eac5e79c91c0d73abdea654d6fae97c6b3b2700e7a4a02ff7681971a8c8d43cbcfcf1f69300ee6825d6f4c9ee02497d7dbdcf80d93c409dacb66427dfc7430c5463cbb2e361abdd0ed2cb35f3704a7e4afb755fe40352f0486b0b647d8f9b7abbc009e0114c70a4bb4e13049cf68db92c14afcf83899f738b4dc37d5d24956c13c598bee053c3d371a3f76a8e25e80f53696427486b1ae" + }, + { + "signature": "03af54d8082a41a2c477714234dbafe66badae60ed8b0927ca93bc54d1c2058df30269882b61448c09675661b5925dcb52e1add5769879c2ff3deb2ea3dd8a6278e043cdc1d6b7e653c78e3759525ff5110395e3a50c9432582590cacd8d5e55e36409124e14bd5ff45ccda50b06fc5d925816a6228565abd0068f6a12ab750e57232fef856d8e036c017fd05aa0388a517e3ee595d50a675e18a7d8ef555b13c845" + }, + { + "signature": "03aae92b85b4a425da56b18b367867f7cf8d5488ef19bd8a662300bae25b89dcfd025046aef043200503db8bd8ddf6914027eb71b5623554db7aa4d143b85d203506026024bd719a5282c9217e7e763c3ff8f0237b251fbb290860c17fa755fd6f873e8211c5dcabfe36fffdc31f9027e771e800d5dd9c071bdb55bf68dd016768cf34826445b100395ce252f99b812f4f1573b18e073ce0646a2460ad18732df38c" + }, + { + "signature": "02f034e249c1b60a98b7a7ef128fbb0cc9aef331b9d03f847080bd9c0fb3847a3c029f2703ff1197f7134c26dc7384f5a9b0f9eeebdba11ba9559bf375da4b0a92f764fed7c19be11d7773265ff194e09715d002bb0b8711105ab75df9c34e9a2a973439060de9d88963e1c435901cd1e4aa637a1604ce64576c10c040b39fe5e73b4ffc6d7d303e3e9d6cb84ce489b3b72fcaae6083d77d11c319dedecfd9d03caf" + }, + { + "signature": "021b8a0008cff9ba8b11b7b03df816fbaa83ac47128685fa77ed39a479af4c30e1033b9616327e6514f49c3ae526e20ab5ee9b438d8338865921f825d26eeb0ea9f188199ce07b0f012f1de4d519d0bca8403ba660b3c718908c0e0b0a7c858888b02fa2ccbd761f4816c1eddd275f0f9fa01e371bc61f4ec33acad9c52b9a608ac37a6ebddfa8eb4eb917bd0b109c676077e82aa6a548d1484de3b5c431bc4d4919" + }, + { + "signature": "0204049ae0920c5c2785b96f0f5e0b6420e492421307e7805b0e1c0bd3abfcaf9202b9069cdc9e676f6f5e67cbfb766def4427f6d64af911cabdff0eba298d0a46ece832265d4e1727baaf7a49163e5b5a327171dcd136f9c4124a75dc4e79e6d923a465d52b85aa5b2b742dd4fb30d9d72d8ba3cbc770c7a692a44a6635828c53d6421c998ebb3eeaeb1ff21c9fac73629b15c551e6e73982a71480a83d5398c358" + }, + { + "signature": "038a66f8a73c93dda6815a84842978f19cfcb607e54dc1892dfd14efd2ac7301950260ff8cc7ca0e71537a6144cd20c77b88bae4b87ea949433d6015f1f8ec1b340407584c314824fbfb71a563a7edee221ed637a0b5c5383b226766ba4d0ab3aa94c2b3f1a4f51a9261e462293e4af379f198215266958b31137ac1f6a3e5bda220b8fbcdaa17fa10a02a19a761411c95042937e58ff77c703078b861dd8dbda580" + }, + { + "signature": "03f3cf7ff31c71122df9a12c36ac39dfd30a60032f160b1cd95a3d84bed4151c89026c215c0857bc2403f35a5c3baca856d50650dcc2b0226ea7bdc0cd9352ded2f1fcb029b6888f40ec63ffef8711b7031491aa3286db571ae0882bec7f27cdab39b466994751132656f1de96fc5b166c4d8c5ad457f1bad4b636d2df54b6b6944ac6ae8d77486f98dfc160f29f408dcfd7ddb53cb6456c88c8a74528b8961328d4" + }, + { + "signature": "03b83bead644420bdf883dae811c30dd2f7dcf0763bf748feb695cf51b5f92f2b502b130c31ded0e6328de5adf3e1c169545d206202de00f1d86661e9d3cb658275245ec0478bfc3421a9e0c8bbb5372da0d410c6c8420a2dd46002345a4d26c7fff4f9cb39d208eeb5c253385d9ecd8ad6c3b88430832028e3d03b62f51d4a22095d4214c768150c19b89d0fd1c5786e23b52cfc8d5228f16ff7ed9f126c12e1d68" + }, + { + "signature": "035864d007729b2ba0b4fec92453fe6aceea7f9af0c82462c358c1a7b5a9235430037f904ea501da12348b9d8a130ac5f16f863dc402d68278f677812d0b6400efe32e9c1487c99f3030c60f2c3bed053155eeceb3d0e9c1975c1663d114a1d21c49f79a794e720ce95880ecf4e69981da0f6af72b05f57e71ebc472043b462fcb5ce5ee84cffa0e1cd3e840dace9e2cbad22693014782bc00b38161d07f93b57927" + }, + { + "signature": "038365833757ed5b160c4596f32bb3dc85d1df3ac8dc2b3b13ffc8ebc0a970570002a93256106b0dfe69a08d68dc4b8d9f4994afdee432409b2f6fe2243d2ff6506cdd44bf528da1b14570280b37c43853062a30f1419b976b3647e531ba5df13f3b7260eb63c1a60d659615833b8e16966170fbc1937352d4fee86a1980d57a54cbfda405f6f6139839a8ec841347a8f0c9bc1efa7b00ee62d6bd38f826e557694a" + }, + { + "signature": "02a2b2d85c4811f95f79f4345785c61e2910bf5489a053b32f1f9dc34c799b76cb039cd6abebb82de5611abeee033da9a42f0e935aaf4a60494d1d1f9b2a91463a932b0d7e6f2926dde954aaaae6f50ced974bbfc5e0de7b5e8daa77d61849a99751ab2abbd8e9aa4305044c77c3b4b8af1e221522a08f8b013ac14696b30b3667e6cda402d32635eb75fd3739765b19a192a4ecb320422456a1e4d259ca01555b29" + }, + { + "signature": "0237e63149b7f87c3aaf8345fdaa92d239fbd3c4ae239d604b1a59a90e48eb19370295fbb4b7c838e9da750944c736b705c5498642b55c5f9190c7eab685e22edb54ac994dd98ab29deb9cbe8cbdcf2598753faf8cc94623c44b1e77a0954dc37694ebee532c3f220ca47d22d51066afe7fda721b14695df76ebbdaf581bd52a251b8b4706a0d622c22835bc2c0e446b50d8b5757e6d935c1ccf547cc4b4834e7de0" + }, + { + "signature": "0363954ff5ed0f9dc7e747d4edcb899947a1f19a2f2e3fca5acaf657c50ddad57f027f39bf6a1620545de927e7ac75bfdd37865d76525f751bb4f12bac0f922360e0afa0380a038637fec99f3141eda07976692e201b06e46e3ffe851918d1a2a62e5a161cd63f6f1936367f5efac40e886603e1b8c5e235712b535e036fbcaaf810ba09988233223ca037e602bc764293dc8a1fe0fb34e0dbc1bb96546c81e006ce" + }, + { + "signature": "03a30f6b2c9597ffd72a1e50224087dcac3a49ffb7c2925bb69a007b987362271802dba721d777e2710daff34b23badb51c19d4d90895d13c5c08da6069483edb542ad37569e2cfdb0146da4aa10f71479f56938b641e42b601c2adb499e45feb2be81f5906f2272051878947b95838af61d6f92e1b9f2d4f65a8f3b4198483b9246ddef5cfea713a47ac8c3a6cffb6cf3b5c8eb4756e275795cc94a9ce18c7111a3" + }, + { + "signature": "02e8740a33e65c021292e0c536b3a28500c507dabdbfaa31ce0cf7f006fdb1424303d48f6819a45b2232140da5f0d60040fcb7f04a76b9717167a9242254c0ea075bcafe7963e70dcc833511c98353cd4a2b811052c8006c6b1e9669e0f5ddded17a14d6c011bf78bd72ca794aee181cbc08c74b8299d7f353afc3149cb54e705498e87e74bf34adebee7bc5c64ea68e86668d1291ec2aa025658be028c3b1009b07" + }, + { + "signature": "030c18d757d7a1a9bce0ab05eb376790fad39ca54b352a6fa3737c05b16bc7b0cd03108f248488340c6db2ee40c9db0b1498a463417662ba35326776536015774406f4c047b65eb18a762aff9d67ef26b5eec9ad4db2132216cb38a6cdb778b4bbe75efd12e7755aaf6789c0c90d7347be6931678620bf65bed6bb6e5640fe2cb0a004fa0aa5edb9c6b51e3454355d0e7d5188736071240b332bb73241d9e7d4c8e9" + }, + { + "signature": "02171e5d0ccfd2e1787eef37d882db7c0a1ba0935ec3516ebbe73f3c897020beed0294edd53970421640bd0ab780487faf3cc51c2ee46ee7b57c7b8f6e1730a2d99afa981c04018d7b7dd416fcfd48c4905c76623b5649a21df45b625089c9fb2b0c9edb088dc3718c5d8cb72f6ab208ae2b9d7e7c7680e662a9c9e9fdc4952586913fcb65835239fbf78e26c1b7e8f3bcf6dd0117834a66c7f19f717e8cc3322538" + }, + { + "signature": "03cd7811e8a88c4612ed3d87307ebbde16ed4245a5172be3ade052ef8a084ab424032d7119ad56070c698b99a4fbb38b82ba1774dd50e735ca28384179c1ee205f86d3134bde0374a7338ac781889bb4eaa3625253986998f93765decac0a40ffaac2d2e0ece7bf66fa4e7516adbe0f160e9c4e65184154a641b8c8af33fb1ab3ad79943a55f6544a4a126f5ad959845831e80300008ad8293a447ce58530383f1ca" + }, + { + "signature": "03b78da2ce2a4eb52ffd51509fe12c53a0be7370f4c24e9d95e07a34ad28a05d0d0257ed1c3feebd5ed7c9745c4726c101c62bc3e44f22f3e16ebb81191a4cf511217f5a1f41b54ec0ad5b9c575e8456c732efd2a5e8993af37b34a33c12cb324198db9259f04666258a3478437ff0ad0e86041fee95c79e31bc43fc58c4ba400650b4064d5c52e86fb7869580cbee23a24b878e1ec1848431829d5f6842c3cea963" + }, + { + "signature": "032c3db6ca40049f2743711ebcfd838e5a6473b9ae13c3f65ccb2d40800253fbbd023eb9b03029f4a20a1451e5802cfd7c292962709ae4b8acf4b8eae6b794f2f36afc2f214404bfa22c8b1d8abc3302dfb9b91b1ae31cbd60f1d5e6401cbbc2ccc031054dc931a2102f51c2ca3d27a8b27a1cd0f43d8605c52d88f2139977402acc15e76542d097ef928c51502a2029cd89af2961a211bbdce15d61296b1084768a" + }, + { + "signature": "0335a38c29dedff0245c6267f5c2dbab18c541730bf35a07219d9f547f653fd2ef02bc7482bc838c7b73cdcc6fa8a7825e349e050653f001c01b2f3066680033531e395255aa00097b7f3ff976e8437f40147dcbbabd5137401b1b01166d7b41b43bba2f4a22de2f4be0074c1a3f856ac85b41a88912f382fa4c25a3605c2f5dff49776ad0ff434a474ad79988e5f62f1f93803048fc05fad892905ee61188fdcf36" + }, + { + "signature": "027d9a0f7eaa63db0f2df1ba2ad1b8c6e91b8d006b13b5afd5ca8dcd0538b9f7fa033081c68aea534eb674065415c1e1b95518fb4a000f2b6e95222884dfbffb9e811d0d1623568fb1fa07591ffe62df0030d46ba0f53f56f691d056e4210af35b7637a7d845754647d61abe372b8aa8cb7b03b95bdac5966ebb4d2ffa77e106d6666ebcc7da8efdebdd95be7763681a8bd7e7a2d8f5d5dbf0a13f8dad1304a994f4" + }, + { + "signature": "026106341c9f50f35d39821892e366b0e8b9ca84fd7f6cd580c249ee7dd9deca7e02924cf4cc93ae37c0cdf0b00e4c7fcdc640ad4dff6bba7cb227e8f5d861c0243a57ba67c857d284924a68c27b20bf542e3f1e77ca4288ce5c0bd69068ad06926d47fe56d3109e54a15addd0e3a647bed460ba27a5cb186d097d4593370ebb4b4392d2395b0df7a4854086e3bc5bcf8d87ff5efe08d6654288e90bc1ec9fccddee" + }, + { + "signature": "02fd40b2af97c72a3408d9814a0f8d556ce99dcba4ef41b617173dda57540251950254a42191c82049ac9f9e80c2e507289bd19a938baa48b081648e14a87316f7b9f92ddd3263054bcb9f64647bbc7def4dff370ffd0d796e1eb6d4f7f15c5e634d07d2b425efb4c47dec0d6d323256d63748bc2843ea51500a591290aeef2a35c54139840add72aadb2da51a94a50b15975bdc0dd1ac0e4437e8b1e5720fceffc4" + }, + { + "signature": "02ecc3a6f4d45fb8a659b9482f3e41890d8e3f3e741fa07a6edfcd74e165471bf703442e93c3011b7cc3a4559e7a3662d299bc0c78a19d0d132a2978adceb4c1b2d930c6175022e55db10f22702b3fc8fe9d81842ec0e7d189ab9aaf8295fc1b2cb224e0e056c2681e3f4d874de9e0624c5b3bce85cad4ffe24c96e5589c5bf31329fc3375b54e202367c13245097625a4aed407711d1e37ce10164e7c779f4fb8ff" + }, + { + "signature": "0297a536a106ee55c8e9c73b731a377f1459abff1310608f02b985d9950a25bcb403bc7331b0b6cbfe4f0124b23bd3d1b453fbefc4fe8e3c8aa9381256ec2a50489a72d4e23afecb6b920c2428d903c77c59748e0402e1ef06597b2cf9f52fe5792bbbec98a2092af2a2c470d53f845df33c1ddc639ba4e86e12b4afdc63b0b59f384d085a8514d4aa127c6d21c98538ffcadec13ef3e947da779d20a6a1a56af2a3" + }, + { + "signature": "02d3c7b48715408585570cfc88431c2a0bbe4732d50dea59373ff449500c11ecb70283007c9686f8d10fdd1ab22ad7b18f56134380bf87ab6ee94071c6732b5c26cba232bf3be6bb4d08d8a7c695683d52f916660ac7606a3d85d7863480923f54cee3d56739010ec06751fb1b9badba062d0cec08bce30d474facfc56fe095905883ab27c38cc761ad991486ea34ff1874d03b70f5f268ec55dc392f5752a68cdd2" + }, + { + "signature": "0250bc7d7286300cf45bad96aaf4b4d0d774cd7fb7af19592fa8b4231091de47a702b48b11ccc3dce525617e981980987b008f71452253e42d701a62ba6e839c2dceb36e0c317ff7cac8d15b03c3ef429357feb467d04659fd47ddc879d303b404ba18593a1bc01a6c19c36a45ef20827fbb7f1a6b52752332760b2755310e977b90ea2d47c425b3e89ce5352f8014048b84448ee1fb3a9b241dadc2fe1ac78c2e7a" + }, + { + "signature": "02e675706a659d611397332521eb38059d2bd20d9a474172b2b2f68cce60c772550385f2256b9fe0f1836533d3805fc0df70757e4995c10e85aa34d7b8541916174b29f5e3c3c5162c48b92dafd9c0882083b228790a59f1373af6b1c5ee28a0d2f74b4c0d78fca6836832877886cc75bf333fbea1308f4273d8232ef1445fca7665ee19f7728ddf57678b7ea44096b1fc10d862fa00fee532477b10027dd49a8f7f" + }, + { + "signature": "026a18b5d7777c2b30cf23137b475c91fdf7d4696705eb5bd0d55e45fa02bb945a02f1f6520340c96e32a75b99e0d5477eb4bdbd969ced07d9e0e5d733ce754169246c7cf05a00b0c140ca8607647b3c9302cf8bebcf7ce1ab6d893b34b078f25008eb3e5837f3ad831ccc20d59bcb1b90e57b70a13f3fad76a0541fa001f9f2d7cc63b5b7bd0cfb861f921394e938ea97ba056ac29c767c33cf36e6699eb67bed72" + }, + { + "signature": "023bd25dbc087bf7e0ad94fb16a504f6b9906288c6bc6406e293c200819b1105b103bd3cbeb2eebe1a07545d608524d5dcec337806f568141824e21fe666560b779a9868d40b807bc1ef111e3f58eb014fbe364476c7dc9c246b712bb77743f9c3451d275f15c94cca2bab8c5d0d9c5d46ee70d71eaf2986172d5a021d459dd4588a0636022784328bf36244ac5b18734040c3c1ad9c197521fdcaaedbe11dbe60e9" + }, + { + "signature": "0356604d7a123f621e6c71e056b4748791d95ae00244ae0f5a77fc630d48484a1002a75e8aa510a4904d2759778841d13db8d451670dc7c04dc4de3e7885c15727807864549ca815a9accc998a31bd7ab6e45e3e4f975132e1c3a7e72e3dac39e8d83af82d5fd23a020632d5e5184fad907109e943f80c9be9c5503dff1ec25c162daf92dfc510a9acbe5cb5146e4083eba562331524755fb77a02b63bd4ba642010" + }, + { + "signature": "03e7706f879f7c143f1834e53438baa087fb33ae2debb0a48b856b3bb4f537aaca03fb619e24ed90cae9bb916c168cbef1f77296a2b15095bdea246bf35f5621b50758045110378313ced45a0d2c23220dfaad256b7eb2768fcbd5aca8c01295a99df261e76b7c15e75847356e213c17b3048dd592106fffb32260d3c3bccf015774418cc711ec336b37ad434b78cab33d8af738c36cce8e0651a6301c657f3918ec" + }, + { + "signature": "03aadc1801889f9855b4cf0c0e25c6ca90bd4c442ffc3311bd0a4956c7692f650f020d631b842155004ad30491169214704fe070f4106bb132976c7743032fd9d2d21f6ae52b35ace707894e4359ddaec830bff67a74c35e234c2cd96248ff4b2f6dbb7f1add414d6455fdc2624c36ba196523d1de6f6043d63a854c8642a1c68927eae6ab0d617a2e47a80702dd2a837732d4d110288d486e1e26f8cfaab64b1f35" + }, + { + "signature": "02b0ab7e95e763d42c62dd857445d6ca0d0607573292d18f27cfe8b431e2111289034b8dd8138dd45484294658314b67250396aee45f74c2a9844e95db6139acfc016afd29978464f5e9203bd2e90675d6da196a14c93c53efcf4e72f43b915a822f89ddde58224adefa7ccbd23819d779cfaa3e81a33da639cc4f68e8a97ef706f3401083b8b6f3f4c2b58789010bb2f7f8f74aa34688271e7056cc94a2a78fce19" + }, + { + "signature": "0335aa3ee4060dcc7198469da52dbb3e651108aaae209075755767326db2b61b93036d5910aec22d7a80a042a5fbfe9277e19fbf3d443cf009afef0d81d91b6e41d5619e74ac64f6f9ea594373c0c57e8a0b64f34f4cbec3a0a0c30efda9598a04ee2397c3516684fd9e3f6ebe4d8c80255589d29cc6dfaa2eb40f3ba109bcef56facd5974091ff3a5a88f42a9d3c72688d6791859e923ffd5477820bd48dabd0160" + }, + { + "signature": "035ddbc0e00e537fe2dbe2069f97c47fcdecc5103cf51f125d61b1d37d5236d43d03f2b226630148a65e58f3ee0f6d3a876292de679f6db0553f47f72fe4d893802f1693aaadab7b4658d5adb4c57637cb168a2e4c7023625e8c87cc9161b7212c1b0f23ebbab613cbd92199ab24b9ae3ab21d1f2015d58cfa74792587be21d41f83adecc45e830109417aec5f6128356f91fed7719bc4e47db855c4405f6eda8449" + }, + { + "signature": "02e2ab0565e5fe33fd40833893569df2f0673ffd0967b3395c83087e6a3605455202b3c840f5f5b02af14efb96d9b415bb271e9e52d3632ff3b0b18181b65b470986ff40ae346fb8c7b25f1ac31cff40da40227f03153eedafffa93a73cd8b57381fcf81aaa4ed3a0f0037d1f522ddef88ffd11ec6521bcf7627a281f386ce0adaedf2ecca4adaf8c074c976cedd3f97d8570dca0aad78dae9856f16fae2aed5a815" + }, + { + "signature": "03d2c31bce896f6385c4fa5a122c7b13b2e1b1866433e22b135d32fdac4d33473103a03a971fc681768ad7e26b30b682e18815161778ea0759cb3ab6dd587fd5aee8fbb6399c2046232c62cb6a94066d5e88c6e8ba8ef1d960ce1d2cb159be46c925ac9d03080de51a05b20c08057e39bd90e4022793f1d9db173f7dbd6ae203910ac64c7b0344ef9acc5adec53dd72b073b00eb509f4279423f0dd61e60936e374f" + }, + { + "signature": "03db3e64d3cd2230a8c42d465619f11f0c87f94b1a2aa04c5211577ff7e26b739e0203b53e57a583a7b26d5acdb9a9d8058b889a9a7e4a450b2e8ee7b729a19d56912a7f7e4c702c9ece4d2f73cc1296ce4439fb14bc87f3026c615e0594fb9fe5c656c5dfc8f0f5cbc6349edb4e2802b80b88f9310e92c78182d2ddc3bc236bfb7f6acde890ced2131b214b416a24f06db7066eda26795f3a5e20b65ba587510c02" + }, + { + "signature": "03575c19332733e7b72249d034510eba65d389cb30163677b137aa16ea2aaaade4034303095ea4a31bb7de798d1d2848fc604985f7f05f8f39a75bdedf8c5759a510e1c6c3bd36756db6cada04ec1fe82b3e70d631aa2dcc05b469f077a53b2fc7e16fcae52c8c38e15c5b2623cb276d37bb5555c2d465fb80e8a76d457104fe4aaa3ad4be34ec69415ff5a9417cea4d35a9ea5a5e8c1a4dc4c573d007f42eca74a8" + }, + { + "signature": "03e024d8ce876f4a9d421409759a8b812b4b6060ba7ed9528249ef2b51b893db0e02c6f5802a3dfc76bb754dfa75b554a86bd74089b2f7875b2c09bd004950e253fd8231c61977f80be801c68fa06bc0312422c3339ae7a533cea2788d779942be3172d50e12b06cb87a91fc23fa0cc8352b3a1ab6849f136f3bde9e60124ecae5c20bcc942a3f70043051b3e5bbbeca3401ddcded259b05bb53fc6576994473e131" + }, + { + "signature": "027f44ff122d7555c2563172d6dea4d2edb5caf05bf01525d13b75b9a0fb2762cd037a5ce9f34ed2c777d35af21500ddf629e25aa73648d8aeec8da72bed570caeabbf1fae4a4d718e051c6634bb08a77654a70c38f410dd91120c5ce3560dae58f192797b9eea3fd04ca94387f2671ccf74eac579251aa1b9c995a54dba04356b73692333d0bc90a3b24a9a0a1420be5a6da8972cdd2fe3353082499f199dcb4fec" + }, + { + "signature": "02dc9fa3462402240743941699546a0dd22be44f9776540fd921b65227694e24da02d02d5bbb123fe6c88d4d593cebeb7b336ccf2a4ac91de9ea5623e1f76a39aefa0320e45cdbb75faafdff8d5d91020e5a385d0f8b13e9e12d73d2b02c4f02899820b4b48294b5e5fea9432cb2518e7b226a72396b6b3f1e8a8c6b7c05c4fd633cdc0337d98589d24b9ac4307b6d9ce526c1d58a5f6e0d99fc285aff18e8f93c13" + }, + { + "signature": "022a725a04e0e034922cdf4fd6ff76b477fc745464ecc4978df304de36845a2d9f03a4aa2925631d6f5c6ef712efcff5dc34ec65463afb498c420754b84b3ff513c19f661a7998c84ecbea160054dc76f1ba1513c16c29c25d4cdc0d3942c79cbd953b6ad1f23573373ed3758a82f32f9a215cdbb9073a74cf49a36957053d4d5f3d9ecd9039bed20d86ea90cb4d5706afe6920972cf4d8d62e074f1a64847e30d8c" + }, + { + "signature": "023ecffc0fb5998ef4fb295a4c1f21659c3d5573424d8c59f254391adbf61bdbae03312fe9bc16335f38fd376b97d15e68d941a31ae8f66346695410fcd9414f78b91831a61aae1a05701330d01c61dfb526bb5e0afc615314daefb2a414d89a46845ba385ad3c410c86a6f6919e1137269c45fd6fa291f9cca29d38f04317364e4dae1dc0b8e06112238f50d897871c2fdc5746f132974f23d5a533cefffa9a62a1" + }, + { + "signature": "0326a5205aa8fc63a5da05427727d5fca1ed5e24e3962eb24e37e6b47f1946967103e1c8828eddb94bea5525ef76cf6300b478526eb314cab3bdec59d4efec2123c35375718daa4381965e20a9429507dc250403551b0d1e18ea1868a4b93622307eff86b7ca9503f71cfc912466b6e825817d842e9e7c831fa6561c9ad27fc13ac42662a55349c86feaffac86a1d77f1b4ec8d9bc8f98c4ba7658ccb310a2c511d5" + }, + { + "signature": "0280b1cb35f977d89266386a5ff9cf8024c4819f0d0d402161856623650124c0cf02a8271b76dad303d1c72da5a0db62567063ecdc1151d21f33f52241cf2099408eca6d6714f52725bf5e392d12c22253137ca61eeeb8aadd950b82aee14eefba112019f413877d53624ba6ac3c01f466a385b0d0ab34e7ad00adb9befb06361576413fc937445bcbb01246775ae5dcc3312dc531acb3c4ba2926ea76d623096fe8" + }, + { + "signature": "02b456751657a73528f961677fb683cb3602d658d9d04350fdb6c1063dba427b6d031f929caafc712c100536ac0aff2fc59fc581c79f0267281f4c6373a3be135ab050b7d255364e2e551a124ef762d37616a2c9c54606d96a6f141c7c82dd6bfbd240cdc442c37a9179af5bd45d7b1f2654f89f7744bab7b8ef4e69532167a3318ca3859ecfb1749884d3ca17dd3e88bca5c0fb1e00be38d6237f6ece011e7a0bba" + }, + { + "signature": "026ba035d3ef3a5f6381a3c80f44c7d46100e65754b41688da9f8349c94685153d03ef41489e7b04dedf170f36448074bbadbd13235862e634fd6e3e90d30dcca72287fdea7f69ec736f61c7a677a1b3aed9e5b8b06cc786898a125061f3e3a6487495d4ff8c17b276f0a2b0beb1b920c3a663f62d512485382637dbd926906b52285a675bab574bf4ee3c40cd2afbf7069b739589ec89b377762f8baf17095b0cec" + }, + { + "signature": "02cb81ba606602da0f7a6524db89d9857bd297accd8da477151d807be3ac91a6fb03348b6b66ee935fa93c34a24cb93dc0d52397cd32ee18f43762933a742ddb812e5f434bbef3c867c3f64b57dedc844c701e4ad650110b558a167d268921b75b1d67d5f6f4d75cead0ccf2d6f1c1fd9e091e73810c2553d9e68deaa193e9b557d1ecf32a379e75ea555f68f245f0be6e4920cf52ad311a1cf0289351aacb2bf25c" + }, + { + "signature": "02e390eb77a64967982ca4acff6f632742caf5030689eb8057ad520a4d699d9c6e022b4b7200a321c762c5016845cfc8aae23450433043fd5bb976a7a9db3eb1a362dc1a5ecdc3b2dbaf597daf0bf69e76122de7d5f0d82e2f882ac91bf0a84f3c6de7dca752c2c39f302d3fcac0227c4053298d3d96bf1736c0ed4069215d9df49b88c34db6fa4f1a3403b437b1ce489d8a48ab89aedebbbc7e1e0647d7bdda3bb4" + }, + { + "signature": "02ddd0be22acd22b59cfe93e7b122c73a93f1e02f42c1c6bc3b3246f1bb18f2bb302022ba74b56faa21476c6d3265765ebab8f68f44f174922448dfb1f1ee0cba5b515a512095e0992681451c44f1a90158600305d836533a3ae22a7a1ab8737f1a18de8f46cf26fe369f631df46d5adfff684fcd1250dca208d10fa3992eda6704ea6c7ed91daafdba804d1d907d30c66fd127d900d6c4e298552a1feedd85ade22" + }, + { + "signature": "022ea17afc9fe79b5e34ab54d9d7481231fca8d92dd5562951e3a5ae8d26b0532c0236cc16a227b33e4ce63d18ec875bc1de41407ba2a6e131e458ec8d608a5b0554367682462ad095fac1d477c7e24d5bd3c200370f17b7dab5471f644623328d960b93faaef4333abde9f61695ef486879054f5702c8a45aed9dfbf855e567d93b64bddff07d1e19c139cebfaa9449b1bc0df5d34b020accf34fa2987403f09709" + }, + { + "signature": "02266062e102f23241a1714c7424a2ebe0e69a2567cdbbcfb0e75739ce1a3327e60397cd3ea6fa434afe259d6bf60d729331d6236b2991252c72048fab69f6d4a6df99b1f59e43f43f3c2b07409a58207c65e8f244c039e6c1b539eb8e4c86e97c7a484f74ee0c7aeae4554240aa394e6de8e631daa53a896673691249cb6389acb4a9ce03a94e5e4aa02921833cc086865895372070716a1c2873c5e38ca03f2654" + }, + { + "signature": "030b4908e6ae2f0c90b7612276b369252a5d1a01e9c5a6c1db32d7de0ada4ede9c0357ecca8675d89c1bcd582b3587c88e1587cd9657bf20dd2954dd9cfdefcd7bdff926c93754808f630723f2acd81c3fe791fc70e10eaf25c47cd61134745156d145df059f966fc94ddb3ca01e336d78609de8a18d694904563679ecf5857e15aeac22a5deb5ea2a85ceaacac4f96492d03c80cd0cd8bb703264f5f7bd9bfcf803" + }, + { + "signature": "036519216a2ad7bebf1e70b12d98e3c16bf326f44e1b1c69d231e9a5d1a0b6d38e027ba0e9864f39476f076ef4ec11aa1b21b1ef5391ef4c8c63eed31753551a0816fd839a80648ff2f3a50930ef84175b163bd69125ffda9adbe3590c6ea9b26c1f74f12a31b2f7d155436e95b86dd2b1fbea62ee2682f1428f1c8d5f530cd5c34b325ca4f8596c0cf877999beae01d5a9e9910f2144263c33a250bbb4151f91bec" + }, + { + "signature": "02247827bff8fcf068e888738d09be330fbd0ac27607b7476e6a440734069dd6690364a0ee53cfa0df54cca68f1e12cb92900f6de81f7e0cf5198df42f374aef88b1bca5841e61d19fdd0944f01cf38c08337cf29ec603421544dc82fb8058014ccef0a5fe060cba1e424947571e1dece50f12538a757695114ebcd7ad223c650447defc43af7707a1dc750825aadcf925dbae5dbd1f29e516ca9f64010364c46eef" + }, + { + "signature": "03df01c7873630c17588627968d7fcb8c280f7a0874fb904049ba5fa755e98681e037ef36b2fd83b98bac6990e6d52ef555f3b8baced1f4b2292054d76768e035d407e588aed91e4f59bb20c1e2ad14eec1ada8fa03eeb12cd9088842ab395845d31f998b48373a38b323c44ca1a57d9b9014039de88b215f5b54ee8170fae27991675f2db3673371bec8534eb630d774d1305072916038cca8aa0a1740541fe943a" + }, + { + "signature": "035b8f78a76ae7b03e8f466f1999982492609832803e26dbf3d97db6b62eb847070375806e6562447bc022122389696c837d8908933d3d85716f51940e754f366cca74904219e2e707e9720304bad19d42401d6ee3c1d6d74a66656d8df05bc40576ca6c17484279d291a0f8e18f98314b97c4aee1cc21ff5bb6084bba097724cbad95091e77392a50709ca0ba398671497f84f50cf80f6a5a3d763f129a4f237a94" + }, + { + "signature": "034d37551bbed3c642cb1f13ce151b07f3c5627abbd7ea823517a67532d5f1b1250340602c3c631c0d0299777712ee03bb0246e5839f0a4fc4c41ac750283f1d157fb7500c143e390ecdefea92888e20a487c2223a981dd23e73ffedeb9d99f47e5ce75f2b492d8f1393104c6655e9e73aa621f12a38d9f65e22d2539bf1c55711213e3bad77668d2e82ea2a0710bc805eb923b8b39959f3f032e3f36f4079278bc8" + }, + { + "signature": "032528c57ee33a4c6f8db0327e92f7d275f96cfbd3b8633451b7a3c419d6774b4703226ff163b786d44ba35fad8026f0b36040cc937cb508556be3943bf69b170b958e5bf034b4d14ed91355385d116d776b75bc60b429b27fd2fcedbc659ef8d2ce375899f1bdc63c621a9796c033bf156302b22d0aebdebe2cf164d79e8539a26983071b847ae4c56832f6c02f3fa8383aef45985f3d324d16ae80a9558ba97806" + }, + { + "signature": "03b063d78c059067d6504d5a741afe4289ea230a08a6c8900059d4d41e221b2bc00388aafbb8cb4add361e98001abd938040471154cdf8abd79cd61061110cc7e6ed2f814c7fbd5ebb923a05461a76b4508801f022bf548d0b3698d114113ce44a3b0d18af0723975df20950986b20c0b833292a28490e6e932ff1bea9b1cfcfa961ab16ba697d8622ed9c367e32c3ae8a00bf475f1f7045cc9ab116b0137e69b5e4" + }, + { + "signature": "02415ce55c258596484cfffbf0cfdb94865e280eb6191281106d3d23f75c237cfc03b0c38fabb52673cd928d06e7ad59c76509bee703dde507d1c3e978849ebc14fbbf10408d4ae490809a18df0c5e2e77bde9194de07a565fba5f9e3933c09b02b25bad6161177c86d2280bd539ba4b2e003062a1b9dd4ab86bb099776abfa6ef7bb8807c6aa1b6f5483d0d9d97f0d97023a64fce71892ed1d1db8f5c0f36f7b6f2" + }, + { + "signature": "0204bce60baa331c5ff1e6fb7d0cd733c9a75ba0b2a277b2ba5de4dadbcd16d2e9035b4dc7ef8f9a3f83878d8a1e4203f0cff88644c85045b751b6140df70a11633c9d9142bbe1e18de436d46cdc55665ad8c73ebf4982de997cd8f2020d2f59d977348fdcb2feba82f82d9bd50a06ae924d41dbe85da2ab259aacc633f1ac781099cda89de252de79834c2bd8e4a5fab1c13e258e96b0db0add35ab1e2efad0925a" + }, + { + "signature": "03b9c79ca1d81a3a784726179f4e2c58aeffc674568ec3da5d74e1e39f9442dc1202dea953eafd5ba5cc8a27d910d265e072d950a610422cf7bcb93e417ab68e734fa7ba63af2246140eb14d976997d88c4098144ebee6b4b7b9a5894e8420baddab8a26623d76c41c98ec9d6e49bdc42d894a645feda454dbe50a4f5a6518c240dea713cd3d5831909d1ec4cd5f5444f7e5bf688cd26c73ce72c3312c04ca34e972" + }, + { + "signature": "02bdae4b2f6c7a5728d9566ff03e81becefb6b0c96f27eee23a7488827ff096ca90305dbdcd545503f46951e1c9b5176529b2831e4633648e52424f3241acef5384cd212b8f2ae977c241997b940e62d372f1a14e25686e17dfb53a2a74d8a295812e179e2fa3d06dd795087bf92baaa379e2e7888a0caeafccfc0c0462e09555e0e3e8e70619abe4c242fe756f6afd803123a4c96c404695fc32780259880160123" + }, + { + "signature": "0345fb03c6f9f1944859d3e1497c6a9634adc773dd1216cff8814613735942637b03966a9d2d6f7bfcd9513c00b8e3f2da8af0c371ff3a4e769caccf9abc1048ccfee7e2b461f2e42a9b4fc89f83a4cff0b11cf4e23e9d1b0808d184d4158280c03fa7ff6a4247d3c27e72cfec55a56c8ba1149a15bad44ab6cd7935b3e46c98a3cc281c692d867c15fc52ea7062a7779bf76e0d63c8e819e0b38a72ee59f729089c" + }, + { + "signature": "038445e68001a29b226d8125af0476298f1f05b723c63a75cd1ba55721b86aed1a031acb18189dc6284e38820035ea7630f63803347cc7b5cff474ea62850966d7a3da874b2b4a05bc9f43d69fa07ee9f7e66c16a3c504f19c21722ec55f7d8a6dc46cc09d3339c1a9bcaad045fef6b2f96c71df3923a7395f8096d42923bb76335635eecbade078d470db89ae08b1ce65b24e75f1eedabe4b991d89a28c3bb5ad96" + }, + { + "signature": "027ea502d06229f888f291a710e9b3bfde53fdb759d85ede18481d3704de78db3702dd7fb65d65dc70e0a4029f2b39c63073827ea90b4bb94bd2b91aa00fd9c283d3e9c4444ca9737fcd83dea93c967ff2d2ff2347e49fa7d0cf61f138a5ec920c8a13d8eb7830e737f4a6904fba67c125d4d851eee65e3f740070058144bf9c8ca0502e21500160fdde3f8e1b4a8c70400018799e64c050b63ee9593b79232d295e" + }, + { + "signature": "02b16548096721da187256c6de59b506ed2e06c0afabcdfb51222d96b9d755fabc032dae132f2e8ea49257fdae96a65a1c90b7a8d94107b5cff360541a76606586b75d0fd4f5da796687d812a7b1b7bcd04d5650aceb65efa642a210d0aaf802f2aba9f5c01d950dacab75ed16e0679ec96b410eaae6c3b5c61145067f8838c4b0e8ecd26fa49688e8986333eb1d7d4cb547c9d8015587c34731c124c822f9174daa" + }, + { + "signature": "0357594e1895ebf950588b575b98bff57316e499637d056493f917f1d9817c97910239994c939864639ead1400cd4b53061834e037bda00fedbb1935590223c4ad4d61841bef54c7bd255a99bcb55d7ab47b71d2dffdd6d229dd384f24541aeecb48c4ab001422146f6a07229b0aab8764ebf50a865b27bbcc6d63d5d21336432ff376a57ced3f5eb5258dc1ed85fe8eee417368b0ac80e824ef333236374d250369" + }, + { + "signature": "02b0765bb098c368162a76c0f6c97349c4849d846c3c69ba17be6d01288f3c365b023ceab4d11eb829cff14350d1bf709c8ff49e1833adfd26e5fc50643330398b3d8e034c94fddc93a97fe6fdacb2635ecbd27ec0114ac357c7a121ed925f7e06f15e37602d501afeee3dab789bf451222d326f5f9798acf24b97fcfbcef84e24654d95f91eafe19bc0f07b8a77fe22de81c93165d2d167181fbd1fd6c1fd4b2d3f" + }, + { + "signature": "021f235643cbd93965ca6936235f6b5971d8c6e05f1f09c39d0a8c67284b8d1556028a7209337fd2e2b20f0fae7d174dbef5bed022a0c76348f74b5cc9e3fd09826d9f412f43fd38762fb9b5021492d413dd33237516c11d678cf865c2df6bb4f87fdec0706a04faa7208013fa7b94d0f3569f0ba405d6f608537e0b7efbcd7ab8b8f72e03e095d1e78e873d4401628b79091b130e53c2531b176f69d90b0b938c24" + }, + { + "signature": "03be9416732a86583acbf277d4e96a7345075c556b1e0acb1096bfbc3d96a9831003ad591c26ee0ea1e65536e8ec28f832ed3ca69cd71b04870fad6512d418f619cbc2f9dfe61c9adbc7cac5a351c070528a24d68c073102a6fec70c87667d112503a456192b61e72477bf15ba81c4e4604bbbbefcfa49193a110a6874644bd7a2150bc9b50f6a87601598a0da357bfe5bbeef9c8f7dbab1a5b522a33e8acc39664c" + }, + { + "signature": "02d240d31465e971122484c921ade5f0a3ce2bea579717115500bd01ff67a08aa002daeab8cd98c051c41d345e35b46e8bde151b3672512827e11ca9d3c1762c263ec919d76e58058e74e036822de6f668fbac9f32d42eab15d5c8bd06e2eaeee2f1db55082f980bee0084c2fe870f556e1ff336ebf0051355b082e07fb7535db3d9b97e340a0e711305c9c9a11eb08448b3096e4457cbc9a06fa323f70d84b0d63f" + }, + { + "signature": "03c1fb8b4fd7b2da38dea2212e39048141a66eed17bae26485bb979bd9eefc029303d537a6b89498c2e661cba1bf7fd5f0796346ab539b585bc81a5c03dae917d73f2f3785b9bddf87cab6ed6bf8db8a9e0299ec6212878df378c3d5a9b0daf13aafee79daaf08f612d93a9a43a4194cde2fe33e8814d72ea32abc6d097a4cdda596c909f66458b8db812b8f2d5b1559761b83fd29144337fc5a62c57ba978caa8ef" + }, + { + "signature": "03171c6ea4c9db7bef409232b9f12f111bc9579c685972a5471a7958e705d748cc03793917a53f2b73e8b6252943e5838bf9651193e17daa0413aebced6e129b712d6b086c14bdeff8041f61d7be7122896eb777efdda563c76b7c7f302e4446f9bfdab972fd101c8303c9d7f7d0c7db927f3e40286288048702c0a46b7408bd54be6871e6bfc812bad7200262d30b9116d90c0e5ead055b4abdadfab53d9944e2f1" + }, + { + "signature": "02eee518913e53b271ac562b69991975fef49b6fd4bb176de8bcb1b453415e508202b992ca2c47cdfc19346db6eacfa74f347fcc5bb9a63d8637198bb15c83d5763d7bed506b994ddac5d45fa5a1249819aae311ca4ff32232be4b079a9f8cd9547dbea87b4a734804a4a98455a914d4b7a473095b215fb81a3d9bf39e137e2e7e3fd6e3bf0c3ee7576ee52f9c2f2ff1d031d53143e62cd2fafbdbf62799f9e2a6e4" + }, + { + "signature": "0329247252f24928360c01dd637432dcabdc2f86a08e23ff7b0d1f20f01bbccbec020b47bece5c8c97e0df8c6162acb4aa38a820aa058e244b06a44917cca736f142ff21af3dbcdc31ea0f8813c5e8402691f917e9ac0f4e30eed25a2c456edd24ef1ca2cb67d52cff58a8feec563cb09411d50195877f4cd3b0a279fdbc9501b18916b7e11d7abf709d66136cbce3263065d5580ce30649b90dc2ce4bb5f338c286" + }, + { + "signature": "023eec66a4f1ecb4de7c22c37648731378ede724f51a4ded08480bf1f8d6f89950020d317d749f0b5f17f842c57a2f105c43bdac1d46e678e393bea5f61adb11bfef2e044fc64b9ba1046e668018f13bf97c944b8890583beb672edeffc6e9e51610980f05bf8a265de7efea3e193c7952d4bbf9c18b072157208c1962e812f86d50c1085e1ab2c6326a99c6fca5e7c4e0a0f9bfd37c308f4e768a2698fcae306733" + }, + { + "signature": "0303c51491301f4170485c54bceee3e51a39615afe352c4fd9fc49ad20ed468cd403318b163b5a211bffb354082f049a54e998944487a3eea53fd0b3fae908957e9c2b52b33c79e66dad0ea651d4653a98e53ef78226d47e6f0587fc0936eb3564616b7f459686491414cd5b8e49ec02a0de0121274890e6dad9013adf467b7bd6f8cfd52e03d5af61fb6bee8add25ced626fc74651dad8bfbb1651cb208c8408aef" + }, + { + "signature": "03eba0e45eeb36a493b26b40f9a5e412e15ee17a15922ad8498185837801fc5ca003f5c73bfc2c4afde24a0f10fa52d057b183e88ee663618a0e48f952f8553c3feee162e162eb183fe3368af046646318fec92bf2e404e9b7e9d9da1f8e507d5b74a5addef184030179b4526af23015529caf485211d9ae7144288a6e1ce0f01d31f4f30d9141fec366328947691e41fedb16463d415cc895dac602548f2123af19" + }, + { + "signature": "0262efc7e21f8ddb97772cc512316a4ca22139f36511abf69eea4b2df89a25525503c49e73a4c24bf2f636816d593b7825f97fa2f9b0fb739b231440f755b9fda5825ac693c815130ed1c5fe8cb438310eac96134effc715917b8ae8bc5f414ea774436ecddf789a734922935deb33df2f0e61f01107491f2612fb6f4354dc4470f1c55d1ceac6cee23b17e3c346f2a19de89502e2703c46d212931c9418f20bb8d8" + }, + { + "signature": "03f377756545c7b18edf8d56ffdbf564d14c1e9d46d192a989095780a2f1b6714102400d6b2861bff212cff6a4183db4564368451b7df97b6adf74aee671ef9359e18f07067eaea42095037cc64b4b15085f6b53fdd8c9f007d4432e891b201b2e0fe43e92db93c8d38f5f0e06f5b1f28bf69627c9013a17bc68e8e3fc15606476d8e33163c7c65882cf7bade269bbceec07c22963a04a29cd8e22e191ee62d9a09b" + }, + { + "signature": "03425492adcb0efcec1167ef2cf15018b0b0c5e6d0e386c409de6dacbdd7ad8eaf03485a9bdb1d3639cad9f70c59a20e4fe518b9ee508b2d963088c03152f10017727a6ba5c41157e5ecae8e22200b4eded979a3c1fe3ec02b003c1ba960eeab5d153c05a8171b828e1366f510155583d460b3d7ad447433282fb52d205de169ad453186072ea2cbb5b0545c0b2ac1d34de3550f3177224094337525cd46282755ef" + }, + { + "signature": "038b6443a3896509d7472031e00cae08b10c4151bf42926f16eb4e2e37d39054d2032659a42b85276d9398a285323858e5235a4dab639e84900b7910ac775318dc6146f7d72473464d8377c59311e30cf908a428245b82e01201a9f87664d3018751a3d84749395548747d6fbd4e423e24646eb2cf7a72b89ec8bb129cb2083a7433ad11a44268c9cddc143bd376a7d90df6e4694a5dd3f341361172f7181ddd8a8d" + }, + { + "signature": "02b775422a321ca705b11e71fd6902d565c637aeedfaba4cc80b2a8ea3456b524a030b5e9603fcb080350ef761a53fa53d5e65777c44e723e7910297bc3885872c266c2e42d40928cffa4458d48dc3f0cc7231af622013994b68aacc0bf25fcccb60a82f34a5388812f12fe3ac9865c35e2dd12c61263a630ab9858b750c1e17e59bcb4d8ff832711238a6d6e0d052ad87a83ab0e7d83414a92bcb1a05348967a4d4" + }, + { + "signature": "0286c3716c9cd7afb75b9091ebac76fc3bf887ada41b20dcea6cabf8f401032f9602b6644a45fa5d6abdc40d6fe26f220c7ae02cb5fa4d821b75322c59ef80e0971f873d6ac555b39f12da8ad98f68152e31d61958c62c3d3327d2fec5546e8b7ff1c046bd06c6557e70717d4610f6d6de532e1addeccf01fbe893ea9deef026eedd72da43428a5a68dc8481659178500e9bee6b3d47cf6199a3166f758909e27cb7" + }, + { + "signature": "02aa44bb080456bfe65aa8eb983c930f3484c0b2cc0425b2e4d9a5d03a39226f2f02971c4d0042856dff7af319aeccdc34abcf30ef7ff34aad9b594484463c20ada7e1fae89ceefef4f2c827c9f39575ab57b91dca2e24f6ae12c057f3db7c46a5d014ba2aee3ec8abbf5e66f7b82882cf2ca1f919c1dd2d7a21e7e8a71591aa2d922df7657f713479bbb888ceee850a89674f54b3ef8c7b64076c2d8c9399d5798c" + }, + { + "signature": "022058e69c219ca350af323e696122127410262f077e4a35f57e25dd46b95acc9c02e22735442f27156ce4e1060298aeaeec84193fc5f5b286f5ea48a5604ab2d0e8ea9fe1604912314f8cc77e469f9248ff989a954da14940f8c91aea78160c5b471e06ef67d1eb79319a93af231e4726fc8e346dd54f8e57ef0a83c9c11c6addcedd21bca7fe0e9197d204383fceb4e94f466e8be3f186383a2b5fde941e8e44c2" + }, + { + "signature": "03773d10fe9d98b68971b1e102dfd9c9ba9c67b863e279c5ecc97304f5655d5d4f0338189ae69b6feeda0a7766421d4f0addbdb27968a70a0b6ecbba5ee0e9af01b4ce1746c34f98cdb265cb39afcf25647a277fbeac8b3107a67bf77640420a25b0183e0be38ed757819acbf5cd36db59a90867f801aad750f3e2f21a0c229c977768e61b4df5ae8931643ebaf58a59026fde0639f0ba6ba375ccc8466f50cd5ec1" + }, + { + "signature": "03a60e39d437be778e9e8d928aeef1ed8b14503f7e6629bb4e05baeedcf10f9cbd0385888187c193bb64d9acaf3a49577e946c8225c9fe5f9e12c027bc8f1c14f88fbc0ae4c2ae94fb31847b17d2abe6e211100f4c1721c7cfb5e0ab0347075ab4a43c15754578c78f98d4c2102f0a1e890f63cdee73f587e43ec070995da45c92faf48c45b9043532dd1d01c3c6f6bde6523ca415566f9dd3f15124ce0310b4db6a" + }, + { + "signature": "038987ceac2918bf22b41477385964cc9a7cdd72b78af4385e08ae72fb6152bf10036cb5764fad778e4bd60bcce4d5da441256eea96e3622731f3072007f05e9cc7db720f4372cb58b3ed474758e3aa812bd4e83805d447d34f53b0dd5d7012f9f88b7308041c7dc11b3e0a367be0b90e03f9a5a98b9182d22dc48fc3e9afa37da1ddd334e68e4a122210fa7e98a80236a84a043280bc9c5fa8fa5ccce58514c9549" + }, + { + "signature": "0229345aeb5d6f10e210f5e7fa12cdaeab71e55c926bba94c31391b65b0754c711038829fb59b014a3d68b5c3aef968e94cac411e2d7ae6b3600cd688c96b12284d8659f55ff87552ddce1795bc9d36e3bbc05b4286e5d4bbd2d6966c2a841f3acc3ca57bcfea577476673210fdbd1cfac94388df88953581d5d16411bdbb2615e0a3b0e0456b05845271fffb6f6a55f9162013a3b2628f61d9409e00ad21f5be574" + }, + { + "signature": "03ac496b78bdbf1147a07190d73f41991ad6428b5cffa90db7a472414736ffd42c033f98cd196d865c4177c261b133c9717b2112e79aebabcd46a452c3a3675fe4954007fade5b9c77321c77ed9075f575bddc6fa4cb7d0254ad52b0aaa78a2a9f334ab23d1e3d55dcc50c0b569b33c34c47d057407050f3324f9fffaaf2e5329e8a99826e4041dc58e162466ece8d19d3bae1e2ba9407583988ab3228aab5b8c117" + }, + { + "signature": "0260a56fadcc0b139ae199e2538ea5eff47c7fec4bd3ccb9ce12eed5c11c05fa630362b1b4adea5b1cc0e2535e62d16ed1a8b629f75dddaedc71651ecbd4ed38525c9229205d72d71daa181988fdf784eaf22cdb0bc069255f5744ce6e732115bc69f9d9db5ea9335970d08b75784edd515d613f1c8002bb5ab4e94c2be246284bd6999512c523d124452d864a8fd923feeb1c90c7268e175ae6ba37607b24296f74" + }, + { + "signature": "02f00e6c805da4cb385bcf342674575fd9a632b88a3d449a9eff32ebf32de0490802030065d708912ab378e851e3d71224a517baa2f7752b422cb8ba60c8e208717ca30c4cdc32d7f3d1288bc98144e20038209b1bdb404eebfb6fc072f1206d9aadd4979e95dd7517374657386c3dc9e81933bd47bd657319f07dd29b63fdf2fc957719a81e5664f960954aaed5d1fcc06002fcbd72f712f55866124e6286fbd5f9" + }, + { + "signature": "03c36d76a3e04b9542f2e7a013fad50ca317114f1a73fe33f1ab4ae7bdd96395bb022619536db0d5cc9977a26693f54d5c530bd864af7a49976c6a124a69db15c1b91d0e91517ada9d2f386474267bfd9b46e8768922d0dab36e66212ea578add47b5a22a7ce5e0ce91966409491df41b724ad2a6b1929081da82b31fcc1e61a33cecb74e513c5ede341f2abb579517bf4bcc98a4d89bece056145b5ab41018d75e2" + }, + { + "signature": "029b2ec03ad05d0c32fe90965183258e8b0a534479f155a0524e542a19d1523bf9020f038f235b726474e3b4501702c3e52a055c39a2105d0cc12a2965f63f9449d9e833ae48901afcd2683952d8ca68bb61175f199bf43d3c1d03134ce23e30223efe3dee0bf44ca9fa49cd640f2f5a548b7d995b6bea53059a1f646f9e31b07ae8cc569a05bbab3b70f209344ea6e05b33a4bf508b99cf2c33c9807893150639fc" + }, + { + "signature": "024bca51dc5105137c48f973db1bdf8a1221d6ad2c4319df688fc5fc9b5fa84a310317303a504e028cf89b815ed8a93cafd7070a51511958b6834b36b046e4253130cb079453f37d7a6b2317e42d3d6ca9f181a339f7389f4e85078f43679dd429a0826f01e64d794865de703fcebf59bdafa6645a6a91ba00b39b88cc8d82395b1ec4e9c9a807c58146ca5da1660b76859dc0672ebeff66172eb1b1f5a9345823fa" + }, + { + "signature": "03ddc67cb2a0ea930f15382f38dcba8b31b5040f647e88b973872ec2fcd1fdddb30269ef3c2bad04a75cb0c758840ebe227985c3623f40c2c025818adf218048154da9646a1960fbafb910b3df693c6cc016003414a08ceec372e414bccaffcea3485510709fc655072c6a4d906983bcda6f41382343e0cbfe93f9bd349a9de3eb28e6c4f7b9149b22d8ed2f7e4bc4d4439b7b85c38d884ecaafcbafd7325c9d1273" + }, + { + "signature": "031dabb45d00140f35337367c55139360888339d219e047948387e30bcfb678ea802cba105d738bfa6fbdfcc4ce03b324471d2343cf2ee6958a0346adde7a77fb76d9326aa16c3b48ea04cdf8e6dd484cd38e6330cdd5681f4740262442428c46d01271454caf220a98bdf7ab62dd6408b5d7fabf8ad43d3a8c1463ae655ac7fc0e6b1a6edadf356352bb677e5ae0285c7d69782be6eb0233f3817f66a17ca665a8f" + }, + { + "signature": "03780089934d336d597b57f255f8092d7c90b0b9f65e7cf1b7dafa36d861e0256f03ae3b7a9ee26739d9a8d097d0b7bb6a12eb76eaf898e873b0dd1f81a92495cd236546910295ab5429e51a4934e92b0a6552ded658ef315119f8faf4314851ed68623325ba9e1a5e8f7c093e2603328a347d093fe8651fa74abd66be8173a719c0dfd975b633b697bfad4f10cc9be9da904924bb0160fc125f2af54e0a0b122ab8" + }, + { + "signature": "031fbf53d7b4aa170f40a9cbbe97fec761179ecf0b8370312dcb9c672cfc2fa9a802406c28e534ad45510d7b6379b85c7b127780b016962d6d1e8d55e5b7e2c1951ae49968e62951b13429ebd7989bac91f15b4b48a0675f1958bb28331b2f9a0d390468a7bfa449e402dbe07a5dc985ddc9d5b2327bcbb2adcd6b9406a7f45b0b73fad11c0b92524a74666d0817b00c4aceed64bab24ca6c634e11209feb8f5e09b" + }, + { + "signature": "020a4b38ec49e9f01393a7b811a0c487132303465b93408adafc5721c74474f3750214dcf51c7d3692a3b77378439bf433c6dc743078ba5aa8d25361a145f1355c874a85861e86f5f616f663669f5cd07ed2511177370c46eee245b0161705cc8cd921dcdfdac91744aeb50ca16192dd7a6b130ea3e4a1cce672ca66f965187bb15684b63d10048d2660de97b528fc03c32ec2fbb97aee4ec4d5fcbf7fe8ab063f4a" + }, + { + "signature": "0347858c84dbaa6bd58d3b255178c19d6c02009964b1fc9806d5c2af874991225e03a45e2e0e6cb4703b4924d2f0c245235473201a0b4c2c739c8d6c99b4a1c3676dd258642822142c5e336b6833becf80fedd104cd3b6b7b5fc0d5fba7742864029ff61f9b39e9e7f5890c935786d9ef054d3bb79008ae996c80bb5dc0f2b6f8bf1bb8f2478c1e4ee9807ad9f026976402437b7f6727b2aa138af09f4cd1159c8f1" + }, + { + "signature": "03287c8617c9cf6e2961985920714a6bac60f483d55bce3d6b077155d515bcab6e03b4ac97aedf6c87206d9f8cf74e688f0a5d87dc5650e3ee2e8e1cae5ab47837c471368130705c48bbe1bd94474ff7ff7eb32dad782aec3f06e3fb4ce47e2a0bfbd3ac103fdff65c707bb8723ecb96701180729ccfe0ebc7a60b8038b9dd0779746424710af6bcc82777a2d0828d90dc5a787b0ad7ed101812dbfc730b02f4a68e" + }, + { + "signature": "030abe1975033c5b7004419ddb8e74ab05412f713c7611a8f85e0a287b905b53fb027d1a13859660125087c2a9d2ae8ce1ad2f34e64bdb257a26b3adb141954937824ee516cb915545f6f40dc555a2498a45e1f188eb3b8a1c22ab224d58348d62463289491fd62b3adb9cf4516181edd53d74426c95ccdc8b51a422b66f3fd9a1dd674cd77fb3cd23a22c4c42d855616cc10c8c4415d2ec81ec5bfdcbc8d1a46b16" + }, + { + "signature": "039605699991051c9fa54b1015772e6cbe78d329712d957dd31627c53ddc27e16f02ec53e09dd49e57988093079b7f21669cef9a95d790c1dea95e2e8016ba611a9097ddcea578f9eb910290564d17a36ce1f4c6d1776593fca55d98c63346888a783c7b050dfdd16d28e0f422e63603b2da729d774c8fc83a6023dc71abaf76ac159ffc402002bdc6ccb1faa8d5099049f53d2d7cc97a35d03a9cc9730afa535919" + }, + { + "signature": "02db39efd702d5dc5cf8c04336f19bb5553a717dc8973608b0693cdc3f5ee62dee0370e02a3ec75a83d8d673306b8e3718405c0cca07e00497afa7b86d0bb91ea504ca7ce977303f3274f793e434fe05015a4387765feabc24c702e0eea7f623fdff4721b7e58ac4b0c102368d2f481631a056f665bab4342d29da6bd9e90df45a7f608c05756f160a2fda15f3d6d8dd36daad85db6ac1d064a4bd8cd115ba5ad643" + }, + { + "signature": "0287c96ffc2b8dab164afad70327da64eca08c5f13bf79ca03ffab2ac091fe3f4e03485624fd9880330cdf3cfddde575647b74ec6f5f466615c5605cacf67da5e92f2e6d4794a845e8e7b64e33b55ad742d5b604bee6a68c9c623248a7bb956d5526cc527de00e7a5b0a23a8d09c850d61e473878d551ddc201b4bcaa7b82664f24d9ed282373dfb9f3dfda207de53bcc8d86acf2c8e3cb252086ad3c4e29172a39f" + }, + { + "signature": "03c29d615d0921dcc5652445f19ff94c8f4e0870e9b65195f6207214a196560a4d031457383f1573286721b28185f2fe16dc0861eb437d979851d3af90e744aad2cadf8a98e28c2620391ab2610e6045863c6ff376fe1f548b2a02b773d85f1b9784d289c387f71001e34548bfe385aa60cf8d905cb8c0924bdbed9b7abee17443ff60a6ab95408c1e269a056116c61e056eb9aea47a6d1cfa84be0a8f409bdb7afe" + }, + { + "signature": "03e7a08bc312eb4aaa5cc78f71b6b46ad7d279d69576fde08cf5626093e21297f203d896215418352eb7fcf9fc3d85546b79a329c3c25d87039b24ad003876d23c16fad79c4fe99fb0bf024f9ca18e48ee4ae1c99e91a72a93b29321e834c75dd5b5ab5e09e8fa81685f64d41dd2c59377a8d914707ef4965b4c364d1982a9681a42fad566d01d445a74729cb331c665a3c9cd7fb94efefccf61074f5c997c2fae55" + }, + { + "signature": "02490844a3e075d720a3fbb6ffd523a7f70657137dc70198703b02970e8a0c7edb038c3a00eddbb18f539f0ff5d17dd070504acde6700181251f576c11623f2ec51d229b594d782f3ba3bbcf2e9b54eca5c7a14edac0540d2e209290edb6d997ff0b3333ac2ccba6e8e432ae715c6e31e53e06cb48aca35503a9ebdfca034ee62e158878f5d2d440607187d11ca0ae6dde5748070a1b172e8f4b4ad38725260868fb" + }, + { + "signature": "02a5102eb2f24c5e0d1875b7a16384c52cc9d4b5122827e947320b36601930d9d0036aab9cae518f903ac1607cfe4cfa4eb79affaa3424e074ef43332988beb34d83e78f6eba5d792359733ee0dc34461a0dd0cea26aa06fa2280b60557c2cf6bfd4d70a032261d95cb9d2f583bf802056f03fb17a02893f6ce6bf456ed08eeb6e4783b8ea13133fb7a6aa0646d5e3e970e73162d4a23296b642d00aeea776d657e1" + }, + { + "signature": "03eda7ee170bdb33634cc9cd7097f82bda42758fb04ae3b8c26789d050de52f7c602db880c6e31026abeb76841a4cfbf0c11ee15316656db322e9b7eae0fc890f8943d21ceaa0664e416f44f8c99039b29d990f08c3d617eec2d99d44eadeeea1526040d316576c7b9567be7e6baaf978c7b03d20e694fe443bbad0646ba2b886e3fc22b1cde75094b856b51eb698b88c2143f94dd41d583d8cb0b1dd3082935b8e1" + }, + { + "signature": "02fdabf7f2a41584de6ad73a74ea5059fcfc34ce9ff657916658e01e6be302686e02a352ab550887f0ab35f508866c04b063ec5882c2c9a6e7fb8e13984d6f3d43d42c441e21eff6525f58b7af4e8d2db35fadbf88f619721daff44ad47de409a62559e0aa6476cb21badd5bdf57e4edb2a7eeb1ac42f047bc2e5fff7dfba14ea8c1aee112dc4b939c6685cccd8212f271ac1a6c6a11a2f1bbb2d3daae88c2ca3e7c" + }, + { + "signature": "03238dfc607ff0f4e1fdde582e2deae89b12e2abc8cba338034d87321ce5af7cb6025b1cee83a752334c84f37af399586e292d18f390477dea73bdec5a6a135d9c6725946fb8115be2279c02b3cdb9a13a7177566c4a951174c9ff06df89c4b758ab8b9c61235efeb6f2b41254047f0b35d75b239608aafaf8bd87819bb8eccba2a15ee713080c53a8784f1c9fcc5229e710e70896181154693d29602126ec638237" + }, + { + "signature": "020e128991408d1e084163eac5e79c91c0d73abdea654d6fae97c6b3b2700e7a4a02ff7681971a8c8d43cbcfcf1f69300ee6825d6f4c9ee02497d7dbdcf80d93c409dacb66427dfc7430c5463cbb2e361abdd0ed2cb35f3704a7e4afb755fe40352f0486b0b647d8f9b7abbc009e0114c70a4bb4e13049cf68db92c14afcf83899f738b4dc37d5d24956c13c598bee053c3d371a3f76a8e25e80f53696427486b1ae" + }, + { + "signature": "03af54d8082a41a2c477714234dbafe66badae60ed8b0927ca93bc54d1c2058df30269882b61448c09675661b5925dcb52e1add5769879c2ff3deb2ea3dd8a6278e043cdc1d6b7e653c78e3759525ff5110395e3a50c9432582590cacd8d5e55e36409124e14bd5ff45ccda50b06fc5d925816a6228565abd0068f6a12ab750e57232fef856d8e036c017fd05aa0388a517e3ee595d50a675e18a7d8ef555b13c845" + }, + { + "signature": "03aae92b85b4a425da56b18b367867f7cf8d5488ef19bd8a662300bae25b89dcfd025046aef043200503db8bd8ddf6914027eb71b5623554db7aa4d143b85d203506026024bd719a5282c9217e7e763c3ff8f0237b251fbb290860c17fa755fd6f873e8211c5dcabfe36fffdc31f9027e771e800d5dd9c071bdb55bf68dd016768cf34826445b100395ce252f99b812f4f1573b18e073ce0646a2460ad18732df38c" + }, + { + "signature": "02f034e249c1b60a98b7a7ef128fbb0cc9aef331b9d03f847080bd9c0fb3847a3c029f2703ff1197f7134c26dc7384f5a9b0f9eeebdba11ba9559bf375da4b0a92f764fed7c19be11d7773265ff194e09715d002bb0b8711105ab75df9c34e9a2a973439060de9d88963e1c435901cd1e4aa637a1604ce64576c10c040b39fe5e73b4ffc6d7d303e3e9d6cb84ce489b3b72fcaae6083d77d11c319dedecfd9d03caf" + }, + { + "signature": "021b8a0008cff9ba8b11b7b03df816fbaa83ac47128685fa77ed39a479af4c30e1033b9616327e6514f49c3ae526e20ab5ee9b438d8338865921f825d26eeb0ea9f188199ce07b0f012f1de4d519d0bca8403ba660b3c718908c0e0b0a7c858888b02fa2ccbd761f4816c1eddd275f0f9fa01e371bc61f4ec33acad9c52b9a608ac37a6ebddfa8eb4eb917bd0b109c676077e82aa6a548d1484de3b5c431bc4d4919" + }, + { + "signature": "0204049ae0920c5c2785b96f0f5e0b6420e492421307e7805b0e1c0bd3abfcaf9202b9069cdc9e676f6f5e67cbfb766def4427f6d64af911cabdff0eba298d0a46ece832265d4e1727baaf7a49163e5b5a327171dcd136f9c4124a75dc4e79e6d923a465d52b85aa5b2b742dd4fb30d9d72d8ba3cbc770c7a692a44a6635828c53d6421c998ebb3eeaeb1ff21c9fac73629b15c551e6e73982a71480a83d5398c358" + }, + { + "signature": "038a66f8a73c93dda6815a84842978f19cfcb607e54dc1892dfd14efd2ac7301950260ff8cc7ca0e71537a6144cd20c77b88bae4b87ea949433d6015f1f8ec1b340407584c314824fbfb71a563a7edee221ed637a0b5c5383b226766ba4d0ab3aa94c2b3f1a4f51a9261e462293e4af379f198215266958b31137ac1f6a3e5bda220b8fbcdaa17fa10a02a19a761411c95042937e58ff77c703078b861dd8dbda580" + }, + { + "signature": "03f3cf7ff31c71122df9a12c36ac39dfd30a60032f160b1cd95a3d84bed4151c89026c215c0857bc2403f35a5c3baca856d50650dcc2b0226ea7bdc0cd9352ded2f1fcb029b6888f40ec63ffef8711b7031491aa3286db571ae0882bec7f27cdab39b466994751132656f1de96fc5b166c4d8c5ad457f1bad4b636d2df54b6b6944ac6ae8d77486f98dfc160f29f408dcfd7ddb53cb6456c88c8a74528b8961328d4" + }, + { + "signature": "03b83bead644420bdf883dae811c30dd2f7dcf0763bf748feb695cf51b5f92f2b502b130c31ded0e6328de5adf3e1c169545d206202de00f1d86661e9d3cb658275245ec0478bfc3421a9e0c8bbb5372da0d410c6c8420a2dd46002345a4d26c7fff4f9cb39d208eeb5c253385d9ecd8ad6c3b88430832028e3d03b62f51d4a22095d4214c768150c19b89d0fd1c5786e23b52cfc8d5228f16ff7ed9f126c12e1d68" + }, + { + "signature": "035864d007729b2ba0b4fec92453fe6aceea7f9af0c82462c358c1a7b5a9235430037f904ea501da12348b9d8a130ac5f16f863dc402d68278f677812d0b6400efe32e9c1487c99f3030c60f2c3bed053155eeceb3d0e9c1975c1663d114a1d21c49f79a794e720ce95880ecf4e69981da0f6af72b05f57e71ebc472043b462fcb5ce5ee84cffa0e1cd3e840dace9e2cbad22693014782bc00b38161d07f93b57927" + }, + { + "signature": "038365833757ed5b160c4596f32bb3dc85d1df3ac8dc2b3b13ffc8ebc0a970570002a93256106b0dfe69a08d68dc4b8d9f4994afdee432409b2f6fe2243d2ff6506cdd44bf528da1b14570280b37c43853062a30f1419b976b3647e531ba5df13f3b7260eb63c1a60d659615833b8e16966170fbc1937352d4fee86a1980d57a54cbfda405f6f6139839a8ec841347a8f0c9bc1efa7b00ee62d6bd38f826e557694a" + }, + { + "signature": "02a2b2d85c4811f95f79f4345785c61e2910bf5489a053b32f1f9dc34c799b76cb039cd6abebb82de5611abeee033da9a42f0e935aaf4a60494d1d1f9b2a91463a932b0d7e6f2926dde954aaaae6f50ced974bbfc5e0de7b5e8daa77d61849a99751ab2abbd8e9aa4305044c77c3b4b8af1e221522a08f8b013ac14696b30b3667e6cda402d32635eb75fd3739765b19a192a4ecb320422456a1e4d259ca01555b29" + }, + { + "signature": "0237e63149b7f87c3aaf8345fdaa92d239fbd3c4ae239d604b1a59a90e48eb19370295fbb4b7c838e9da750944c736b705c5498642b55c5f9190c7eab685e22edb54ac994dd98ab29deb9cbe8cbdcf2598753faf8cc94623c44b1e77a0954dc37694ebee532c3f220ca47d22d51066afe7fda721b14695df76ebbdaf581bd52a251b8b4706a0d622c22835bc2c0e446b50d8b5757e6d935c1ccf547cc4b4834e7de0" + }, + { + "signature": "0363954ff5ed0f9dc7e747d4edcb899947a1f19a2f2e3fca5acaf657c50ddad57f027f39bf6a1620545de927e7ac75bfdd37865d76525f751bb4f12bac0f922360e0afa0380a038637fec99f3141eda07976692e201b06e46e3ffe851918d1a2a62e5a161cd63f6f1936367f5efac40e886603e1b8c5e235712b535e036fbcaaf810ba09988233223ca037e602bc764293dc8a1fe0fb34e0dbc1bb96546c81e006ce" + }, + { + "signature": "03a30f6b2c9597ffd72a1e50224087dcac3a49ffb7c2925bb69a007b987362271802dba721d777e2710daff34b23badb51c19d4d90895d13c5c08da6069483edb542ad37569e2cfdb0146da4aa10f71479f56938b641e42b601c2adb499e45feb2be81f5906f2272051878947b95838af61d6f92e1b9f2d4f65a8f3b4198483b9246ddef5cfea713a47ac8c3a6cffb6cf3b5c8eb4756e275795cc94a9ce18c7111a3" + }, + { + "signature": "02e8740a33e65c021292e0c536b3a28500c507dabdbfaa31ce0cf7f006fdb1424303d48f6819a45b2232140da5f0d60040fcb7f04a76b9717167a9242254c0ea075bcafe7963e70dcc833511c98353cd4a2b811052c8006c6b1e9669e0f5ddded17a14d6c011bf78bd72ca794aee181cbc08c74b8299d7f353afc3149cb54e705498e87e74bf34adebee7bc5c64ea68e86668d1291ec2aa025658be028c3b1009b07" + }, + { + "signature": "030c18d757d7a1a9bce0ab05eb376790fad39ca54b352a6fa3737c05b16bc7b0cd03108f248488340c6db2ee40c9db0b1498a463417662ba35326776536015774406f4c047b65eb18a762aff9d67ef26b5eec9ad4db2132216cb38a6cdb778b4bbe75efd12e7755aaf6789c0c90d7347be6931678620bf65bed6bb6e5640fe2cb0a004fa0aa5edb9c6b51e3454355d0e7d5188736071240b332bb73241d9e7d4c8e9" + }, + { + "signature": "02171e5d0ccfd2e1787eef37d882db7c0a1ba0935ec3516ebbe73f3c897020beed0294edd53970421640bd0ab780487faf3cc51c2ee46ee7b57c7b8f6e1730a2d99afa981c04018d7b7dd416fcfd48c4905c76623b5649a21df45b625089c9fb2b0c9edb088dc3718c5d8cb72f6ab208ae2b9d7e7c7680e662a9c9e9fdc4952586913fcb65835239fbf78e26c1b7e8f3bcf6dd0117834a66c7f19f717e8cc3322538" + }, + { + "signature": "03cd7811e8a88c4612ed3d87307ebbde16ed4245a5172be3ade052ef8a084ab424032d7119ad56070c698b99a4fbb38b82ba1774dd50e735ca28384179c1ee205f86d3134bde0374a7338ac781889bb4eaa3625253986998f93765decac0a40ffaac2d2e0ece7bf66fa4e7516adbe0f160e9c4e65184154a641b8c8af33fb1ab3ad79943a55f6544a4a126f5ad959845831e80300008ad8293a447ce58530383f1ca" + }, + { + "signature": "03b78da2ce2a4eb52ffd51509fe12c53a0be7370f4c24e9d95e07a34ad28a05d0d0257ed1c3feebd5ed7c9745c4726c101c62bc3e44f22f3e16ebb81191a4cf511217f5a1f41b54ec0ad5b9c575e8456c732efd2a5e8993af37b34a33c12cb324198db9259f04666258a3478437ff0ad0e86041fee95c79e31bc43fc58c4ba400650b4064d5c52e86fb7869580cbee23a24b878e1ec1848431829d5f6842c3cea963" + }, + { + "signature": "032c3db6ca40049f2743711ebcfd838e5a6473b9ae13c3f65ccb2d40800253fbbd023eb9b03029f4a20a1451e5802cfd7c292962709ae4b8acf4b8eae6b794f2f36afc2f214404bfa22c8b1d8abc3302dfb9b91b1ae31cbd60f1d5e6401cbbc2ccc031054dc931a2102f51c2ca3d27a8b27a1cd0f43d8605c52d88f2139977402acc15e76542d097ef928c51502a2029cd89af2961a211bbdce15d61296b1084768a" + }, + { + "signature": "0335a38c29dedff0245c6267f5c2dbab18c541730bf35a07219d9f547f653fd2ef02bc7482bc838c7b73cdcc6fa8a7825e349e050653f001c01b2f3066680033531e395255aa00097b7f3ff976e8437f40147dcbbabd5137401b1b01166d7b41b43bba2f4a22de2f4be0074c1a3f856ac85b41a88912f382fa4c25a3605c2f5dff49776ad0ff434a474ad79988e5f62f1f93803048fc05fad892905ee61188fdcf36" + }, + { + "signature": "027d9a0f7eaa63db0f2df1ba2ad1b8c6e91b8d006b13b5afd5ca8dcd0538b9f7fa033081c68aea534eb674065415c1e1b95518fb4a000f2b6e95222884dfbffb9e811d0d1623568fb1fa07591ffe62df0030d46ba0f53f56f691d056e4210af35b7637a7d845754647d61abe372b8aa8cb7b03b95bdac5966ebb4d2ffa77e106d6666ebcc7da8efdebdd95be7763681a8bd7e7a2d8f5d5dbf0a13f8dad1304a994f4" + }, + { + "signature": "026106341c9f50f35d39821892e366b0e8b9ca84fd7f6cd580c249ee7dd9deca7e02924cf4cc93ae37c0cdf0b00e4c7fcdc640ad4dff6bba7cb227e8f5d861c0243a57ba67c857d284924a68c27b20bf542e3f1e77ca4288ce5c0bd69068ad06926d47fe56d3109e54a15addd0e3a647bed460ba27a5cb186d097d4593370ebb4b4392d2395b0df7a4854086e3bc5bcf8d87ff5efe08d6654288e90bc1ec9fccddee" + }, + { + "signature": "02fd40b2af97c72a3408d9814a0f8d556ce99dcba4ef41b617173dda57540251950254a42191c82049ac9f9e80c2e507289bd19a938baa48b081648e14a87316f7b9f92ddd3263054bcb9f64647bbc7def4dff370ffd0d796e1eb6d4f7f15c5e634d07d2b425efb4c47dec0d6d323256d63748bc2843ea51500a591290aeef2a35c54139840add72aadb2da51a94a50b15975bdc0dd1ac0e4437e8b1e5720fceffc4" + }, + { + "signature": "02ecc3a6f4d45fb8a659b9482f3e41890d8e3f3e741fa07a6edfcd74e165471bf703442e93c3011b7cc3a4559e7a3662d299bc0c78a19d0d132a2978adceb4c1b2d930c6175022e55db10f22702b3fc8fe9d81842ec0e7d189ab9aaf8295fc1b2cb224e0e056c2681e3f4d874de9e0624c5b3bce85cad4ffe24c96e5589c5bf31329fc3375b54e202367c13245097625a4aed407711d1e37ce10164e7c779f4fb8ff" + }, + { + "signature": "0297a536a106ee55c8e9c73b731a377f1459abff1310608f02b985d9950a25bcb403bc7331b0b6cbfe4f0124b23bd3d1b453fbefc4fe8e3c8aa9381256ec2a50489a72d4e23afecb6b920c2428d903c77c59748e0402e1ef06597b2cf9f52fe5792bbbec98a2092af2a2c470d53f845df33c1ddc639ba4e86e12b4afdc63b0b59f384d085a8514d4aa127c6d21c98538ffcadec13ef3e947da779d20a6a1a56af2a3" + }, + { + "signature": "02d3c7b48715408585570cfc88431c2a0bbe4732d50dea59373ff449500c11ecb70283007c9686f8d10fdd1ab22ad7b18f56134380bf87ab6ee94071c6732b5c26cba232bf3be6bb4d08d8a7c695683d52f916660ac7606a3d85d7863480923f54cee3d56739010ec06751fb1b9badba062d0cec08bce30d474facfc56fe095905883ab27c38cc761ad991486ea34ff1874d03b70f5f268ec55dc392f5752a68cdd2" + }, + { + "signature": "0250bc7d7286300cf45bad96aaf4b4d0d774cd7fb7af19592fa8b4231091de47a702b48b11ccc3dce525617e981980987b008f71452253e42d701a62ba6e839c2dceb36e0c317ff7cac8d15b03c3ef429357feb467d04659fd47ddc879d303b404ba18593a1bc01a6c19c36a45ef20827fbb7f1a6b52752332760b2755310e977b90ea2d47c425b3e89ce5352f8014048b84448ee1fb3a9b241dadc2fe1ac78c2e7a" + }, + { + "signature": "02e675706a659d611397332521eb38059d2bd20d9a474172b2b2f68cce60c772550385f2256b9fe0f1836533d3805fc0df70757e4995c10e85aa34d7b8541916174b29f5e3c3c5162c48b92dafd9c0882083b228790a59f1373af6b1c5ee28a0d2f74b4c0d78fca6836832877886cc75bf333fbea1308f4273d8232ef1445fca7665ee19f7728ddf57678b7ea44096b1fc10d862fa00fee532477b10027dd49a8f7f" + }, + { + "signature": "026a18b5d7777c2b30cf23137b475c91fdf7d4696705eb5bd0d55e45fa02bb945a02f1f6520340c96e32a75b99e0d5477eb4bdbd969ced07d9e0e5d733ce754169246c7cf05a00b0c140ca8607647b3c9302cf8bebcf7ce1ab6d893b34b078f25008eb3e5837f3ad831ccc20d59bcb1b90e57b70a13f3fad76a0541fa001f9f2d7cc63b5b7bd0cfb861f921394e938ea97ba056ac29c767c33cf36e6699eb67bed72" + }, + { + "signature": "023bd25dbc087bf7e0ad94fb16a504f6b9906288c6bc6406e293c200819b1105b103bd3cbeb2eebe1a07545d608524d5dcec337806f568141824e21fe666560b779a9868d40b807bc1ef111e3f58eb014fbe364476c7dc9c246b712bb77743f9c3451d275f15c94cca2bab8c5d0d9c5d46ee70d71eaf2986172d5a021d459dd4588a0636022784328bf36244ac5b18734040c3c1ad9c197521fdcaaedbe11dbe60e9" + }, + { + "signature": "0356604d7a123f621e6c71e056b4748791d95ae00244ae0f5a77fc630d48484a1002a75e8aa510a4904d2759778841d13db8d451670dc7c04dc4de3e7885c15727807864549ca815a9accc998a31bd7ab6e45e3e4f975132e1c3a7e72e3dac39e8d83af82d5fd23a020632d5e5184fad907109e943f80c9be9c5503dff1ec25c162daf92dfc510a9acbe5cb5146e4083eba562331524755fb77a02b63bd4ba642010" + }, + { + "signature": "03e7706f879f7c143f1834e53438baa087fb33ae2debb0a48b856b3bb4f537aaca03fb619e24ed90cae9bb916c168cbef1f77296a2b15095bdea246bf35f5621b50758045110378313ced45a0d2c23220dfaad256b7eb2768fcbd5aca8c01295a99df261e76b7c15e75847356e213c17b3048dd592106fffb32260d3c3bccf015774418cc711ec336b37ad434b78cab33d8af738c36cce8e0651a6301c657f3918ec" + }, + { + "signature": "03aadc1801889f9855b4cf0c0e25c6ca90bd4c442ffc3311bd0a4956c7692f650f020d631b842155004ad30491169214704fe070f4106bb132976c7743032fd9d2d21f6ae52b35ace707894e4359ddaec830bff67a74c35e234c2cd96248ff4b2f6dbb7f1add414d6455fdc2624c36ba196523d1de6f6043d63a854c8642a1c68927eae6ab0d617a2e47a80702dd2a837732d4d110288d486e1e26f8cfaab64b1f35" + }, + { + "signature": "02b0ab7e95e763d42c62dd857445d6ca0d0607573292d18f27cfe8b431e2111289034b8dd8138dd45484294658314b67250396aee45f74c2a9844e95db6139acfc016afd29978464f5e9203bd2e90675d6da196a14c93c53efcf4e72f43b915a822f89ddde58224adefa7ccbd23819d779cfaa3e81a33da639cc4f68e8a97ef706f3401083b8b6f3f4c2b58789010bb2f7f8f74aa34688271e7056cc94a2a78fce19" + }, + { + "signature": "0335aa3ee4060dcc7198469da52dbb3e651108aaae209075755767326db2b61b93036d5910aec22d7a80a042a5fbfe9277e19fbf3d443cf009afef0d81d91b6e41d5619e74ac64f6f9ea594373c0c57e8a0b64f34f4cbec3a0a0c30efda9598a04ee2397c3516684fd9e3f6ebe4d8c80255589d29cc6dfaa2eb40f3ba109bcef56facd5974091ff3a5a88f42a9d3c72688d6791859e923ffd5477820bd48dabd0160" + }, + { + "signature": "035ddbc0e00e537fe2dbe2069f97c47fcdecc5103cf51f125d61b1d37d5236d43d03f2b226630148a65e58f3ee0f6d3a876292de679f6db0553f47f72fe4d893802f1693aaadab7b4658d5adb4c57637cb168a2e4c7023625e8c87cc9161b7212c1b0f23ebbab613cbd92199ab24b9ae3ab21d1f2015d58cfa74792587be21d41f83adecc45e830109417aec5f6128356f91fed7719bc4e47db855c4405f6eda8449" + }, + { + "signature": "02e2ab0565e5fe33fd40833893569df2f0673ffd0967b3395c83087e6a3605455202b3c840f5f5b02af14efb96d9b415bb271e9e52d3632ff3b0b18181b65b470986ff40ae346fb8c7b25f1ac31cff40da40227f03153eedafffa93a73cd8b57381fcf81aaa4ed3a0f0037d1f522ddef88ffd11ec6521bcf7627a281f386ce0adaedf2ecca4adaf8c074c976cedd3f97d8570dca0aad78dae9856f16fae2aed5a815" + }, + { + "signature": "03d2c31bce896f6385c4fa5a122c7b13b2e1b1866433e22b135d32fdac4d33473103a03a971fc681768ad7e26b30b682e18815161778ea0759cb3ab6dd587fd5aee8fbb6399c2046232c62cb6a94066d5e88c6e8ba8ef1d960ce1d2cb159be46c925ac9d03080de51a05b20c08057e39bd90e4022793f1d9db173f7dbd6ae203910ac64c7b0344ef9acc5adec53dd72b073b00eb509f4279423f0dd61e60936e374f" + }, + { + "signature": "03db3e64d3cd2230a8c42d465619f11f0c87f94b1a2aa04c5211577ff7e26b739e0203b53e57a583a7b26d5acdb9a9d8058b889a9a7e4a450b2e8ee7b729a19d56912a7f7e4c702c9ece4d2f73cc1296ce4439fb14bc87f3026c615e0594fb9fe5c656c5dfc8f0f5cbc6349edb4e2802b80b88f9310e92c78182d2ddc3bc236bfb7f6acde890ced2131b214b416a24f06db7066eda26795f3a5e20b65ba587510c02" + }, + { + "signature": "03575c19332733e7b72249d034510eba65d389cb30163677b137aa16ea2aaaade4034303095ea4a31bb7de798d1d2848fc604985f7f05f8f39a75bdedf8c5759a510e1c6c3bd36756db6cada04ec1fe82b3e70d631aa2dcc05b469f077a53b2fc7e16fcae52c8c38e15c5b2623cb276d37bb5555c2d465fb80e8a76d457104fe4aaa3ad4be34ec69415ff5a9417cea4d35a9ea5a5e8c1a4dc4c573d007f42eca74a8" + }, + { + "signature": "03e024d8ce876f4a9d421409759a8b812b4b6060ba7ed9528249ef2b51b893db0e02c6f5802a3dfc76bb754dfa75b554a86bd74089b2f7875b2c09bd004950e253fd8231c61977f80be801c68fa06bc0312422c3339ae7a533cea2788d779942be3172d50e12b06cb87a91fc23fa0cc8352b3a1ab6849f136f3bde9e60124ecae5c20bcc942a3f70043051b3e5bbbeca3401ddcded259b05bb53fc6576994473e131" + }, + { + "signature": "027f44ff122d7555c2563172d6dea4d2edb5caf05bf01525d13b75b9a0fb2762cd037a5ce9f34ed2c777d35af21500ddf629e25aa73648d8aeec8da72bed570caeabbf1fae4a4d718e051c6634bb08a77654a70c38f410dd91120c5ce3560dae58f192797b9eea3fd04ca94387f2671ccf74eac579251aa1b9c995a54dba04356b73692333d0bc90a3b24a9a0a1420be5a6da8972cdd2fe3353082499f199dcb4fec" + }, + { + "signature": "02dc9fa3462402240743941699546a0dd22be44f9776540fd921b65227694e24da02d02d5bbb123fe6c88d4d593cebeb7b336ccf2a4ac91de9ea5623e1f76a39aefa0320e45cdbb75faafdff8d5d91020e5a385d0f8b13e9e12d73d2b02c4f02899820b4b48294b5e5fea9432cb2518e7b226a72396b6b3f1e8a8c6b7c05c4fd633cdc0337d98589d24b9ac4307b6d9ce526c1d58a5f6e0d99fc285aff18e8f93c13" + }, + { + "signature": "022a725a04e0e034922cdf4fd6ff76b477fc745464ecc4978df304de36845a2d9f03a4aa2925631d6f5c6ef712efcff5dc34ec65463afb498c420754b84b3ff513c19f661a7998c84ecbea160054dc76f1ba1513c16c29c25d4cdc0d3942c79cbd953b6ad1f23573373ed3758a82f32f9a215cdbb9073a74cf49a36957053d4d5f3d9ecd9039bed20d86ea90cb4d5706afe6920972cf4d8d62e074f1a64847e30d8c" + }, + { + "signature": "023ecffc0fb5998ef4fb295a4c1f21659c3d5573424d8c59f254391adbf61bdbae03312fe9bc16335f38fd376b97d15e68d941a31ae8f66346695410fcd9414f78b91831a61aae1a05701330d01c61dfb526bb5e0afc615314daefb2a414d89a46845ba385ad3c410c86a6f6919e1137269c45fd6fa291f9cca29d38f04317364e4dae1dc0b8e06112238f50d897871c2fdc5746f132974f23d5a533cefffa9a62a1" + }, + { + "signature": "0326a5205aa8fc63a5da05427727d5fca1ed5e24e3962eb24e37e6b47f1946967103e1c8828eddb94bea5525ef76cf6300b478526eb314cab3bdec59d4efec2123c35375718daa4381965e20a9429507dc250403551b0d1e18ea1868a4b93622307eff86b7ca9503f71cfc912466b6e825817d842e9e7c831fa6561c9ad27fc13ac42662a55349c86feaffac86a1d77f1b4ec8d9bc8f98c4ba7658ccb310a2c511d5" + }, + { + "signature": "0280b1cb35f977d89266386a5ff9cf8024c4819f0d0d402161856623650124c0cf02a8271b76dad303d1c72da5a0db62567063ecdc1151d21f33f52241cf2099408eca6d6714f52725bf5e392d12c22253137ca61eeeb8aadd950b82aee14eefba112019f413877d53624ba6ac3c01f466a385b0d0ab34e7ad00adb9befb06361576413fc937445bcbb01246775ae5dcc3312dc531acb3c4ba2926ea76d623096fe8" + }, + { + "signature": "02b456751657a73528f961677fb683cb3602d658d9d04350fdb6c1063dba427b6d031f929caafc712c100536ac0aff2fc59fc581c79f0267281f4c6373a3be135ab050b7d255364e2e551a124ef762d37616a2c9c54606d96a6f141c7c82dd6bfbd240cdc442c37a9179af5bd45d7b1f2654f89f7744bab7b8ef4e69532167a3318ca3859ecfb1749884d3ca17dd3e88bca5c0fb1e00be38d6237f6ece011e7a0bba" + }, + { + "signature": "026ba035d3ef3a5f6381a3c80f44c7d46100e65754b41688da9f8349c94685153d03ef41489e7b04dedf170f36448074bbadbd13235862e634fd6e3e90d30dcca72287fdea7f69ec736f61c7a677a1b3aed9e5b8b06cc786898a125061f3e3a6487495d4ff8c17b276f0a2b0beb1b920c3a663f62d512485382637dbd926906b52285a675bab574bf4ee3c40cd2afbf7069b739589ec89b377762f8baf17095b0cec" + }, + { + "signature": "02cb81ba606602da0f7a6524db89d9857bd297accd8da477151d807be3ac91a6fb03348b6b66ee935fa93c34a24cb93dc0d52397cd32ee18f43762933a742ddb812e5f434bbef3c867c3f64b57dedc844c701e4ad650110b558a167d268921b75b1d67d5f6f4d75cead0ccf2d6f1c1fd9e091e73810c2553d9e68deaa193e9b557d1ecf32a379e75ea555f68f245f0be6e4920cf52ad311a1cf0289351aacb2bf25c" + }, + { + "signature": "02e390eb77a64967982ca4acff6f632742caf5030689eb8057ad520a4d699d9c6e022b4b7200a321c762c5016845cfc8aae23450433043fd5bb976a7a9db3eb1a362dc1a5ecdc3b2dbaf597daf0bf69e76122de7d5f0d82e2f882ac91bf0a84f3c6de7dca752c2c39f302d3fcac0227c4053298d3d96bf1736c0ed4069215d9df49b88c34db6fa4f1a3403b437b1ce489d8a48ab89aedebbbc7e1e0647d7bdda3bb4" + }, + { + "signature": "02ddd0be22acd22b59cfe93e7b122c73a93f1e02f42c1c6bc3b3246f1bb18f2bb302022ba74b56faa21476c6d3265765ebab8f68f44f174922448dfb1f1ee0cba5b515a512095e0992681451c44f1a90158600305d836533a3ae22a7a1ab8737f1a18de8f46cf26fe369f631df46d5adfff684fcd1250dca208d10fa3992eda6704ea6c7ed91daafdba804d1d907d30c66fd127d900d6c4e298552a1feedd85ade22" + }, + { + "signature": "022ea17afc9fe79b5e34ab54d9d7481231fca8d92dd5562951e3a5ae8d26b0532c0236cc16a227b33e4ce63d18ec875bc1de41407ba2a6e131e458ec8d608a5b0554367682462ad095fac1d477c7e24d5bd3c200370f17b7dab5471f644623328d960b93faaef4333abde9f61695ef486879054f5702c8a45aed9dfbf855e567d93b64bddff07d1e19c139cebfaa9449b1bc0df5d34b020accf34fa2987403f09709" + }, + { + "signature": "02266062e102f23241a1714c7424a2ebe0e69a2567cdbbcfb0e75739ce1a3327e60397cd3ea6fa434afe259d6bf60d729331d6236b2991252c72048fab69f6d4a6df99b1f59e43f43f3c2b07409a58207c65e8f244c039e6c1b539eb8e4c86e97c7a484f74ee0c7aeae4554240aa394e6de8e631daa53a896673691249cb6389acb4a9ce03a94e5e4aa02921833cc086865895372070716a1c2873c5e38ca03f2654" + }, + { + "signature": "030b4908e6ae2f0c90b7612276b369252a5d1a01e9c5a6c1db32d7de0ada4ede9c0357ecca8675d89c1bcd582b3587c88e1587cd9657bf20dd2954dd9cfdefcd7bdff926c93754808f630723f2acd81c3fe791fc70e10eaf25c47cd61134745156d145df059f966fc94ddb3ca01e336d78609de8a18d694904563679ecf5857e15aeac22a5deb5ea2a85ceaacac4f96492d03c80cd0cd8bb703264f5f7bd9bfcf803" + }, + { + "signature": "036519216a2ad7bebf1e70b12d98e3c16bf326f44e1b1c69d231e9a5d1a0b6d38e027ba0e9864f39476f076ef4ec11aa1b21b1ef5391ef4c8c63eed31753551a0816fd839a80648ff2f3a50930ef84175b163bd69125ffda9adbe3590c6ea9b26c1f74f12a31b2f7d155436e95b86dd2b1fbea62ee2682f1428f1c8d5f530cd5c34b325ca4f8596c0cf877999beae01d5a9e9910f2144263c33a250bbb4151f91bec" + }, + { + "signature": "02247827bff8fcf068e888738d09be330fbd0ac27607b7476e6a440734069dd6690364a0ee53cfa0df54cca68f1e12cb92900f6de81f7e0cf5198df42f374aef88b1bca5841e61d19fdd0944f01cf38c08337cf29ec603421544dc82fb8058014ccef0a5fe060cba1e424947571e1dece50f12538a757695114ebcd7ad223c650447defc43af7707a1dc750825aadcf925dbae5dbd1f29e516ca9f64010364c46eef" + }, + { + "signature": "03df01c7873630c17588627968d7fcb8c280f7a0874fb904049ba5fa755e98681e037ef36b2fd83b98bac6990e6d52ef555f3b8baced1f4b2292054d76768e035d407e588aed91e4f59bb20c1e2ad14eec1ada8fa03eeb12cd9088842ab395845d31f998b48373a38b323c44ca1a57d9b9014039de88b215f5b54ee8170fae27991675f2db3673371bec8534eb630d774d1305072916038cca8aa0a1740541fe943a" + }, + { + "signature": "035b8f78a76ae7b03e8f466f1999982492609832803e26dbf3d97db6b62eb847070375806e6562447bc022122389696c837d8908933d3d85716f51940e754f366cca74904219e2e707e9720304bad19d42401d6ee3c1d6d74a66656d8df05bc40576ca6c17484279d291a0f8e18f98314b97c4aee1cc21ff5bb6084bba097724cbad95091e77392a50709ca0ba398671497f84f50cf80f6a5a3d763f129a4f237a94" + }, + { + "signature": "034d37551bbed3c642cb1f13ce151b07f3c5627abbd7ea823517a67532d5f1b1250340602c3c631c0d0299777712ee03bb0246e5839f0a4fc4c41ac750283f1d157fb7500c143e390ecdefea92888e20a487c2223a981dd23e73ffedeb9d99f47e5ce75f2b492d8f1393104c6655e9e73aa621f12a38d9f65e22d2539bf1c55711213e3bad77668d2e82ea2a0710bc805eb923b8b39959f3f032e3f36f4079278bc8" + }, + { + "signature": "032528c57ee33a4c6f8db0327e92f7d275f96cfbd3b8633451b7a3c419d6774b4703226ff163b786d44ba35fad8026f0b36040cc937cb508556be3943bf69b170b958e5bf034b4d14ed91355385d116d776b75bc60b429b27fd2fcedbc659ef8d2ce375899f1bdc63c621a9796c033bf156302b22d0aebdebe2cf164d79e8539a26983071b847ae4c56832f6c02f3fa8383aef45985f3d324d16ae80a9558ba97806" + }, + { + "signature": "03b063d78c059067d6504d5a741afe4289ea230a08a6c8900059d4d41e221b2bc00388aafbb8cb4add361e98001abd938040471154cdf8abd79cd61061110cc7e6ed2f814c7fbd5ebb923a05461a76b4508801f022bf548d0b3698d114113ce44a3b0d18af0723975df20950986b20c0b833292a28490e6e932ff1bea9b1cfcfa961ab16ba697d8622ed9c367e32c3ae8a00bf475f1f7045cc9ab116b0137e69b5e4" + }, + { + "signature": "02415ce55c258596484cfffbf0cfdb94865e280eb6191281106d3d23f75c237cfc03b0c38fabb52673cd928d06e7ad59c76509bee703dde507d1c3e978849ebc14fbbf10408d4ae490809a18df0c5e2e77bde9194de07a565fba5f9e3933c09b02b25bad6161177c86d2280bd539ba4b2e003062a1b9dd4ab86bb099776abfa6ef7bb8807c6aa1b6f5483d0d9d97f0d97023a64fce71892ed1d1db8f5c0f36f7b6f2" + }, + { + "signature": "0204bce60baa331c5ff1e6fb7d0cd733c9a75ba0b2a277b2ba5de4dadbcd16d2e9035b4dc7ef8f9a3f83878d8a1e4203f0cff88644c85045b751b6140df70a11633c9d9142bbe1e18de436d46cdc55665ad8c73ebf4982de997cd8f2020d2f59d977348fdcb2feba82f82d9bd50a06ae924d41dbe85da2ab259aacc633f1ac781099cda89de252de79834c2bd8e4a5fab1c13e258e96b0db0add35ab1e2efad0925a" + }, + { + "signature": "03b9c79ca1d81a3a784726179f4e2c58aeffc674568ec3da5d74e1e39f9442dc1202dea953eafd5ba5cc8a27d910d265e072d950a610422cf7bcb93e417ab68e734fa7ba63af2246140eb14d976997d88c4098144ebee6b4b7b9a5894e8420baddab8a26623d76c41c98ec9d6e49bdc42d894a645feda454dbe50a4f5a6518c240dea713cd3d5831909d1ec4cd5f5444f7e5bf688cd26c73ce72c3312c04ca34e972" + }, + { + "signature": "02bdae4b2f6c7a5728d9566ff03e81becefb6b0c96f27eee23a7488827ff096ca90305dbdcd545503f46951e1c9b5176529b2831e4633648e52424f3241acef5384cd212b8f2ae977c241997b940e62d372f1a14e25686e17dfb53a2a74d8a295812e179e2fa3d06dd795087bf92baaa379e2e7888a0caeafccfc0c0462e09555e0e3e8e70619abe4c242fe756f6afd803123a4c96c404695fc32780259880160123" + }, + { + "signature": "0345fb03c6f9f1944859d3e1497c6a9634adc773dd1216cff8814613735942637b03966a9d2d6f7bfcd9513c00b8e3f2da8af0c371ff3a4e769caccf9abc1048ccfee7e2b461f2e42a9b4fc89f83a4cff0b11cf4e23e9d1b0808d184d4158280c03fa7ff6a4247d3c27e72cfec55a56c8ba1149a15bad44ab6cd7935b3e46c98a3cc281c692d867c15fc52ea7062a7779bf76e0d63c8e819e0b38a72ee59f729089c" + }, + { + "signature": "038445e68001a29b226d8125af0476298f1f05b723c63a75cd1ba55721b86aed1a031acb18189dc6284e38820035ea7630f63803347cc7b5cff474ea62850966d7a3da874b2b4a05bc9f43d69fa07ee9f7e66c16a3c504f19c21722ec55f7d8a6dc46cc09d3339c1a9bcaad045fef6b2f96c71df3923a7395f8096d42923bb76335635eecbade078d470db89ae08b1ce65b24e75f1eedabe4b991d89a28c3bb5ad96" + }, + { + "signature": "027ea502d06229f888f291a710e9b3bfde53fdb759d85ede18481d3704de78db3702dd7fb65d65dc70e0a4029f2b39c63073827ea90b4bb94bd2b91aa00fd9c283d3e9c4444ca9737fcd83dea93c967ff2d2ff2347e49fa7d0cf61f138a5ec920c8a13d8eb7830e737f4a6904fba67c125d4d851eee65e3f740070058144bf9c8ca0502e21500160fdde3f8e1b4a8c70400018799e64c050b63ee9593b79232d295e" + }, + { + "signature": "02b16548096721da187256c6de59b506ed2e06c0afabcdfb51222d96b9d755fabc032dae132f2e8ea49257fdae96a65a1c90b7a8d94107b5cff360541a76606586b75d0fd4f5da796687d812a7b1b7bcd04d5650aceb65efa642a210d0aaf802f2aba9f5c01d950dacab75ed16e0679ec96b410eaae6c3b5c61145067f8838c4b0e8ecd26fa49688e8986333eb1d7d4cb547c9d8015587c34731c124c822f9174daa" + }, + { + "signature": "0357594e1895ebf950588b575b98bff57316e499637d056493f917f1d9817c97910239994c939864639ead1400cd4b53061834e037bda00fedbb1935590223c4ad4d61841bef54c7bd255a99bcb55d7ab47b71d2dffdd6d229dd384f24541aeecb48c4ab001422146f6a07229b0aab8764ebf50a865b27bbcc6d63d5d21336432ff376a57ced3f5eb5258dc1ed85fe8eee417368b0ac80e824ef333236374d250369" + }, + { + "signature": "02b0765bb098c368162a76c0f6c97349c4849d846c3c69ba17be6d01288f3c365b023ceab4d11eb829cff14350d1bf709c8ff49e1833adfd26e5fc50643330398b3d8e034c94fddc93a97fe6fdacb2635ecbd27ec0114ac357c7a121ed925f7e06f15e37602d501afeee3dab789bf451222d326f5f9798acf24b97fcfbcef84e24654d95f91eafe19bc0f07b8a77fe22de81c93165d2d167181fbd1fd6c1fd4b2d3f" + }, + { + "signature": "021f235643cbd93965ca6936235f6b5971d8c6e05f1f09c39d0a8c67284b8d1556028a7209337fd2e2b20f0fae7d174dbef5bed022a0c76348f74b5cc9e3fd09826d9f412f43fd38762fb9b5021492d413dd33237516c11d678cf865c2df6bb4f87fdec0706a04faa7208013fa7b94d0f3569f0ba405d6f608537e0b7efbcd7ab8b8f72e03e095d1e78e873d4401628b79091b130e53c2531b176f69d90b0b938c24" + }, + { + "signature": "03be9416732a86583acbf277d4e96a7345075c556b1e0acb1096bfbc3d96a9831003ad591c26ee0ea1e65536e8ec28f832ed3ca69cd71b04870fad6512d418f619cbc2f9dfe61c9adbc7cac5a351c070528a24d68c073102a6fec70c87667d112503a456192b61e72477bf15ba81c4e4604bbbbefcfa49193a110a6874644bd7a2150bc9b50f6a87601598a0da357bfe5bbeef9c8f7dbab1a5b522a33e8acc39664c" + }, + { + "signature": "02d240d31465e971122484c921ade5f0a3ce2bea579717115500bd01ff67a08aa002daeab8cd98c051c41d345e35b46e8bde151b3672512827e11ca9d3c1762c263ec919d76e58058e74e036822de6f668fbac9f32d42eab15d5c8bd06e2eaeee2f1db55082f980bee0084c2fe870f556e1ff336ebf0051355b082e07fb7535db3d9b97e340a0e711305c9c9a11eb08448b3096e4457cbc9a06fa323f70d84b0d63f" + }, + { + "signature": "03c1fb8b4fd7b2da38dea2212e39048141a66eed17bae26485bb979bd9eefc029303d537a6b89498c2e661cba1bf7fd5f0796346ab539b585bc81a5c03dae917d73f2f3785b9bddf87cab6ed6bf8db8a9e0299ec6212878df378c3d5a9b0daf13aafee79daaf08f612d93a9a43a4194cde2fe33e8814d72ea32abc6d097a4cdda596c909f66458b8db812b8f2d5b1559761b83fd29144337fc5a62c57ba978caa8ef" + }, + { + "signature": "03171c6ea4c9db7bef409232b9f12f111bc9579c685972a5471a7958e705d748cc03793917a53f2b73e8b6252943e5838bf9651193e17daa0413aebced6e129b712d6b086c14bdeff8041f61d7be7122896eb777efdda563c76b7c7f302e4446f9bfdab972fd101c8303c9d7f7d0c7db927f3e40286288048702c0a46b7408bd54be6871e6bfc812bad7200262d30b9116d90c0e5ead055b4abdadfab53d9944e2f1" + }, + { + "signature": "02eee518913e53b271ac562b69991975fef49b6fd4bb176de8bcb1b453415e508202b992ca2c47cdfc19346db6eacfa74f347fcc5bb9a63d8637198bb15c83d5763d7bed506b994ddac5d45fa5a1249819aae311ca4ff32232be4b079a9f8cd9547dbea87b4a734804a4a98455a914d4b7a473095b215fb81a3d9bf39e137e2e7e3fd6e3bf0c3ee7576ee52f9c2f2ff1d031d53143e62cd2fafbdbf62799f9e2a6e4" + }, + { + "signature": "0329247252f24928360c01dd637432dcabdc2f86a08e23ff7b0d1f20f01bbccbec020b47bece5c8c97e0df8c6162acb4aa38a820aa058e244b06a44917cca736f142ff21af3dbcdc31ea0f8813c5e8402691f917e9ac0f4e30eed25a2c456edd24ef1ca2cb67d52cff58a8feec563cb09411d50195877f4cd3b0a279fdbc9501b18916b7e11d7abf709d66136cbce3263065d5580ce30649b90dc2ce4bb5f338c286" + }, + { + "signature": "023eec66a4f1ecb4de7c22c37648731378ede724f51a4ded08480bf1f8d6f89950020d317d749f0b5f17f842c57a2f105c43bdac1d46e678e393bea5f61adb11bfef2e044fc64b9ba1046e668018f13bf97c944b8890583beb672edeffc6e9e51610980f05bf8a265de7efea3e193c7952d4bbf9c18b072157208c1962e812f86d50c1085e1ab2c6326a99c6fca5e7c4e0a0f9bfd37c308f4e768a2698fcae306733" + }, + { + "signature": "0303c51491301f4170485c54bceee3e51a39615afe352c4fd9fc49ad20ed468cd403318b163b5a211bffb354082f049a54e998944487a3eea53fd0b3fae908957e9c2b52b33c79e66dad0ea651d4653a98e53ef78226d47e6f0587fc0936eb3564616b7f459686491414cd5b8e49ec02a0de0121274890e6dad9013adf467b7bd6f8cfd52e03d5af61fb6bee8add25ced626fc74651dad8bfbb1651cb208c8408aef" + }, + { + "signature": "03eba0e45eeb36a493b26b40f9a5e412e15ee17a15922ad8498185837801fc5ca003f5c73bfc2c4afde24a0f10fa52d057b183e88ee663618a0e48f952f8553c3feee162e162eb183fe3368af046646318fec92bf2e404e9b7e9d9da1f8e507d5b74a5addef184030179b4526af23015529caf485211d9ae7144288a6e1ce0f01d31f4f30d9141fec366328947691e41fedb16463d415cc895dac602548f2123af19" + }, + { + "signature": "0262efc7e21f8ddb97772cc512316a4ca22139f36511abf69eea4b2df89a25525503c49e73a4c24bf2f636816d593b7825f97fa2f9b0fb739b231440f755b9fda5825ac693c815130ed1c5fe8cb438310eac96134effc715917b8ae8bc5f414ea774436ecddf789a734922935deb33df2f0e61f01107491f2612fb6f4354dc4470f1c55d1ceac6cee23b17e3c346f2a19de89502e2703c46d212931c9418f20bb8d8" + }, + { + "signature": "03f377756545c7b18edf8d56ffdbf564d14c1e9d46d192a989095780a2f1b6714102400d6b2861bff212cff6a4183db4564368451b7df97b6adf74aee671ef9359e18f07067eaea42095037cc64b4b15085f6b53fdd8c9f007d4432e891b201b2e0fe43e92db93c8d38f5f0e06f5b1f28bf69627c9013a17bc68e8e3fc15606476d8e33163c7c65882cf7bade269bbceec07c22963a04a29cd8e22e191ee62d9a09b" + }, + { + "signature": "03425492adcb0efcec1167ef2cf15018b0b0c5e6d0e386c409de6dacbdd7ad8eaf03485a9bdb1d3639cad9f70c59a20e4fe518b9ee508b2d963088c03152f10017727a6ba5c41157e5ecae8e22200b4eded979a3c1fe3ec02b003c1ba960eeab5d153c05a8171b828e1366f510155583d460b3d7ad447433282fb52d205de169ad453186072ea2cbb5b0545c0b2ac1d34de3550f3177224094337525cd46282755ef" + }, + { + "signature": "038b6443a3896509d7472031e00cae08b10c4151bf42926f16eb4e2e37d39054d2032659a42b85276d9398a285323858e5235a4dab639e84900b7910ac775318dc6146f7d72473464d8377c59311e30cf908a428245b82e01201a9f87664d3018751a3d84749395548747d6fbd4e423e24646eb2cf7a72b89ec8bb129cb2083a7433ad11a44268c9cddc143bd376a7d90df6e4694a5dd3f341361172f7181ddd8a8d" + }, + { + "signature": "02b775422a321ca705b11e71fd6902d565c637aeedfaba4cc80b2a8ea3456b524a030b5e9603fcb080350ef761a53fa53d5e65777c44e723e7910297bc3885872c266c2e42d40928cffa4458d48dc3f0cc7231af622013994b68aacc0bf25fcccb60a82f34a5388812f12fe3ac9865c35e2dd12c61263a630ab9858b750c1e17e59bcb4d8ff832711238a6d6e0d052ad87a83ab0e7d83414a92bcb1a05348967a4d4" + }, + { + "signature": "0286c3716c9cd7afb75b9091ebac76fc3bf887ada41b20dcea6cabf8f401032f9602b6644a45fa5d6abdc40d6fe26f220c7ae02cb5fa4d821b75322c59ef80e0971f873d6ac555b39f12da8ad98f68152e31d61958c62c3d3327d2fec5546e8b7ff1c046bd06c6557e70717d4610f6d6de532e1addeccf01fbe893ea9deef026eedd72da43428a5a68dc8481659178500e9bee6b3d47cf6199a3166f758909e27cb7" + }, + { + "signature": "02aa44bb080456bfe65aa8eb983c930f3484c0b2cc0425b2e4d9a5d03a39226f2f02971c4d0042856dff7af319aeccdc34abcf30ef7ff34aad9b594484463c20ada7e1fae89ceefef4f2c827c9f39575ab57b91dca2e24f6ae12c057f3db7c46a5d014ba2aee3ec8abbf5e66f7b82882cf2ca1f919c1dd2d7a21e7e8a71591aa2d922df7657f713479bbb888ceee850a89674f54b3ef8c7b64076c2d8c9399d5798c" + }, + { + "signature": "022058e69c219ca350af323e696122127410262f077e4a35f57e25dd46b95acc9c02e22735442f27156ce4e1060298aeaeec84193fc5f5b286f5ea48a5604ab2d0e8ea9fe1604912314f8cc77e469f9248ff989a954da14940f8c91aea78160c5b471e06ef67d1eb79319a93af231e4726fc8e346dd54f8e57ef0a83c9c11c6addcedd21bca7fe0e9197d204383fceb4e94f466e8be3f186383a2b5fde941e8e44c2" + }, + { + "signature": "03773d10fe9d98b68971b1e102dfd9c9ba9c67b863e279c5ecc97304f5655d5d4f0338189ae69b6feeda0a7766421d4f0addbdb27968a70a0b6ecbba5ee0e9af01b4ce1746c34f98cdb265cb39afcf25647a277fbeac8b3107a67bf77640420a25b0183e0be38ed757819acbf5cd36db59a90867f801aad750f3e2f21a0c229c977768e61b4df5ae8931643ebaf58a59026fde0639f0ba6ba375ccc8466f50cd5ec1" + }, + { + "signature": "03a60e39d437be778e9e8d928aeef1ed8b14503f7e6629bb4e05baeedcf10f9cbd0385888187c193bb64d9acaf3a49577e946c8225c9fe5f9e12c027bc8f1c14f88fbc0ae4c2ae94fb31847b17d2abe6e211100f4c1721c7cfb5e0ab0347075ab4a43c15754578c78f98d4c2102f0a1e890f63cdee73f587e43ec070995da45c92faf48c45b9043532dd1d01c3c6f6bde6523ca415566f9dd3f15124ce0310b4db6a" + }, + { + "signature": "038987ceac2918bf22b41477385964cc9a7cdd72b78af4385e08ae72fb6152bf10036cb5764fad778e4bd60bcce4d5da441256eea96e3622731f3072007f05e9cc7db720f4372cb58b3ed474758e3aa812bd4e83805d447d34f53b0dd5d7012f9f88b7308041c7dc11b3e0a367be0b90e03f9a5a98b9182d22dc48fc3e9afa37da1ddd334e68e4a122210fa7e98a80236a84a043280bc9c5fa8fa5ccce58514c9549" + }, + { + "signature": "0229345aeb5d6f10e210f5e7fa12cdaeab71e55c926bba94c31391b65b0754c711038829fb59b014a3d68b5c3aef968e94cac411e2d7ae6b3600cd688c96b12284d8659f55ff87552ddce1795bc9d36e3bbc05b4286e5d4bbd2d6966c2a841f3acc3ca57bcfea577476673210fdbd1cfac94388df88953581d5d16411bdbb2615e0a3b0e0456b05845271fffb6f6a55f9162013a3b2628f61d9409e00ad21f5be574" + }, + { + "signature": "03ac496b78bdbf1147a07190d73f41991ad6428b5cffa90db7a472414736ffd42c033f98cd196d865c4177c261b133c9717b2112e79aebabcd46a452c3a3675fe4954007fade5b9c77321c77ed9075f575bddc6fa4cb7d0254ad52b0aaa78a2a9f334ab23d1e3d55dcc50c0b569b33c34c47d057407050f3324f9fffaaf2e5329e8a99826e4041dc58e162466ece8d19d3bae1e2ba9407583988ab3228aab5b8c117" + }, + { + "signature": "0260a56fadcc0b139ae199e2538ea5eff47c7fec4bd3ccb9ce12eed5c11c05fa630362b1b4adea5b1cc0e2535e62d16ed1a8b629f75dddaedc71651ecbd4ed38525c9229205d72d71daa181988fdf784eaf22cdb0bc069255f5744ce6e732115bc69f9d9db5ea9335970d08b75784edd515d613f1c8002bb5ab4e94c2be246284bd6999512c523d124452d864a8fd923feeb1c90c7268e175ae6ba37607b24296f74" + }, + { + "signature": "02f00e6c805da4cb385bcf342674575fd9a632b88a3d449a9eff32ebf32de0490802030065d708912ab378e851e3d71224a517baa2f7752b422cb8ba60c8e208717ca30c4cdc32d7f3d1288bc98144e20038209b1bdb404eebfb6fc072f1206d9aadd4979e95dd7517374657386c3dc9e81933bd47bd657319f07dd29b63fdf2fc957719a81e5664f960954aaed5d1fcc06002fcbd72f712f55866124e6286fbd5f9" + }, + { + "signature": "03c36d76a3e04b9542f2e7a013fad50ca317114f1a73fe33f1ab4ae7bdd96395bb022619536db0d5cc9977a26693f54d5c530bd864af7a49976c6a124a69db15c1b91d0e91517ada9d2f386474267bfd9b46e8768922d0dab36e66212ea578add47b5a22a7ce5e0ce91966409491df41b724ad2a6b1929081da82b31fcc1e61a33cecb74e513c5ede341f2abb579517bf4bcc98a4d89bece056145b5ab41018d75e2" + }, + { + "signature": "029b2ec03ad05d0c32fe90965183258e8b0a534479f155a0524e542a19d1523bf9020f038f235b726474e3b4501702c3e52a055c39a2105d0cc12a2965f63f9449d9e833ae48901afcd2683952d8ca68bb61175f199bf43d3c1d03134ce23e30223efe3dee0bf44ca9fa49cd640f2f5a548b7d995b6bea53059a1f646f9e31b07ae8cc569a05bbab3b70f209344ea6e05b33a4bf508b99cf2c33c9807893150639fc" + }, + { + "signature": "024bca51dc5105137c48f973db1bdf8a1221d6ad2c4319df688fc5fc9b5fa84a310317303a504e028cf89b815ed8a93cafd7070a51511958b6834b36b046e4253130cb079453f37d7a6b2317e42d3d6ca9f181a339f7389f4e85078f43679dd429a0826f01e64d794865de703fcebf59bdafa6645a6a91ba00b39b88cc8d82395b1ec4e9c9a807c58146ca5da1660b76859dc0672ebeff66172eb1b1f5a9345823fa" + }, + { + "signature": "03ddc67cb2a0ea930f15382f38dcba8b31b5040f647e88b973872ec2fcd1fdddb30269ef3c2bad04a75cb0c758840ebe227985c3623f40c2c025818adf218048154da9646a1960fbafb910b3df693c6cc016003414a08ceec372e414bccaffcea3485510709fc655072c6a4d906983bcda6f41382343e0cbfe93f9bd349a9de3eb28e6c4f7b9149b22d8ed2f7e4bc4d4439b7b85c38d884ecaafcbafd7325c9d1273" + }, + { + "signature": "031dabb45d00140f35337367c55139360888339d219e047948387e30bcfb678ea802cba105d738bfa6fbdfcc4ce03b324471d2343cf2ee6958a0346adde7a77fb76d9326aa16c3b48ea04cdf8e6dd484cd38e6330cdd5681f4740262442428c46d01271454caf220a98bdf7ab62dd6408b5d7fabf8ad43d3a8c1463ae655ac7fc0e6b1a6edadf356352bb677e5ae0285c7d69782be6eb0233f3817f66a17ca665a8f" + }, + { + "signature": "03780089934d336d597b57f255f8092d7c90b0b9f65e7cf1b7dafa36d861e0256f03ae3b7a9ee26739d9a8d097d0b7bb6a12eb76eaf898e873b0dd1f81a92495cd236546910295ab5429e51a4934e92b0a6552ded658ef315119f8faf4314851ed68623325ba9e1a5e8f7c093e2603328a347d093fe8651fa74abd66be8173a719c0dfd975b633b697bfad4f10cc9be9da904924bb0160fc125f2af54e0a0b122ab8" + }, + { + "signature": "031fbf53d7b4aa170f40a9cbbe97fec761179ecf0b8370312dcb9c672cfc2fa9a802406c28e534ad45510d7b6379b85c7b127780b016962d6d1e8d55e5b7e2c1951ae49968e62951b13429ebd7989bac91f15b4b48a0675f1958bb28331b2f9a0d390468a7bfa449e402dbe07a5dc985ddc9d5b2327bcbb2adcd6b9406a7f45b0b73fad11c0b92524a74666d0817b00c4aceed64bab24ca6c634e11209feb8f5e09b" + }, + { + "signature": "020a4b38ec49e9f01393a7b811a0c487132303465b93408adafc5721c74474f3750214dcf51c7d3692a3b77378439bf433c6dc743078ba5aa8d25361a145f1355c874a85861e86f5f616f663669f5cd07ed2511177370c46eee245b0161705cc8cd921dcdfdac91744aeb50ca16192dd7a6b130ea3e4a1cce672ca66f965187bb15684b63d10048d2660de97b528fc03c32ec2fbb97aee4ec4d5fcbf7fe8ab063f4a" + }, + { + "signature": "0347858c84dbaa6bd58d3b255178c19d6c02009964b1fc9806d5c2af874991225e03a45e2e0e6cb4703b4924d2f0c245235473201a0b4c2c739c8d6c99b4a1c3676dd258642822142c5e336b6833becf80fedd104cd3b6b7b5fc0d5fba7742864029ff61f9b39e9e7f5890c935786d9ef054d3bb79008ae996c80bb5dc0f2b6f8bf1bb8f2478c1e4ee9807ad9f026976402437b7f6727b2aa138af09f4cd1159c8f1" + }, + { + "signature": "03287c8617c9cf6e2961985920714a6bac60f483d55bce3d6b077155d515bcab6e03b4ac97aedf6c87206d9f8cf74e688f0a5d87dc5650e3ee2e8e1cae5ab47837c471368130705c48bbe1bd94474ff7ff7eb32dad782aec3f06e3fb4ce47e2a0bfbd3ac103fdff65c707bb8723ecb96701180729ccfe0ebc7a60b8038b9dd0779746424710af6bcc82777a2d0828d90dc5a787b0ad7ed101812dbfc730b02f4a68e" + }, + { + "signature": "030abe1975033c5b7004419ddb8e74ab05412f713c7611a8f85e0a287b905b53fb027d1a13859660125087c2a9d2ae8ce1ad2f34e64bdb257a26b3adb141954937824ee516cb915545f6f40dc555a2498a45e1f188eb3b8a1c22ab224d58348d62463289491fd62b3adb9cf4516181edd53d74426c95ccdc8b51a422b66f3fd9a1dd674cd77fb3cd23a22c4c42d855616cc10c8c4415d2ec81ec5bfdcbc8d1a46b16" + }, + { + "signature": "039605699991051c9fa54b1015772e6cbe78d329712d957dd31627c53ddc27e16f02ec53e09dd49e57988093079b7f21669cef9a95d790c1dea95e2e8016ba611a9097ddcea578f9eb910290564d17a36ce1f4c6d1776593fca55d98c63346888a783c7b050dfdd16d28e0f422e63603b2da729d774c8fc83a6023dc71abaf76ac159ffc402002bdc6ccb1faa8d5099049f53d2d7cc97a35d03a9cc9730afa535919" + }, + { + "signature": "02db39efd702d5dc5cf8c04336f19bb5553a717dc8973608b0693cdc3f5ee62dee0370e02a3ec75a83d8d673306b8e3718405c0cca07e00497afa7b86d0bb91ea504ca7ce977303f3274f793e434fe05015a4387765feabc24c702e0eea7f623fdff4721b7e58ac4b0c102368d2f481631a056f665bab4342d29da6bd9e90df45a7f608c05756f160a2fda15f3d6d8dd36daad85db6ac1d064a4bd8cd115ba5ad643" + }, + { + "signature": "0287c96ffc2b8dab164afad70327da64eca08c5f13bf79ca03ffab2ac091fe3f4e03485624fd9880330cdf3cfddde575647b74ec6f5f466615c5605cacf67da5e92f2e6d4794a845e8e7b64e33b55ad742d5b604bee6a68c9c623248a7bb956d5526cc527de00e7a5b0a23a8d09c850d61e473878d551ddc201b4bcaa7b82664f24d9ed282373dfb9f3dfda207de53bcc8d86acf2c8e3cb252086ad3c4e29172a39f" + }, + { + "signature": "03c29d615d0921dcc5652445f19ff94c8f4e0870e9b65195f6207214a196560a4d031457383f1573286721b28185f2fe16dc0861eb437d979851d3af90e744aad2cadf8a98e28c2620391ab2610e6045863c6ff376fe1f548b2a02b773d85f1b9784d289c387f71001e34548bfe385aa60cf8d905cb8c0924bdbed9b7abee17443ff60a6ab95408c1e269a056116c61e056eb9aea47a6d1cfa84be0a8f409bdb7afe" + }, + { + "signature": "03e7a08bc312eb4aaa5cc78f71b6b46ad7d279d69576fde08cf5626093e21297f203d896215418352eb7fcf9fc3d85546b79a329c3c25d87039b24ad003876d23c16fad79c4fe99fb0bf024f9ca18e48ee4ae1c99e91a72a93b29321e834c75dd5b5ab5e09e8fa81685f64d41dd2c59377a8d914707ef4965b4c364d1982a9681a42fad566d01d445a74729cb331c665a3c9cd7fb94efefccf61074f5c997c2fae55" + }, + { + "signature": "02490844a3e075d720a3fbb6ffd523a7f70657137dc70198703b02970e8a0c7edb038c3a00eddbb18f539f0ff5d17dd070504acde6700181251f576c11623f2ec51d229b594d782f3ba3bbcf2e9b54eca5c7a14edac0540d2e209290edb6d997ff0b3333ac2ccba6e8e432ae715c6e31e53e06cb48aca35503a9ebdfca034ee62e158878f5d2d440607187d11ca0ae6dde5748070a1b172e8f4b4ad38725260868fb" + }, + { + "signature": "02a5102eb2f24c5e0d1875b7a16384c52cc9d4b5122827e947320b36601930d9d0036aab9cae518f903ac1607cfe4cfa4eb79affaa3424e074ef43332988beb34d83e78f6eba5d792359733ee0dc34461a0dd0cea26aa06fa2280b60557c2cf6bfd4d70a032261d95cb9d2f583bf802056f03fb17a02893f6ce6bf456ed08eeb6e4783b8ea13133fb7a6aa0646d5e3e970e73162d4a23296b642d00aeea776d657e1" + }, + { + "signature": "03eda7ee170bdb33634cc9cd7097f82bda42758fb04ae3b8c26789d050de52f7c602db880c6e31026abeb76841a4cfbf0c11ee15316656db322e9b7eae0fc890f8943d21ceaa0664e416f44f8c99039b29d990f08c3d617eec2d99d44eadeeea1526040d316576c7b9567be7e6baaf978c7b03d20e694fe443bbad0646ba2b886e3fc22b1cde75094b856b51eb698b88c2143f94dd41d583d8cb0b1dd3082935b8e1" + }, + { + "signature": "02fdabf7f2a41584de6ad73a74ea5059fcfc34ce9ff657916658e01e6be302686e02a352ab550887f0ab35f508866c04b063ec5882c2c9a6e7fb8e13984d6f3d43d42c441e21eff6525f58b7af4e8d2db35fadbf88f619721daff44ad47de409a62559e0aa6476cb21badd5bdf57e4edb2a7eeb1ac42f047bc2e5fff7dfba14ea8c1aee112dc4b939c6685cccd8212f271ac1a6c6a11a2f1bbb2d3daae88c2ca3e7c" + }, + { + "signature": "03238dfc607ff0f4e1fdde582e2deae89b12e2abc8cba338034d87321ce5af7cb6025b1cee83a752334c84f37af399586e292d18f390477dea73bdec5a6a135d9c6725946fb8115be2279c02b3cdb9a13a7177566c4a951174c9ff06df89c4b758ab8b9c61235efeb6f2b41254047f0b35d75b239608aafaf8bd87819bb8eccba2a15ee713080c53a8784f1c9fcc5229e710e70896181154693d29602126ec638237" + }, + { + "signature": "020e128991408d1e084163eac5e79c91c0d73abdea654d6fae97c6b3b2700e7a4a02ff7681971a8c8d43cbcfcf1f69300ee6825d6f4c9ee02497d7dbdcf80d93c409dacb66427dfc7430c5463cbb2e361abdd0ed2cb35f3704a7e4afb755fe40352f0486b0b647d8f9b7abbc009e0114c70a4bb4e13049cf68db92c14afcf83899f738b4dc37d5d24956c13c598bee053c3d371a3f76a8e25e80f53696427486b1ae" + }, + { + "signature": "03af54d8082a41a2c477714234dbafe66badae60ed8b0927ca93bc54d1c2058df30269882b61448c09675661b5925dcb52e1add5769879c2ff3deb2ea3dd8a6278e043cdc1d6b7e653c78e3759525ff5110395e3a50c9432582590cacd8d5e55e36409124e14bd5ff45ccda50b06fc5d925816a6228565abd0068f6a12ab750e57232fef856d8e036c017fd05aa0388a517e3ee595d50a675e18a7d8ef555b13c845" + }, + { + "signature": "03aae92b85b4a425da56b18b367867f7cf8d5488ef19bd8a662300bae25b89dcfd025046aef043200503db8bd8ddf6914027eb71b5623554db7aa4d143b85d203506026024bd719a5282c9217e7e763c3ff8f0237b251fbb290860c17fa755fd6f873e8211c5dcabfe36fffdc31f9027e771e800d5dd9c071bdb55bf68dd016768cf34826445b100395ce252f99b812f4f1573b18e073ce0646a2460ad18732df38c" + }, + { + "signature": "02f034e249c1b60a98b7a7ef128fbb0cc9aef331b9d03f847080bd9c0fb3847a3c029f2703ff1197f7134c26dc7384f5a9b0f9eeebdba11ba9559bf375da4b0a92f764fed7c19be11d7773265ff194e09715d002bb0b8711105ab75df9c34e9a2a973439060de9d88963e1c435901cd1e4aa637a1604ce64576c10c040b39fe5e73b4ffc6d7d303e3e9d6cb84ce489b3b72fcaae6083d77d11c319dedecfd9d03caf" + }, + { + "signature": "021b8a0008cff9ba8b11b7b03df816fbaa83ac47128685fa77ed39a479af4c30e1033b9616327e6514f49c3ae526e20ab5ee9b438d8338865921f825d26eeb0ea9f188199ce07b0f012f1de4d519d0bca8403ba660b3c718908c0e0b0a7c858888b02fa2ccbd761f4816c1eddd275f0f9fa01e371bc61f4ec33acad9c52b9a608ac37a6ebddfa8eb4eb917bd0b109c676077e82aa6a548d1484de3b5c431bc4d4919" + }, + { + "signature": "0204049ae0920c5c2785b96f0f5e0b6420e492421307e7805b0e1c0bd3abfcaf9202b9069cdc9e676f6f5e67cbfb766def4427f6d64af911cabdff0eba298d0a46ece832265d4e1727baaf7a49163e5b5a327171dcd136f9c4124a75dc4e79e6d923a465d52b85aa5b2b742dd4fb30d9d72d8ba3cbc770c7a692a44a6635828c53d6421c998ebb3eeaeb1ff21c9fac73629b15c551e6e73982a71480a83d5398c358" + }, + { + "signature": "038a66f8a73c93dda6815a84842978f19cfcb607e54dc1892dfd14efd2ac7301950260ff8cc7ca0e71537a6144cd20c77b88bae4b87ea949433d6015f1f8ec1b340407584c314824fbfb71a563a7edee221ed637a0b5c5383b226766ba4d0ab3aa94c2b3f1a4f51a9261e462293e4af379f198215266958b31137ac1f6a3e5bda220b8fbcdaa17fa10a02a19a761411c95042937e58ff77c703078b861dd8dbda580" + }, + { + "signature": "03f3cf7ff31c71122df9a12c36ac39dfd30a60032f160b1cd95a3d84bed4151c89026c215c0857bc2403f35a5c3baca856d50650dcc2b0226ea7bdc0cd9352ded2f1fcb029b6888f40ec63ffef8711b7031491aa3286db571ae0882bec7f27cdab39b466994751132656f1de96fc5b166c4d8c5ad457f1bad4b636d2df54b6b6944ac6ae8d77486f98dfc160f29f408dcfd7ddb53cb6456c88c8a74528b8961328d4" + }, + { + "signature": "03b83bead644420bdf883dae811c30dd2f7dcf0763bf748feb695cf51b5f92f2b502b130c31ded0e6328de5adf3e1c169545d206202de00f1d86661e9d3cb658275245ec0478bfc3421a9e0c8bbb5372da0d410c6c8420a2dd46002345a4d26c7fff4f9cb39d208eeb5c253385d9ecd8ad6c3b88430832028e3d03b62f51d4a22095d4214c768150c19b89d0fd1c5786e23b52cfc8d5228f16ff7ed9f126c12e1d68" + }, + { + "signature": "035864d007729b2ba0b4fec92453fe6aceea7f9af0c82462c358c1a7b5a9235430037f904ea501da12348b9d8a130ac5f16f863dc402d68278f677812d0b6400efe32e9c1487c99f3030c60f2c3bed053155eeceb3d0e9c1975c1663d114a1d21c49f79a794e720ce95880ecf4e69981da0f6af72b05f57e71ebc472043b462fcb5ce5ee84cffa0e1cd3e840dace9e2cbad22693014782bc00b38161d07f93b57927" + }, + { + "signature": "038365833757ed5b160c4596f32bb3dc85d1df3ac8dc2b3b13ffc8ebc0a970570002a93256106b0dfe69a08d68dc4b8d9f4994afdee432409b2f6fe2243d2ff6506cdd44bf528da1b14570280b37c43853062a30f1419b976b3647e531ba5df13f3b7260eb63c1a60d659615833b8e16966170fbc1937352d4fee86a1980d57a54cbfda405f6f6139839a8ec841347a8f0c9bc1efa7b00ee62d6bd38f826e557694a" + }, + { + "signature": "02a2b2d85c4811f95f79f4345785c61e2910bf5489a053b32f1f9dc34c799b76cb039cd6abebb82de5611abeee033da9a42f0e935aaf4a60494d1d1f9b2a91463a932b0d7e6f2926dde954aaaae6f50ced974bbfc5e0de7b5e8daa77d61849a99751ab2abbd8e9aa4305044c77c3b4b8af1e221522a08f8b013ac14696b30b3667e6cda402d32635eb75fd3739765b19a192a4ecb320422456a1e4d259ca01555b29" + }, + { + "signature": "0237e63149b7f87c3aaf8345fdaa92d239fbd3c4ae239d604b1a59a90e48eb19370295fbb4b7c838e9da750944c736b705c5498642b55c5f9190c7eab685e22edb54ac994dd98ab29deb9cbe8cbdcf2598753faf8cc94623c44b1e77a0954dc37694ebee532c3f220ca47d22d51066afe7fda721b14695df76ebbdaf581bd52a251b8b4706a0d622c22835bc2c0e446b50d8b5757e6d935c1ccf547cc4b4834e7de0" + }, + { + "signature": "0363954ff5ed0f9dc7e747d4edcb899947a1f19a2f2e3fca5acaf657c50ddad57f027f39bf6a1620545de927e7ac75bfdd37865d76525f751bb4f12bac0f922360e0afa0380a038637fec99f3141eda07976692e201b06e46e3ffe851918d1a2a62e5a161cd63f6f1936367f5efac40e886603e1b8c5e235712b535e036fbcaaf810ba09988233223ca037e602bc764293dc8a1fe0fb34e0dbc1bb96546c81e006ce" + }, + { + "signature": "03a30f6b2c9597ffd72a1e50224087dcac3a49ffb7c2925bb69a007b987362271802dba721d777e2710daff34b23badb51c19d4d90895d13c5c08da6069483edb542ad37569e2cfdb0146da4aa10f71479f56938b641e42b601c2adb499e45feb2be81f5906f2272051878947b95838af61d6f92e1b9f2d4f65a8f3b4198483b9246ddef5cfea713a47ac8c3a6cffb6cf3b5c8eb4756e275795cc94a9ce18c7111a3" + }, + { + "signature": "02e8740a33e65c021292e0c536b3a28500c507dabdbfaa31ce0cf7f006fdb1424303d48f6819a45b2232140da5f0d60040fcb7f04a76b9717167a9242254c0ea075bcafe7963e70dcc833511c98353cd4a2b811052c8006c6b1e9669e0f5ddded17a14d6c011bf78bd72ca794aee181cbc08c74b8299d7f353afc3149cb54e705498e87e74bf34adebee7bc5c64ea68e86668d1291ec2aa025658be028c3b1009b07" + }, + { + "signature": "030c18d757d7a1a9bce0ab05eb376790fad39ca54b352a6fa3737c05b16bc7b0cd03108f248488340c6db2ee40c9db0b1498a463417662ba35326776536015774406f4c047b65eb18a762aff9d67ef26b5eec9ad4db2132216cb38a6cdb778b4bbe75efd12e7755aaf6789c0c90d7347be6931678620bf65bed6bb6e5640fe2cb0a004fa0aa5edb9c6b51e3454355d0e7d5188736071240b332bb73241d9e7d4c8e9" + }, + { + "signature": "02171e5d0ccfd2e1787eef37d882db7c0a1ba0935ec3516ebbe73f3c897020beed0294edd53970421640bd0ab780487faf3cc51c2ee46ee7b57c7b8f6e1730a2d99afa981c04018d7b7dd416fcfd48c4905c76623b5649a21df45b625089c9fb2b0c9edb088dc3718c5d8cb72f6ab208ae2b9d7e7c7680e662a9c9e9fdc4952586913fcb65835239fbf78e26c1b7e8f3bcf6dd0117834a66c7f19f717e8cc3322538" + }, + { + "signature": "03cd7811e8a88c4612ed3d87307ebbde16ed4245a5172be3ade052ef8a084ab424032d7119ad56070c698b99a4fbb38b82ba1774dd50e735ca28384179c1ee205f86d3134bde0374a7338ac781889bb4eaa3625253986998f93765decac0a40ffaac2d2e0ece7bf66fa4e7516adbe0f160e9c4e65184154a641b8c8af33fb1ab3ad79943a55f6544a4a126f5ad959845831e80300008ad8293a447ce58530383f1ca" + }, + { + "signature": "03b78da2ce2a4eb52ffd51509fe12c53a0be7370f4c24e9d95e07a34ad28a05d0d0257ed1c3feebd5ed7c9745c4726c101c62bc3e44f22f3e16ebb81191a4cf511217f5a1f41b54ec0ad5b9c575e8456c732efd2a5e8993af37b34a33c12cb324198db9259f04666258a3478437ff0ad0e86041fee95c79e31bc43fc58c4ba400650b4064d5c52e86fb7869580cbee23a24b878e1ec1848431829d5f6842c3cea963" + }, + { + "signature": "032c3db6ca40049f2743711ebcfd838e5a6473b9ae13c3f65ccb2d40800253fbbd023eb9b03029f4a20a1451e5802cfd7c292962709ae4b8acf4b8eae6b794f2f36afc2f214404bfa22c8b1d8abc3302dfb9b91b1ae31cbd60f1d5e6401cbbc2ccc031054dc931a2102f51c2ca3d27a8b27a1cd0f43d8605c52d88f2139977402acc15e76542d097ef928c51502a2029cd89af2961a211bbdce15d61296b1084768a" + }, + { + "signature": "0335a38c29dedff0245c6267f5c2dbab18c541730bf35a07219d9f547f653fd2ef02bc7482bc838c7b73cdcc6fa8a7825e349e050653f001c01b2f3066680033531e395255aa00097b7f3ff976e8437f40147dcbbabd5137401b1b01166d7b41b43bba2f4a22de2f4be0074c1a3f856ac85b41a88912f382fa4c25a3605c2f5dff49776ad0ff434a474ad79988e5f62f1f93803048fc05fad892905ee61188fdcf36" + }, + { + "signature": "027d9a0f7eaa63db0f2df1ba2ad1b8c6e91b8d006b13b5afd5ca8dcd0538b9f7fa033081c68aea534eb674065415c1e1b95518fb4a000f2b6e95222884dfbffb9e811d0d1623568fb1fa07591ffe62df0030d46ba0f53f56f691d056e4210af35b7637a7d845754647d61abe372b8aa8cb7b03b95bdac5966ebb4d2ffa77e106d6666ebcc7da8efdebdd95be7763681a8bd7e7a2d8f5d5dbf0a13f8dad1304a994f4" + }, + { + "signature": "026106341c9f50f35d39821892e366b0e8b9ca84fd7f6cd580c249ee7dd9deca7e02924cf4cc93ae37c0cdf0b00e4c7fcdc640ad4dff6bba7cb227e8f5d861c0243a57ba67c857d284924a68c27b20bf542e3f1e77ca4288ce5c0bd69068ad06926d47fe56d3109e54a15addd0e3a647bed460ba27a5cb186d097d4593370ebb4b4392d2395b0df7a4854086e3bc5bcf8d87ff5efe08d6654288e90bc1ec9fccddee" + }, + { + "signature": "02fd40b2af97c72a3408d9814a0f8d556ce99dcba4ef41b617173dda57540251950254a42191c82049ac9f9e80c2e507289bd19a938baa48b081648e14a87316f7b9f92ddd3263054bcb9f64647bbc7def4dff370ffd0d796e1eb6d4f7f15c5e634d07d2b425efb4c47dec0d6d323256d63748bc2843ea51500a591290aeef2a35c54139840add72aadb2da51a94a50b15975bdc0dd1ac0e4437e8b1e5720fceffc4" + }, + { + "signature": "02ecc3a6f4d45fb8a659b9482f3e41890d8e3f3e741fa07a6edfcd74e165471bf703442e93c3011b7cc3a4559e7a3662d299bc0c78a19d0d132a2978adceb4c1b2d930c6175022e55db10f22702b3fc8fe9d81842ec0e7d189ab9aaf8295fc1b2cb224e0e056c2681e3f4d874de9e0624c5b3bce85cad4ffe24c96e5589c5bf31329fc3375b54e202367c13245097625a4aed407711d1e37ce10164e7c779f4fb8ff" + }, + { + "signature": "0297a536a106ee55c8e9c73b731a377f1459abff1310608f02b985d9950a25bcb403bc7331b0b6cbfe4f0124b23bd3d1b453fbefc4fe8e3c8aa9381256ec2a50489a72d4e23afecb6b920c2428d903c77c59748e0402e1ef06597b2cf9f52fe5792bbbec98a2092af2a2c470d53f845df33c1ddc639ba4e86e12b4afdc63b0b59f384d085a8514d4aa127c6d21c98538ffcadec13ef3e947da779d20a6a1a56af2a3" + }, + { + "signature": "02d3c7b48715408585570cfc88431c2a0bbe4732d50dea59373ff449500c11ecb70283007c9686f8d10fdd1ab22ad7b18f56134380bf87ab6ee94071c6732b5c26cba232bf3be6bb4d08d8a7c695683d52f916660ac7606a3d85d7863480923f54cee3d56739010ec06751fb1b9badba062d0cec08bce30d474facfc56fe095905883ab27c38cc761ad991486ea34ff1874d03b70f5f268ec55dc392f5752a68cdd2" + }, + { + "signature": "0250bc7d7286300cf45bad96aaf4b4d0d774cd7fb7af19592fa8b4231091de47a702b48b11ccc3dce525617e981980987b008f71452253e42d701a62ba6e839c2dceb36e0c317ff7cac8d15b03c3ef429357feb467d04659fd47ddc879d303b404ba18593a1bc01a6c19c36a45ef20827fbb7f1a6b52752332760b2755310e977b90ea2d47c425b3e89ce5352f8014048b84448ee1fb3a9b241dadc2fe1ac78c2e7a" + }, + { + "signature": "02e675706a659d611397332521eb38059d2bd20d9a474172b2b2f68cce60c772550385f2256b9fe0f1836533d3805fc0df70757e4995c10e85aa34d7b8541916174b29f5e3c3c5162c48b92dafd9c0882083b228790a59f1373af6b1c5ee28a0d2f74b4c0d78fca6836832877886cc75bf333fbea1308f4273d8232ef1445fca7665ee19f7728ddf57678b7ea44096b1fc10d862fa00fee532477b10027dd49a8f7f" + }, + { + "signature": "026a18b5d7777c2b30cf23137b475c91fdf7d4696705eb5bd0d55e45fa02bb945a02f1f6520340c96e32a75b99e0d5477eb4bdbd969ced07d9e0e5d733ce754169246c7cf05a00b0c140ca8607647b3c9302cf8bebcf7ce1ab6d893b34b078f25008eb3e5837f3ad831ccc20d59bcb1b90e57b70a13f3fad76a0541fa001f9f2d7cc63b5b7bd0cfb861f921394e938ea97ba056ac29c767c33cf36e6699eb67bed72" + }, + { + "signature": "023bd25dbc087bf7e0ad94fb16a504f6b9906288c6bc6406e293c200819b1105b103bd3cbeb2eebe1a07545d608524d5dcec337806f568141824e21fe666560b779a9868d40b807bc1ef111e3f58eb014fbe364476c7dc9c246b712bb77743f9c3451d275f15c94cca2bab8c5d0d9c5d46ee70d71eaf2986172d5a021d459dd4588a0636022784328bf36244ac5b18734040c3c1ad9c197521fdcaaedbe11dbe60e9" + }, + { + "signature": "0356604d7a123f621e6c71e056b4748791d95ae00244ae0f5a77fc630d48484a1002a75e8aa510a4904d2759778841d13db8d451670dc7c04dc4de3e7885c15727807864549ca815a9accc998a31bd7ab6e45e3e4f975132e1c3a7e72e3dac39e8d83af82d5fd23a020632d5e5184fad907109e943f80c9be9c5503dff1ec25c162daf92dfc510a9acbe5cb5146e4083eba562331524755fb77a02b63bd4ba642010" + }, + { + "signature": "03e7706f879f7c143f1834e53438baa087fb33ae2debb0a48b856b3bb4f537aaca03fb619e24ed90cae9bb916c168cbef1f77296a2b15095bdea246bf35f5621b50758045110378313ced45a0d2c23220dfaad256b7eb2768fcbd5aca8c01295a99df261e76b7c15e75847356e213c17b3048dd592106fffb32260d3c3bccf015774418cc711ec336b37ad434b78cab33d8af738c36cce8e0651a6301c657f3918ec" + }, + { + "signature": "03aadc1801889f9855b4cf0c0e25c6ca90bd4c442ffc3311bd0a4956c7692f650f020d631b842155004ad30491169214704fe070f4106bb132976c7743032fd9d2d21f6ae52b35ace707894e4359ddaec830bff67a74c35e234c2cd96248ff4b2f6dbb7f1add414d6455fdc2624c36ba196523d1de6f6043d63a854c8642a1c68927eae6ab0d617a2e47a80702dd2a837732d4d110288d486e1e26f8cfaab64b1f35" + }, + { + "signature": "02b0ab7e95e763d42c62dd857445d6ca0d0607573292d18f27cfe8b431e2111289034b8dd8138dd45484294658314b67250396aee45f74c2a9844e95db6139acfc016afd29978464f5e9203bd2e90675d6da196a14c93c53efcf4e72f43b915a822f89ddde58224adefa7ccbd23819d779cfaa3e81a33da639cc4f68e8a97ef706f3401083b8b6f3f4c2b58789010bb2f7f8f74aa34688271e7056cc94a2a78fce19" + }, + { + "signature": "0335aa3ee4060dcc7198469da52dbb3e651108aaae209075755767326db2b61b93036d5910aec22d7a80a042a5fbfe9277e19fbf3d443cf009afef0d81d91b6e41d5619e74ac64f6f9ea594373c0c57e8a0b64f34f4cbec3a0a0c30efda9598a04ee2397c3516684fd9e3f6ebe4d8c80255589d29cc6dfaa2eb40f3ba109bcef56facd5974091ff3a5a88f42a9d3c72688d6791859e923ffd5477820bd48dabd0160" + }, + { + "signature": "035ddbc0e00e537fe2dbe2069f97c47fcdecc5103cf51f125d61b1d37d5236d43d03f2b226630148a65e58f3ee0f6d3a876292de679f6db0553f47f72fe4d893802f1693aaadab7b4658d5adb4c57637cb168a2e4c7023625e8c87cc9161b7212c1b0f23ebbab613cbd92199ab24b9ae3ab21d1f2015d58cfa74792587be21d41f83adecc45e830109417aec5f6128356f91fed7719bc4e47db855c4405f6eda8449" + }, + { + "signature": "02e2ab0565e5fe33fd40833893569df2f0673ffd0967b3395c83087e6a3605455202b3c840f5f5b02af14efb96d9b415bb271e9e52d3632ff3b0b18181b65b470986ff40ae346fb8c7b25f1ac31cff40da40227f03153eedafffa93a73cd8b57381fcf81aaa4ed3a0f0037d1f522ddef88ffd11ec6521bcf7627a281f386ce0adaedf2ecca4adaf8c074c976cedd3f97d8570dca0aad78dae9856f16fae2aed5a815" + }, + { + "signature": "03d2c31bce896f6385c4fa5a122c7b13b2e1b1866433e22b135d32fdac4d33473103a03a971fc681768ad7e26b30b682e18815161778ea0759cb3ab6dd587fd5aee8fbb6399c2046232c62cb6a94066d5e88c6e8ba8ef1d960ce1d2cb159be46c925ac9d03080de51a05b20c08057e39bd90e4022793f1d9db173f7dbd6ae203910ac64c7b0344ef9acc5adec53dd72b073b00eb509f4279423f0dd61e60936e374f" + }, + { + "signature": "03db3e64d3cd2230a8c42d465619f11f0c87f94b1a2aa04c5211577ff7e26b739e0203b53e57a583a7b26d5acdb9a9d8058b889a9a7e4a450b2e8ee7b729a19d56912a7f7e4c702c9ece4d2f73cc1296ce4439fb14bc87f3026c615e0594fb9fe5c656c5dfc8f0f5cbc6349edb4e2802b80b88f9310e92c78182d2ddc3bc236bfb7f6acde890ced2131b214b416a24f06db7066eda26795f3a5e20b65ba587510c02" + }, + { + "signature": "03575c19332733e7b72249d034510eba65d389cb30163677b137aa16ea2aaaade4034303095ea4a31bb7de798d1d2848fc604985f7f05f8f39a75bdedf8c5759a510e1c6c3bd36756db6cada04ec1fe82b3e70d631aa2dcc05b469f077a53b2fc7e16fcae52c8c38e15c5b2623cb276d37bb5555c2d465fb80e8a76d457104fe4aaa3ad4be34ec69415ff5a9417cea4d35a9ea5a5e8c1a4dc4c573d007f42eca74a8" + }, + { + "signature": "03e024d8ce876f4a9d421409759a8b812b4b6060ba7ed9528249ef2b51b893db0e02c6f5802a3dfc76bb754dfa75b554a86bd74089b2f7875b2c09bd004950e253fd8231c61977f80be801c68fa06bc0312422c3339ae7a533cea2788d779942be3172d50e12b06cb87a91fc23fa0cc8352b3a1ab6849f136f3bde9e60124ecae5c20bcc942a3f70043051b3e5bbbeca3401ddcded259b05bb53fc6576994473e131" + }, + { + "signature": "027f44ff122d7555c2563172d6dea4d2edb5caf05bf01525d13b75b9a0fb2762cd037a5ce9f34ed2c777d35af21500ddf629e25aa73648d8aeec8da72bed570caeabbf1fae4a4d718e051c6634bb08a77654a70c38f410dd91120c5ce3560dae58f192797b9eea3fd04ca94387f2671ccf74eac579251aa1b9c995a54dba04356b73692333d0bc90a3b24a9a0a1420be5a6da8972cdd2fe3353082499f199dcb4fec" + }, + { + "signature": "02dc9fa3462402240743941699546a0dd22be44f9776540fd921b65227694e24da02d02d5bbb123fe6c88d4d593cebeb7b336ccf2a4ac91de9ea5623e1f76a39aefa0320e45cdbb75faafdff8d5d91020e5a385d0f8b13e9e12d73d2b02c4f02899820b4b48294b5e5fea9432cb2518e7b226a72396b6b3f1e8a8c6b7c05c4fd633cdc0337d98589d24b9ac4307b6d9ce526c1d58a5f6e0d99fc285aff18e8f93c13" + }, + { + "signature": "022a725a04e0e034922cdf4fd6ff76b477fc745464ecc4978df304de36845a2d9f03a4aa2925631d6f5c6ef712efcff5dc34ec65463afb498c420754b84b3ff513c19f661a7998c84ecbea160054dc76f1ba1513c16c29c25d4cdc0d3942c79cbd953b6ad1f23573373ed3758a82f32f9a215cdbb9073a74cf49a36957053d4d5f3d9ecd9039bed20d86ea90cb4d5706afe6920972cf4d8d62e074f1a64847e30d8c" + }, + { + "signature": "023ecffc0fb5998ef4fb295a4c1f21659c3d5573424d8c59f254391adbf61bdbae03312fe9bc16335f38fd376b97d15e68d941a31ae8f66346695410fcd9414f78b91831a61aae1a05701330d01c61dfb526bb5e0afc615314daefb2a414d89a46845ba385ad3c410c86a6f6919e1137269c45fd6fa291f9cca29d38f04317364e4dae1dc0b8e06112238f50d897871c2fdc5746f132974f23d5a533cefffa9a62a1" + }, + { + "signature": "0326a5205aa8fc63a5da05427727d5fca1ed5e24e3962eb24e37e6b47f1946967103e1c8828eddb94bea5525ef76cf6300b478526eb314cab3bdec59d4efec2123c35375718daa4381965e20a9429507dc250403551b0d1e18ea1868a4b93622307eff86b7ca9503f71cfc912466b6e825817d842e9e7c831fa6561c9ad27fc13ac42662a55349c86feaffac86a1d77f1b4ec8d9bc8f98c4ba7658ccb310a2c511d5" + }, + { + "signature": "0280b1cb35f977d89266386a5ff9cf8024c4819f0d0d402161856623650124c0cf02a8271b76dad303d1c72da5a0db62567063ecdc1151d21f33f52241cf2099408eca6d6714f52725bf5e392d12c22253137ca61eeeb8aadd950b82aee14eefba112019f413877d53624ba6ac3c01f466a385b0d0ab34e7ad00adb9befb06361576413fc937445bcbb01246775ae5dcc3312dc531acb3c4ba2926ea76d623096fe8" + }, + { + "signature": "02b456751657a73528f961677fb683cb3602d658d9d04350fdb6c1063dba427b6d031f929caafc712c100536ac0aff2fc59fc581c79f0267281f4c6373a3be135ab050b7d255364e2e551a124ef762d37616a2c9c54606d96a6f141c7c82dd6bfbd240cdc442c37a9179af5bd45d7b1f2654f89f7744bab7b8ef4e69532167a3318ca3859ecfb1749884d3ca17dd3e88bca5c0fb1e00be38d6237f6ece011e7a0bba" + }, + { + "signature": "026ba035d3ef3a5f6381a3c80f44c7d46100e65754b41688da9f8349c94685153d03ef41489e7b04dedf170f36448074bbadbd13235862e634fd6e3e90d30dcca72287fdea7f69ec736f61c7a677a1b3aed9e5b8b06cc786898a125061f3e3a6487495d4ff8c17b276f0a2b0beb1b920c3a663f62d512485382637dbd926906b52285a675bab574bf4ee3c40cd2afbf7069b739589ec89b377762f8baf17095b0cec" + }, + { + "signature": "02cb81ba606602da0f7a6524db89d9857bd297accd8da477151d807be3ac91a6fb03348b6b66ee935fa93c34a24cb93dc0d52397cd32ee18f43762933a742ddb812e5f434bbef3c867c3f64b57dedc844c701e4ad650110b558a167d268921b75b1d67d5f6f4d75cead0ccf2d6f1c1fd9e091e73810c2553d9e68deaa193e9b557d1ecf32a379e75ea555f68f245f0be6e4920cf52ad311a1cf0289351aacb2bf25c" + }, + { + "signature": "02e390eb77a64967982ca4acff6f632742caf5030689eb8057ad520a4d699d9c6e022b4b7200a321c762c5016845cfc8aae23450433043fd5bb976a7a9db3eb1a362dc1a5ecdc3b2dbaf597daf0bf69e76122de7d5f0d82e2f882ac91bf0a84f3c6de7dca752c2c39f302d3fcac0227c4053298d3d96bf1736c0ed4069215d9df49b88c34db6fa4f1a3403b437b1ce489d8a48ab89aedebbbc7e1e0647d7bdda3bb4" + }, + { + "signature": "02ddd0be22acd22b59cfe93e7b122c73a93f1e02f42c1c6bc3b3246f1bb18f2bb302022ba74b56faa21476c6d3265765ebab8f68f44f174922448dfb1f1ee0cba5b515a512095e0992681451c44f1a90158600305d836533a3ae22a7a1ab8737f1a18de8f46cf26fe369f631df46d5adfff684fcd1250dca208d10fa3992eda6704ea6c7ed91daafdba804d1d907d30c66fd127d900d6c4e298552a1feedd85ade22" + }, + { + "signature": "022ea17afc9fe79b5e34ab54d9d7481231fca8d92dd5562951e3a5ae8d26b0532c0236cc16a227b33e4ce63d18ec875bc1de41407ba2a6e131e458ec8d608a5b0554367682462ad095fac1d477c7e24d5bd3c200370f17b7dab5471f644623328d960b93faaef4333abde9f61695ef486879054f5702c8a45aed9dfbf855e567d93b64bddff07d1e19c139cebfaa9449b1bc0df5d34b020accf34fa2987403f09709" + }, + { + "signature": "02266062e102f23241a1714c7424a2ebe0e69a2567cdbbcfb0e75739ce1a3327e60397cd3ea6fa434afe259d6bf60d729331d6236b2991252c72048fab69f6d4a6df99b1f59e43f43f3c2b07409a58207c65e8f244c039e6c1b539eb8e4c86e97c7a484f74ee0c7aeae4554240aa394e6de8e631daa53a896673691249cb6389acb4a9ce03a94e5e4aa02921833cc086865895372070716a1c2873c5e38ca03f2654" + }, + { + "signature": "030b4908e6ae2f0c90b7612276b369252a5d1a01e9c5a6c1db32d7de0ada4ede9c0357ecca8675d89c1bcd582b3587c88e1587cd9657bf20dd2954dd9cfdefcd7bdff926c93754808f630723f2acd81c3fe791fc70e10eaf25c47cd61134745156d145df059f966fc94ddb3ca01e336d78609de8a18d694904563679ecf5857e15aeac22a5deb5ea2a85ceaacac4f96492d03c80cd0cd8bb703264f5f7bd9bfcf803" + }, + { + "signature": "036519216a2ad7bebf1e70b12d98e3c16bf326f44e1b1c69d231e9a5d1a0b6d38e027ba0e9864f39476f076ef4ec11aa1b21b1ef5391ef4c8c63eed31753551a0816fd839a80648ff2f3a50930ef84175b163bd69125ffda9adbe3590c6ea9b26c1f74f12a31b2f7d155436e95b86dd2b1fbea62ee2682f1428f1c8d5f530cd5c34b325ca4f8596c0cf877999beae01d5a9e9910f2144263c33a250bbb4151f91bec" + }, + { + "signature": "02247827bff8fcf068e888738d09be330fbd0ac27607b7476e6a440734069dd6690364a0ee53cfa0df54cca68f1e12cb92900f6de81f7e0cf5198df42f374aef88b1bca5841e61d19fdd0944f01cf38c08337cf29ec603421544dc82fb8058014ccef0a5fe060cba1e424947571e1dece50f12538a757695114ebcd7ad223c650447defc43af7707a1dc750825aadcf925dbae5dbd1f29e516ca9f64010364c46eef" + }, + { + "signature": "03df01c7873630c17588627968d7fcb8c280f7a0874fb904049ba5fa755e98681e037ef36b2fd83b98bac6990e6d52ef555f3b8baced1f4b2292054d76768e035d407e588aed91e4f59bb20c1e2ad14eec1ada8fa03eeb12cd9088842ab395845d31f998b48373a38b323c44ca1a57d9b9014039de88b215f5b54ee8170fae27991675f2db3673371bec8534eb630d774d1305072916038cca8aa0a1740541fe943a" + }, + { + "signature": "035b8f78a76ae7b03e8f466f1999982492609832803e26dbf3d97db6b62eb847070375806e6562447bc022122389696c837d8908933d3d85716f51940e754f366cca74904219e2e707e9720304bad19d42401d6ee3c1d6d74a66656d8df05bc40576ca6c17484279d291a0f8e18f98314b97c4aee1cc21ff5bb6084bba097724cbad95091e77392a50709ca0ba398671497f84f50cf80f6a5a3d763f129a4f237a94" + }, + { + "signature": "034d37551bbed3c642cb1f13ce151b07f3c5627abbd7ea823517a67532d5f1b1250340602c3c631c0d0299777712ee03bb0246e5839f0a4fc4c41ac750283f1d157fb7500c143e390ecdefea92888e20a487c2223a981dd23e73ffedeb9d99f47e5ce75f2b492d8f1393104c6655e9e73aa621f12a38d9f65e22d2539bf1c55711213e3bad77668d2e82ea2a0710bc805eb923b8b39959f3f032e3f36f4079278bc8" + }, + { + "signature": "032528c57ee33a4c6f8db0327e92f7d275f96cfbd3b8633451b7a3c419d6774b4703226ff163b786d44ba35fad8026f0b36040cc937cb508556be3943bf69b170b958e5bf034b4d14ed91355385d116d776b75bc60b429b27fd2fcedbc659ef8d2ce375899f1bdc63c621a9796c033bf156302b22d0aebdebe2cf164d79e8539a26983071b847ae4c56832f6c02f3fa8383aef45985f3d324d16ae80a9558ba97806" + }, + { + "signature": "03b063d78c059067d6504d5a741afe4289ea230a08a6c8900059d4d41e221b2bc00388aafbb8cb4add361e98001abd938040471154cdf8abd79cd61061110cc7e6ed2f814c7fbd5ebb923a05461a76b4508801f022bf548d0b3698d114113ce44a3b0d18af0723975df20950986b20c0b833292a28490e6e932ff1bea9b1cfcfa961ab16ba697d8622ed9c367e32c3ae8a00bf475f1f7045cc9ab116b0137e69b5e4" + }, + { + "signature": "02415ce55c258596484cfffbf0cfdb94865e280eb6191281106d3d23f75c237cfc03b0c38fabb52673cd928d06e7ad59c76509bee703dde507d1c3e978849ebc14fbbf10408d4ae490809a18df0c5e2e77bde9194de07a565fba5f9e3933c09b02b25bad6161177c86d2280bd539ba4b2e003062a1b9dd4ab86bb099776abfa6ef7bb8807c6aa1b6f5483d0d9d97f0d97023a64fce71892ed1d1db8f5c0f36f7b6f2" + }, + { + "signature": "0204bce60baa331c5ff1e6fb7d0cd733c9a75ba0b2a277b2ba5de4dadbcd16d2e9035b4dc7ef8f9a3f83878d8a1e4203f0cff88644c85045b751b6140df70a11633c9d9142bbe1e18de436d46cdc55665ad8c73ebf4982de997cd8f2020d2f59d977348fdcb2feba82f82d9bd50a06ae924d41dbe85da2ab259aacc633f1ac781099cda89de252de79834c2bd8e4a5fab1c13e258e96b0db0add35ab1e2efad0925a" + }, + { + "signature": "03b9c79ca1d81a3a784726179f4e2c58aeffc674568ec3da5d74e1e39f9442dc1202dea953eafd5ba5cc8a27d910d265e072d950a610422cf7bcb93e417ab68e734fa7ba63af2246140eb14d976997d88c4098144ebee6b4b7b9a5894e8420baddab8a26623d76c41c98ec9d6e49bdc42d894a645feda454dbe50a4f5a6518c240dea713cd3d5831909d1ec4cd5f5444f7e5bf688cd26c73ce72c3312c04ca34e972" + }, + { + "signature": "02bdae4b2f6c7a5728d9566ff03e81becefb6b0c96f27eee23a7488827ff096ca90305dbdcd545503f46951e1c9b5176529b2831e4633648e52424f3241acef5384cd212b8f2ae977c241997b940e62d372f1a14e25686e17dfb53a2a74d8a295812e179e2fa3d06dd795087bf92baaa379e2e7888a0caeafccfc0c0462e09555e0e3e8e70619abe4c242fe756f6afd803123a4c96c404695fc32780259880160123" + }, + { + "signature": "0345fb03c6f9f1944859d3e1497c6a9634adc773dd1216cff8814613735942637b03966a9d2d6f7bfcd9513c00b8e3f2da8af0c371ff3a4e769caccf9abc1048ccfee7e2b461f2e42a9b4fc89f83a4cff0b11cf4e23e9d1b0808d184d4158280c03fa7ff6a4247d3c27e72cfec55a56c8ba1149a15bad44ab6cd7935b3e46c98a3cc281c692d867c15fc52ea7062a7779bf76e0d63c8e819e0b38a72ee59f729089c" + }, + { + "signature": "038445e68001a29b226d8125af0476298f1f05b723c63a75cd1ba55721b86aed1a031acb18189dc6284e38820035ea7630f63803347cc7b5cff474ea62850966d7a3da874b2b4a05bc9f43d69fa07ee9f7e66c16a3c504f19c21722ec55f7d8a6dc46cc09d3339c1a9bcaad045fef6b2f96c71df3923a7395f8096d42923bb76335635eecbade078d470db89ae08b1ce65b24e75f1eedabe4b991d89a28c3bb5ad96" + }, + { + "signature": "027ea502d06229f888f291a710e9b3bfde53fdb759d85ede18481d3704de78db3702dd7fb65d65dc70e0a4029f2b39c63073827ea90b4bb94bd2b91aa00fd9c283d3e9c4444ca9737fcd83dea93c967ff2d2ff2347e49fa7d0cf61f138a5ec920c8a13d8eb7830e737f4a6904fba67c125d4d851eee65e3f740070058144bf9c8ca0502e21500160fdde3f8e1b4a8c70400018799e64c050b63ee9593b79232d295e" + }, + { + "signature": "02b16548096721da187256c6de59b506ed2e06c0afabcdfb51222d96b9d755fabc032dae132f2e8ea49257fdae96a65a1c90b7a8d94107b5cff360541a76606586b75d0fd4f5da796687d812a7b1b7bcd04d5650aceb65efa642a210d0aaf802f2aba9f5c01d950dacab75ed16e0679ec96b410eaae6c3b5c61145067f8838c4b0e8ecd26fa49688e8986333eb1d7d4cb547c9d8015587c34731c124c822f9174daa" + }, + { + "signature": "0357594e1895ebf950588b575b98bff57316e499637d056493f917f1d9817c97910239994c939864639ead1400cd4b53061834e037bda00fedbb1935590223c4ad4d61841bef54c7bd255a99bcb55d7ab47b71d2dffdd6d229dd384f24541aeecb48c4ab001422146f6a07229b0aab8764ebf50a865b27bbcc6d63d5d21336432ff376a57ced3f5eb5258dc1ed85fe8eee417368b0ac80e824ef333236374d250369" + }, + { + "signature": "02b0765bb098c368162a76c0f6c97349c4849d846c3c69ba17be6d01288f3c365b023ceab4d11eb829cff14350d1bf709c8ff49e1833adfd26e5fc50643330398b3d8e034c94fddc93a97fe6fdacb2635ecbd27ec0114ac357c7a121ed925f7e06f15e37602d501afeee3dab789bf451222d326f5f9798acf24b97fcfbcef84e24654d95f91eafe19bc0f07b8a77fe22de81c93165d2d167181fbd1fd6c1fd4b2d3f" + }, + { + "signature": "021f235643cbd93965ca6936235f6b5971d8c6e05f1f09c39d0a8c67284b8d1556028a7209337fd2e2b20f0fae7d174dbef5bed022a0c76348f74b5cc9e3fd09826d9f412f43fd38762fb9b5021492d413dd33237516c11d678cf865c2df6bb4f87fdec0706a04faa7208013fa7b94d0f3569f0ba405d6f608537e0b7efbcd7ab8b8f72e03e095d1e78e873d4401628b79091b130e53c2531b176f69d90b0b938c24" + }, + { + "signature": "03be9416732a86583acbf277d4e96a7345075c556b1e0acb1096bfbc3d96a9831003ad591c26ee0ea1e65536e8ec28f832ed3ca69cd71b04870fad6512d418f619cbc2f9dfe61c9adbc7cac5a351c070528a24d68c073102a6fec70c87667d112503a456192b61e72477bf15ba81c4e4604bbbbefcfa49193a110a6874644bd7a2150bc9b50f6a87601598a0da357bfe5bbeef9c8f7dbab1a5b522a33e8acc39664c" + }, + { + "signature": "02d240d31465e971122484c921ade5f0a3ce2bea579717115500bd01ff67a08aa002daeab8cd98c051c41d345e35b46e8bde151b3672512827e11ca9d3c1762c263ec919d76e58058e74e036822de6f668fbac9f32d42eab15d5c8bd06e2eaeee2f1db55082f980bee0084c2fe870f556e1ff336ebf0051355b082e07fb7535db3d9b97e340a0e711305c9c9a11eb08448b3096e4457cbc9a06fa323f70d84b0d63f" + }, + { + "signature": "03c1fb8b4fd7b2da38dea2212e39048141a66eed17bae26485bb979bd9eefc029303d537a6b89498c2e661cba1bf7fd5f0796346ab539b585bc81a5c03dae917d73f2f3785b9bddf87cab6ed6bf8db8a9e0299ec6212878df378c3d5a9b0daf13aafee79daaf08f612d93a9a43a4194cde2fe33e8814d72ea32abc6d097a4cdda596c909f66458b8db812b8f2d5b1559761b83fd29144337fc5a62c57ba978caa8ef" + }, + { + "signature": "03171c6ea4c9db7bef409232b9f12f111bc9579c685972a5471a7958e705d748cc03793917a53f2b73e8b6252943e5838bf9651193e17daa0413aebced6e129b712d6b086c14bdeff8041f61d7be7122896eb777efdda563c76b7c7f302e4446f9bfdab972fd101c8303c9d7f7d0c7db927f3e40286288048702c0a46b7408bd54be6871e6bfc812bad7200262d30b9116d90c0e5ead055b4abdadfab53d9944e2f1" + }, + { + "signature": "02eee518913e53b271ac562b69991975fef49b6fd4bb176de8bcb1b453415e508202b992ca2c47cdfc19346db6eacfa74f347fcc5bb9a63d8637198bb15c83d5763d7bed506b994ddac5d45fa5a1249819aae311ca4ff32232be4b079a9f8cd9547dbea87b4a734804a4a98455a914d4b7a473095b215fb81a3d9bf39e137e2e7e3fd6e3bf0c3ee7576ee52f9c2f2ff1d031d53143e62cd2fafbdbf62799f9e2a6e4" + }, + { + "signature": "0329247252f24928360c01dd637432dcabdc2f86a08e23ff7b0d1f20f01bbccbec020b47bece5c8c97e0df8c6162acb4aa38a820aa058e244b06a44917cca736f142ff21af3dbcdc31ea0f8813c5e8402691f917e9ac0f4e30eed25a2c456edd24ef1ca2cb67d52cff58a8feec563cb09411d50195877f4cd3b0a279fdbc9501b18916b7e11d7abf709d66136cbce3263065d5580ce30649b90dc2ce4bb5f338c286" + }, + { + "signature": "023eec66a4f1ecb4de7c22c37648731378ede724f51a4ded08480bf1f8d6f89950020d317d749f0b5f17f842c57a2f105c43bdac1d46e678e393bea5f61adb11bfef2e044fc64b9ba1046e668018f13bf97c944b8890583beb672edeffc6e9e51610980f05bf8a265de7efea3e193c7952d4bbf9c18b072157208c1962e812f86d50c1085e1ab2c6326a99c6fca5e7c4e0a0f9bfd37c308f4e768a2698fcae306733" + } + ] + }, + "refundSignature": "304402204fbfc6d29decfe9cff65ee2313c92499db731cf70b1ec5ac0870e9129f5e37da022040c69282c66baa9f294a409a0e2a54475d3ec152f98e1a7e64e407d1ac0d2c6f" +} diff --git a/dlc-messages/src/test_inputs/dlc_fee_test.json b/dlc-messages/src/test_inputs/dlc_fee_test.json new file mode 100644 index 00000000..e54a9d7c --- /dev/null +++ b/dlc-messages/src/test_inputs/dlc_fee_test.json @@ -0,0 +1,12362 @@ +[ + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 88, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 440, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 880, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 970, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 490, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 980, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 670, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 980 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 630, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1260, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 690, + "offerClosingFee": 1180, + "acceptFundingFee": 690, + "acceptClosingFee": 1180 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 2360, + "acceptFundingFee": 1380, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 280, + "offerClosingFee": 98, + "acceptFundingFee": 292, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 2920, + "offerClosingFee": 880, + "acceptFundingFee": 2800, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 280, + "offerClosingFee": 88, + "acceptFundingFee": 280, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 2920, + "offerClosingFee": 850, + "acceptFundingFee": 2800, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 2800, + "offerClosingFee": 850, + "acceptFundingFee": 2920, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 280, + "offerClosingFee": 88, + "acceptFundingFee": 280, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 1400, + "offerClosingFee": 425, + "acceptFundingFee": 1400, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 292, + "offerClosingFee": 85, + "acceptFundingFee": 280, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 2800, + "offerClosingFee": 880, + "acceptFundingFee": 2920, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 2800, + "offerClosingFee": 850, + "acceptFundingFee": 2800, + "acceptClosingFee": 880 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 630, + "offerClosingFee": 490, + "acceptFundingFee": 1460, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 280, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 1380, + "offerClosingFee": 1340, + "acceptFundingFee": 2920, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 292, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 134, + "acceptFundingFee": 280, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 1260, + "offerClosingFee": 980, + "acceptFundingFee": 2800, + "acceptClosingFee": 970 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 134, + "acceptFundingFee": 292, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 126, + "offerClosingFee": 98, + "acceptFundingFee": 292, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 236, + "acceptFundingFee": 292, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 138, + "offerClosingFee": 98, + "acceptFundingFee": 280, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 292, + "offerClosingFee": 236, + "acceptFundingFee": 126, + "acceptClosingFee": 98 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 1460, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 490 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 1460, + "offerClosingFee": 485, + "acceptFundingFee": 690, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 2920, + "offerClosingFee": 880, + "acceptFundingFee": 1260, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 2920, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 2800, + "offerClosingFee": 850, + "acceptFundingFee": 1380, + "acceptClosingFee": 850 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 280, + "offerClosingFee": 85, + "acceptFundingFee": 138, + "acceptClosingFee": 236 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 1460, + "offerClosingFee": 425, + "acceptFundingFee": 690, + "acceptClosingFee": 440 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 1400, + "offerClosingFee": 485, + "acceptFundingFee": 630, + "acceptClosingFee": 485 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 22, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 34, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 292, + "offerClosingFee": 97, + "acceptFundingFee": 138, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 22, + "feeRate": 5 + }, + "offerFundingFee": 3255, + "offerClosingFee": 425, + "acceptFundingFee": 3195, + "acceptClosingFee": 670 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 173, + "acceptChangeSPKLen": 22, + "feeRate": 10 + }, + "offerFundingFee": 6510, + "offerClosingFee": 850, + "acceptFundingFee": 6390, + "acceptClosingFee": 2360 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 651, + "offerClosingFee": 88, + "acceptFundingFee": 651, + "acceptClosingFee": 134 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 22, + "feeRate": 1 + }, + "offerFundingFee": 639, + "offerClosingFee": 98, + "acceptFundingFee": 639, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 25, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 639, + "offerClosingFee": 88, + "acceptFundingFee": 651, + "acceptClosingFee": 85 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 35, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 34, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 651, + "offerClosingFee": 98, + "acceptFundingFee": 651, + "acceptClosingFee": 97 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 71, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 25, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 639, + "offerClosingFee": 134, + "acceptFundingFee": 651, + "acceptClosingFee": 88 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 22, + "offerChangeSPKLen": 34, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 71, + "acceptChangeSPKLen": 34, + "feeRate": 10 + }, + "offerFundingFee": 6510, + "offerClosingFee": 850, + "acceptFundingFee": 6510, + "acceptClosingFee": 1340 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 22, + "acceptChangeSPKLen": 34, + "feeRate": 5 + }, + "offerFundingFee": 3195, + "offerClosingFee": 1180, + "acceptFundingFee": 3255, + "acceptClosingFee": 425 + }, + { + "inputs": { + "offerInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "offerPayoutSPKLen": 173, + "offerChangeSPKLen": 22, + "acceptInputs": [ + { + "redeemScriptLen": 0, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 0, + "maxWitnessLen": 218 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 108 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 133 + }, + { + "redeemScriptLen": 34, + "maxWitnessLen": 218 + } + ], + "acceptPayoutSPKLen": 35, + "acceptChangeSPKLen": 34, + "feeRate": 1 + }, + "offerFundingFee": 639, + "offerClosingFee": 236, + "acceptFundingFee": 651, + "acceptClosingFee": 98 + } +] diff --git a/dlc-messages/src/test_inputs/dlc_fee_test_scripts.json b/dlc-messages/src/test_inputs/dlc_fee_test_scripts.json new file mode 100644 index 00000000..3ecda662 --- /dev/null +++ b/dlc-messages/src/test_inputs/dlc_fee_test_scripts.json @@ -0,0 +1,57 @@ +[ + { + "byteLen": 0, + "script": "", + "description": "empty" + }, + { + "byteLen": 22, + "script": "00146f47307cd1d7e61b89a6fe24e660714d31e4aca6", + "description": "p2wpkh spk" + }, + { + "byteLen": 25, + "script": "76a914a5745456754abf104d8d1a8852f9ef4cbb0af3ee88ac", + "description": "p2pkh spk" + }, + { + "byteLen": 34, + "script": "0020e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "description": "p2wsh spk" + }, + { + "byteLen": 35, + "script": "21022a5c418a642d70ab3f21029f510931a5af44617d58fcc50195acc136ec90b75cac", + "description": "p2pk spk" + }, + { + "byteLen": 71, + "script": "522102a48558c126c5e3eda2188e743ab31cf9b3e956bb5cc6b9a9eeceb17c69ccffc42103f9be793aa26af2acb555ced3702e360e3c65b8c040c0fc0cf85844bce904cf7452ae", + "description": "2-of-2 multisig spk" + }, + { + "byteLen": 173, + "script": "532103828103a5eb0a8663fffd122ccc52ab7705197686cb09abc8a3d25bdae7426a7a2102fdfc0fbf0148587cb076bbeea390fad9f110ef4b5f5c916b68f0b846ccd8892d2102ab454385715ca02c7cc3aad97b202fd84375906612798b88d386e1c9a7e5bb5421020af3417e4c0a9ddd5a0adbbf460ca05301a9a13d61dcd7ac8bf43b49f06d4d2c21034f5385fdeaaaa725231983765e7fe4c1dbab5c54c051b02b1d4b68c57b8eb67555ae", + "description": "3-of-5 multisig spk" + }, + { + "byteLen": 107, + "script": "02473045022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a3362501302206104618664922452bfbf40951deb1cccba49f659e3a082761e360d1e1f6abff921029a5276b84f01538373a67033942bb9c4078d8ee2cb72b6dd148fc25e075109cf", + "description": "p2wpkh (low R) witness" + }, + { + "byteLen": 108, + "script": "024830460221009efb9e799b6ddbad4040bf6ae214e3320064e68ccba81dc5a19c516eb0cb8148022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a336250132103b000bc3cae94b64f26375a8f5d5700f320beeeeb19f82cbb1494cd22f9bf6325", + "description": "p2wpkh (high R) witness" + }, + { + "byteLen": 133, + "script": "03473045022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a3362501302206104618664922452bfbf40951deb1cccba49f659e3a082761e360d1e1f6abff92102d96d94954612b0ca242247baa8f09ebc4a98f9d4fe335e1b2d1efcecc4ec2f351976a9141969d7b6c106a848d1330652290cd128705d28da88ac", + "description": "p2wsh(p2pkh) witness" + }, + { + "byteLen": 218, + "script": "0400473045022100dc049370a3e1e2f1c30976f97b503ce00e840b10603cf7da86cbbb7a3362501302206104618664922452bfbf40951deb1cccba49f659e3a082761e360d1e1f6abff94730450221009efb9e799b6ddbad4040bf6ae214e3320064e68ccba81dc5a19c516eb0cb8148022023fb6c8f5c1e1d0e3cf6890684afc31eac2ad1d64f0ba8613906a3129cd3f12e47522102a48558c126c5e3eda2188e743ab31cf9b3e956bb5cc6b9a9eeceb17c69ccffc42103f9be793aa26af2acb555ced3702e360e3c65b8c040c0fc0cf85844bce904cf7452ae", + "description": "p2wsh(2-of-2 multsig) witness" + } +] diff --git a/dlc-messages/src/test_inputs/dlc_test.json b/dlc-messages/src/test_inputs/dlc_test.json new file mode 100644 index 00000000..5fb1b98c --- /dev/null +++ b/dlc-messages/src/test_inputs/dlc_test.json @@ -0,0 +1,2766 @@ +[ + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "937ce52b968e2bf92253fda2932ffdcf41b4a4a4840b1ae6dfb086fc0c11e90d", + "nonce": "5966a509a8244c6fde25ed5eb677b2fc79e2889371bff864790ff6af8055966d" + }, + "contractInfo": [ + { + "preImage": "8490930830672369053", + "outcome": "582e987a29cec9b8fd24a03935b415c9a2afa88059f31c3fcd1e013b8a698316", + "localPayout": 200000000 + }, + { + "preImage": "4978697395168035511", + "outcome": "c6f1e739d6321d0728b8fa72b9005af83d30479aa68d76be8245ce5f06138fe6", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "c6f1e739d6321d0728b8fa72b9005af83d30479aa68d76be8245ce5f06138fe6", + "oracleSignature": "5966a509a8244c6fde25ed5eb677b2fc79e2889371bff864790ff6af8055966dd606fd2acf734f669b02c42a61e75e8457f90296e46b5adc37631c0e62d333b2" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c1e616cb35cdb08332d9608f3d9d2dbf4ec34be800000000", + "idx": 0, + "inputKeys": [ + "9451e9f8663804875f235d77821b42e457d1bcff517591bbc0b61a161fcaf0f9" + ], + "scriptWitness": "02002103c3d8681e15682e53ddbd7953e7a52ce5a685df961f473962e4366e0fb270a97d", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q8p8qgw4lv0z3xdrune4e46e03all6hdzqhyv9s", + "fundingPrivKey": "b1709c0c767c1f2d69f9c8fcb7fdc26df748f666147e263b7b533066f4122096", + "payoutAddress": "bcrt1qszcrd5r5vfr9elze93wt39kjym7mq8lpw0rql5" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c4975d11b9d66aadcdf74592afc0ed4ad62cd71600000000", + "idx": 0, + "inputKeys": [ + "350f55c94ef808f144c765dd7877e06a6657c9bd0b0b95ff49bbe4c4c298896e" + ], + "scriptWitness": "020021034cb7850266009c44985500430874cefc23d1f91bcfa84c9e8e68dd9e8907f38b", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q2vtmn8738rme3j56fkull9lz9ys9skut54m8l6", + "fundingPrivKey": "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead", + "payoutAddress": "bcrt1qx2rdxteeum3suhqvxgzwvyljtjjv5nd4g24vuy" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71039021338343930393330383330363732333639303533000000000bebc20013343937383639373339353136383033353531310000000000000000fda71240937ce52b968e2bf92253fda2932ffdcf41b4a4a4840b1ae6dfb086fc0c11e90d5966a509a8244c6fde25ed5eb677b2fc79e2889371bff864790ff6af8055966d03b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e00016001480b036d07462465cfc592c5cb896d226fdb01fe10000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c1e616cb35cdb08332d9608f3d9d2dbf4ec34be80000000000000000ffffffff006b000000160014384e043abf63c513347c9e6b9aeb2f8f7ffd5da2000000000000000500000064000000c8", + "accept": "a71c2a76238034e325eb8e504b73f472e7db3c35050c58c28650bc7bb793e4b5f9270000000005f5e10003f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b001600143286d32f39e6e30e5c0c3204e613f25ca4ca4db50001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c4975d11b9d66aadcdf74592afc0ed4ad62cd7160000000000000000ffffffff006b0000001600145317b99fd138f798ca9a4db9ff97e22920585b8bfda716fd01450200b723225c702e854959729d0cbcd6cb914e66d0f39da40a458689e9b0cbe9e695a358a879893368a536769b335363a57d8963652373b1ac6db70840e61df2542501732a470c02a4c99bf26d25d4f26fb1031cf41bf56087c9ad0327f46244afd8f6c74111512193f1bdf0f1b5fd6acc1b9554e162b51ff3f45bd570f27420f8c30e3090e832ca7b25b5bb6a0aa06104279765e98154885aef92f34244ec8f9a878f00bcf1fb2c798b76548d0a61ce728b311b2d62327f9b3c69e4cbc9de1484deb099302951b32718b13b06536a6210a466bdf71f5ab8a1d98163d55266a8204d475500cd1eb1d423c71c90ea1314efcd518d98b972dc829f12030f7ae6616ab8f61d47a2f1bdb1aed42bcbc50b1d905aa719157cb417431efbd7a1d01ab603dcec22f7f876cd4920e4fef9e7c00bb9e5d8d4324c65ca5a98a243bfde28c0420dd1b7aa047dd4d049db02b430d24c41c7925b2725bcd5a85393513bdec04b4dc363632b1054d0180094122b380f4cfa391e6296244da773173e78fc745c1b9c79f7b713", + "sign": "a71eba4cabe1e2899d2b33455871ac84413a7600ed476f690337799fea64274713a6fda716fd01450200219c7711e62088ed163756cbcb0c647e818f33789d00f0596db2368da6806e77bd966f2efca4c977038521a203b2cb6dc5d2feb75b8c7a36f34c0e70dfd84ec2002b3f9ae3b3a87661c7ed20a80e66baa94b6f2902e90fa9ecd74f3bcbc0bbe18e5e7310f241212f89afb3c3ad929590b9a9b2510ef067903e650d4790d1a0e53665d6271a682afda00efe840a9dda7180dae2aaaa3fffe2f9073dcf522091bd69001aaad098e0ea964247717b8631b3ec81210bdaa9439b96049a675134fae328c26d7510c64ccbbf1c254033b40b11145d6839aa7f233a110a480fa802b8fe94680101dd07a8da4f2a130f03bcdf59f08d75bab08e0accf288c29c46e9d604577c3a68438cc7d6b02c59d0ba6c5a41eb2ee8b6c0ac5b58f65ded98c8bacf553c86fd9f3261a93fb2fec264907f5cdef659a43fa36a7e7f87789d71ab852726aafe78077ed09868c8b2e9f41e34b614dd09c8821877d2d64dd1c4587dec76b47864f30b754ed4954a5ced1b99ac68432309c7afc3b79f4365f46ac0b4421119204f6cfda71870000100020047304402206d97f918326e093c284778e4a5d7ebf329de95b1455b6a359c10b40fda273c5f0220146a2c384ce2e8fb416e903087e6096383169b34127971cb143fb4481ebbb29501002103c3d8681e15682e53ddbd7953e7a52ce5a685df961f473962e4366e0fb270a97d", + "unsignedTxs": { + "fundingTx": "0200000002e52143f6dd0830d2836f9a6c79b5fb864ef87326a27c0ba6e1fd96cc9a887c640000000000fffffffff54f289e02f029b21f82c6d62af7477c251daf2bca50b705130bb6207b5484d30000000000ffffffff0352c5eb0b000000002200203c10db2cb640e406f057963c3decb3d5eeed47c2b830d5c70f401f222d5d7d4fe1dcf50500000000160014384e043abf63c513347c9e6b9aeb2f8f7ffd5da2e1dcf505000000001600145317b99fd138f798ca9a4db9ff97e22920585b8b00000000", + "cets": [ + "0200000000010181eaf2c3f75de4c56785ab374be8354ae1a6f658021315bdc0b86ad661883a900000000000feffffff0100c2eb0b0000000016001480b036d07462465cfc592c5cb896d226fdb01fe10147522103b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e02103f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b52ae64000000", + "0200000000010181eaf2c3f75de4c56785ab374be8354ae1a6f658021315bdc0b86ad661883a900000000000feffffff0100c2eb0b000000001600143286d32f39e6e30e5c0c3204e613f25ca4ca4db50147522103b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e02103f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b52ae64000000" + ], + "refundTx": "0200000000010181eaf2c3f75de4c56785ab374be8354ae1a6f658021315bdc0b86ad661883a900000000000feffffff0200e1f5050000000016001480b036d07462465cfc592c5cb896d226fdb01fe100e1f505000000001600143286d32f39e6e30e5c0c3204e613f25ca4ca4db50147522103b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e02103f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b52aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102e52143f6dd0830d2836f9a6c79b5fb864ef87326a27c0ba6e1fd96cc9a887c640000000000fffffffff54f289e02f029b21f82c6d62af7477c251daf2bca50b705130bb6207b5484d30000000000ffffffff0352c5eb0b000000002200203c10db2cb640e406f057963c3decb3d5eeed47c2b830d5c70f401f222d5d7d4fe1dcf50500000000160014384e043abf63c513347c9e6b9aeb2f8f7ffd5da2e1dcf505000000001600145317b99fd138f798ca9a4db9ff97e22920585b8b0247304402206d97f918326e093c284778e4a5d7ebf329de95b1455b6a359c10b40fda273c5f0220146a2c384ce2e8fb416e903087e6096383169b34127971cb143fb4481ebbb295012103c3d8681e15682e53ddbd7953e7a52ce5a685df961f473962e4366e0fb270a97d0247304402203ba3396e078fa46fb1600fbae9a953a1f0f41e55af6de6b854b42a621c0636d602200ea9b828ef048d5307265b063a371abf7d0936b12fd6afe75d38fcfd4cb846fa0121034cb7850266009c44985500430874cefc23d1f91bcfa84c9e8e68dd9e8907f38b00000000", + "cets": [ + "0200000000010181eaf2c3f75de4c56785ab374be8354ae1a6f658021315bdc0b86ad661883a900000000000feffffff0100c2eb0b000000001600143286d32f39e6e30e5c0c3204e613f25ca4ca4db504004730440220314082e1b3a24a5a6223b102d8792764259361be319121f496536ce5c38c618a022057eeabfa7babac7d317f7b79c1753e00ee13e7b1511bcada29ebae0300ec4f5d01483045022100bcf1fb2c798b76548d0a61ce728b311b2d62327f9b3c69e4cbc9de1484deb099022040814a52e0e6041daaa664b07e20d911b06d89d457ab1f77b4c5478c5f0d0c0a0147522103b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e02103f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b52ae64000000", + "0200000000010181eaf2c3f75de4c56785ab374be8354ae1a6f658021315bdc0b86ad661883a900000000000feffffff0100c2eb0b000000001600143286d32f39e6e30e5c0c3204e613f25ca4ca4db5040047304402201aaad098e0ea964247717b8631b3ec81210bdaa9439b96049a675134fae328c202204c28b4ce193dc0af4be8851f898ef1f5cfc21e1704bd52718d0b48f77eb466ee0147304402202c51681ec7d80a8c289da5ef084ec3ddc5662306bf04ed7341ff4a089f8de6710220063a64856276fba6b114efe2b85a6a084c5303cae47f42138ee7ef02cd07250c0147522103b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e02103f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b52ae64000000" + ], + "refundTx": "0200000000010181eaf2c3f75de4c56785ab374be8354ae1a6f658021315bdc0b86ad661883a900000000000feffffff0200e1f5050000000016001480b036d07462465cfc592c5cb896d226fdb01fe100e1f505000000001600143286d32f39e6e30e5c0c3204e613f25ca4ca4db504004730440220077ed09868c8b2e9f41e34b614dd09c8821877d2d64dd1c4587dec76b47864f302200b754ed4954a5ced1b99ac68432309c7afc3b79f4365f46ac0b4421119204f6c014730440220047dd4d049db02b430d24c41c7925b2725bcd5a85393513bdec04b4dc363632b02201054d0180094122b380f4cfa391e6296244da773173e78fc745c1b9c79f7b7130147522103b221c54dbb518d6a954845059b4a8e98e422109cc3437e705eb54538361967e02103f95241dfb00d1d42e2f48fb72e31a06b9fd166c1d6bd12648b41977dd51b9a0b52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "883086b5ccde2b75d1d8134144b96d95fc1dbbc4743d4aaff5effe11be5686f4", + "nonce": "b927715f2f0d02d7d86aeef4485c217a899ced88ddf0b2e484208805ceab4049" + }, + "contractInfo": [ + { + "preImage": "-7639545703483034209", + "outcome": "57111a58967f2f9b1511d96f943f9023536981aea1b23d3df1899a82491bbe43", + "localPayout": 177736288 + }, + { + "preImage": "6622384472141149519", + "outcome": "69751efdc86fd6ea1a3ed6ca98d99d73921e6b4eafefd8915dcdf37334533a6b", + "localPayout": 0 + }, + { + "preImage": "5063174658540129347", + "outcome": "40da4c545830826e84445ca2c562c1f783f3f69de8fb290dceeb9e1a4f185fce", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "69751efdc86fd6ea1a3ed6ca98d99d73921e6b4eafefd8915dcdf37334533a6b", + "oracleSignature": "b927715f2f0d02d7d86aeef4485c217a899ced88ddf0b2e484208805ceab404910b2bbcdc48b1e52ca8cf27406d3ad6066243063e9df2e80a727b707cc328194" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147f16ab560a1b4c59df489b1c94300bac4f665b3700000000", + "idx": 0, + "inputKeys": [ + "0910a65beabd4de48c29d42d838196e99d1fbf64da2a52883893bf16d06a1103" + ], + "scriptWitness": "02002103043ae3ef1e3abc625e30cd37f5fb93c5dcd961a7e5ef50d3b7cad1860a50d34e", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q9aj4jpsy995w38tkus3789q67m64v7xjd56mdd", + "fundingPrivKey": "d4773cfc21589ab1ca3b7177ebe1b6f5aab40e0e1d84e2ce4fe9df9d6fd04f24", + "payoutAddress": "bcrt1qetytq88atj6ql5kduz5sffawzn7m4yzkldp7g5" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001407aa038d98aca099b82ceda4e7f06c8d3d4b180b00000000", + "idx": 0, + "inputKeys": [ + "ed57008c92c5b53d19b909f65d45e913c5e95ef67ede8da1ada0e5e28c0b6631" + ], + "scriptWitness": "02002103979a26bc66b7260c54d089acbe8cd6a714766687bf1723f08de843051f2ac358", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q3et5uj5wwkprf56dycm79w5u9dppphurfftdl9", + "fundingPrivKey": "67e2385dec54a07a897b6b4bbdd3e4010d29beca56cff77f9c55d8cda2873265", + "payoutAddress": "bcrt1qlu3udrl6tpsdzc7l8ymal5ntqdcre27hhlk7p0" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105603142d37363339353435373033343833303334323039000000000a980a60133636323233383434373231343131343935313900000000000000001335303633313734363538353430313239333437000000000bebc200fda71240883086b5ccde2b75d1d8134144b96d95fc1dbbc4743d4aaff5effe11be5686f4b927715f2f0d02d7d86aeef4485c217a899ced88ddf0b2e484208805ceab404902fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee7600160014cac8b01cfd5cb40fd2cde0a904a7ae14fdba90560000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147f16ab560a1b4c59df489b1c94300bac4f665b370000000000000000ffffffff006b0000001600142f655906042968e89d76e423e3941af6f55678d2000000000000000500000064000000c8", + "accept": "a71cc34578524c0ee12123eac6497032043ccf807252672467757442d293ef360cd30000000005f5e10003d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a700160014ff23c68ffa5860d163df3937dfd26b03703cabd70001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001407aa038d98aca099b82ceda4e7f06c8d3d4b180b0000000000000000ffffffff006b0000001600148e574e4a8e758234d34d2637e2ba9c2b4210df83fda716fd01e703010b0e17e0240028072a13ab67875867971f93d3362c79020947825dd374fe50adb48836276bc640dd46a25c00324dc8b8a9e914cc6f2c79f1af1b3d20d69d5f8700c827ff83113439e6bc86cbb962c7317a31e68ab1a04e1baad1c9c60bd8e6f72b5ddcfdd2b4c1e197cd3f89e00ba681600986c303936940615c3e4c19bd42f87f640732c6b1e6628c234e93fa892ed482ef2496841048afc56334cdb75b34da4d002abbd43c15d81d95e827f2f7479fd9220c28c6bfee2bae7b80925cef07e41ad516fa50842183e2b3b478370c07192d03b62c3e7624d07b01807d052d29101f4c00f7965d46768063d070352daaf94bcca66ece1b791afd5ac98a61c67b9d562f053dadadd34e76de3dcfaf9166d74be548e7f55aeebbb8fc47ea7816a7403ad3e7c73f7a5d6d775420e801d2204890b6cd365a26ea564ad2be00fe933a7219fc7f011203c30fd3499dba7c2e8d419a861dedaf37a562e33f89c15772f4219f09f557d3e9c43f8d95dcb8a286d7a849dcdc9a50e2f002e9cbded0f66509e6f1ea96e901b6ebef8a2fc51fb1bbfd1a3608e2cd67356527526618f00e645f4dd97d76d0e7b71b0ba6bb6c0cc6cb8780d6f7b2b83f01ce6bb9ddc230f964ee8ef84dabbef1fa13dbec1efc22bf2b3ef8c1b719e5f10c9138110560d698323892a7a0447f1653f4b41ce033662358f0b70544271cec03578e5e342a7a84bbd017e2791d711917fa01cf48367e67f14ec40f9cd854f63c135d4e0f0584508182e7896ee9e76e", + "sign": "a71e0737adef37a7ee2f2136313b576b935a7e9121ce5d636601796fe33fbdcdbbecfda716fd01e70301d067b84178196e014154db223d43acbae7d0f85b1feaaa28fe51687cc9eb0c0707a5dfce4acf917eebe7a98970a2babd56980d322f6c8c0d893148f1b327172f01d7ed5aca5e3bc8546016b9f77516773dd32dc65a7a877dc4e3dddaccde272e170c10831840adaff65a9f94880ad95f8c99a6769d06de85570602da3b52a2cb244cbf9c3c7d68324523adedbeb165d15e77261e8cd950f8e5490ce7a13310024200bc3b4ca62284897ed04ca06a817aef1190a904ab6f0c7c90c1bb585290febc9fe2b8030862f67544ed69b0c12cfd4893272d84baef9749d908a89fb21641a1f9005c5625254755563330165e9fd8608f374a8f28f4da717f6ad34f61ba869bd5ed1472f910539342bd03150f84561e789e5b5b4f73b8124122c90dc585ad06f70c131bc75c36086e16d0080f608b4f1a74950667f300e5ca1ccafcc013f025a235006dbda76883cd0086a27e7acc3933bff8fac004ec1bd13fee7e3295062885ebc79da7cccad2117a0594a4f55b09672c0d4ad56925b443198e830477fc17039c57017905c3666495cd65b72feea80a21313215cd832eee7e409e2dda137af28bf5e3793c912038865902475d16a58c8e5fb764149b3eb2020a7190af48ec2df0d92776060e952fc847124f81d6488f936e0c60ee6da8921369dbb66cfe55229240b84f50b550e2ad2a98abb733fa63ae0845c69b08373473df899542068300e22f250da4c43a90aaf0b054ab9d4b76a68c80b08f28d42287cf3201b1f146fd232573fda71870000100020047304402207bac4b96efeb7ceb94c0315d46dfb79f836c48d022c58b86dde8f6ba01e21787022022081c29bce8036da8cbf64d5e370293ba88e00a563a3183c1b18599314e2c6901002103043ae3ef1e3abc625e30cd37f5fb93c5dcd961a7e5ef50d3b7cad1860a50d34e", + "unsignedTxs": { + "fundingTx": "0200000002948b044703b7cf372d617a6d31b6fb7c3c034994afcf5e85f6679dfb0180bea80000000000ffffffffd409705c3388d21cbe38839c42f273b3e8d335ad9684c3fadb0c1c74216aeacc0000000000ffffffff0352c5eb0b00000000220020686a1b78dc769a11062b4ef354511d9f33c4ea0399501ade31bbfa37676da674e1dcf505000000001600142f655906042968e89d76e423e3941af6f55678d2e1dcf505000000001600148e574e4a8e758234d34d2637e2ba9c2b4210df8300000000", + "cets": [ + "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff02600a980a00000000160014cac8b01cfd5cb40fd2cde0a904a7ae14fdba9056a0b7530100000000160014ff23c68ffa5860d163df3937dfd26b03703cabd70147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752ae64000000", + "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff0100c2eb0b00000000160014ff23c68ffa5860d163df3937dfd26b03703cabd70147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752ae64000000", + "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff0100c2eb0b00000000160014cac8b01cfd5cb40fd2cde0a904a7ae14fdba90560147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752ae64000000" + ], + "refundTx": "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff0200e1f50500000000160014cac8b01cfd5cb40fd2cde0a904a7ae14fdba905600e1f50500000000160014ff23c68ffa5860d163df3937dfd26b03703cabd70147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102948b044703b7cf372d617a6d31b6fb7c3c034994afcf5e85f6679dfb0180bea80000000000ffffffffd409705c3388d21cbe38839c42f273b3e8d335ad9684c3fadb0c1c74216aeacc0000000000ffffffff0352c5eb0b00000000220020686a1b78dc769a11062b4ef354511d9f33c4ea0399501ade31bbfa37676da674e1dcf505000000001600142f655906042968e89d76e423e3941af6f55678d2e1dcf505000000001600148e574e4a8e758234d34d2637e2ba9c2b4210df830247304402207bac4b96efeb7ceb94c0315d46dfb79f836c48d022c58b86dde8f6ba01e21787022022081c29bce8036da8cbf64d5e370293ba88e00a563a3183c1b18599314e2c69012103043ae3ef1e3abc625e30cd37f5fb93c5dcd961a7e5ef50d3b7cad1860a50d34e0247304402202ab3577c1ab0e42b03aaa9ac4013370bc0be45283ab529b5abaaeafc1c39f0d40220319f6696e0db6e6b45588d3e32a43e4f51f35ed77c045d9bc0ae986831d1aed3012103979a26bc66b7260c54d089acbe8cd6a714766687bf1723f08de843051f2ac35800000000", + "cets": [ + "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff0100c2eb0b00000000160014ff23c68ffa5860d163df3937dfd26b03703cabd704004730440220187c7b0ca1bc0a9af4582bf85e2c7def53372661ebf0096a451d456855203891022056e1070dac878e95c318072bd4ce56654a264c4795168ad6060aa5c517d175d30147304402202abbd43c15d81d95e827f2f7479fd9220c28c6bfee2bae7b80925cef07e41ad502201431c96a75cb7bc0f544252bf1e6479b6494a087799379997f2e58820178eb6d0147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752ae64000000", + "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff0100c2eb0b00000000160014ff23c68ffa5860d163df3937dfd26b03703cabd70400483045022100bc3b4ca62284897ed04ca06a817aef1190a904ab6f0c7c90c1bb585290febc9f02201f0994b7856cc0fa0aa80605ad396d5f3033cba9e5d11f08e62f3df1c93a78b0014730440220539891371a9708651271b199914b73bc5696ecfca7bbf9d1dff59f3bdce812ef0220750969ce780d14c80bf364c4556abd1c4ee8c73ba505c7fe320e56aed0b8aaaa0147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752ae64000000" + ], + "refundTx": "020000000001013fb7fb52ac312d0d7401473a9c5311b16697592772f7dc020e0fa97bbdd572c40000000000feffffff0200e1f50500000000160014cac8b01cfd5cb40fd2cde0a904a7ae14fdba905600e1f50500000000160014ff23c68ffa5860d163df3937dfd26b03703cabd7040047304402204f50b550e2ad2a98abb733fa63ae0845c69b08373473df899542068300e22f2502200da4c43a90aaf0b054ab9d4b76a68c80b08f28d42287cf3201b1f146fd23257301473044022053f4b41ce033662358f0b70544271cec03578e5e342a7a84bbd017e2791d7119022017fa01cf48367e67f14ec40f9cd854f63c135d4e0f0584508182e7896ee9e76e0147522102fe8e5c05f8d71008172e3a4e16061bee85af6c27aac3e00d134eff84fb08ee762103d2280f2197371dc4b8c919f858e8630ee607194017ae4cc908d8bff91c4038a752aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "3f201323e7bee139633fbd75c63ab1dede3fcab0b823dd5743e2b5f4dc81b1d6", + "nonce": "431fe7b5349cbc2eb36de636dc2e7254a363b852c45681e9573156fae96a63f0" + }, + "contractInfo": [ + { + "preImage": "-3929986758304149295", + "outcome": "03f8cfbb27fc4201254f0068a232e600fbe3e81c7c637db107b07e6d62cc1ae9", + "localPayout": 157282950 + }, + { + "preImage": "-7691005183117806894", + "outcome": "0dfe1caa8af6fbba8b70e0df52c0499740a7cd995d4999d300b18495ac0cf7f3", + "localPayout": 89942031 + }, + { + "preImage": "253939062911350736", + "outcome": "88d0a4aa9f2adf2df6fd5f8e56647ff3f1107dd22db62fc01515be5a129bfe89", + "localPayout": 200000000 + }, + { + "preImage": "-1576695362158804659", + "outcome": "d4f5207a6209f4e4e490d3c4fd279232c6b13511cacffb3e71f5d71d7f8ea691", + "localPayout": 0 + }, + { + "preImage": "9141579879464469171", + "outcome": "54d7d7537bdcc25d0fb4c4b273a151536afc25be44255791528c7114a529ff1b", + "localPayout": 108290640 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "d4f5207a6209f4e4e490d3c4fd279232c6b13511cacffb3e71f5d71d7f8ea691", + "oracleSignature": "431fe7b5349cbc2eb36de636dc2e7254a363b852c45681e9573156fae96a63f075c3096411ab62bf608c20b9795c8b2d7bf97e088a9bc6dfaac1997f0db891b4" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fa94fcdf2b201f6c31de85bf1e3922dc92e7360500000000", + "idx": 0, + "inputKeys": [ + "d8b3099828b4e78671a39a05dad7cc54c3aa13a264e5adf2d95d7ce86d2961ff" + ], + "scriptWitness": "0200210268e831eaa911098bb8d79d038b5a6c1299fdf4b332fde455f6c0d3f0e5a149e7", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qvls63she85xyesyg2m8u0p94t3jr8j7qf250ju", + "fundingPrivKey": "0dfd1cdd9f171ae9a08fefc9665737193f2d2a0f986af4611a68cd220dc04953", + "payoutAddress": "bcrt1qwausukltl5sxcmflnzney0neyu0mxpdxeuvnj2" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001443ff34de510385ebd5f8154d2f22615b260fc16b00000000", + "idx": 0, + "inputKeys": [ + "cbdde278e99aba6bd3be8e50ebed47dbaca11c05a2683946c6665bf84da67299" + ], + "scriptWitness": "02002103bf5044130feca26e01aa4684824b37bad18e64d9175c852d1824f525237fedaf", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q0ec7jqjdy6xr9w2c88sqvet0ejw8xgrkljx6nc", + "fundingPrivKey": "4b8d30f814e20266af567ab0e45123dd298b78a0966fb9b7d37ed9f83337b280", + "payoutAddress": "bcrt1qkcln56nrq56d2j66kptm2d2k7935fy5plsuwm8" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7108f05142d3339323939383637353833303431343932393500000000095ff286142d3736393130303531383331313738303638393400000000055c680f12323533393339303632393131333530373336000000000bebc200142d31353736363935333632313538383034363539000000000000000013393134313537393837393436343436393137310000000006746250fda712403f201323e7bee139633fbd75c63ab1dede3fcab0b823dd5743e2b5f4dc81b1d6431fe7b5349cbc2eb36de636dc2e7254a363b852c45681e9573156fae96a63f00326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b60016001477790e5bebfd206c6d3f98a7923e79271fb305a60000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fa94fcdf2b201f6c31de85bf1e3922dc92e736050000000000000000ffffffff006b00000016001467e1a8c2f93d0c4cc08856cfc784b55c6433cbc0000000000000000500000064000000c8", + "accept": "a71c769d45487f1abbc0a207ec05dc755de7958b1a83a682898e557fc99494a520c10000000005f5e1000287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb4500160014b63f3a6a630534d54b5ab057b53556f1634492810001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001443ff34de510385ebd5f8154d2f22615b260fc16b0000000000000000ffffffff006b0000001600147e71e9024d268c32b95839e006656fcc9c732076fda716fd032b0500d8cb3a84dcbbbb9d05ea22d2118653cdc362d11eaadf1521bc64a697126d1a699378ab2693ce9ef7c876df8230b6ce8707c043a5da12da049b01af65ce8d92e90031e695831394c969c8c64a20344b68f398ed8c9e24d7ad502d5d970ad9b1282695d7b3c3da9539154da079886780c0c5bd4a8afaa2dfd2b165ea71ea24c81b365b57816930acfd1f65fe7fe927d19d07eb5fa123124be435daf345fa6b35c99b00c351510f73af09a22f0df5c16c7c4872c1e6aaf3554fb924dbb1e2df5cbee7830661032f4fe8f14e13d92b28ce569e886e5d8f95754251edbe85356931f9a28001a2292423836ff7194621c4bf914d8637d0445eeaaa39d678c710444bc431903307812a41803208af645d2e0f63d17bf320fb857c5a0721e7249eb837771b023630c81f2086e1d366e5bfd2187d4830e3e2f1a1e918015e18c4fa5a09995ebbcf00d0d2203f07361efede24b333a7ff7c0e0bf2e04dcb3d0d6f01e73e75d58b47537d288276e9e324cea36cf186a7627dfbbe0b934c98f90e3c238e6be1d5ec7bf901b736eab6a2ff1c8744fdcc27aff7875c04b0584264df8e49b3c94ff6ce7fc24addd5a78a3c649bff6c19f4e065ca6f718c21c9a5782d0d41675ec0d5fedec3206307f54a7b4d078dad7b8dd45c8859ad4ffdf3e74bab17406b0ce6d133c73e1a0048ab66c9491b1dc18fd5bf7da8c5c2ae4f25d367f1b331493fd4832c67d57752217d7dab609d30c0b45196ba85a3d15ec7013930b8120d3904ed87b080b1b1b4018caa6c542391194049ba35302b381f49f1d500d875315313a437373c3917f4082e8b292ea0c8d052398131f53ca0454b61102ea7372cfb7213ad9630012f6dffce9f975b553719e0cd91aea9dc95180b9b17ce499ba7520a551218facc6dd87101615f1e5e7a7b0ae099f7c4fd0b69615ee3cfe01fa947d79dd6a7f197816cd9d290455d88665f8b092e35ee433cee4c6f33f1472714c8a18b98a1f0b426571f020049f9b619f9f6dd0256ded4553e0deb4cbb61aa74052e670566937940f8a05d28bf495a293ae8a9ccdd1db91dc4ea7ddef29ef37530a4b6116ede37e0a8c71ea34d03e5bfc0b086cc59c2cf00ad0222f5e241154ae02b8c57e0ff0c40bdd06eba173f6a64879daf26c25318f7012bc8cd431c99753e82138e46913f1288a9281133f8661f10a2125401de68d0972e29157e74fe2ced942245733e8d9348921ad1", + "sign": "a71e8c4031a79043aaca40f42e668b45246e001b42ddd2148d4d2303feb28ac2d118fda716fd032b0501a0e9bdf6d93c2fa9860c1ef0e4180bf4f04aeafa95e55f86deea867eb80fd165bb7b3872e9dcf11189e724415dac440c16032027649169f11b863c24a3afe1110154b80e8eb01f5d6a3090808326fc081b08b2098c02758a4e94a376b00dcadcd29474b2a14fa188785be54c5256e6b9c894e595ff15714d20fc981b355e9a6fb0cc0a27e69cf783bec41861ea3079cf8f804921d9ba9cbb356b217ab7cd4fb0860075bc8b5ae636729623f48cd857a62833d2e42acff0311cb04ce1dd214866b39674c5e3ac63298b160c734f817b5d38f3aba73c9d58251890d03bac0d380c895e01469847d0e4b1604f8184218da79cd00b99e68b44e8453da4bd00d978d512b4805e0c3545e21c75441e0e1f25ece0e40580051d631aaa5a14b1e496a54f01a27b815a085a404e7de6982ba75b570e84936de67b5e59ba223bf4a9a3d6262fcc4f008e25ba5ae4e557d05fe4e96e7bebe510334843f8dde1f17ae17c0db50ea2c3ec184bc07ce84aa2e7a12af160084fa6e8a9d122b91014fa91015847daf9cde9a70026078a18096c258b75561977b9536553a79f5784c780d26402b8a76b34efe6d2b4bc7f9187f2ac9218e8cab29cb393cbd50940b8cb218c17bda7f84facac611c01cc17abfccd74a3f566b9f101b98a6371008d2af06bf5190fc950f5ac3addb401f746f5bfbb945993253bd894fe3fb225898f738c1a1da8009879b0387bf47e4b21e393dbf871f85522f856f88593534d328c48ba7e85532b7e99bc5ead71c28f01e9033c3c8bbeb7f4cb7ecde76c46dc44e4731dcfe4ca141d10a84bac4f6c80e3d0683eef798888ad5dcdf4367564d799fbae154d9a19db22df63ed30d235ff87f977518998bd1a289fe57da950b4c9fceeb1056ea8ba43ce86e6c0f20dafdc7300fa45df7d59b8c231dc352e458836fd10d5082c3a94624723da7dbfedf9b5e0d6e78e107494dd66e4140b541f43f770592ee41fcea144c03a052e67bea585e70d007d929bac3755575cc6529f8f2c869b08ef83cbef8b98d6cf13dd84f77fc54d9d2ec695c554921a383838442dd3c518139a749d6b44401d5457ab11e243ddbf3860469e77c03474a878de7e946dd3dddd6e0ef4e8114bcf463484406ec85abe9504058f798c6635dc8dd8d9ac00f967d718f96ca2bdc8b0416f2af39b908a9bae485f1b3c9ba92371cecd87ae272a6328b9730e21c27dae0f58150c8bbaec2847fda71870000100020047304402207701405a30a3d8cc7e0d22861944e1af0fd0bcf2609361e59d14c0ec9fd8c1590220056ce52e6bf1beee4a7efd923235ee4084047e136b7ecf761e875fbea9e822850100210268e831eaa911098bb8d79d038b5a6c1299fdf4b332fde455f6c0d3f0e5a149e7", + "unsignedTxs": { + "fundingTx": "0200000002c93a68a06e5e8186550c6e13d68fd90d679d2d84b03b32ae5cb26f48a32c52b30000000000ffffffff26f9badab986b6790b137bca8b54d239b9f8e891027b824ced267161a17c7edc0000000000ffffffff0352c5eb0b00000000220020a826c2c965b108f6fc2e76b26ed9dbaf357d3efc5da3c73feffd9aeab0e6b7fde1dcf5050000000016001467e1a8c2f93d0c4cc08856cfc784b55c6433cbc0e1dcf505000000001600147e71e9024d268c32b95839e006656fcc9c73207600000000", + "cets": [ + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0286f25f090000000016001477790e5bebfd206c6d3f98a7923e79271fb305a67acf8b0200000000160014b63f3a6a630534d54b5ab057b53556f163449281014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000", + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff020f685c050000000016001477790e5bebfd206c6d3f98a7923e79271fb305a6f1598f0600000000160014b63f3a6a630534d54b5ab057b53556f163449281014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000", + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0100c2eb0b0000000016001477790e5bebfd206c6d3f98a7923e79271fb305a6014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000", + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0100c2eb0b00000000160014b63f3a6a630534d54b5ab057b53556f163449281014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000", + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff02506274060000000016001477790e5bebfd206c6d3f98a7923e79271fb305a6b05f770500000000160014b63f3a6a630534d54b5ab057b53556f163449281014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000" + ], + "refundTx": "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0200e1f5050000000016001477790e5bebfd206c6d3f98a7923e79271fb305a600e1f50500000000160014b63f3a6a630534d54b5ab057b53556f163449281014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102c93a68a06e5e8186550c6e13d68fd90d679d2d84b03b32ae5cb26f48a32c52b30000000000ffffffff26f9badab986b6790b137bca8b54d239b9f8e891027b824ced267161a17c7edc0000000000ffffffff0352c5eb0b00000000220020a826c2c965b108f6fc2e76b26ed9dbaf357d3efc5da3c73feffd9aeab0e6b7fde1dcf5050000000016001467e1a8c2f93d0c4cc08856cfc784b55c6433cbc0e1dcf505000000001600147e71e9024d268c32b95839e006656fcc9c7320760247304402207701405a30a3d8cc7e0d22861944e1af0fd0bcf2609361e59d14c0ec9fd8c1590220056ce52e6bf1beee4a7efd923235ee4084047e136b7ecf761e875fbea9e8228501210268e831eaa911098bb8d79d038b5a6c1299fdf4b332fde455f6c0d3f0e5a149e70247304402202448b6f221b160528b3479554aa3f8544f0f6695860a068d2a7a984f5ec44cf00220073ac445422795b1bd3c8f0b4d9f377992686ee537cc117e6f6202d1a384bd17012103bf5044130feca26e01aa4684824b37bad18e64d9175c852d1824f525237fedaf00000000", + "cets": [ + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0100c2eb0b00000000160014b63f3a6a630534d54b5ab057b53556f1634492810400473044022048ab66c9491b1dc18fd5bf7da8c5c2ae4f25d367f1b331493fd4832c67d5775202202162aef380ea62067fe1c50f55d43bcee8ae7e3dac9cdc5e92d98f830f00269801473044022039759edd83da4571bf4948f8b4d3585fd5f19e5c03c039654c58c972338dc98802204d7c1a014f8dc19b0e69a0f3e1cb60181d17a37980449fdc132460fd3a4a8278014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000", + "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0100c2eb0b00000000160014b63f3a6a630534d54b5ab057b53556f163449281040047304402203010f9605e7d6c6944760f11b19b83c000e75a7aae70ed4ea0541173f1eb3ddf0220188f171a881af464caac022f7ce4d06e5670789e5b1171e0182fbd82e3ab795c01483045022100f746f5bfbb945993253bd894fe3fb225898f738c1a1da8009879b0387bf47e4b02204c89ae2ccc8bfb1a9c4f6745f816ef7f4ee857cb3f14532e25c267ee496a770e014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652ae64000000" + ], + "refundTx": "02000000000101d9f1671e26377c76c30496745e5890958979305763c2f3e20a1159efef74ddfa0000000000feffffff0200e1f5050000000016001477790e5bebfd206c6d3f98a7923e79271fb305a600e1f50500000000160014b63f3a6a630534d54b5ab057b53556f16344928104004730440220173f6a64879daf26c25318f7012bc8cd431c99753e82138e46913f1288a92811022033f8661f10a2125401de68d0972e29157e74fe2ced942245733e8d9348921ad101473044022004058f798c6635dc8dd8d9ac00f967d718f96ca2bdc8b0416f2af39b908a9bae0220485f1b3c9ba92371cecd87ae272a6328b9730e21c27dae0f58150c8bbaec2847014752210287f5b2df8c1b7fc2b18b0cb7ddc0a9ddc44197157c23f553121552aa447ceb45210326027ae77c1b739b96cab8b80d0ee4e83266a3f7d4b7c5e757128efcdbb636b652aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "77fa3f71c45840f0f5c01588819c88592f86c257737c94baa15ae02bb7e740f7", + "nonce": "b38d5c37f62ee451e39bc827c3288f436a115c8fd7a53acd991c56a465172a43" + }, + "contractInfo": [ + { + "preImage": "-3471323491422305310", + "outcome": "f9244793624bf6e2d794ff0a5297093e096f2279697d014f60f074b6cd5a1095", + "localPayout": 162797772 + }, + { + "preImage": "-7611493754448723953", + "outcome": "b4f0935a18d6a25a99b9714ecaee41ccef1083a79b46a9e31deddd5337ce8cab", + "localPayout": 7833117 + }, + { + "preImage": "-3799188400809816894", + "outcome": "5b73d4c925ef025f71e82575c7d33bde6cb6de874fd413da22b4be77bfa8e7cc", + "localPayout": 185056319 + }, + { + "preImage": "4929916271403093696", + "outcome": "16f2bc7072a524ef78bda0099aef947bc311dfec2ef71345ca19c02122371cba", + "localPayout": 115750371 + }, + { + "preImage": "2897849241273297541", + "outcome": "0d81fab21de207e3e2778cfd280e8e9506854962bd4f0989a9c433d5cba21eae", + "localPayout": 14710220 + }, + { + "preImage": "3020164268141430832", + "outcome": "ceb193451718584d6ecfad26894cd346bd53900acbc8d60528e7013775cced61", + "localPayout": 199937260 + }, + { + "preImage": "2528107270415818352", + "outcome": "3d5beb2c157465783533ffb0e39346668a8d6a8a024d6258fb06fe4059b4fc6e", + "localPayout": 200000000 + }, + { + "preImage": "8691028691742653137", + "outcome": "e8160d1d93a642b8dfac93b55eda1a97012139a2e6136fc9ef3ed349418c6ca6", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "b4f0935a18d6a25a99b9714ecaee41ccef1083a79b46a9e31deddd5337ce8cab", + "oracleSignature": "b38d5c37f62ee451e39bc827c3288f436a115c8fd7a53acd991c56a465172a43c9fb20c910f2e2f81e2d8b48ab30176954609206fdd53990d047bd26af7624e6" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600141d3b8d3bf619b76fad5f45f3b0ca3acc2ebab60c00000000", + "idx": 0, + "inputKeys": [ + "ed43e2345370b43c068a38511894fc3b1faebb24b00eda31f9fa8c6e178873ae" + ], + "scriptWitness": "020021022ae3e4852e11cabb90faddd5876c388b26d719c1e5b3f71274a5699532246919", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qcfgk6jetkgl337jr3k7mcrrhnkwnefw6pvkpa7", + "fundingPrivKey": "439d0af3afd317f922cdd2f4c87c88118673fe177c5c6e8df15d0e33d0b14ac4", + "payoutAddress": "bcrt1qq0cslzyn00fltefaf27ck467q7kmjs69kkfvs0" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b0fc339562361e8e91f13fbfafcb0a723f1ceeb600000000", + "idx": 0, + "inputKeys": [ + "289e7414c80291af08cb9376f020ee3483fd31b3753283a939fe6db4af2a11f5" + ], + "scriptWitness": "0200210257d1ba13d9c9e042023b8fbb2c7d62190c8a326df7e96186c0628476e0f95e0f", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q0r7pc4hy4r83qw032pqxtmqpaavnx9d240v5sw", + "fundingPrivKey": "f200e0488038525db2185b40faface4017b7c64d6d68d4b149e922ab5a79086e", + "payoutAddress": "bcrt1qrv67e4rgdhpzzdftdm9quaz9ncctx4g6h9gzzs" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710e408142d333437313332333439313432323330353331300000000009b418cc142d37363131343933373534343438373233393533000000000077861d142d33373939313838343030383039383136383934000000000b07bc3f13343932393931363237313430333039333639360000000006e635e313323839373834393234313237333239373534310000000000e075cc1333303230313634323638313431343330383332000000000beaccec1332353238313037323730343135383138333532000000000bebc20013383639313032383639313734323635333133370000000000000000fda7124077fa3f71c45840f0f5c01588819c88592f86c257737c94baa15ae02bb7e740f7b38d5c37f62ee451e39bc827c3288f436a115c8fd7a53acd991c56a465172a430335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f0016001403f10f88937bd3f5e53d4abd8b575e07adb943450000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600141d3b8d3bf619b76fad5f45f3b0ca3acc2ebab60c0000000000000000ffffffff006b000000160014c2516d4b2bb23f18fa438dbdbc0c779d9d3ca5da000000000000000500000064000000c8", + "accept": "a71c937735aa16362dec945da44a30c6585de68f32b6b68d593e85e44a8b92f49d540000000005f5e1000335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d001600141b35ecd4686dc221352b6eca0e74459e30b3551a0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b0fc339562361e8e91f13fbfafcb0a723f1ceeb60000000000000000ffffffff006b00000016001478fc1c56e4a8cf1039f1504065ec01ef593315aafda716fd05110801ae3e9eabd28187fbe24ef297555f248c71874fabe13ff55d62a4f2d47057f724f79eb76eef74e6497fe3a6347b97c78ae499ce6c692bd3f06e74eb5d98986825010e94174fcacfe70ac8e7de3e2c5aace5e7b8d61f69f11b4973f702ec9d6576cb60c0c87312043dfee358ac76daa7f5064170325ca8116c674ed3f43da9064a6dbb21f3b251ddb3fbcc261c91f706551ccf96b8af02df7d07a3bd4b38d761053f00b391c694eec8e527e3f769d297571234c6e0bed8c661aa361605991f5e2fab2494b5bb171910893a99e193a17955c14d005b09da7fd78f9bc639c00859b4d3d9012606a5c8e573eb15f5a03d20a35e7f4b57c573b658720c57e29f41bc556c1492c1a343eb9eed77a39037c999a2c7e8bbdc15b5be274e139a61037a3cc87b929e9e912ac7bcb6229cb48515963c5fcf8a0a109924f37b53cf5e786d15b3b6c0b201e3443d51a9c022d414ad54d012f258e7d91e99ab10da20d3ffc52e56bc6d67603dea5c2fbb52c6dd83487fc3f67a8b685c128d0b2333a0b77192b47101abee4c010c830c1cae06ed9721f385a363fb99342d18eb94afd05e35ed0ce5f05844e4fc3433fee1402da69daf2aec9edc5173e8f7e73f580d9f08f8b0eec4ccb95b40e44b914ab1dd9800738464218b1044debf896ba0b242d1ca3e59f44d977d6bf08301f8ba2d61b8df623273c6357ef6ec4a90fd97b36cedba95d0af3727dc180c83963735cf92136b1a27aa6ab68891a7c6224afbf85ff51d409e155d44a42a7f221900c5ec42c86e018b8df43238b67b7de470e28c826eb412f258a44f9755387b9a64c665ae5a55dad4baf4f43ec7616bad2069f251e8cff540fe2c0817ff905814a3f2eb3d1b60c419ac2ded9db0a3b70f69b0090aca27813e347cd949a0c7f7853401e67794ef1a8ce9017a35f248198fdcf7599e01d942c6fd7170b94b77ddd9371a96553b001fb415ed20f90655879f7ef88d4f2f25ad1e866cca93de257996069100ad679d09833133f2dd91f2520fb5ff403a28773b58bc6638ff3ec722436b95994a41cbc3e0577fbd7b0cfd37bc207025ad08eae5aefb9120cecb53ba93171331b1f8e5caa40f851e77bf6959affb932093fe97f3cbc260f65d1b2c755336735f0118c1c92862d89dffc75e82b5926e7f02bcdc91319cd9a53e9b1800b04458d18ac2443f279924b61bee995589dde3be3517d80ab3802f4d373af384a4ed4f416e001d58eab7bc3efef2e23e97977e03c35f156e2116c33d8eac839a6eb448dd49f580813304731dbe0fdabbf09d1426afc282ae6aeb709caa62039859ffa5ff1c42b0f6e21aa5c2872ae9e8f4c10fe5ffdf70fe0d4034bcdb1fa401c34a119416ba01d36beeb97c589fe79c2efaeef3d96c6d1e0061a588639ca5019c2021a32b410f060173bf210fee4ee7cd1d15c53819e6f89b3ef1d855e1e5ee01f472b4a7602e00ce643e9e91c325c813a72e05cc723054a26008db61b0a32fd01480d8996be3eb94919407a83982e2ad8331005364747a99d43371bb60ea2856fe292d3365e38fbf425a9087af4d89b8126d93ce0ddef51000d7bc09052f9bcaf106e118ec73680154cf17bba9900d2f23c073b8ba2b0c29b93c0d70cd8d87e52f93ed5776a2e95178b1e87142d6040e4da95cf8d48648757e1d5b88782d2773ba3f7b2abb5b542000ee52ba922e4910452bf8ded302b11a52eeb5c497963ff50f9a15ad5ac70008fde51c9884cfeff45b92e1635bcdfa74d60592a3b56fa0fa9200e88505b4f8f0c28f267f0b47d23c415d21b4df3e5ef0c362ccb74c527d41ecc12f6e9559ea91e94cd4033c40b9b622507f57e848e9ccbaf6f44531be6a4950062aa9d8cdc514022c74798caced803421379dcd5fe49c33d6022a5ae55727fa6d8837d9f4b4f105", + "sign": "a71e987bdd40a2c878a36fc21413e1dc086ee2cb67dc2456e62cfe72fdac8652cefafda716fd051108009f82bbee5e5eb0ad1bea5feee5d80756cd7090f169d09d08b9939713e08bacd46ebd5256f4769c18ebff7c49f13547e0ac00849e0d50c23ff16a59892c3bf18c0123f17f5c9ff137570c174d5c344b5bd6f21fb900dfcfb648e08e42444d95b2a13a51062a0894a3020311c56f95cc69011f961c5fa3561d96f0567b05fdd244f75a0f369c6105c6d378639d7dac648a15fdebc5378cfb451a943ddb83e98e9c0b0092947fb8d0b2c1d4efe2f8fdf26251b86b6a90f862333d0f4849df8ea498c729b6d0c47087575237f31ed8642182cb16539a6fbdc4ba667cf31b5e5e6d76080b019177a4ced47bc5ba52d11b54571f979b27d06d5fb619c9b4d55bfa1c4637189954d393b06f1ee99e9a15f2954e256c3e8c0da9bbdba629fea80acc32251a26bfd873a001c6e3b333c7173d12a0890fae99176bf7317e30b72b663a69969bbcb200369f3b3c7c592c8ee8c889d9741cfcda4a46d916024848d5f4d6980df14e8469b057b30f263febcd82b8194239c5b37d751d54a1d78427b91d3f78d17bf053da01a82ccec37e1b70a42b103c981598e37e36588d421581b11dd9276db787a7ae6ba3a434bdb2fbfd5727a86ab07bf5b7ac9b3669fc8c7b26edca238ac91f3765667689b78bd17696918863f40b3273dc0a16a413354291a8b3a4e8300bbe40da0c0039076719eb795988a880a562b2584bba9da14acf5b486dc05529af2157c1e73ccc6a9829559e157279f12f2428975db88f9a94d17c671719b37d7bcc3c4324b800e0919e1d26d794f432919ff5e4db62ad719d4e1a4a09857797aa9ff60c16b8514501790c8166c34235459168d61f43cb4be501c234afc54fd480907775aa0ffa91cd3cd654ddfccd1c830b71ac21242882e3bdbaf484bc771afdef0ca44c61fa01e1dffd6c66aa4d0f4dbe9daee335dc02091da6c21dab19b81bd71c1336eaa3ab4b1fe1eb80360b5edec2affe6c590c68b64cfbc840582a792135be5f70ea8ab10198c9f14c57b92bd491953b78d8c42eae4eca09475e08b73450e403991e5ad314141bbdd77810f7e82cd545f6269ce426dbc41b4025c7f73cbab5535bee0a07cd9568370a2cfc2b0a5d81a8523fcec92e5f8e75b0344bc6b0224440b3117368440064e8b299a24b40c8a67fa1c0c962b6c8d8c04286a6b6a8356945a3271dc9b7bf3668fe418cae962f064cfc84be26e5cb0b39a44171d1e186a9900f5b5f0948a10062bfcd47fb6c8fb0e20196fa95e37073244c54051e0296952d2bc3aebe7f3e9c7ce29a3c0bee2dd45bc0706df22f49cd5666fec44c986f88a3cc4bfd64aae54371acfbd5bd9047d5149f0bb108104c1283607524bdfceae921af82b612917ae700ee2756bdcd5b3b40147f2b0e0272c54876d66fa8fe3b1dc8681e98a63d7bf98276b6ec08e78e661999a34bfd5a6543862d8e3fca05860fa25aae75d7a84b5b0c006177a8c148f39ccb42b1a57d232aa494dcd706e1640b4ebe048d48a0a2522baf531fdfde56026b1442fbed7d4c9eea1303b31e0640e02d395c64ca61593d1d8e55d2715b9f27be02b67e7ba43e5d30c33cac1b75c80a9426e1762cfc0595fd410074207e5e309012e28c87ffcde3a861b55df5ff89db3ef4fe6a66df31348c79dd36ba32d071efb18e282019dbdd32ccdbc723e5ef38a8084b34d523229abe649600af38a91ffc44346f178e0045c245a320e3bc092fe4677846d2fe71124f769fcf123b7ff7c493fd9368d81181804cb0ca75140b1cb87fbff3ece8bce868dbc0da415f7eac2839c695e341fe37035edd3ccf4d66bdca6f7c0bc712756d5f2f6ea141906e55a715e5c7824669b14341db3218edd94cf1480561c20299106d3ff1151ad9ccd5ee3342703f092bba0ba814da2f4c2eb105cf3da38c9528a9f70d8cb2fda71870000100020047304402205076a7998115d9523e5a7a79621d5f6c400849f09940bebeefd0595b322ef5a802206f11cf17db32529fa72936ee39e7cf9f6cbd26fb797f4f3c11468d4a15cf154a010021022ae3e4852e11cabb90faddd5876c388b26d719c1e5b3f71274a5699532246919", + "unsignedTxs": { + "fundingTx": "02000000027ac6ad8243b7f0371353764f0d9777de2411abb05e2925522bbd64a7845a124b0000000000ffffffff40044b75d8bf96d12612ffba7610c098898cb67c40fec2a179944a4d91e707640000000000ffffffff0352c5eb0b000000002200209162f53bc9bb8c7190ca448e2a40a351cfbb4a1cd47f4eb0f243c1ed89514195e1dcf50500000000160014c2516d4b2bb23f18fa438dbdbc0c779d9d3ca5dae1dcf5050000000016001478fc1c56e4a8cf1039f1504065ec01ef593315aa00000000", + "cets": [ + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff02cc18b4090000000016001403f10f88937bd3f5e53d4abd8b575e07adb9434534a93702000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff021d8677000000000016001403f10f88937bd3f5e53d4abd8b575e07adb94345e33b740b000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff023fbc070b0000000016001403f10f88937bd3f5e53d4abd8b575e07adb94345c105e400000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff02e335e6060000000016001403f10f88937bd3f5e53d4abd8b575e07adb943451d8c0505000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff02cc75e0000000000016001403f10f88937bd3f5e53d4abd8b575e07adb94345344c0b0b000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff02ecccea0b0000000016001403f10f88937bd3f5e53d4abd8b575e07adb9434514f50000000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff0100c2eb0b0000000016001403f10f88937bd3f5e53d4abd8b575e07adb94345014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff0100c2eb0b000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000" + ], + "refundTx": "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff0200e1f5050000000016001403f10f88937bd3f5e53d4abd8b575e07adb9434500e1f505000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52aec8000000" + }, + "signedTxs": { + "fundingTx": "020000000001027ac6ad8243b7f0371353764f0d9777de2411abb05e2925522bbd64a7845a124b0000000000ffffffff40044b75d8bf96d12612ffba7610c098898cb67c40fec2a179944a4d91e707640000000000ffffffff0352c5eb0b000000002200209162f53bc9bb8c7190ca448e2a40a351cfbb4a1cd47f4eb0f243c1ed89514195e1dcf50500000000160014c2516d4b2bb23f18fa438dbdbc0c779d9d3ca5dae1dcf5050000000016001478fc1c56e4a8cf1039f1504065ec01ef593315aa0247304402205076a7998115d9523e5a7a79621d5f6c400849f09940bebeefd0595b322ef5a802206f11cf17db32529fa72936ee39e7cf9f6cbd26fb797f4f3c11468d4a15cf154a0121022ae3e4852e11cabb90faddd5876c388b26d719c1e5b3f71274a56995322469190247304402203cddb3b2a421cb3578672ed2da6636f46f5335632b44572a696995b63d11d43402204e9850f76195c4ad4edf7029dc896fac96c05e9bf27a7ed1cccb30bc54975e0a01210257d1ba13d9c9e042023b8fbb2c7d62190c8a326df7e96186c0628476e0f95e0f00000000", + "cets": [ + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff021d8677000000000016001403f10f88937bd3f5e53d4abd8b575e07adb94345e33b740b000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a0400483045022100b391c694eec8e527e3f769d297571234c6e0bed8c661aa361605991f5e2fab2402206dc2137598c9675b729c71997330381b6e20393139d6241803897c8189ae1d8b01473044022034f59e46f3e85b141f2d04a8404275949cb70d6c3288e92ba4054f37ab2579eb022073e41fb7db9525d044fa6b914a77b24a293e11b3dc9085263ea18308732842f9014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000", + "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff021d8677000000000016001403f10f88937bd3f5e53d4abd8b575e07adb94345e33b740b000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a040047304402201a55c1d8321f2cf50ac91d150e84f60219b2c06832970fba18f1a8aec0ae95bb022071cb8edff0584cdf165b4231dc42b8a2c1728f8a9011def40881f85a76ccddbc0148304502210092947fb8d0b2c1d4efe2f8fdf26251b86b6a90f862333d0f4849df8ea498c72902205e2b09af120a6002eb3965516d6239c0a604e6e58b291fa9f00d16b22f543ea9014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52ae64000000" + ], + "refundTx": "02000000000101ae53a61427b7967b12bfdb926a55440433501ad159b09ffb4f55feb4eae80c0b0000000000feffffff0200e1f5050000000016001403f10f88937bd3f5e53d4abd8b575e07adb9434500e1f505000000001600141b35ecd4686dc221352b6eca0e74459e30b3551a040047304402204cd4033c40b9b622507f57e848e9ccbaf6f44531be6a4950062aa9d8cdc5140202202c74798caced803421379dcd5fe49c33d6022a5ae55727fa6d8837d9f4b4f10501473044022041906e55a715e5c7824669b14341db3218edd94cf1480561c20299106d3ff11502201ad9ccd5ee3342703f092bba0ba814da2f4c2eb105cf3da38c9528a9f70d8cb2014752210335ed4271f34b2ff73fed67d0d185bff1cef08ef417e5ebfe76cd54521e5c569d210335ff520fd3e28ab88af530c7d5b0e69225b4730e6c0eb144470546ecf27c785f52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "c68f1a7607fba3e4a7900a80b367f600381ee72a6c4fcb3145493003e78f91a3", + "nonce": "0f42b9481b99ef6a3f99adad7b7faa07476d3fe0c7fdbd22c3e2dea1f38bade6" + }, + "contractInfo": [ + { + "preImage": "7934975880024876991", + "outcome": "c1292ef4a29a384fff79af405b983d1e351f2baa7bc891f08170fc86149beaee", + "localPayout": 161160357 + }, + { + "preImage": "-2016533797658581429", + "outcome": "b3eab99f2ca8edcf8890b97fe371e03fae719a5de10833234be02e255dffc331", + "localPayout": 200000000 + }, + { + "preImage": "-2776759541651737722", + "outcome": "cff48fd4b80f65a9e5ec652e0c96d20aaea8c7b347695e1a898036507bd35cdb", + "localPayout": 183623952 + }, + { + "preImage": "-7163381539866601565", + "outcome": "a53d521a044296e18b3465f52e7437e52c9b92550e738c9d3799686ee8ddf32b", + "localPayout": 92700935 + }, + { + "preImage": "4818716420578072819", + "outcome": "e563926ed2d15bd6c9474487f540206c924fa04acef6a4174840501e6f55af6b", + "localPayout": 44353580 + }, + { + "preImage": "1094418960531534139", + "outcome": "6fc358711f6d34b6b9d303dec9dfefc58362f7a75657016deab02d479f41b72f", + "localPayout": 152088465 + }, + { + "preImage": "7363843635007435424", + "outcome": "eec098b6a3ca297174207fa08aa0977a6a585ee6a948a1977ee275305f94806c", + "localPayout": 97203344 + }, + { + "preImage": "-7691271549458956706", + "outcome": "34ca6758b3e30b24d4bb6eb863e31f13940c1b5c3b6834e299324c78e5a61c83", + "localPayout": 101732012 + }, + { + "preImage": "5387949226322895996", + "outcome": "58bc22cb5a8f18ba704759d02a81aff3f4195abe051ee389c6e1386f937840c1", + "localPayout": 65397507 + }, + { + "preImage": "-2535039057087874922", + "outcome": "033648645234689b61c9b72d691d6f0bf5f44d7d49bd0b68583c86bf1704cd4b", + "localPayout": 123599415 + }, + { + "preImage": "-7137163046824607070", + "outcome": "93799b3068dc61b00c03347a6cdc5fbb6603cfc7b2ef1f862ca93fe3962494ef", + "localPayout": 88568483 + }, + { + "preImage": "-4139807799257007900", + "outcome": "90a9b90174d85c76ade0e72baaa1199986684111704289ee75305181e6771ec5", + "localPayout": 37431285 + }, + { + "preImage": "-8854534032861506207", + "outcome": "0903a4c82c3e9b44ed49b18049edba303005631245b4e1e6918d88db4a177d25", + "localPayout": 7655391 + }, + { + "preImage": "6274509860605813049", + "outcome": "268343c2018569ed314a489d51e3ec9598aa9c5339690425a2cd8ba51f191bf9", + "localPayout": 65712140 + }, + { + "preImage": "8612482470495202444", + "outcome": "7cb42622e626c71f6862305b5c0b4c1c7e27df17887f0384cec1064493357684", + "localPayout": 155673628 + }, + { + "preImage": "-6063596341218270283", + "outcome": "0a0dbf8a048de944cbb54720628ac6133e5de5115c3d9df7c27ee0c1187f7d8c", + "localPayout": 95195155 + }, + { + "preImage": "3172718380352622480", + "outcome": "ec456bcba56b5f9a23dd2c92210f0eb49eba0990fcdc6f664edd611e41390db0", + "localPayout": 108760405 + }, + { + "preImage": "-7239963122893261966", + "outcome": "89497b7950ce8a582c5ed29f531a7634a0ffbeb17e6c5e36c2122b28e55e70d9", + "localPayout": 58266810 + }, + { + "preImage": "940821527990821662", + "outcome": "037029599485201750ed3e5a25463d87bbd282b9473b2a48733db782360d6c86", + "localPayout": 128821355 + }, + { + "preImage": "8733197791846525194", + "outcome": "632ad5b65272d018949b93b7abec674a922d73a194c432afe937f915b57d07f3", + "localPayout": 119318296 + }, + { + "preImage": "5074461097340657774", + "outcome": "a86308130c5be315a699840c1566a7eb915654503f6c8324c461b3d530b5cba2", + "localPayout": 83774738 + }, + { + "preImage": "2915388381566733081", + "outcome": "4e7a2459b58dcfc85aa422201799cb2ecc2e6b7585c9278b077bf4791614831b", + "localPayout": 10244500 + }, + { + "preImage": "-4869233677862109296", + "outcome": "3535d90748f418383b232290322e1a6b68129e0638423720a5c4b17c3a3f65cc", + "localPayout": 98973990 + }, + { + "preImage": "5200544740219364123", + "outcome": "d19c6864df044b7017ce8d7689042662a92eec4c7f79e9441827321a2cd3681e", + "localPayout": 76714831 + }, + { + "preImage": "1256870990702040630", + "outcome": "1e887ebe02903810cfbaddedb96f18e223f48dbb77dacb166523d0be3b99c8a8", + "localPayout": 118603525 + }, + { + "preImage": "7089123057073909594", + "outcome": "03784e0acc3b29cc02c8d14513fc7a7408c9e4100dcc7dfd0aa85c8ac3da0973", + "localPayout": 131751818 + }, + { + "preImage": "-2413349715897533690", + "outcome": "dfef5f799fe188a0170bcf9b495b251906756159a757154930da3700a6ad3a8f", + "localPayout": 96340953 + }, + { + "preImage": "8152625160351278702", + "outcome": "9d92b15c79a7fcd8688392d5f2a667867d2ae9af04ee2e4c1e2b14871eca9540", + "localPayout": 178048180 + }, + { + "preImage": "340648860765072857", + "outcome": "8e18261a43f4ed7b7451da0a5a0b5784705a7bc8e984fb5e02f1d7c610aa077e", + "localPayout": 60200896 + }, + { + "preImage": "2466727064049411319", + "outcome": "a06d24ee44ded790ef2309484d05eb5f2c3829a6c4ed70f3e5649feabdd70751", + "localPayout": 66208576 + }, + { + "preImage": "-4569471047695463304", + "outcome": "9758c498ab95861b87b78d2976e059666604bffc03e169dc96ceccf385296d7c", + "localPayout": 48880239 + }, + { + "preImage": "-7864011771029769367", + "outcome": "99c89011445a91a6d5db3a85188bd49a829a14e9dddd04b4ec8c8c2ca51b0f67", + "localPayout": 187857723 + }, + { + "preImage": "-7788084616404261829", + "outcome": "5bedb3e39858fd0161ae7453866688c8e5794c7181b065c41e65884ad08cbdb7", + "localPayout": 139278319 + }, + { + "preImage": "-3716252968214214606", + "outcome": "31620143f392879cd3877e2d1634be83c7e3209460d01ac19792ae9ce1add46e", + "localPayout": 161924313 + }, + { + "preImage": "-8299911049932526960", + "outcome": "d7e95cb979541fe3b4de5a9e51a9a0ba950f3017a8eb8f67a2ee29331d5ed86f", + "localPayout": 36330839 + }, + { + "preImage": "-5286202550460815044", + "outcome": "ba11e61e803562b609a710f0548d942081b21b82b1fee1864095e8f473e59e94", + "localPayout": 140070405 + }, + { + "preImage": "-1536169034949495453", + "outcome": "6cb0480d7f478c0bd4f29625f62cb86ed2363f6b45729521c57efc699aa9f4d2", + "localPayout": 111591357 + }, + { + "preImage": "7121283837312155605", + "outcome": "a457ef43af6ad1b4267ae2ae6676c2c9d181b54113474b6b7425e09128b9d2d3", + "localPayout": 86327668 + }, + { + "preImage": "648988027443786838", + "outcome": "e910074f69a76c432f5a53e81fddf76528bb62e4fe90875d985def42af7e3b37", + "localPayout": 178200853 + }, + { + "preImage": "-3315084485778854071", + "outcome": "12bfa097c3286caf4e5a5fb34321ca62fdc3a7c80afc23911d3780b4fe7437eb", + "localPayout": 49356492 + }, + { + "preImage": "8180277896675904565", + "outcome": "fbdaa57b511617c91f8df437f707baf948f42a01cb418c28319f51c3240b2801", + "localPayout": 36464224 + }, + { + "preImage": "5876133829034490350", + "outcome": "2904fbdde4218a898e2b862ca3e2acc71af28e6742dca2fc73165f874fa65616", + "localPayout": 0 + }, + { + "preImage": "8444993389728880970", + "outcome": "d39460e59c17eaeb65e7009c69efa3a0b5ba5f44d2b835cccf27594184d6d7e9", + "localPayout": 57644393 + }, + { + "preImage": "-758483385535912787", + "outcome": "2f495ef904ed16c10b3915660957fc2f8d8331fb60458853517b379726282cdf", + "localPayout": 93816868 + }, + { + "preImage": "3102326591960775401", + "outcome": "5624877f6e4221996833a767242bb714a28db6c9e4f918d924c5b43a792b2541", + "localPayout": 43045182 + }, + { + "preImage": "-326719743887104564", + "outcome": "64ff4ecf6e9f6031503dd67d15187f11d71990417556c9e2a79516862c6039f7", + "localPayout": 184564383 + }, + { + "preImage": "5014671369900518253", + "outcome": "582a4dcfb185a5ff236ce2184a0a07007396af09414d1479fa410c7408489429", + "localPayout": 199002477 + }, + { + "preImage": "3093301156175065271", + "outcome": "cc6635775bd1a1ddd123dbf6951cc57bd5dacd22d78b9b5393ae568e7c6bb282", + "localPayout": 135492335 + }, + { + "preImage": "8927422526313256851", + "outcome": "1f2bbde278dfe07f8f3dec4d4c50eaa0121db3ba2baf002c62ffc0568dc8e732", + "localPayout": 111774498 + }, + { + "preImage": "7015068737281168169", + "outcome": "ec8c8ee725c5099b3a950d1b749277634e7d0b5600c904e34a4b7d858ffc3272", + "localPayout": 10170860 + }, + { + "preImage": "-1467610426696740034", + "outcome": "b6ba299901a6e0932aade3d04e3b6993003875186b31e40d4c22b437ea6af041", + "localPayout": 54038362 + }, + { + "preImage": "8467735030414347439", + "outcome": "3716eaae828e12dfa9d0cceb60e402a37201ef5330b3a426b5f27753824c28ae", + "localPayout": 130079334 + }, + { + "preImage": "-527369161871442972", + "outcome": "9988524d281a7e554100ec21ba4fb193dbdd94ecb324939a4252727cd78c722c", + "localPayout": 81691611 + }, + { + "preImage": "-8327946725850930214", + "outcome": "db0768afe20ff3d4b557d4669216fbb3efda4f8c95435ae1f2fcda8b100910c1", + "localPayout": 83960442 + }, + { + "preImage": "928185023044225451", + "outcome": "e7cc44805f2388943e4ec4aa5afaa6308032fcfe665243a861bdac606744a0f3", + "localPayout": 88978252 + }, + { + "preImage": "-5496268475562167450", + "outcome": "aba9dc103d3798353bd6f9afd5b4f80f55329aaa7f2eda9a2c89845163de8bb9", + "localPayout": 136204003 + }, + { + "preImage": "8048567326577973782", + "outcome": "c95f430316d1c0ff8054ce277928abcb23a27b629c997c5647e23e042cd65cbf", + "localPayout": 35675625 + }, + { + "preImage": "-2125981980014244544", + "outcome": "4d0a54bb471105a1356fdcf7608ae7e09c89b34466f5053a525d322f862353da", + "localPayout": 27903387 + }, + { + "preImage": "-2722541019409869165", + "outcome": "0a02e917e32034104f89f80a1223dfb8a2085cb108b56a71a598ebb74c68a520", + "localPayout": 186815306 + }, + { + "preImage": "4570691479221730302", + "outcome": "f851bb1b8ff0578fb5c8bbdafe3cef4119c76a114cd987bb4c789990dfe6d43c", + "localPayout": 184249247 + }, + { + "preImage": "-6436894932790471359", + "outcome": "d08cf99901ff7da459504fd8c1cb8b399f053439966d27e2213915760ca68dc8", + "localPayout": 151355111 + }, + { + "preImage": "5625469585153190496", + "outcome": "6ff11d5f864e7bdb4f38e13b7132deaeb2352d90f1619d0a3410c127b0646bc5", + "localPayout": 108261611 + }, + { + "preImage": "942315456864724525", + "outcome": "cae2c766b386a1e6cbfddb4e151a552398a9c6549283fa8204470524efd53c6c", + "localPayout": 178139248 + }, + { + "preImage": "-1067506799380504775", + "outcome": "dd1235d46152052e5949d7db0d021651f90d284baa4a8fe5f3a7fe0c42e12268", + "localPayout": 114607535 + }, + { + "preImage": "-7100632640127860197", + "outcome": "716ce16279cceea0a92cab11a43a543b13ba00a25ee4daf367ff8eaefe6b34dc", + "localPayout": 184523572 + }, + { + "preImage": "-5803515398153445587", + "outcome": "3910a5ee14c48f4ca74c35b1584c66e4009aae4ecdd3af7da346948177abd127", + "localPayout": 4038033 + }, + { + "preImage": "-459040773310308209", + "outcome": "d3dfb0238c349b816181249c7a2d97feb8908a949c4ed154a84c106f98537f64", + "localPayout": 134850845 + }, + { + "preImage": "4242969514806291198", + "outcome": "b4e9af093049d10157eb6fe44fe2531e4559253b0cc0e60ab5f3509f5b0caafe", + "localPayout": 146897383 + }, + { + "preImage": "-6835049582307545198", + "outcome": "ee12f5a494063b4a21ce0189eb0d6ab010c75382a16e89e88b7db00d65b1b316", + "localPayout": 178905592 + }, + { + "preImage": "2816701088247388195", + "outcome": "83c77a9fd92e3248b22c52e64fe23908b3b295db038b8e8eae9a26a58567a24d", + "localPayout": 54170805 + }, + { + "preImage": "1055559876596887992", + "outcome": "0dd9ab0f62c31ff443a68ace0b9a97fb74db93dc8dae2bbc7e05ea0e0f0d17c6", + "localPayout": 67520931 + }, + { + "preImage": "6134586001487557742", + "outcome": "23c36a7729799ea921bae07d9394a1a344f2e4c8d59e492048c795f43c32bd27", + "localPayout": 38024963 + }, + { + "preImage": "-3303568545939914044", + "outcome": "b6b617fbf098872503125e194a611e416adc9450353c7934e2d8612529b32ed0", + "localPayout": 85577401 + }, + { + "preImage": "-6492048866906536292", + "outcome": "5436aded84d77288e5f76e6957c5b23ad2040c2e65d0df981bfd39ae83a2a273", + "localPayout": 33830315 + }, + { + "preImage": "5452148677690188754", + "outcome": "acf8bf79f4112c9975589b0bc25dfa40fb388417124d67a578e861e860e59ba8", + "localPayout": 173246631 + }, + { + "preImage": "5767255941859566675", + "outcome": "d8b9ec189c69bb5e1af290402b779d75951ef67dc30bb92a41405ac8ba1ab83b", + "localPayout": 50755251 + }, + { + "preImage": "5744741432781801865", + "outcome": "123d8dde668ac95db395345036765346ac7ecf1649a0165b416dbc49dce95a05", + "localPayout": 33627485 + }, + { + "preImage": "3007186482350312924", + "outcome": "eae44ebb7fca1d9be62455fa688732c1bd9339bb1d413ea408d8a21278d93740", + "localPayout": 15308432 + }, + { + "preImage": "-2711015437510962650", + "outcome": "ea6d05597c5ac0fceb2cce06602fd9d7643b95e158f8df7fbaf2a74d106a5af6", + "localPayout": 90958269 + }, + { + "preImage": "-4107343689882248895", + "outcome": "3ef57ebc438dcfca52df30857a74b2301dac6629c3c1a33193c22d91ba3b6711", + "localPayout": 154902763 + }, + { + "preImage": "4653076849042178533", + "outcome": "caa69355a6ef26e15964a314c0f9791b0c2d15efc487357fd12d5024d2577521", + "localPayout": 176294235 + }, + { + "preImage": "5263104210086094340", + "outcome": "a6f6b30fc87bfda76b3e44796473570132dc2c6ef269a0375839016d4b780b30", + "localPayout": 77121708 + }, + { + "preImage": "-5930367370915713841", + "outcome": "e79f72c8112e6ed015dfb249a9ce38dadc865b7c44c36bce328b9808e27d94b1", + "localPayout": 131139541 + }, + { + "preImage": "-3556665387405895410", + "outcome": "1bfb83b7f5f46bb1d8b8eebeebfaaccdc5417c2d564c9b7df28a1736e3814320", + "localPayout": 141810236 + }, + { + "preImage": "899525088161880309", + "outcome": "41c6b0b1b7140eb014a2b22db67cefa0f91ddd844829a9305366ec776a97c21f", + "localPayout": 50113438 + }, + { + "preImage": "1636346114998504944", + "outcome": "efe83f7f5695410758bf253a5e911d434ed1d4c26d8cacab92e1df8724370cbb", + "localPayout": 78003463 + }, + { + "preImage": "6068904230784029488", + "outcome": "0edcfdb40f67f58bd144dd8d9e68e8bf389c3be890e892edb3bf4ff723ecf3a4", + "localPayout": 82525998 + }, + { + "preImage": "2645327896126925828", + "outcome": "a25c8dc855cbe37f2caa83daa49ac3ac83630955009da11f7ea7cd2f5a34ced8", + "localPayout": 1357709 + }, + { + "preImage": "8764044951720075913", + "outcome": "77b524197f3b804214ebed292d002b6cfeba952aadf8cc56222dd073c80f3dbb", + "localPayout": 3448901 + }, + { + "preImage": "-6212842123581948570", + "outcome": "2c7fde123bc4239f56250c8478ba82c5b48ffba881116ba8df436c79c563bfd6", + "localPayout": 147171033 + }, + { + "preImage": "7788541798611048023", + "outcome": "457765dc577797384e05370872f61b1fe9cc2dc782acc6c003d099ff2debb297", + "localPayout": 58732990 + }, + { + "preImage": "5587089287394007708", + "outcome": "3e5b107ff71f8cc7d2fdc41f59a9d0db5cfccbef30293def0556b00a3b64ee45", + "localPayout": 196653619 + }, + { + "preImage": "-8028940888735384847", + "outcome": "126a44e61e52032fb29e6681620caf0ebb2a88aa7aa7ec6bdeb6952c26365f5c", + "localPayout": 91488948 + }, + { + "preImage": "-6515506057056086639", + "outcome": "d6dec374fa76099f4673b27c0b740618bccc7d19a72d69dfc8215a7234a8130c", + "localPayout": 58552810 + }, + { + "preImage": "778776860924432572", + "outcome": "caedf361f3dbea605f6ed80f05e109cbde0296f241c6623fea7de3496cec108f", + "localPayout": 193653795 + }, + { + "preImage": "-3114618024238282747", + "outcome": "8264c2501361e26b0bb416cb3df088f05806cfd1693a11d8acf397e1ff6a25fc", + "localPayout": 170583410 + }, + { + "preImage": "5771826333019349144", + "outcome": "09b5b54586af9612db45cb8979537d100df20621af700531de982e30846abb12", + "localPayout": 1597399 + }, + { + "preImage": "-6837726262932599677", + "outcome": "acbc4436ef7ca370fb6d16ca85389bf3780ec53eb931f92a6fd2a67989532f10", + "localPayout": 89755512 + }, + { + "preImage": "7178363758118805321", + "outcome": "042bdc25320bd8cdfb05ffb655e2e5b1e26e930b7d4afe9a0c4a837072176401", + "localPayout": 183724847 + }, + { + "preImage": "-7238554134032636625", + "outcome": "4212bb186b396b0602a2b2c2a17e17ec4fd634640d0046c16d50d18172451903", + "localPayout": 102716727 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "a25c8dc855cbe37f2caa83daa49ac3ac83630955009da11f7ea7cd2f5a34ced8", + "oracleSignature": "0f42b9481b99ef6a3f99adad7b7faa07476d3fe0c7fdbd22c3e2dea1f38bade64e45eae700962013477a673a0227732621d69204fd41b021939d40ea8edea024" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014997c124c2b6aa9a29a8647f845895d03f940e7e300000000", + "idx": 0, + "inputKeys": [ + "cab2aaeb143f189b3f62554f3470fe4c738d40ff0bc534c40de30498cff33428" + ], + "scriptWitness": "0200210388b1f67ea595b7419097ee92c003aacead6e2b7edf313c907cb3ef8b8115b00c", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qa5q2jxj6wp8relqy2ylq49vul24a26tj79svck", + "fundingPrivKey": "dc268eb709d7b58affed85210a1ac74c772da610fcdebab6a69f70fef7c3b687", + "payoutAddress": "bcrt1qeuq7uykqvvzw5e2flqyu9d03rclgclfsejdgd2" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b0ec3166b60a24213db9b8f7907e98cbe4c92ea500000000", + "idx": 0, + "inputKeys": [ + "d9d4a6d1efe8124666a909ed7c7b903d9a0047fea6860f537cbb61211bf69491" + ], + "scriptWitness": "02002102909f579d4d8569ea9dc69e58ed13b7d400bdc47183ce18144c3f606b0f6a16a5", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qq60x7aztrgzyreuma9fn4mwjj29vkgj9l74x7a", + "fundingPrivKey": "63f36daa54acdc10ce8e9700cefb9bdd044d99ac2959c9c1d8cc9abb562c6f02", + "payoutAddress": "bcrt1qph68muds3yg88wlvg29f7mnphh3wvl07sgad85" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710fd0b1464133739333439373538383030323438373639393100000000099b1ca5142d32303136353333373937363538353831343239000000000bebc200142d32373736373539353431363531373337373232000000000af1e110142d37313633333831353339383636363031353635000000000586810713343831383731363432303537383037323831390000000002a4c82c1331303934343138393630353331353334313339000000000910af9113373336333834333633353030373433353432340000000005cb3490142d373639313237313534393435383935363730360000000006104eac13353338373934393232363332323839353939360000000003e5e303142d3235333530333930353730383738373439323200000000075dfa37142d3731333731363330343638323436303730373000000000054772a3142d3431333938303737393932353730303739303000000000023b27f5142d38383534353334303332383631353036323037000000000074cfdf13363237343530393836303630353831333034390000000003eab00c1338363132343832343730343935323032343434000000000947641c142d363036333539363334313231383237303238330000000005ac9013133331373237313833383033353236323234383000000000067b8d55142d3732333939363331323238393332363139363600000000037914ba123934303832313532373939303832313636320000000007ada86b133837333331393737393138343635323531393400000000071ca71813353037343436313039373334303635373737340000000004fe4d12133239313533383833383135363637333330383100000000009c5194142d343836393233333637373836323130393239360000000005e639261335323030353434373430323139333634313233000000000492934f1331323536383730393930373032303430363330000000000711bf0513373038393132333035373037333930393539340000000007da5f8a142d323431333334393731353839373533333639300000000005be0bd91338313532363235313630333531323738373032000000000a9cccb41233343036343838363037363530373238353700000000039697c013323436363732373036343034393431313331390000000003f24340142d343536393437313034373639353436333330340000000002e9da6f142d37383634303131373731303239373639333637000000000b327b3b142d3737383830383436313634303432363138323900000000084d37ef142d333731363235323936383231343231343630360000000009a6c4d9142d3832393939313130343939333235323639363000000000022a5d57142d353238363230323535303436303831353034340000000008594e05142d313533363136393033343934393439353435330000000006a6bfbd1337313231323833383337333132313535363035000000000525417412363438393838303237343433373836383338000000000a9f2115142d333331353038343438353737383835343037310000000002f11ecc133831383032373738393636373539303435363500000000022c666013353837363133333832393033343439303335300000000000000000133834343439393333383937323838383039373000000000036f9569132d37353834383333383535333539313237383700000000059788241333313032333236353931393630373735343031000000000290d13e132d333236373139373433383837313034353634000000000b003a9f1335303134363731333639393030353138323533000000000bdc896d133330393333303131353631373530363532373100000000081372ef13383932373432323532363331333235363835310000000006a98b22133730313530363837333732383131363831363900000000009b31ec142d313436373631303432363639363734303033340000000003388f5a13383436373733353033303431343334373433390000000007c0da66132d3532373336393136313837313434323937320000000004de83db142d38333237393436373235383530393330323134000000000501227a1239323831383530323330343432323534353100000000054db34c142d3534393632363834373535363231363734353000000000081e4ee313383034383536373332363537373937333738320000000002205de9142d323132353938313938303031343234343534340000000001a9c59b142d32373232353431303139343039383639313635000000000b22934a1334353730363931343739323231373330333032000000000afb6b9f142d363433363839343933323739303437313335390000000009057ee71335363235343639353835313533313930343936000000000673f0eb12393432333135343536383634373234353235000000000a9e3070142d313036373530363739393338303530343737350000000006d4c5af142d37313030363332363430313237383630313937000000000aff9b34142d3538303335313533393831353334343535383700000000003d9d91132d343539303430373733333130333038323039000000000809a91d13343234323936393531343830363239313139380000000008c179e7142d36383335303439353832333037353435313938000000000aa9e1f8133238313637303130383832343733383831393500000000033a94b5133130353535353938373635393638383739393200000000040649a313363133343538363030313438373535373734320000000002443703142d33333033353638353435393339393134303434000000000519ceb9142d3634393230343838363639303635333632393200000000020435ab1335343532313438363737363930313838373534000000000a5388a7133537363732353539343138353935363636373500000000030676b313353734343734313433323738313830313836350000000002011d5d13333030373138363438323335303331323932340000000000e99690142d3237313130313534333735313039363236353000000000056be9bd142d3431303733343336383938383232343838393500000000093ba0eb1334363533303736383439303432313738353333000000000a82095b1335323633313034323130303836303934333430000000000498c8ac142d353933303336373337303931353731333834310000000007d107d5142d33353536363635333837343035383935343130000000000873da3c123839393532353038383136313838303330390000000002fcab9e13313633363334363131343939383530343934340000000004a63d0713363036383930343233303738343032393438380000000004eb3f2e1332363435333237383936313236393235383238000000000014b78d1338373634303434393531373230303735393133000000000034a045142d363231323834323132333538313934383537300000000008c5a6d9133737383835343137393836313130343830323300000000038031be1335353837303839323837333934303037373038000000000bb8b233142d3830323839343038383837333533383438343700000000057402b4142d3635313535303630353730353630383636333900000000037d71ea12373738373736383630393234343332353732000000000b8aec23142d33313134363138303234323338323832373437000000000a2ae57213353737313832363333333031393334393134340000000000185fd7142d363833373732363236323933323539393637370000000005598f781337313738333633373538313138383035333231000000000af36b2f142d3732333835353431333430333236333636323500000000061f5537fda71240c68f1a7607fba3e4a7900a80b367f600381ee72a6c4fcb3145493003e78f91a30f42b9481b99ef6a3f99adad7b7faa07476d3fe0c7fdbd22c3e2dea1f38bade60237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e100160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d300000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014997c124c2b6aa9a29a8647f845895d03f940e7e30000000000000000ffffffff006b000000160014ed00a91a5a704e3cfc04513e0a959cfaabd56972000000000000000500000064000000c8", + "accept": "a71cfb8327f862f83764f8424bc90ea3b7c22b6f4a7dd8522bb8b8b51173eea7728e0000000005f5e10002c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c6001600140df47df1b0891073bbec428a9f6e61bde2e67dfe0001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b0ec3166b60a24213db9b8f7907e98cbe4c92ea50000000000000000ffffffff006b000000160014069e6f744b1a0441e79be9533aedd2928acb2245fda716fd3f496400f2035d9fb491db45cd4aaeb23aa8f91e5da9a829a770048fea5370e673075b815540ab6df5f0853c07c8b2505ce6c17e0f38cd5fdac55c6cab65a39926f8e7f200c3f77bf336da4a0c09ee5cdc4105b7effe250685bd9631ee2536f89ec727a4b7a21858876495d60e8d9b57988e7c25f3e2d7bb7179fe9233b56a74d1b0c4625ca1dcc1390319870078e60dbcc31d91b7a445d61be48cc6a29fdc6c18600437ed00b833fcf84b109b46ba2b63ba5d8a424dfde14d6fa9e3d49d689202ad5bc35e9f2c814f06834a7b6cef8ab9569296215a693fe440e68034046e0102c40230da6500808942162a47126c83a96dda5ab1c5b2499146eff56b8ba176ca9c7080f6a2eda80656151c47841baac500698096c81dab32a16282bdebe618c36e9fabc806b333946961e4c53a5d2f16e0bcd5f30e9c067b9e338ba46304be2e594ecbc2afdc00162a6fd55f3df5e173a22798c5f48540fae7c1fcad0fbe7464747c0a988785c9df79f6e42ad1fde41f9984429314474ca47d2dc808e626c48b040457c3cb591801f7fd9b6da830db85e2c57da25f72f303581c5ec0ad4b18f4ba031e0225fb529fba733e4b54c04e03f7a01db827e6198252a9e3ef557614dcd112fbf82473001a04e7f27f20ffbbc90d67079dfe771d4a48b172e8ccc4e79c86f7d4f1e2c8ec9700910da26eb7687e2a47489e21104d2a48ac84ce4a315d1586974df354cb7aacf2224c03a7dece09276919ea7eda5b1d5408b535a9e72402e84d773e25f8d6e5c801e0e358131b5ac2f8e19f225ec7f4180cbe41ca96b4e6f17329704206c50fbf795d6390cc3356a57e7d077eef9e78e25b2d2802eeda14d0d97f32363daef5acd260097732131634631ed5c7446a12d54ee3a45a858f68ea128f2ea42ff2d3b5bb0150bdd8d115c26a907d78762875ba0fd3592b96d137d5ee5333ad8190321261a7d78488d201b6a8917c4c592063869cb2e367d618c5e811755f5ef86d2e1d8a330199095ef093ca40227eb6627226a933a59833151fcd120706e6afe8cdfd2d52546c82377d538c4ecd91cfbe3aaffe165bd3685bfe43da1fb7ca3285db71f08bef49db1e9a67f7f7b8fbfec4aee7e888e9d0b30da0c5a66461bcb81c1fee5f51970052dcadb50aeecb2b9fc1f40bdbcb807ce8f6ae53429c5d71a87e4ec47cd3c74dd530129c2d0af8f373a53bf9922e402794829eb7bc9fc9991eaf11be5274dca101967fd271a0bbb57d40443df2178f7e0b88f4ff6991521f7fcc9ac9a93753464de383b1b7fd6260d67e0cd7e0277b6a45b20399de866713bb1dd185a888694b6577cfa3fe582be1b45b23e1826857a2b7f36f5f53a3a9f4195855b9a46239a7e401fe85f7eca9b22bbde341ce139501206658861a8e0677bddb28469bbb85c8d794e74974b45c79b88df2b8dbff6d077758d4d0c1dd91149cd50f12eb4acdd4f3a000ae108c8b8429fa8ff358cdcfa98003b47b9a845e21d0e7438607c73ed06204d0dc5361c606208c77bb41e64f537432d91bea7d421de5c4078aecc15dad33b076b00fe9a79f3a6933dac9a3b46766113fb59c0b5e2053c31c024192ec4b00bc6401bc9a2901a9d910df742a88445e46047183ce1da7944c165352f8561bbb365b32af3cb819ba1e41aa147aece938bb44dc565b0e98b23f24ca37ecb92aa03e539100d95b2195641113ac3649e56e15fced66e2672cb3151053012647870f5163c1cfdf8b2c859341e691c93abf80110d00f2b011a016fdd28d9659f132563a52eb00327dfde11c4ac59ff154280e18bc6f04e64763c6980eb284702d211a340d054600698718722117fb5fbf0413cef6d5dfe07d089783e4dd0d2d83cc21251b675f24e6d63f46dcb25201186d36a12bec75b258bf38330e72387962ba43133a82b10701c36b55ea8952496baa60c15e5998037c100f3980f3106324b79e6663d4b947bd69ddd36c643d3b53a11d96c057dcb00fbe075dfb96ece821692d9084af81bf1ffc73537e942d7864560258d8cf18cebba1697a15c3b9288b02c7ee71adb4a033019872ca12d442904c53a4fb5a58217ea21de20882f98b403a527ce3253cc397b388ed9aae079c2eee08df43ce8ef54caf1a8d526828803d5b28cd1ee2a2c17a610089b5afc381b652518e63d96b1d974f214bfd1e341d9d07ff4d149fc8acdc4e46ea08719caa2ad5f010e396a9023851854c2c162e8f24953913592e1d9192e7ae59e8d4d2e75535b52d640df5fc21a43f1301dbdd2e9722153f4ced6624fd08c400ecaf430d2976d0843a51734ea1b8ac777acb8d73c2b120aaccc80f595f51b9cb5a38bc561d5fbf5de3b4a742070caead299ae5115907238e3d5f7a4db8b7c473013a4545aa4b9f984016286387e19f62b5ede2195926dba9aa2c6c16bfd203e5583310bee5f119f42e600c3b51e3d435d48195441d048405e961a1934970cb42ab25ae93d403588efd7435b7929da436b964c226e9ffd285999f4645c1edcafd9001569e0850bba62036424d4630bb7d7eb74de7059e472bdd2b86df785b5e2a4efbe47590fc5885d7bc684425a6a34284c38502c70e8c1eb7bcbabe0079af54cb020056d51ae03138c7ffbac61a60ab7fa358bc85ca5a53e9cca5864065a723e649edfe2c3358f8ccaec02250db27b012aa4be50bc61774b567a1825093dad7ec6300fd20bfdcebfc44f0ffe7f63462e7b4b823fd35b5b375a32e8eea4b40284f8b7b01c6c7f3c51fc460d413d1d1bd5cda68ab868a1bdc6f3d449a9a170a385b9be533e22a261f6009093f73f44c3c74ff90ec82bff3e10fba3c9770aaf2bbf8006360010c58fd875d3a20d36b04521065dfea31fc41eda6860790ebc3cfe5e35b703afd65abcbe7c5c82e30c04a0ec445f7402bef61dd59d288b4aea0478e2f497855fbfdc18d0ed4c6d56094aaedd36441596adb2488c2c0f344d7f8cadaab83e94d18007045c765ea88b47c909484e115b12ab66e65b92c4588313c73b8fdd97af8344b4e9ff8d146b6cd32d0e28a2cd972176bdc760246d3ac8a628701ee5c565ebb2201a7b24db6a1186744d5e738e9d003991d11a9d70020603b04909b13b9e598a014c5738dcf67ac81ee038c9980917785446d3d02597491e28386af9b2023e1b6b0de698d1147c338b1b2af3af822c6a5e18171bbc4bfde4ff85c418c7aab2d595901f0a7e2260e4167e05f50824f25a6fcd238f89629a3c86b26794b25686707950ded8ed40016fb6923bb7634fadc10a0c2ccfd2734f398ce5f44ac6f345e9771b0015d38aa7a2bcc1b723153125048ae3113ffff177990f1f1b374664a59de16beb939e3eb477fca3272dee4402d4e1c5058a63aa50ff099ee0bf5acd54652a0808b77f1417d98030b9308b7f5f97de2ca425607457c6a844cf658da8a4b110f71cf0142448f351ce83acf1168e9e9706d9edabcd3a6a9318099acef096b06804dc0adec9d723f1f1f976c6b3331397a0499cdf4351ba0cbb221cf63a17430654fc6470029cf5fe6c373e001a385aeb0e2379d3defa11ca4fbd050cd20daf68beddcc004145176d86511c97679536c7aa8e28d6d186e2975f7055081105f360ac789ad8f7fab4efd54d4e8d023aeafb5d30fdec29fd63524c1e44267bfdc14df80c82d71011d6178b60bd552e3bb304f15fc93fac20cf7e5cae4e084d0093134bb46f98a8c91db59840b92cab007134efc262f0704a493c6a51b7272e704590bf2ce5d5d530105a5b7b465f55a0e286b67ea5208981124a804dd6592aedc5cbcffbf70b261dcc4673bb105871054be5347003b25b3d2976a427b0b93a5d751333fad397efa980239d924671a8e1a5a4280aa3fc9435208c0ef7b1c6d8cd53c42bc154156afd0015e017c33686b0a087307c2e1f949bdf6e535852c79c12f04c3319799904b3b1ca1a81d93242ae7686f6db3905996a0769b02ca5164ab957dd4a0f18e892a9c34014df2720bb9592fc6f6573630ebe2f36eae7df273e2fff64276a0d255a93f06989d37d869b84e4e112105432ba597cebb417e81d6a4bb8e6805d6607c73e1952ce4d0086cbc82e67813b13b16c807e014de6d86c0436496df47ac01125f121bf201fbb1ff4f0ef39da7e9ed1b3d00d47aba1d3da9d64a32f73f3baf40201f411dbb3fe67bbe15ae598d7ab039db2e35628d32416aaaae67f99ea3f51dfb2de614bf001a230b559312a96b85b58168270d56cf5c88619e6f32422ec601f5979578304efe3bb43f7d0321685eb403792db9cd1360785fd0bec37aaa42137a27ee6d89245f50076bfc4208847a3393626f97a52d97d06a2d26bb6cf53f327831b49a6cb10153723a88c50ce7675874d1d71121157433a507fc656108c98f781637b0bb9f95bf68c86871d1521f06d5780d7fe49dcfdc167e04d817e83cf389efbccfda57710044bc584719cef3ac0f91de39ef437f9d6278a6a14fc0e4c736b68ef294608f59e7e1c76a78a77a9a6aa373529af52aff3dcae08410b5ec40e5aff45f340f2ed3bdf18dc5e014f568701ee24d21d6383d41b3c7710c1c792438de38a5f0fc8fc100ee2469a1209bbd365d2fb2f1241615b3b5b79c91caf4aade8571f311668276f6110078e338f92d3733d3f73de3530a7d09035d439215170f69c752a57c34e44a01979183981bc4c608887f9cb6a4cde8d615a0c1590d353816ffd3b8b9b448ce0440fe466ef2a2549632f89c81db10748da8d8ad1467e43bacb02981d135521e6b2675c02eea8514c06fa2c6abaca406513a5896d574817ecc1e9b83a242399e8d01d2d8ff2e39d79a0493cac322acea598d73d66825c7501d38595cb3cf649fb84de0edcb7cdf4c37aef4825116ac7563e51611cf53e7432928ed503d41f98f725b00a4d7e2d8e6f256df697fd948d5e183e70a22f05ece2ec2935cb32630d844aa3c91efa921e4829776a436436a5f04e1449eeaf26ef01d405449c83ce00e5cd3bcf75ee7a3633f73053455ad62ec811ccd6bc93fcc8d08306542471cbe85f0d3b10164442ce24fc2dce47972c2fdd358bd8f9cd9842a948a207fed6760bc0c1ba887da9c768960d1de00f31ee760d7bd952575487c70161b57e2171238a74112165d00d954b5659a18cb682068faeb2767fb6f0e909c0178c2d1c19846a1896f7ebeda73e7406788bfe8ad42f0577e904a6dd89652b58c7769389e27429c7c0867f9b3da6684cf36d51d94c7a4499806d97d81a379bf81a768c8c4c818f0f330a0ba21004adcbd185fb9fce0f39e29567439c9be1883d554662e80f7eb637b92082422bbcc26d2f85493846aa0ac7c20eab615ee7cf7c77d2ebf2d121a243fe19e58553000958cd808b8410d4b0fff5f89b4b033e313c6f7a02f31edc5daf1742ff304fc6fc919bff54864f7af258fa020f7f07da11b0516c0ec4e5c0ffaadfc2eab7c18a367416397517d854f13703d50cefd231c489006fabc9d3ca8b742d7cfc686ff8c007ba91852b629a09e64255199b6a7099de701531f59a4534daf2441d090ce2c5b46f7edbb072128b925ac8e6050e2f4cbf6b21a43328563b28ecf85821a8f94d4004daae01576948150f12c445b6bac8b3f5e0ebfa63c05e97b56d2452fad5ab270766f19946f3f7dda852021a671a3c475c3c79f3387a27ed0b6349ebc5042ad26495617ce5f6a64c603efdbc30e6e0f3a1dddb9006827772f4e8af3e2dc0fce8c005f44be5c8993ee695b91ef65e21ffafb70840eca7c861c2f8d59fc1a1f34f19b6b09895871b7492feb14707b8b571bb358a9836efc2ebc17649b713afe895fed009789f4b88383627ce80834c42b0fc84728355d9706426135bc11b9377e4b528158627f5f889716a67d951b94fc248d1f048b8ba8449c477bd653ecaeb34c9f14312047be17af6d2d6a9b50bb0fc5b43864adfd2f27ce45f0939759faab9c6ec500fa7d60d73a50529b3f017f36f92c236149b2233b69a4edf7ab3b76345367968e8f1aa97e062285bd33d06828e7b84948e0e199158be90bc09f24b1c95748f48d01d3f80b6f1f92003e130f28985b7a5527b91f33cd11d81c21e384c47e20b8375982b0487a20c3e12f9095fd438f9e06e88b16cd499a9d7fc1bff3ff3696676e00a0537c117260509bfd13d223bbfb4d8e8c1ebbe820ea84223c8af17fe164a1e50035e62ed738798e2eb142c126bfe82bf545e221e701e5dee92b139f8594ae0de1a49a56fe68c140d1d404975b23fd964098ef6607ad834ff8fd9c68aa1611014c00101608265d48abd68ae98d505565ceeddf5dda48057916e4bfc270f1fb3a49faeb15ac5ecc2de221630fc838b68fb6f5eebd95f6299a7b2524124d5b5f6c9e93b1ce7c549a7361206869146abb1ba9ac371362a1acee700a343c8a68c95f8de000767b7cb5f5ec52e5dbbba4e465c7fef4b072c212c1cc91a2fcd65557c3d331a502aa3579670e4aa6d3d68b85d9b4825af5e5924e305918d2a768a562141b8cff01096ef5ad8615aa8fe33a7e81d38d949ec711fb76c3b554e19c834891a56d942567daab68aff237df44b81cf67442249b3cb694dfd3c2739eaaa33589c7d00d5d10a35a1c31b3272efc9317abbac6106f086cdc1cfbf5517018b65d492789e0bd008608fc7eacc36f659f32e27637e28d006cc8af7d7126f5e6255c264b80f799c0e64d094d35ee465babbc49915032200475c673645cf28ec31209f33683f9536701363431fdee6762be81fb48dd36e99d8820778a391931a744fe5ff6e5a2ca516046788a0bc60de35dc1c45976cc8b0f708be20c55d0f767b54d49d3dfb6f25110ff6684daa3257cb769262f89cdb48e691292182c4164223d2ec1d5a8fc19fea200148b9f6d718e6d4c23a924967ea9eb461f4b413ffc43aaa61c5edc09ad7273a6773a8045ea187ae4366e0480b39841c96e083e2c1bcc9e26d15658dd32fb064e00cef6fc40389b94b83f280b2dae88fbcd38af1253c8f5a50b39f353aa965eebdab0309cce2310efb079b461a1cd09a4ee33e7cf9e92a7fee3ac6b909e617f477d5e69480b0c139cb0c11c1f0faf59893a3d5a7373839104ad246eb42060c60cd20177274e96d97932a730ac27d2b3e07e76c4624cb3e2fb6c0238422d4e554851fbeb5cfd14bc26591ada35cc35dea5483dd7b066695b805166ed8dd7e8974b29b901e143257fc2f5ae4b75ff1bb8effde2b70f268b6ee980b4fa4aa0d4716f2ae73d7bc30a90b2b2b6b45a90769bf09893a16c1c2bea9f9267dc3762b60caf5774b05e4d6a9d2e1b8960a063c80302330a7d43da88930be148420fbbbdcff9f73d4e01a13767492fe7fee40c57a79af7070fbb25969596aaad151ffdd9736919c82e7bb413d0c2ead90a50349462c57ce7b4aa6a67880f89d2fa92fd754dd4a4cb638a00fee2baf423b6cb465284d31aa93c793b174e464add8625648c4b9586fe8969545e128b1b29db8aa9966add0af9efd6bf1938b1583c3c6079145110974018c98507264998b4bdfbb25491ac34f9fd39d7426b4674065bd14b18c4764cfdc8560e013e6584ae091b22e3789fa5ef78f0fa3dd3cac949a76be9905e3fa93e48d48910b9738f2be1fe94f27837fee2577f17d4fc9f331974c558083696455ff4093a18008a13ff9e6b7d7e2aeb4447a1131833da67881da396f488ee5f714b501f6a9afbd244df7c086520846c368f2483e3ab3ca62cba9e722cbd6cebe13264d9027345a361e0b1d966e5839a2f559ebd06d915ca13d3c470a47e9cdd3f720790d96792019ca5b74c09850eabb4a18f86a3a688324a67aa2ec238137f53bdae1ddd86a88b46d40950c8b42b53c3bde33d0ce9e3eccb2be93fd8d2c40f7397afc58ce75d0a014dbc6897cc8f8dd83a91d8757239330d294949ad49d3fb034da79dac412642fcfb8d82953bd00bea95d7b02e68ef2cc74b9d396feda9fec64c15be89db6323f9099af5733c4938b9bae023341414f48a880c7b45545d9bb7fae8c4a95b459e6800e6e17912e1e91648a38e9d8f7e54db6bf0f1d767504bbcbd3c503eafa134bb958eb855a3cbc215b09de2ea4eccf62930e59e5b5b1c15f2768b9c12089ef8c2760163bec2f6d11c30d51596c85b60ad79c778a6bc5d0229db6169d09b0609f461f998dc58f70a7e40a551672136c5bb037e801d7f6fa9286c11252db7e53733c2724a88a2d39be8ccec99fb959a1da74de6e3cfd3a48f7709b83cf69e2902f9345300c26cded4697c2f2ac194bdcfeae2ada6fd8c18525852b88ab31077dc944ed7da97ac90e57910ac42ff17ff1cdc5dd09447892ae31cf0f3768f1e8447829383f700327d1e81ef466592fdb7291c4cb1f292dc1a96135bec59d18b4c238e7484f0c0445d91946b4043cfacd64f66755a098c897ca0ff733d2c4bb2964bf4662cccfd8b421708049cd1c7632ec772c214b3a9350f2727e0917e77941d7444aa68715000dba0ce63edffcc590186ea529f790672ed5b19f0492bcb0dc81bb8cb5ae036f7b90a2d64818571f094cf64d3dee647008e6deb3745f06075c11ab76dc468691c005410efa8816b256a9a51f221439eb788e6b1d45b54ec74d59389e7d0569ab75a3de8ab80281fdd1202afabb7edc62c0f24ff12c7ac46404c75efa49e57469536683796a0a812876918da42ccd9880f95467d11a3091a15b0f3216662d1703e9400944adfc9eeb63354ba9521fd322da86c72b88b27b40f493d9f4fb37a5c083c97cea81aaf36f7df1a22f1bc2d4eaf43823c9a5f342cb94bffc90fd423257dcb4d01712e7719b6a8ae5f173604aa1e07b3362641d9e239c2a3053763c3a15ce4693bde4318b4ee8616a5ad14f4ca944975ba9543d4ecef27b5741f89f8c0e3a4c98b70548526fd8d6b168c221626c7fc9602fd2c7a2cef20eaf4d661d60a6321da7201a5fa95cf06069a14596ccc064e85e89d72795b3cad307053a40464f1af2559f54f150cc7cfea2f2a9500b622b2450dd959682419bb2bd79b863a243531121e0401ca1e15d2ca41009c94196c8ac6e8fbc77e5e9a0800cce836c025659c67378322b516a801e21e92f5f7b3cba514691503df838ccd0773f1484fd0bb2cd0f6675d7ef26aac4845c8dd47dca8474daf502c91f9456536f3e20f398e1cc5898f2347004a372ea84bd757040627cf78930cabb9eb640b04cbbd4e308a60bd5f6689c2c340bcd82fa3e4b48172814d1a8faa98371edfd4341324c561cbcf1824fb35851801fcf07078068bbaf3f449b2861abd8f2b8190cd9f8ab9aa58c3fdaf0337c3eb3ac03510636931b2e5f0857301a0ef77d85015e29898342a4fcb6d9943de063890ad92865f3812895918ee0d8a5b00248ccbe33f4b39221d0e6618fee97216f3250056b27ca7e813a2e346e18670fabe4ffa592f2f9896d234caa6164b13ef774f9b6d5a6ecff321e3872c4f8fe259a40317b6b636b4abe662dcb2c2d614b4c46a4f01248198c536803b6ff2bf2fcde18eb96c600491fe2e95999ef09266d993cddf97799d70c5d7c9c43e5a2ab12464a01c0e3e6e829247396893a66edb7de082d426fd327d804f979f7849a48536e90f68891e817bc86cc5fd83772232515325f10700ff0d87424fe166cbcde55768869137e1fe5b8d6e5be39a61fb84f2be9eb26251c0b04355ee61866991b65a9f0def161a51dfcb598fe8a293b748ec295961ec7a01246bd0ea9c64a8efd7500b8d269dd5e1cc28011f40345838ec78bc5d2675f1d576b9c28353903e49f6e594a45a286bc2465948fd523178190f00047640bf8d2ba5d3f2ea0d31515930502848ecf7f1ad624b3af198383cf8b9a3c19740ea23c80015c05f32f16db14ab3fb5aee1594386f0773154ec591df820989e578b2bc256147e9413d6267f4b1df834d2ae084f819e90d9cab5469b641ba03d141ca2fe059003c8bc31eb05d3b44cd97898a2591e0ed56a3700d943a44f39334ba72452831f5b243efb52a76599b0af0a12cf97694f87dd7adacece1a95f239f5fc8d86612229547fff947c9925057d1b778786946fc2c42668d6da997a80809c697684630ff007e0da9443a8beb91da11dfe08f886b49da3a6cdebeb890154d3dfbf9b35f1ade4bba87be7b75043b68f7e4bb917a9b7083e2e0f6bc8008969196bc05ea4c6d2b0003c199a26ea3a86e3154f090b0be898392fe77c089a52461d9df7229f3aeda46db00686cb027b68340c2f1571b987f87bf9944fb7c3d4799b01eb90dd5cc9c2a05ef894026f726f1b6d5840ff6f84ee9f7a6bb4bac92b62ed85291bb8c437b8d00942f75c581bdf0d15e071a0aa2bacc61f74f94148c434c3748b807ac126a6fc30fb9c95658348bf764e1a389d2615072d23a680e08addc8cad85d64b155c6265004af395efa85b3434359c5752dee34d25836e4f5b4235a30e38d13262591e964ced8b8ebad2e093bba87f74294f0b4c1d5719759e7a51f06ab96e6f8574ad3a4b5d196769ddff0bbef39c1b884b27b2563aafc362459b5c7e4be8fe0bc484e03d000ca52bc97f8f90d6aa648b1265eeb7613c15bd01f8ffa1860dddb86828ad62f8cb5202b9e87d91ac2eae6fb40313acd47964373538e2dd0e9c67799599da8b9d0198c1d8d877ba7329b7bf810de859f33d4d7527d9c135e6829a7c85a6b190d8e8cf15986149b091c43d86faf49e22a8847e47bcc2d156463ef2caf81c94749b5d8f8775c24029f1037151e140705b0857f4af356eeccd9eedf8e5beead720c9e500d00bf56fe2e306fe55b233a0c279657f8716955e606aecb4f70010fc400f14e9f487eb02f3a93293ae3765e4f706595080deef9c53014c6373df4d61f68a864b0025cce2ffe777245ec039a78ec109aebae09493ecf57d1771b2721b2747e3bdebdfd8e961ca09807886f5cf373962f5396d47525b15719ad44cfc30f38ce618a9aaec83e8d0b3f795367d3b0a4b74af2172f3c8b1742299b155d347c1e834d0cb01bb409d1967d9f1c0891d3e2472062003bfbd122c7316bab6d35b0d3828de0e8f66ab1574e51c95458e2b1eab86ea870a944544f9dae50d8fb91652f679b450840115f80a86da709329c511d44b686ad289f94f4d7ea52185d22569ef5b7948d49717d1e3c5674d8b0ed7541ebdfcf94eeadb0be3dbf12457a53c095c02bf296b2e95cda04bcc6f9f687271ccc377107d7f72b2e9dfc675069e52e0c88ba7d499f0014dd71d0ad748422736d0dff00af78bac8e29c8d7e0ac2f688f3457c101e4f7cc948fe7bc9591756bcfb007179becf7f799cb5cea421f4e84731b2754b2f5df6800386f96ea7efd21a1d5d83f82a2ad31b8d5a4025775ecd4bdb7f539ad597804aaa479ecbcb6de958e7da0435fc34737011b8509246754c8051f2c1778118c92dff36c96806953ac791d29fc02c90dc13d85458c0fbe030eb0af3cf62d10951e4900bd9d6778fd9618a7e58baa8ed2d6a00d85eba97614f6555d5563022054ef48196601dd7402f1d1881ae2f2c51ab8cdeb410822a0ce530deeb88e1fa00a110465016131c7be2fda1a8f82d9ae974928955387eb62173aa775dbc9a78a4b10e8dba11c9d0d93b6acfb5b157ce56315704326039d975d9f0406582dcb7349e6810aec60d1dd06c5cf91694813cb7548785d7ef2b7d4f207ac79723f1357ef45eb30980101faa37bd25f771d92d6f4257590ee7c19a28fbf92bc0b1d24dc9b7336929e3266d372c73b7d5bccb0c14a05894e6cbb1dfdd1c6c1de47699251cbf894390ea201d57a4212c49bc560778099a22ce8b93babcaa23c3acb991239892fefe2296d1d4d3ef5cbf9333eb864dcca72fe991d7a5f942aede56153b72d6187b2cf7c91bf4556ac31d4808e5e9c76619d2963238b4e029cf9bf6f200f89ce5517efbca47d014ae99b863b7ed681102069b65c0d2fda5405ae52eb4450b882c59b182e846cef20455990be6964d1afdb2ce49b5332e43cc35a4771a18c7b2d5a41715905148d01a4dccdcd25a9fe656463df90e36b142514405a0f089efcaa18daa820f67c988895e06dad0c6ad4c6bf5fc879432ca9a496d828753fb8c901090bbb7a90be2acf6adefdacad5bac27df0918eafda16bf66493029e102f29da7e7f240f0753388200e3176ad0fd23dd4f02c2370398b2291af29d12e724873649ea1a48875b09752f0062c90c552bbc3c568de3de6d9483a56759981a49d68dfd43f91657f6ee2222016d8e02201ec4130882521d02212063fe334196da3104a2916eff868689b56b54af2f9963e776ee0e796e882dab725b2b5a22d7ad4666ef4bcc8a404f1d0aed642d426deeea8c1da2d42f2c8355dd30556fab06da5e0dcc2ba73d4c99766e8128005d9d73c3fa41d351a3d50719df7b125e61b621382798eeeed3b5c73e0778a9197aeec27193f0ff1b9852fa923f0c0fb0d8f204f88ee4564916533536670b6aaa002cca05e5ee63ec66d5e5da3a4fc7ce74c55f700267b13369f3c0026e90bc1e7ff395a61cb5b72588984c56d522fa53c12c27b0de6a2a74c59186ca361f352418fae31a6c3b512d15304abde56c4fad875c0d82d0ccdca46dad4938f86d567ac300d7f0466cab40e8179cf5a43254d3c481833e3c0005450edb5f167bb36840c718abe9bb9267d5a3554fd38b511955418a9c11462c21d35e166153c13e4e1c52910124eefa3fe8de01d16448aa4e7b4db1165f070182619cc8dce96b2f9c63e56ec9fa938b21c74402d121a974033f66f9232d4297506e8ed0808f734b6079a628cbb0bd5c75a98519a7514798f333d25bbb474e3a2ccc6c79a0690668f6c47fbaad0073390f6cb6be92eb8e3f8b416f9473f17318e8f66038003d9ee321abca6d346bd722bcc6ff1fca77b85f0e7bf3cb3ec05cb9d8b322974804f543abed4841106701fef68cdd0a4203378c74a3d87da6f891a891a6d5a72d3803a8df802ebc4896e71364774e12c2b98d493253771756a5c2ee9d34f51a4062ab9a89a6c4a25da74987b87bd1251f9400886e84f01b1fe89526717b601347bdb7dd1ad044c40e3f76019562acddec55be4686d2916d1167562baad96bdde4322435279629ad6d582a123dc82042df04a47a962f35d18ae3abc7cab8dd72643f2ca73abfc8de5c2d26370180f1ad2221133086e95ba0427825648fd4c91fc9411f1e997d18a7783d4da3db18838a3c56b8e3033bb3f8fd8e87982d671c3b8401065b9a6438c1d1e1f314ab1b9b80cca86ce7aac5e2454f79f58dd3556800caab57214c4a85c21ba28d720201bbf3fa61e94ddf46c9b9356f5427b6f1ced26b84592a71ffbb9ba97e5310d812c54c49c1948465e0ca507894305ced74d26f64980f58d1a3e4b9d61d25da64e6006162513fbc7e57ca76faf87e91cfea1cb88283f98425db9ba499c852308b5639883acf8f8dac6a4271baea9029ac6227bbed456656cc157973d27fa682e7d80a43dff01c48ffa7d9174c4ece54e905eaaf24cf4e15d5c24fcb2ccd083f022d5a00eefa17806ede8f9212f5459a0c5fbf442780ffc25375cc484f8403774ec4ac5dc41d814aa333392bd44d95a0bbe5d4514182761474c1f78b3f7f2f61c1bc88a801500a32da84ad7937553768f4e09e843e9dea54421bee642c4be48758a39500cd17cb9cdd100d74911b8ab2aa64b6e7dafa0aa7e6eb4bdecc1c65b5629c10c59982fc752b6755f26a1ba356f158905c48dcae4596abf5f2c480caca9f5f7b5cf401dedae0be96579af99e79944ef67ce3bd61b5f59a2796f91ef181825f68ea6f75262b2bb86702b42a9da5b829b9ac4609206b24e3f369a2e1ab419d23d80f06f00077f51001a502292d1bb92392fe8429b2da97e2f18455232b80f063f7c5907266638adfe842ff5e002ead197bb6736f9d0f323167e6ad2602724a2fbd8b2f9f87cb96c41b78b90015bb1ac8c72cad5920aa261ef19aded76467c563e2f7f7f582010ee39f6fc140fd3e1f1da71adc6c6d48f6caa3fa8365cc9d339754e288957ef7573b32e4e26f8e55e1ded708002afb7df43ba263e6cef8e7bed80f6ceec2d78501895c9b02c8cd9a611ffb3998e73ddeb303c897eb28c408fc899ed842db8456018347143de4b35fce083b5fb0f1b30237bf6b94b85fc3b9c7161cf80724186a67a9a348412e02230acd41c44a8ddf022b4a15d85e9ab8b53edcffad9c668beee401bfce1f8ff1c2fb02cdaef667a4538a6db48e9ad2a0b54e3c6fac0268cb6552caa8035d2d741980b9d98161c8efc8826952c41a76e5f45dd7f7c8d6ee1b03c46a000e24c0a58d772312be26e7b2ae6c461357c9540bc59b626610ff63ee8c355b397ade90cc6379bd8f328b38ad2cc3c2ca9e8ae9ff95b7482bda792551ff553fb7af8bf49e8bbe0e682b6b3fe9496804f8f19328f2186f2bf90c5d65ca3083d576013ea1b7219cd68c4d9b01d4be664a8b29d7b9a2d149c86c1666e9545921823449f9e0e8f62a20a0ec5ca88be41edc64c414f2369818a38189f6e05a60d3ac42e30160283d61b0ebed2e7a9507903b9bcd9da1a23c1bb161c7edc6ec1141c66428a7f8c3f25a14c7d20d8f7b9131bb901b631e894b2cee8d390127c725fd96716cae2149b1eeb5e6c16a82c7e285daf94bdfb399074c96a23f2c40438f6360243da1005c5462258266313548331dfb502a2855f488f4dde674aa89b759fa3d17716bc6761ed5480a9173877b9db3bd7742411aaba8e4bc0608b065b1379f31a453f6c5013a2f269090d753157bb36114f02f918e14205f8ca7bead71d558f01470a3a4d962ea10d7f4417e33f26e327de05166561e6c30721bc1f5ec522d946f5236cd3db4d67f327225651a6ad8c8ad24554609fab6548dff187bcca4f6fd93b71cc5250111fd31143187bc7eacaea4ad8163bb6ceb40d5fc766bfc4664a1893f8f700b4036f61946ba8ed992c92a06b75eda2e30a4e9f71d0c24e5553f080d34dba2c9bd0037ae227920a70787907cdaeae7deed5911a63e6316a6ff07e88906e230d3bda6edd49c4d6f6e1f0b47ed7921b5e04d6c849be2e3ffcf60f73410b107c833520ec3f5ee396f379add8d49141ce67fc7f3fc909078d41dd6183f263fcc8a004e05003945e3187b5c5a10e1d3b331dc03f82ed5052d8726b3cd923126e614e1a2302f73e1bd2429b903e5d8e79c03987e4aad49f0acf7c91b1402708571145018fc5f003267f76ab8e643e0e364f9a54c7419a08e4a3dfcbbecde5d490cf2ce970ac819f7db9d266df68b1cf99dd2baff683b2ab62777d4f8b07d15eb210300a61a83f7aa521eec6c703642d86a5dbdb3a3f01d46d093e4534a876bc100ccc0049666600010c7b1b27e59de70b295c74024d57c3ed7a8bba8094f11725cf5df4ccc1e1dbb86f22840b0ae3c103c2c3e10025590286b732cc3fd0d7ea3ad636821224842c201eb2e11e50e8c329c70512c55471d68f0da4b5cfcb2c6a6c09cde0a3772ff6244e33b5c389771bcf42a6bc5c1fa6abca3179d261f3c86009ab156db5fb4da125de979e38d1d65896bd17ee8f164c4f7a1058c62a1d7fda17acf082de8796c3b2200229477580b8b0bb79042b05a051b98a56465cfc8a5e24f74af2f4cd85e48964ed04c384d4e3e30e86136d8058ef056df606bb6f3265490deb279f346695f288f01f5d138e21a48850d8b33fb9423be052b555daafc56b198ed9994b06e14915155f82f3af18b86cf1bb2a3586d927794d0b510f155a6af8e89ef88cffccbda6ab21af536a0325fb348fdaf7fcf482185fc286fb29ed69f06ec9ffce5b9b34289f200d127d117fef3d01ac598cac0fa042c5e3bb00c57907b5d8efe853afed6c6ca0f12c93a81c88148859607ed4123d64b6b92350a015ed1267f7affa97bcde6c32e00fc08066c06a79f140cdf216c328601eb07db91c5d651b801bdba60cf3476d55618eb48ef0597f5d3e9bc20d6ec7e4919b60e563c274f762edc47dd1afd130fcfa31b0d380c434ef822b3293c806df4d72233c31c19b2fbf4ee4151c65b44ba3501e1e72f29b60dd0aaa209d3198d19c0d818c819e094ccddd07d272de22e1e1546ec473afa0c7fbeed87051cd1a057f79adf47dfd94aad788a0e73eb0d7be52ba60173e17c823ff087917a5563c1c30ecff7fa1e0dfe11d4b86da35994dd7f5dc759363306ff8f19c0e18b3afcbeead783f9a4e36e41f0333dde3bfa533bab67473a566f8586ed056a6860d5f0a72180e3fa8489636b11bd342d0f9b6875988061a301c261e89c7e5e217ae64f5ca99ac36689889824eeba67a67692a7cf735653fcdf180bd35a97415f916982558daba68d60a787f5abb725194f89e40c12c52d4eea00065351ac6b2296fbac8d5289603f371c4c0df540423490ccf6dfad647f53a545f9e6d78a462535c906a5902fd10b4ac9b72567dcc1cd44ab817f17675fc35726e1d48e1ea7e87cd7b1f9f84098a6f288c138a121b97edb36f4e90ac4e78db34301531d237b02b16052363c3b5c3ea15a01c82809c25e388f86a28747c1d3954d77a65d491f8b5ce48389a8c6d39bd32fead13231d7c298740777fbb2684b1a4a9101e3a6192c1c7018855b2221cebdfd69b1039382325bd312d974effe1910f3c496082006659d3153f6895ee8db3e12fc5565e99467c282e2be927954b6212760265efb9913126a9c76d060b5bfe86504958487686f0dfd8aae0fb48fc44c88e82a0003153c65816712db6279916eb724fe1ab04016ed3edd883321f4deac2546bf724bde63abe165220ac7796a4bed656a00b15963d9f89a61216efbd6089b7d879201c71aaa0ea86f7a0d9b9bc05fb25c37842669fb98764d455904350223706e5f41c07c49d2843a7b5ae6fd56a526d4c70e7003a96c74e4859fc62bdea24e439c79505651c5ad12fe9c48158bf01b123fde1a3dc37506519fd793c282b27215396a00fe603659a22902c86723bda94fe018f2696383048ad12ca13d87eb4a66446fddf5ac25df6ab34b0ee0d148bc5112cb782c246f75596df3c6af44080fecfc51ba002380b4c1987a08dd2b6fe21b7335a15c2e918b05ea8b43e3d0ff8e184b6abcd8d5fa4500a78a887cac544bf411c363ceb7b9022d77a2e167830db60a64c35f1d654620cef64f9d4a5d5564a450e5c7df28df57032a9282f2519f549b08b48da1008b03540c4b09f09b359421f8367e8c0d391770e55b2970a55595000246e0ca182fc45305496a434efbe155d8b8c48c26b3552dd4468635fbb467359e719135ae00319cf9051b1fd6545dde764514aedd48cf9030f4faf380ab5bc9c11d41bb37be85160d169273ebb19093800e154afb21a7bd4d0218361739528ac17f1cfb3e4371961dc40e0f55aa785ff2bfba4dc28e6211bebfd76957d3b8145a07ba437e6500a8d62a904224830e8fd336ed6d9a3996cceed905f86b25a7e27d91b24cc25e78a0c575d9457188b1bdbf2f6337f31eb4b14eee87b7cc788dd151ce68841421210105f6c71a738f686acf0dedc08318c94f75f47c02f2c103898d3ae6443ccc4d2d8d89d25304abe772a45d1f4c454b83d8399c0fd7c97f54dfb7f066b74c6961db07fe5bb6945a604e03a14bd9642e384173b21933e646f972389fc27de0c9be9400045b4e028ff83265039ed2fac91b8cf5f73ffca94878dcb33210d0c723edc40f8f74a2893df22db696e683243557fd037bea302deec1f75f7edc1f37c5c6a12a004540e8ab76aab17a32c1310307627bd08ac2c3edfd28126e83c5a23596892e585b331f32533d4f4829afe459889e01e5f93429d8a304f97ba5444c81df47e12ceb3c5293a18d8ae54cb997341a0a48e0a73371b657daae6f1d3e36f93a7c51ef000f042216710f52c6e941dfd8315d77a03e62d964c226f620d69ee647085ee94162d7768a5f97eacad943bc73ec21aeb46ae07e44ddd65310e542468c1c532620014eb29aedb80e10306f771fa80919cf9e3942e465db01280218e98909ebb626d522875af7abe4b1c01088e18c44f3dc2f6c361a7a2e3950cd7eda22947a7e98df9158173b58b7593c6fc57e932bcc19f0f8583421c3016549553851286fd48559012ecbebc87b8d8948abf19096026dbcc398008c0fd747e1b8261b9c778a7949b659ad620928353587d2015b758e431188e930cee259c0763d546076d719b2fc07011b95e6a7695ab073ae41006a67f665528770b59cd0053588ca0dc394ef1b3ff95e79eb1e03da56f000f08764092bf7d59ce26e4b2e1cad3bca0a5ef4c950c00a7908220f907e0f7de817451c8ebec7d031a2fa057e9e500b56f700eeb10d04cc014a3d83cc2bf334e6b91dfdc53dcba96c071ef7a17ff5d500f331b0e4e8d0dd87d13b29e8b98875d371077c4ae99c96f526024ab83637ddf8af8495502d3398020091c2d5d715f432022c3129a73065214acfd605e96cd33529225c051443836339b51151f2fe43828af2944005b3055db7ce2727b6fba50a90d2d2c695193c50c3f31b359c09bdd5334e565cd1f263b1d769b6bce379f4ae5266c2d88111c9fa4a01da39164c7676d63dbf879e80b41db5ace5a70e0643534e266b3bcdaf7fde3973f6a68703231393bb97c7c8dbdd740e46f3b70e8b9317ccf98702c2ff8b95816301138c30dca5824e14a36df3f23d2a78f7f23fb1b5ad9ff3fb60a21cb72f6932d9bef489d315543cf4adc353c35575cf464b81c2f3dab60a154ebf80552ec232b02444b675374cef8ba4297fe08e91255acc343af6a6fd996b171eeb268c8dcd6a0170f2ca2db54093f43fc1268e880f7a5dbca9c8c638fa5baadca77cc9b24ce05a203a9f613080eb8bada0d661266e8a0e2d8aa81e11539b364d0ccf4452a5d61c01741d41dd1987e25bf2652882d1465d4237e2bf616991d356ebf972860878ea82dbc4d525826c7d91e66e64286344cf562c3986c9bdf4f587edd5e213eba09dd1e819db2500c20d5fad33adbb0f132e472c37327032307be68c020b59ebce33e4001be7adbd77d391f29e648d6585aecbe75bc07e36b223828a628aab1ced3d76fd58d26d64a513b860538ac0bfe96c96347cf16ff7e2005d483c2fbce3e24bc73d01ffb334ccca79a6a24022843bb33f184245e733a1968f5bcb3ee513afb43a23da90361729d4d1bd43548cefac4893ba6992c9be65ade4629bdfc91182ec9c699376e71fb5fd1e95508af13a9ae65eae563a7bcca117859fc3294ea4311dc85c3b0114244337d0ce519183584edb4d95748d83a512de510a92508a93737f5a746fac5465df2cb4b81d47604f5d83a4a059237756abfcead33c92ebd6a1a394d86a4901b86a6326a10c6b18b6ac26974acc939699311b989c25ead1c1c7e0fa497f7ead50d7c4463dd909d0acfc5cc7d694aa4e2f840eb8f8ec003951f6e43e5e41a9a52ed348f7afe856180bbcf86066e16d68d4cd8c7a562694a67c81adedf73f48ce00f5bb2dd9122d86f0629b3c09df3a23248cfd9d9f079c6e0b9b09784e8e336c285544b27e0ed27f2c35930cb020a6a6bd0310b183c84be04249be3878fca5f0fd01c369d2cf54c867717151b36fdaaec472f291a0ad94b660550b6b51f5d9a964f0843bd459b640e223872fa3fa10ee74e6b1468fbc7af5ea5e025d325a4f32259e3cb42d67b5f1a56d815efcd47da688eb615be5c8b40ec5cc2d2e6de8472160960161468ee29626db46e82a9125e89f7695e912ad0c4d065e47b9edc1025122569042881a6d8f4b75025aea723b10cc08f2de40c18affb82e302c80f1afdbb1409c012bee0cf8343426fdae6b1b0a48091e39752f082cb8c1cb166c8a530f0a2b378c635968d60a28e781967d8b3653cada9308c0c8b94d1ee03dfdb2e997a5acf2d2962a8f727d34c40e5704b744e2743367643a880b343b97dd89b1eaa51135da77014e058e1cfebad4aba1de5e9746ca086dfa91a28dbfd985f4395751da6bd80b5205e99b385ecf0ff27143334bacff46a954ade0e14ef19bd57ed43fb1b0d3e291002bcabad7e27381b6b5a61375ae582f81fedb75582808512d0c7410f725d3196fa591fac3b9a3d8e377ac5b7ce0dcb30d2185e019f366c6dc7ca0b2818d38710750986266086329b065457e16c5cf5cb239bba1e2c51473d695accf65e35553a5016031d3e50a1516aeab361ac55766eaf9e3c1a4b880ba704c98e81760aaaf880e9a74fef6dbd597b4d0a4f3f39888fd6de5a7d0c1bbeefd993488f0ff6609871900e6e518c16667f39cb9026c5a3b668f3699714fd782436cf95e3ca7661e96095e1ccef846346f3d04b012562df31757a68a6e1803c469403da00fbbde021f567c4250f3b08468915e2f0206314473f84284b727f87e3cc4adae19c4da8f45c3540117ccbfbf72855d5b8d121b7a160ed58f08010b52f03238ff8a61487d70cba5dad98dc7ded3de1b094399675da79e9e26c577084ca9a2913d6e11ca5d379f0404002885f67b763d49730384cf4087068625108d0008292c945a9056084711770219e37653b632ca46ce4877e0bef42b4bc17f3dc90e42bf87c169e02720216cf0981741eb998399e458b6e78bcfb7788875299ccfd29d49cf019ae2c72aa321f99e00732df5aa1e949b64ce2122ae2ec794b1160bcf599a9c0a629c7e5d0a92609e8843d336a058edc2a6bbec280c7ff80f43956ecc92690db9f7478c5ecc5c8f611000bbc490fd5c143d2eef253c2833fbbc21e8031c49a1e5b506325f1d0ac92a3189ac7cfafea6713d6022852574b6afe2ec2dedbb5ba9d25ff38612ff487656cc101d78d821457f772828caea5bda2b00b98dcd4efdf7890decdc3901a162585a5e0041d17cdbf187a39265cf9185186ecf9368c3ce318c5094ba90225d6d8d3806f9f05f1e8e81b43c795106d653ab7801a0fd509d01e7506fb5c2bd3501c4d6a3790196cacf942cf76b1058d79dcc8c866bdffd97560ad72c1b6a328572cf22a1bbb71129dcf52217b287d74c2423df672ae9ffbd7861a0a7fc5f987d479ba0f4cf9c15dda7acd7e6c128f271c46ba4628fd96434d0be37c1968b8a2203788b4024d3001996e3ba7641941cf993781938556e0682365cc135b6b78536ff86c58a7ab4897fe5a62ab55f6042bdc4610d1b5b21f9ae9305eec4af8ae944072fee8da79e480091e68b6dde9f50d0a16f7258aaaba7a7e82fc361d1835a793891e37d3476992869d329cf6178ae07a6936f38b52a9e2155650a49b9b2d534c67052e8cfb5280d9573f72e509fe6abba695c07f26e714dda7aaac48b7211692c2416443e63a29900918d797dc3574707c6b094257edfda57b1540d91824b8a0f9e0afa00f448981948a99ec32814dded44013d789aa1f1da30b247ff677a6eb0b0d5309dd6d8deec01e3f56a5642864938c9d902530d5b8315b17b1d4ef818964416b050c53e39d632677accf765fe7d26039202cf5679d01ff5b284d4cfa4c60399926f055bcf915541416dd40cf534c68fdd1545281e92499215d7edf6f3227a764ceb77d1a7b4d401dae50dd0a732c231dc2c96272b2458629b4832397ebaa7f92811d226033b405655ce3d9c29d101adcf37e7863bea74807392340e5ff219b7974d7450c2030dee0083555e203f294169162ffb08f8a361a36cc4b473f7817fa1f710f0bff2ed561d232a5af81a5fdeb121499ba9d7bc468ce495887a0117cf97417edaa42bd3d991cdf71ad3733fa3c6be7c4ab19650917ea019ba0bb67dbf93fb9389febebeb9b001915fb505a55246eecc1bf845c367f5ee4ec5f43aa2348c82c3c4bc6dfcc7b7ff1069b7473a471ebeb0d1a86bc4cca0d1ab85d0c869439c08eecdc4317c051eee01908e625c0c76939415a7bf3becb3f44f437ccf2c124ddd043b2392570b488308815446c55a5da1147cd2c36ee2b872dcf42144e426c29c79efbefea98123dee19793cf0dd95365c066e0b1148a7dfc28dca112065067603e8e3ef3184ae2aa0d015f87f49231a9d5f8dd199663d3ab37d42bb21f162dfbad5644bbc0556558449787f6f85e71ba597162f7f673cd92123289118f3f701b1c73b5ba0bb2b8b6d1a1000421aabd34e5054dba9a1852c3c14b4df408bc61ffa97d84fa0c512d6a1152f2a97ab87468f28620ffd81c9f21355e4970c0ea200261fb1cedb31d931c4ac4945ba89f27988b0172a6c5719eb37abc5e584361c87a945f03f9de02131f21646901e20addd5389934414dc5d0e0675b8783040a42d3fe4a2b333bfaf88de11277b4a960f0e5b4b23459794a5de418e59985ee72e651e1ed16a55af08187db36672700b9d4d1abb92b4d2687c3a3f43c5e2a8b44549370cf2e0a8255a70dea0a9fefff60aaea7ecc17083e8167eeccfc3826f6f7673ffd65927a23b632bd9c7cd4d6a1ae74043e1c82cd7666de3b9066cb2b04f2c8147dcf6c642ca81262df9ed0ad7000d4c5618995a540892c0c4461dda01ae641762cc1879ae219e30d06041f6d4f1bfad1f8f0dc1504c56b9b51540ef0a22335cd6d137f8e6cde587514a863294a3b019ed1d583dcaac07ec7f834a7e12ef8c38bf2c40210b2d9de8f5bd9b9dafec90a721fa5d8a98628b103190a2869df7343af9ae6bc7934276c6bd45accd8107a218af8ce49fe06525b6a75754874881df7b99298f6566d5e7c93ec97b12b262340008d26fb5da1722bcc847a16e2f1fdee195db0e21b5c4b348af42f45a9c3f75e6447c05a96bb58688cb6fd8509978a3ca44caca13668d9df6e3f8421e974c89c4201895e2023b6d4bc0d302ef7f536ae6bf2cbf612303556e33ce445b284a2b81c1e34800de16a658ee55ef8909737522c2709847af0a9d2e8c7aadf2611c59b57ca22dd946a459fb4fc36999da4b5a38fe49341d39258d17bd0eb35b96b2a38bf510aaa53245e08b4b097096d754affdac4510d26d7b106d50c4c5e8fc0870ea3be13a6445d5e5b9890f52a435caf0cd5c9551573dc7859a9ef8bb87b9889b68892", + "sign": "a71e83c7ad2a8ada27bc5be460296bdef7a83b711522b0cf0ef894df024b84cfdd3dfda716fd3f496401bb5e45325d4051fd2b9ecfb2cb8ddccacc0f47b6ecaaa3c4f1a59d1e08c48042ea35917dd89e0b2556ff31b99d07d7159a9a374a988ad0a883230e355bb7c56a018ee7a2bafc019d870d4e1ac6bcaedc2aa1f3caf3137842006d21f1e06fb594dc6da3e737ac41c783228a12f90cec47777b88b84c6d1ecbf3aef67ed9637262648e1b87b9ca53d0d453da9df8a2754bee98310736dbdc6e4cc90ce92ee9387dba00417164d5d08e2ec8f4a18481682a00078c5af9e3213b8d602137047861282913679808156a6dda0450b6a06871791812a083c162d438f0c8e5f82ab9dc9c95df00818c272b76fb9ae9c5dbfd21866d5410529924e7e6d6d1ea2ccbc25b7d4c7cd5dd58a1b042326b9b2ad550cab2eb543fb19540118753bea6efebc6960413e6f6dc8c7d7e8abee9db4690a3168af474d07d8350709e42255a6fa54be0ff2cf9c3006bc8f0977684e431163fe31b48abcbb90cb0c78ddee80434bc190e2555d9fec733b77a596359fa4231334206e2f73dbb1d34010fbe27b3a1eae4f1385a10ad2c010f0c3c520e118f80621a6f7c7e304ffec91bb0a37876ec366d2aa3bfd5e7406ddaaae9a5ae4f598dfc586cb7ccde085e2a112249c2ad73eaca7b4067822b138ba8bf51767857498e643d1af220792444f91fb26d9b7a9c63596c0a98f36d5b790123e096c641d4ce653e22f96e67ccca06e9496ff74bc83a328cc38a106c6543778cd3ab30cb8c020185a125632b6abf16b5082710114051ea52ee9d838759518c00444b68a7d4223a7b01d656724a4716fa756c3047173eba473ab5b42166d8a536dcafd4ce97329f61b737471a565e5e56ff403a50466c9e7e82dcbdf590ff42c60ea15cab4b35208f4e26316c91a92d6ba3dd7bdbc51e14e0160ddeb6842bc43a01806fb5d652d85923eadbc9874fd5af7eebab9263e9a9b28eb2c1e779d952d6e2566b5a4c60f96e05935869823773a7528c433051861f34a6a55e861afeba419d002001ec311cc9739a5861ccd054d621aa06e214f82d34ea34bb7b4dbac51bbbc35d33a4599fdb4df3321d68b565b3eb3669a4ce89a2af86ad4581321bc89e4b26ad53c12f8bb4bbeb13ea33b95832ea6819b3f6e665d497a32da07dbc570f0e540118dfb0b625e55128d460369fe38c1b80b45e01571a4f598a967692d4c7b1bfa44dc4d9537ea0bc3915c71c23057dc87053027e19994b1ca8e3ea0405691c7197006ea082f8b2dd91a5a578f7d1b615bc834cb59a827cc1eb1dcdf8f30af2a616f0fafe77e2757a7e258645dbda2446b73308345787916e7ae62d1d6bceb7ab84dcb1e3b8677bf452bee306d6fa6c6086d563edea9d2206f99383c31cb5bcc32a6a0105dfaa2ae3c63157793f02e72c829c42aa16318f3fe641c874304686507aa84f59ab64e2b525feec722ddd49428844ceed98060a73ffe63d10d973ac48f6634d005be27404a5ef968b717b456d8fe9afc7629b60641dbeb62cf3e6bcd7d0c75faf58f76c7418fbe219a838d22e1f1356dd766f04db01890971d60f766167b3d657b55b121d7eed5e902b8941eca887d1e286d31e446a65da7c6703242b3506cc4800ce112745ccafae4bc94e511ec09adbba66751fadb21fa7ba454ee056d7986e736b4bbef091782f7c4199c015aa4c27d086de9cdd3b0bcf633b1189930e64e6850179ec1d8356b77d341b7d515b3c4ec04e7cd2f51e32e4d1a939d9f09e1ae6f4ed8bf84fca371468c8d03dd78695ebcd1abeeb82d0d24bdadb0ab794a364c0f273706c95181b1e08201a1ecdaac1be94f4a1f49acc96c03b3546aa0234c568804000f1f1ac8e3a0d3843e137dfdfe59423ca170f4dec6e7a5c4e1eab6f55f4e1b0e458b4f54798587b174d5e9e011220f442aff518c61d2007e07214d7f0b1d19b3e00d3dcc3e4578bfa5ee1b4215f60a6f342c8b75fd7f5014984711919364d9bea09161957aa73fe1343a137471d71c347272d1346e429e0339ad74de430223f370189d7daa4845cb653e252f73eb48b1966611ff62c60cb1d55f71f657ad85d988800e0895a3f3eb0edc2302911c194317dc183d9f062512848e993dce54cf7f37ada16b6cdf23cd37b9452afbbfc17adbdf8ddb0bfef8bd181c8fedbdbc4718f9ea5003b51da0f7a0cc83e6aa747b1d154965daad4b5f8d270663c53843ab6c1e1aa47e2dae8fd3b91adfa13d99414679a1ec19e9b9d84140d7808e661895fcd1018f6201e53ff78e4051729deb50fcbe1b19765b875f98063bb01d8b592f007a611c7018dd4b2dc977e744e6aca320f0f985bf85e3997e7a912b5d8d4c5c7221ce8281bf87facd70fa1bc76cf1406c8c3716494d3fb536a0b0b7b9dd094ed02d6ba0c2500f409cae2b4d7ee4f801a6978d62781ee494d6ff2a76e1acfbccd9c28cc531596e05ad0da9d8f61e1a0c88ae0f35f37c257bbc83d2b86811eb2fafac64b635871f250462825d022fa140bbdbd599ede3651c7055fae76972af53b46797a74def00191a9128b9de0d8b3ffa792641b42defb864cb104342f8ea790e76cf0e919b8e181ac578931fa015429f5d06c3c61ebf336e7fa32daf48dbb67da5a09b5c4b9630103a4456146beb488999ca9313e5a74a71088e5ac29b857f99558008c44b75578c6206785945965b136dcb2bde9363f47cf5dbb09c20c784335dcf8705dc87851c771e551c8931f07e495ee682d10e854b1da80cd003df9040333d43b9aa1d39b003db38531a76e30c9b00d9d5ef92e594d22a6499c6091e600810c6aeccc3beba36763403d2d13bdf652aaa50febff703c32dbd840afaa2883a3de07ba9abfa06000f793c7e515e7d88c3bb21cfb22cf4f79369e6bcb5e8231d791e5f83417835a3bf4979ba79f5c46ebdb62f26230da2f4aec6011e6959c3c3fa17152538d3540b2741ed0e50ebd634b2c6585c364f367f0523f1e0a73896e3aaca1e501562eb8b50032bd90ddcaf056435f5f801376c14127d339e265dab372cb58345a6856e5a31c25a5ed831c832d84fbbbeeb61c0bd19a16e9bf607ddc6e99961cbd944331775d01622b9973caedd69000d5a6d7a034152113d91fbfddf79133665b85e1110df73b82576e0157fe528c79f391721f9d4a4e290ed21b53fa049372d24135e746509d28f6d4a435d2e176501d302aa493f26a5ebb28f5aa853d9ec63037c452daec8b00d9137fe70c1cfb370e5acf911b992e98f554c65093af66162df4f1df8d9b951b8daab29c9c40a1fdb8dac662918d5ecc574bc1336b275c5cf6886ac935f7d4090192494c4acc8d8eff0da5b2832a839e77875ade157dbb2495f7e71d6aab583ba70f3ae490637f4b777689462abf8efde1592ad8c58793cfb7f7fe47100f498c8489de637a4fa6ae2d212fb2e6fe3c762f84ad6e6dc9b88d4e368676a00229edce00ce8111a97946918c308c471167edff993f2a06f3dfaf6fed4592285f29fc45fb0c8cd0a9405c70dbdfb123a91bb68b8d4bd861012527b91d9b2e25e94c7480ca00921c01e303ebc330da888bc57a62e2df48a5decb6aa181e8a6376568ac7927cd9c49395ab92a7d715b5063b2860de94bb1e4413290998a7c5dd3e8635f0bb59953ebf3deab8c4231467ede342fa4048483dc9748f69951e6996537c5506c8b7300600ae865a4be940b8691eedc307515b809a16c8fad9592440ed64c81a969307b1ca85cf500c63031e1e80a8c452b512858ba9c754b56947f1a4cea54445cfc0101e55a2150510c50632e7b25f09559439bff237a30e768188c42bbf971949767139d93b77c7bf72fe7a9d33e8011a8d34ca10a6544b5a622de0bcf3f807d96640e308681471484929a3a9cb4668f651732146ce26cc2f191c2fa1e29c8533aa476014c78ef4ab11098c697e491ade5e8f33c58581e2d1467db17e3abcabc0050525037bb2f51e61723fe5d6931bd0aef155e363154d0d8bae6ed614cd2dca466a838012db61e00e423ac23aef6c20c6e593373392c25e6339cb9e478e67bccdc1711c8ef6d9c423aafd8970707a07d8a0edefa9387e4a2d615c6e861f81c7bbe3927e220929fa6f0d5ed742ce47dfba9ba82f102996408f29dbc170ee4086b3095adac01d3646321f1ac8cec8b65f48e2f312a403ad4aa66ac9236f7cb06250bacdde46b00c57cc517947c586e74fd4fb5ce25330207963556635cd85272c6f5f3ffec1e0103f956d9d0b9025a7721b75d106ff65fbbc3a678a228c6000769428de5600b425597c6195015e830bfbb0de39fbe25955cb43232975d16faba07c8b40b7984f3f1153b81f8f22503f7ae31190b2b22ed5f39cfaae7dbcbe1417023cee4cd35a201b08a4ff8c825f76c2dff8b21b67a2da927da88db23493d29a6cb736d91578020e7de65c9888af56e712fecc50869eba9f56f7b3888b3df21ae854ee08c2ad7180186179a3999ed6a2bbcbcd62665c4e7085ed8bca826599568534b7bf41462861be0eb7ab9f3293283572e8cdbbbc9128c687db65f1fd657307c4c92d9618d0702926adc64e6aeb6a466371f89fe2298c67389ac485c94a7ca40c577ff39fcc6ef01680cef6b0d0f7a169f2b754ceb57d4dd05266f6df7f38f0ffe6f8b4a1c206356f9fb88fb261701a233bbef789de4c8fdadbfce8ca14ad1bddb11bcfaa2c426db01c20caacabc488244062440863ca0f9d3459e4465d52642a93a72a48dce8b430900c4f0dce025897ae176ec8ed8b9168a9a22f605fe1ca2e4f9043157c7eec3b24d5d8e9a47903f4bbdc2dd0da072fa402a80a9e1e37727991670cab69b53a4e300d4f73828437f1acdbba74f6abb5ec8fb9854f9cdb555d291d7b9a5beedbbb71a27537e90acdb1357930e4398e5a2bde4ae45de4e244d513bc7c5a0d5dc1bb40a00bcc566702151d5a49aaea3ffaf31acbcbe1fe1a961a581cfedf4f2e60a2e92698dcd34996a26c7d8c164be3f590b6ece68614c66b9ff3a7e131c5c15ba5d6fa3ec67d9dd69997dfaaa3c781b18461fcad9205ef92f6d803247e53132d940d42f0187a3f8eaf51edd631296ccd49cf24e956d627ec42edd8efab13ccdcd92c17d8d426c89b8e097800b2b93e3009588939de2dbc0be21201d486a72ffa2ee1821d30009d54aab41dc4d8616560339a10743ebb54b13efb65c00e09db27cc8b1c62739969e6dd5299b4f1afe881626a8e3e8a1bbdb63a9539b0537aa517bd1706112ef1cf396ee10eadd05bf21c26428be604211031426646650d64afd91b77a84594d004720fff472b7d8c90014c9c4ca4a6c2d57b256bc76b0b6c435c057fa490e4300457eea011b0c599d704403439d304b6da035e5238fbc55189af3f9504a2d97fc0054ba6331b189c5c5d32953f6120efec994a0f6a90e3f3fba4a4b1443ee7a2be77a94e016586f6ffe33d0a09ee5d1ffd4a20e1011cbf7f2afdd492f0986b6beab455be4aa5cf77905204b1af0de59265405733f24440968ceb13a4a097e91626200e378305a6c390a00cfb59b3425d5e540bea50970c1b3ee6a28e2b6022d44f477c3a9abd9f44588e0c89b600f0490274a971b51d381770f3df987d7814ad1c8450012c3b3a586971ef3216bd21577844b8a78cccbc0f1ba1c89275186bd4513bb03bd55e5063bf5018b75baec87ce99a2d9dbd09332cb1a83f2103d8876c47cea1651789fae8387f5dc561f5ac472a49f98caea51f3b4473b93618e5a4977cb035c00754e88143f8270d7932f3dbaae7d03d32b879296753f1cdc47dfcd2f3074974af606bb4eb5712ed9625e7eadf6164b4e813032af3f51f7d5a7174e7aeef9277d0013333b457857d72b0a9436b109ef6eeb9c75db7e7c1f00c9fd68788263c546e32c06ae876a705c367a0891837f4d84794900953e10810fd85827b4ad7e62aece0c0c08756f968bfcedba2d6958d0e7d8940d5f69e7331771fb56dcac080ab3ed01273b309e6774ce3dbc72c100b1e76df217d08f441e224dc85cbf57d35e253a94ef82f02db1be8713d486debc189a04cddba3ceba99cf9a9708db70642985d00400e18676cbf19052001cb7dbf09567046d067c43e503586a53dd415d486f686bb44e05167fe40a8b7df694e78cf506c474f78ab955033bcffac946fb19f72ea53f0c0795d409c7db68d1f8035bb569944ca5d5bcb9d4af4b49e3c198b548995e830122cb1d0cdfa9fb955a2ddc64fb44ad8fc2910a6af86298181b148eb8e8bfd2db13c1907a926c29ea2e4b3eb277b4fb6b7bbdb5812c3cc972d8bba794a838c98d01586ccdde7a77542af72e7fad0812735e4216c4d5ea4aeb0d4f7b6e2040ce848508eddce6b42e1498690b788e7bc3b180c9db46c2065be6be54f54282e57c12f3dec0a53ea2c593c84916b2f42610a9011eefd452e55ed08d825940de4244853b0135ad68c0d5d00cd76d4fa96a446db31774f83ed4afcc1c2104270e0ea509626d579e7e77fea15ff88679a2343343f6358f0559e60feb829e42d9c24f1398e2bb00bb79e73384bb8249eced437f73dc9135db53bb1ebe0899df1b68495428f2900311dab8a2c93e8c2af276f58e9d53d6fc43553cc3d10eb18dd73389068d3df42a403dc51066cf42f500de9f744e50a00ccb3a639f3353c6e11c80ed08f7fd4e3800373a28d1919df6f882cd53bad6adc87c2477dfe638f96d029898f936219861cb7f239be6504c624a2f2a4310053382aa2462dd02c71010e896eae70bc5e2e16b00b9d417f902fb787adb7e32c5b0c94b1f18725338a8a508178189f8cacc4548e8889b8b759c86e75d0634cda58ccc44c9fe0ed5e40a3437ae55339d624924c55055c1ccce5d7b5df02c795ffb9e4a8948365be958fcde786cf44ee228945a383100a270e292e0dff7eb6d51b1ac74c884d9a4e2ad8e14e40212f7517c354eda2442b9bd8f5e34104b3509eb1b669dc6244ffe3d697ea73950ce8084e37cb39a76b10106f0e077f62a53c5400ba399466969c876a8903f6729fc1a17fb809b09fa469c86a70a028d1c1f06deb5e0e87e0b8daeb84dcb00123e35704916e252f5ab71cad54affc94c534b51af650600ac1b5bd95a0f4b5e5a75d9218b6c6cce353f5e1c003b7563602a23fa984ab3f66c16dc01b942a342a8b03225d74415a9bcc3c50956b3dd75a9b5887ad5ba0952cd964724332c12d0653a25164fa2b9a1fbe97c89c500cf39d1a94b9e71c183faac20aa6dfbd9ba93f92433626aad10e39e66e976f74bc9636c55d79853b1bc4fdb044cec4c7dfba57cbf46ac2d2960fb35fa998073b010f740befa572b0f808650d3606643221d99be70590f7153bb6893d0a3656c6801536f955389c42012c7e6c6371b72780a8f5696615bd88dd605708d5dd0487ccb5e6fdc73017808e7c69b8e8580b5496bf1a1ab6ea85974a1a05af0a8f50fa19f01c43a127699f24ea826c40ea7cdf61fe10969c298d7f0b1e03e5e87ff067b510b03239f07ff30855984d3751bdb5e8d84f6d67a598e9665a6a5b9cc94f002476cf0368753c40d6a3d60de43b54737aa0587d388d1619b2c2c5dc1bf7f255ff0f1012617c6a903f7326db805e221a00517dd5f3393074ed6afd99b849a6328838b0ee683d513175eef8ede0c3240bf8ada5ec15f4b3e511e11ed0b6dcf9d8f33f56300d9838052f517221ae036a737f370c4dd2797b39f8f659f11fdbd53a6302adacdbac88d09f83d4180e687777f1678785b0d24d7c4705c4b40695f3fe3b2aea408ca160724208e76efaa0bd49e4765f7b06e011ff375992b234d1a392098e0afc6014e4cecffae6c5b5884c02bdf837309c31efe051e8d0dc576fa45228f1842e0e8d71de17be9260b01c256859c9d0fce003f3423f26262b4c89ffd9520045fdb280167336e3540408bd0892b30625d8c196780106b5513b5f825ae7a9a837fb135b28ef5c9af75ed08fd5feada066de8b98ed463eb43e2382070bb1fc75752686bc31357cfed92c9c3f03c0da2c99ce4bf1bb2cf3636b50db1259561cb774fb33641014124c9f23330f9a5bae3932b0487147198d244c672d33742bac56c844d8a09c91aa95c2f2b714aa3567ef834a97a63219c3397ab86739dfbc60e00f2435523310188e1e4569ab021eada59a82a13ffd0500bc36568afb44934cc8803fef63378566eaa10bf57f67b0e18bbe9d41741ef7c7861467c175a72fc1d68966862caf53f2da9ea87cfbaafab4c9a83f5bd295a24fb8ce907311ca722527d90d3936d4c1601d0e76c3955eb9364db85fb23fe5e00fb989f496b8a00d75682e0aef3646d8a69b29472405040fbab3120de63974cbed80bc987ba31bbb234928b2a2951e5e1dc01f4d31e33fd2fa85ea41832b0f550b4c199fecbbe12b8c7210319883a50d6eb0121b29134cc6839ce94ef2feff190821ec5180acfebec2e9f5c27ae50c817fb6e3eed94788d78bde3e52d7d997e4fae3b0a297839fbd4eeea72dbafdde71d5bdd006745b05efae88e1a80efe6f00ac3c89052308a2300c8a2a997b17dddb8ea73dd79dff46b26ac04d7da22ae8b4b526644c74f914cec41a91fc64ea703667a6f010128f6ce07472fffe9e20d125f6a8402fef4291598dd4bdc52a1981349513d77b313bfeb6e308f59c6184b23bccdf72fe0b2253305d7ba7130c1e1d0df1e964797b4847a993ee57d89eeaf5dc7225ee0f4983959d9916595ecfd07558c5ed42a0b00aa6acf8b56e0dce90085af2fc97813afd683c4002b032c50e4fae0e2b6d14e79e56bf3db943c394841649013419697ac9760dced18091a8231a2de68dcf17d0e017cef39dcff422ff476291ffd90d85f42200d36c4ab741ec1b8291d81fd0e2390b20ca960229ef8b9e940a1353c5a4db2b62b68edee48d66cc695f33a01978f1844a23e4985f788a04274c04213c91580286f47046e4ec397f7bfd7c6e063eb3600e04f18bd37539610a89e905bafa1c7c7263c1fef991ad1bcdf1f3a9c9453697c2efff55bcb3ed21b378509a05b4760a95a65984f7790b9c0df78e38384c6d16b01338e634a1b7da7af783cb462ec5356e8ab1aed0542ac6948211ed9a8badfc596e91f0791cb04a319d181c4b088f2bfef1d824f14a3869eda06e59ebf8498dfc0c2687f376a424e3d3367310f928fbf15e4f09044bdee607810ec69518f997e4400ff488fefb8f3bd5cc5013a440cfef2e85ae9e5c82900ab6b8d99aa0c19937289c68af114cad4fc73e7d08747ed4263f4f13243e633559af731159592ebca96a501f63b80f611b80efb8644dd0f042b0ad4631502dcab7e8b94fff5c1718b6b1e89d7e7d1dbe82a9128f096bc20b41469c73d176d79d3cc039c1c4f7d02536307959e1facd661c6759e843588687755554db08f3cb19b3d218c37e36bd4bfd2107101893cc02371aae3165e95ddc5859f4a752199a8100b35e01dd8f3057912c985ab6c0b5697fe57e80c4a807a391a93178fe4272f22457c8f0d01a2a79ba733b533014d18cac746d19c205f8ecd8e00d791e649d8cfef1c75ea3c828b8faee81754f6c0b09e9c31bb95e150adbc17e157c3e73667a9578566a5cadbdec14df9c5ae89e64faad4e34d2b6b859a6902f56992f87d8074719d39dfa358026e46fa60479600665c2fa8170784a5f42a27658f545b48fb4c5d576cdd0965f72fd39d39deca0842d8eb0100701ba45139033103d30a142f7c636ad87a417fbd03c0fa7e07c92f01eb0a5b5df9af8d6cae8fb24731a8a42145e9eebaa17142ffccd3451c5beedc6775f8b55c47123ce8167ae974a4b9cb29071ecd1f4fbddd905c2e3df76738a8c058939aad1a9161fe466a226c5d4bbface469ebd76005d41dc3fd55fa93b0c0210025b99ccca62b1ae03fa8499b831ec04ddb069c4a3a522db8a3f526a63a2f1f1baaf8e46b2e7e02b9d700fe213bd20f4b297f2fc00259d74da8bd9c9128adbd6b003203cda2aff30e5e55b04001c1b0f25aef2c4a458febd023167253906cdcecd1381b8a51b0990d641c954d239c3a809bdf01b02dddfb5f6ba2487d3930704c69d94f67144c6846ca945571f0308164caadb9da5753ed638ac54bf2ee48d777e500fec12220474cd5e58d1bab4524ba16b897d2d81aa8fe97246756ffdff93367cc0e3c40e000d985026f490c057c3b5227c4347d79372e9775290178c678ebe88d007dc804c796b31c892c04b194f39ce09ec8762f26e4c232b1ee5bc9461c81e97fe17a7e3b2fd9b1d163bd4b66f0970f42b7493250a3b7c116520b6f92a703deab619da1997877e83dbb471574242872b1a5cca320d0c8fe1ecda42fee2060c9f0005baf3ade0afc805d71593babf82536a36af4f33c12ae69fa2ce72a8ab171f80d653000011cbecf0a305366b663edf78ab9f4062206c35e2b6a59244716d643380146ff106e7b0805cde71ad89cfaa15e3433b222752c2028e3147caab587e03c103d43df58258a9f1a093787efdb18fed0e4ddb02546e89a8ec111c0bdf9f9cdbd24f5964bf61ed213471993675980374705c48f3905fb45f03751ea293d5ed74d0172f7dac29b1472748bae2d80360e15b5b18b9ac02502f72d7596558abbafcc63f7e9563ae297ce5184b7864e6ff0dec0e7501b253a3300a8b6b91d6232742aba01b7d002e32b6df38660bd76fa1e526937df59202805e718cb1b47bef0a7bf11ff89e2e2d3cd5547cdef6f3924ea28d478c06ac837fab4fc982447b9c7fa7d3e4fdce274b0aa9594beb8a631bc62f392acc545862e151ba7eca09a532dedeafbc401a3fae090cfbffe1ebb27602abfd5f8cbd8bf57cc4df271fdc0f60ca5587b150553c81bd4783be009e8ea3a11de96d08e491b1cd8b0bac2481ec78184df4e748c000c96ac86f86ef0196ac9acc23251d365fe2a2ef64c9898e6f5f7be66d6c35ae99937e6be53fe2b3f23553e6cb7b447b3cba2deedf6812a6b87960ef2ffc2afa220a35385de936f4a193bb28fc253c79b31cf7499a3519ad1741bda8af02bd8af00273da4353aa44302bb3e984503de8a92b975cdc23e7e937c9a9b446e0eab498412c9f8989fb1cea2250b10669dc0c7dda17782ac06e7a96633949157de66b2ac00f1f4ef6a2d5616507bee28237c2dfcf8ade0b75aa1cc41d50895232d06369e3d884ea14da88b63401cc3002444636bba4cbb10bd929fe124ab577691942f17b5aca10078df16312c17e2179c3c4ce848f19b083c655f3ed31f60b5d9962b6b1a002b320c72351274e746ca9106888ceae8ffcd936c82a62ca32ae1a52ca587f54b9d00674d2270bed3783866656e8b1f69e33ca550c03530d060fa55540edd0fef01a9c09ff708adf038848282984b9922ae880cab19cb8f0f1719c0195432abcdb42c2a13240e349dbbe3768b46e96ab08b812299c00a1f6785e67c7c070f2cbbe8fceada4afd24637d4138cec324b191429813d06d9bc3d470a987d763b67f5bdf000d8d9b7c79da81d252a220fb2f75e3931e6f410d3c12525a2d83fb5c657479e1edf4211789ee3172fb190ac0dc6d6d8c1c0cd34604ef5d515ad5e7678082d9b4014bc290383599d3ede27dc396daeec19a513578616789c4b458bcf32f27bfcfe0e746743e2aec8520615b6eb411311703584ed04c49444e41b8b29fe97375c7319bdb7de8e5e3ff01bdffacf5ea831dbbffcd0f7e4902ee485ba78e70368b03f001c8bcb13cfd548afbd7f8a38c956e94e75f29982e2d7555f8f698e665404a4dd16c6faf132225aa30dd373005a746df2a2fae92d7f516eb2557fbe3de4159736c01069ba6968105b1a1dfe1edea5c7728714fa5270e5f81505dadf6c77779c81b6006947cae6afad0ca7d065047fe0e1e16b886e89429ba130cc662dd4546cd52d755054704883151c35bc7538f6035703dc6b4ce07b7a17d0af742ab3a23120b470178fcbea8387f46971a405bfd56be6856a492b61904510f1a50b5c5d9539ac180b4e17844b46bf16bd33d502381bc481ef3509035651994946d3ed883f066c1cc005f90a95b61934c69d4d883b65fd3f36017880358f75836597d687f3cda861813751617f9fbb42118f9c34c1ec9d7c0b00ad5fe89cc8fc4cc5b98fe7fc5440d1d790e6d9791a9b378549176e599de44295855fb7957d22b8b869c0003e552c424000b33e6c609c9381dbf1af02d2116ee60117cd7c36b503fd13819c1e3a1439feafd033a8196c88600a333466c693d92d09500d5bf2df9796def1cfde8504e1a350172d58c1f198d29b567f17a0d3146404a0d6ae2aeeef22ab46a3eca6774dc995cc4470794fb0c2ba753888383e669d38d86d8ef86f55e0de2e656a5da76478585d3c773835db0f88288dabdd6e9730f047b817d86073e3944338aa3b4dbf3e92c0017b699460abb3af6db718a4872fc34b3e6a7b37cdaf00cd5dcbc41f8e75062ce4d190b0a29d7fc4f48bc07d2e309df63940dc11df3aaafbe7b0071f2358d0f990017d028929bc0a5fa8bef8ea23b8c8f1dfe50595ccfe493f709c440928f3d9f3f45f9fb58dc87a689ae418229d960783f712a87a298a3f89783f251d5cf8d85ade2941f8ae4a0b57dc7f5b3479ec4f94c71988112f1a33b8e30e3e526194ff74a00ebc1d71621573b6e3fd54836c12be666085c9bbce141954a2336605e58883d003e9661a7c5254a2cef243a35d93310f23a94cdcde23bffc3346dc5761284a6f70011a095b8b063601c433f4fcd810a7c8d0d8dbdef4a41a6f38d14a4d1490008eaf67de30cb20052239005e9613146e41a7b38682412cd4439a6b43dd62c5d04817f2427be7a7179a73388ddd65ae53482aaf94547715f260d87cee2f1a059228e00d95ae047250eb2bac32d8197c1beb32b4a63c5199868894c787c934a675c1b2b638a422717b6d712c660833304e93fde517f974d53ea07cb4d4be114dc73f13101fd9ce26e750763e44bdd3c2621cb57ea1c7d233acf924d7b99f183c595743cfe2808c35834f007e6926498cc26d48061c6dae316cf79635179f5befa99db7b79838c2e2a2bc0f28a7148572ef75e1f8f0b70dae1ee19c682434eef20cdd6d4f20018ecaf834637627a961aa75aa3f7cdf7316631dc48017a5257cea26ce0ba1f7c844e654eaac83064b730324838001572dbd63cdb43298b0f1e95bb8086194d0a009e525f81494baa606b8b1c3f51280ac447a786ab40df69cf1a008fda16635df96cbb0bedf329ff3aa96ab6cf6f294a272512df48e0a7a98012a9a856c85fdb28889eb319da6cca1f8b8bbb41c8170fefaef7108edb098138aae2fd144d42f656003550c4a421010767281b272adf60971699b59ac66d2dfe7c773a41cdcd5e606275245102aee779684d17826655d179eb26e8a0ae1e5b84117fcf6b60e08a50c60035d18a0bf1928cfdc8abf91047d76cad71203f3882affa7419c4e22c9cb535f6b531892e4a146a326570e94737e662db28101c7f89f1a1fd0c49b866b22f970c5d72517dc66cdc9bd4ef7e7adc8d005decf3a0bc50a4e3d4a97bdb8fd4efde9b01e6af6040bb95d57a84c3407384571755495172d41efd60c8b1eebce3ba7e49290c7af66ae28305899805ecf6976109df7269f76e52b4009babf21353fa36a4a201b78f040b07ff27b1dcd30e78bb2f5cf831bb31c127057d93812fb8bb67218fa0c9103293c235a959ff8c6d729627519ad9c2a32a4d3c69b68f6d4cb4540582319d9ee71caacaa7050c393aa4926058185ed8786c4c7fc847ba90720e7970e6a601fa2e836a2718f9df117a8bc59706b90e25ad16ee65621e472e960ec812a7a8b4c609f6f9041b5fbd766d8c81d129ca387b4ad34cf5b346f030ea98e7f44b5452005dde2ce959afed18431b3d3f8f74f1679cf48855fa8ead3ec4f73e51f867f35ba6cd214b4a65edbe72e34263067895ccfa8cf510003a0026b347c2bb3d31e2bbf747a63534f07fd8b7c61314bcc4438a724921a3756be1548d4805b0acaa36b7018d87e29dfc2dae6015c6617b78c12d76c56fd67f94f473fcd84e01b54727f6bc4363cbf6e8858141a14f865f36840b99ba8b878d085f01759e138357ba24426e0125198fa4de3fe54e91cf014862f18c7d541b9bf2c185f8b63e9e8a88f106032adae8e56bf477091506c51ce13b8b1150acb11a3608f79fdc68c415cecfbdcc3bf3ac87cd014cc309758cdbc795e4708c900833d06667e189b88a2642d390581e019da3737572d6afb040dcd11284b7ecb26bdd1f02686b472b1d6fd7640f8a5bce0838d9a4d320c7b436ecc7e0ec1566028cb55a521c3d34ec8554795e4dbaa7d3001f64b67266dc29a336a57a8c9a847732f79d8e1bc30a5d4f23996d11f8df722f699d8d3c3abd70a0353beec3fb639e694787a57f75ff465fb06389b7626bbfb94cb3b400138dbf6230e9dbf7319179ce1b39d9b356501278c75d4707fe7bf2e90141b5bbcf9d6df2288ad16e71ab84b669cb2701af2f95bf5cf23adad301896a7471731213dff35b14230be3dd564f4ca0a790ddd147152c40affa343d9b3eb29400339d0e9fc457fd51875ba7dedef23ff4be300ff14c259844a0cfbd9b13d92cb3047ba966c83b3e3e315c375b4730f58a7082f323ee3123184dc7f4c9807be1a346c756beb501ed0cce82a80d07432910ce8c86724913b64aa78638797e4e1f89011f48de617c2a58a7edae8ac8c96f754309fb89f06577d9a108b905de492ffcba883558ecbf11c8211f9d42b80fed18abc9af73d677a795f3aea3d483ef672beb001d8578a9b57392c5ed3438d84d792e3aacd0630a191f9a60cdcbdb7a9bc66ca15a754a193ca403b230ee6b946633bb6d673dca08259949700377c85d625da9f105bf1a684fe57afbe338013aa0c71a79a2ea761c59847ed13610fd50a37a3d120023c3edc57996c31356ff58d3645b632291ec698c1771486129bce4006b26344b4f93942b56a301634e1d486600ca4b2ab66f9bfe48c84b439a637038d0097a8500ec630e9e48d72d80c04a3604c44485de38bdada55b3cbab7e9fcf61e56e28872a7ac8c25fd2965c6e86184c359267fb1da77bafc2b0cd3e917e3f7f504bb619338aeb080207ff26b3ace81ee701db30f7c6c28eec866ae60632a57f52bb28c8601b0e07d5e6a83c88ae9195c58c7f3f1300fe8f9723487df95bc950e1c4deaab8d9197ba67fd86f557dd4188746eff2a73c46ef1134a11665c2c9e92a0da18a7fb0075c3b8892204a3056c2e39b0027931cc31afd6427174d52d62c671870d96b7277954895d2149263978d3c79b2126b7340aa15d120c37e8b40de3b21dc00f28b1d8aca1d5f92ad74ecb5b24f03402f074b47d7140493bdcd3d671914959fe727a0186019066c84efb635fb72c811bb1e70e445d1bed8b17587e92e344986a7c9845674f80f9aeafc645b1735438321de045cb340367345eb661e55698559aaca1670181aaa4bcfa48d4e7f470ada85c5af52143afe503d32fc770c0d0840cd78e8b65cf10b6291ca0315c038e4da00c01e3c2b85551350109adef2f84ad3faa6f1532ff2fde61f5e4648ed78a835963fd0c1f1a634d6b538e959b65de93ec221032ed004a693d135eaccb054b102d8913773d47d33880d950e68653dcbcba77360f3b99e651a84c750509fc37789fffa73113804afa1ea9c993ab4a67f1fcc3c58a277f0067606290a4c0d4e4adac49158ab3b6a3b4604693e292b632a14665496c0cdf9748f53235acae319a98f8f298149610ed43c432bfe7a11b27d90bfc37504692f31147f185bbfba4d77945a165736025d943b8e01eccdaae9eb5334c149e34b06b00e27b4be001fbe2f10d96631b97b0fb5ac7652be37ec1a1c5a49dba382a69399a518fc213f1bf4ef509f83cbccda05e0d7fa17a0fd19b8218d9ad1cd2df792b8a012d5c87dfabff2c1c82ffee0b84b59296a61e0f5e4f7761ba39b964132bbd8c4ae3657c2dc78c991f38c811d3658500f3817ed64b26dc39cef3ced005a37928dce8f4ee6fa33ccf6bbd12d2914dcf69d366cd69470a57f2ac821a6b596dbf046d00a67b9f2c45350247816f5571ae3e2886a2f346792d78f73e0ba5bee200c98c3742839faade5e0696b06327a84b39e9d58966c5670b8fb159e1f25e0eafce73dd00432f041908ba48c1d01bec9c968d82b56f905965db898c1681ec41a7ae654b7e7e002bd2cca0935c54684db8d86ce5349b9d6d3693c36ce57f0fb22b47c7c86468a033b2acae707e3a815ca2c32e38d45dcd9da6356c6a34f00155f7f10430ae0029a4d53dc258116a5a19461d96bd7b57f98c47aca41d6ef4efca6e818d6dbb37fdbd23f8315c7b37aef172db36650b5f63816880f4bf651cbea68fae7952cf6f01c2e82cc0398ae87be8231161a66a0d3c3122a86e9d6300419fc15f4cc7baf91fe9d73cde9df08b7cea762eb04525038b5018a2f71762cc98c007a6d8d06e295777f96128e7f4c86fe919a4e3182608505adc46512706531d82783ec067bb81a901cdc75e3133319d6713fd7305cd7f71a39c49411d23dfc2434b06703b4c8caff27ec3e0dc1cbfeb62808ae480c72ae94a24cfdb4e8b01250d06b2beb2836679d500b8fb82984ca7996f1c4f8d05fd3833a73c1fb51361f33a517e5e30828d04754f96758b47fb5fba269de01b4867c6123638b82d8fdcf3f4b35ac2b55d70e259ee9cee108f62f7913bde02bd5bb15f3f87ede0c20d9cbab1dfd91f513773cfe68600f434fd4a02fc0df80065a58335266c80200d29d538ae8235749bf4c7e7f7aa8195ab2ec6f69c0672072e89b70f943cf98378cf32a8bad9aec230875b9a8908a5008ed8faad0d772e97e513a2106f15c484bbc77ab90deacb4102f0bdbc0473e89903a1345c0bc92083350e92b1b7ca934e3a27a96637d9f98a51f378534150b7f563e32e19308d31da31c6775dd6c8bd5d10b5feaf7da6179c1d64df6c390cf2ba01d4f37c8cf06270c9c32e1e58b8fc05beeaae969192241c4ff6bc38a951bd89aef97e698228f01b2fbda31189286801b7e839a4ed8fd3494d3cd184f3c10f130201db7ef35ff8c84b2bd9fdd7a7c7de8f75f85f424484025d7c1c4066cd2dd94013bd401c919e08a133dd55935b11d7e82dbd50b7081155aa469672d06871617b0b17fca48157aedf9d598f32003a5821b49edfad9bea2f959ee8ea6ea1f536a05c007293d3ab43a7ba6227ea590ad8e4ccc3b38323071be6cfd10a761c07dcd02732dd456fa5d9bde8c7ddc1a8631b45b3c54fb6606ada10b11229f12400e637d4a30063c7bdd2516a313acf1979cece7ef6538dd11310d78785837be91614f6a64d9a3bf6743e053ff291bc6d8e8fea6a023f1b84cf4c08302b3284e61339cd09204836d52bffba192da057a1a2a78674bf13b941545b7a949402c7d5f9dbec6eb67d006bf87bbef3dcd265a7952fe4d1d58901cd020f2efdca1a1a5b82e3b114b7830b38030d00e6d683a09cdb4f799924c1276b57bb9c7855b0d3696159ff9f3bb56d01d322a4e35d313db71da6e80f5ec431d7a0d42dea1028670d3a10fbf624fa70ac810cadf22ceb99b1de07630a756731f42147c8c193b8edf38605366bf3f1728da4d892e7382332b075496e68360a07ce8e8751f4e049812989cf40d52645afa4003d51de0641151fbc4f58b3e26da99764ab3b0b029ec11f00adcf9003c65cf232dfacd5708d5bd7be5c3baf728d1298adadeeaa248ad4c7221eb6d6a1cc34df5401b1f93fc6e0d66eb296e957d1bd010c040f9edee07727833b5a600d783fd6133b7724d630e7ada477304faf06f902d826e206a7f387df5d67f7bdfc297d766511503d6f4686bda3fbbdfb4e776c8b18e915df4982645a2995666a408e59b46e98010a57585011357f91274811fcacb77734f9e4a5bae05f3fe84a2c179668e1ae23c37a630be31526099780791787abc731953a0b3e90915513343b35c99d4fa34a0017a20cfb9e51bb1345ec74ef28c2f62db3c3eafbb9778563de713ecf3f03672acbdbfdc0951d8c681cbc253740b4fa51b806664e7571291c8dcadc79c263f9e12f6cfdddaaf1101181d570c75a3c371c55b8fb651414de8b357cf35b03ca763300251def9b614d1b8b3c2b395063419f827b0ce46e3a40112514be0ee94ab60ca878471d747f693ab8b9441ff7d22e3b40de0077b1702f8e54892e1d77daf00bf10037dd69bbe4350ead6691265e4fbe950f5c8af7ab98a8b20cca2c5016ad995bee98fa2c480887bbfe859e4c34185d59f38dfef84ec802276362266b3f336a9b025119c2281bc3e2e58fa118bccc81d2b8b6a7a868e06382195a6aff4554267f5301a7117b26db95a3e0f2e0c5acbf5817c7a18f9f5456a604894c199c732995cdf56d57b86bb74bb44a6ed3cfee167b424192965ff592668bab1b9c590e61c941f000231eef2dee537c85a71406f5bbcb580658594ebdd4c284bcd93342232e803d536ae5fc12de1044749c4b849919ec00e50019c1d45cb48b0b58349e45392cf24050b06e94be63cdd864f2f05d5f90e8e14f103a8ddfe254a2a8c1f15f1cc09d2e01db6d0e1217e2cdc1f6529c0515fffbd37322c0a2109f690a240a89b4b46f20e3a3354e49a44dbb2f07b265c69e6379e27183fe8b292f32f21e84924e1d70e430000a65d1e2a13b22b54de1dbfdfee0ecf63bdf845572c3222b782de7afa42477468822b6f520e81122aec57e474dc94aa1d475358fdcad190ea1b49ecda3a5ae37628f2245cfc9aba9622881dd5f67c48c81381b58b8199a961be51757fd50d094008d44591e2fa9ad4b28a1fde3db6b857492e7ba1116f2233c6cd2b4a2aab14573038d28b087d00672cbfc0a63276a938e78be85f3ef1cf6bf49f4c20f7672f31900d70e6a95410ab946102e9ab3bb4ce6a7894dc7a318ac3e8da21a13790e14ee6792a846c5d91a596f07f33a872a54875a388a71ea609f6e38ed466df040a0a36de07aac370c315384757a6208fa70330f583ab3f5bdb3ee3a15074c63070b515000cb08ae7a9beb57ae26f80e9a87f4bba8e6d287d1b8cc40322ad940d0dcb2f4506b14f3a18084af4678a42e02e4dc988343a81c11317ceaf2184dddd67312d60201fb13ec8492415a5a9d68644f0334f0719b90efdedb38208d9352d080d0fc6a7a7b38a66296f867c40cbde49de7d5f73d454d770c3175a7b154a9cdb8d60bec4c50085d8892705ec618059c28f74aca6ea0b8b28e28e4e74dd603daab7602124100a79d1bd1767471f22aa878b1c665701fd29ed84bf2e34b65875e26c00c2340458fc0190d595296817eb415ed8fa377cada599d6e61a75dd1091e18505009861e00724244b36438b94abf19631897b72ffd5d590be71a16f9f97b2d69b3cd708731a549fbeae2adeb669d2050aa551461d50f68c504772a50e1f5ab27e62a2de0f70b8008e1019b1ee8e963e110b2ee78be2983bce753ca2bb3f47ebf666a6a589701b4178b9bd67ec30ed36d6f3cde9c1555f9a121da7c778009bc57848857b03f0dc0bbca756095199b625b8c3b54eaf6a1679cb73921046ae7b8d5bcf933fe67d901c06ba6fe4152189784d87e556057b15d996604918706fd78ab211110533dd539f580e6ab715f7d2bfeef20e5ae187ca6ba166ca229defdb38675e2c1a7e0831957c82a60cd9ff46a60ad92516d9da68b1c56e8bc37157371ddf992ce6e591ee401a9ab10f2ee0d9e33cb41f7d944323989dee56e04271e621deafb4e41f84a6f3eb907cc30e074deda6c1ec49678312158a1985b3058b81bd3f691bd0f19a41584011c6935c7d1e968b113c3aa980f10bc503ab4236ce799c8db80b4fa583f8c6e15d52c8b1c644d54391dfb75907e7db25dbf6da686871a0ed32e6ef54bb74d88cc1f54d04dc5267182fd2a261c606792b64212bce276881ffc16772586fa48f543014d05c6326a4904872f3c51f8ee140caec6a7c6d1d8e1ae4f94e80375b66fbb285b3cb86df0950e5f29c5318c71c3ece7bbf21229bef394295c7037af63fb5fe301b6e3400cb1de93da99f464dfacccef86feeb65bb16927b5b7752ccb62bafe9c5a3961623fc4ba443e8e6d9f893f41dd1e0584fb39a794dddff6222420d7daf6a7d8453591d1393490ae93d5d56fda9ccd1ee39baa11312434d9630e60b9a04be00d0f1f6e597a14c76b04d4fbf2486b0ff9f543f56f7513613db04af14a0e6d5d2341fba5e0b39a2b9556915ce6351ebec5059f971f19fa29976b3b1b75c7d7e120092891052c1033fe63b79cd6854affe02cb084290f7279ffa3fd1da2593ff2442d1856097eacac0d8c59f85ecfb2fcad2b7bc72ebc33d1116930f6ec3d9a8a7a7c0eb6afc8af309f4627936082d3c0b397751aa849f509670258ee607258cdf400064dfef336805a2004f4371c50597074c1b1dd01b65e65f23f1bc9aeefde04a43399f91f2f4c695a97bb2b393413348cb2117b92c358a18b975cd02df00cce0500057c7bb83edaa11584043387ddb73d46a42f62462a33689dc9aef4b2ec1bbdb9daede1b7d9c33a57410d9a9eed038c79dbac05877320dde2fe0f0eda8c9cac221e61661c36f2cb47d00be1d7655025a4484356b68161fc64f80c7a1413565c65d015b7a5ce9f6d15df30bda692285366caa6f2084cb9373a12267d894029db4626c040af8770314445c1cd5bc53c0131c59826b1f8f3b13a20c31f6bb1cbaee636200ad635553af14d942e8664b00247a8e8a09a8effafaa323ebb5202e83049f13813ab09cdbe3160987cb4a7cab6180e722592a521c1d6f48729d16c0b749f7a759454bba66d30a34b36e96c2c605d95f07abffde83cbedede0e878f8cc29870855004cc2baa1b9e245d070dc62b8e3a363b41ef151f13cfd16e00e8ef678f19bd5a4e00d540f2f89ffe4ec747409fa27d87b00a72dea1e6e43d24f9ebb52fec9750500d6b9af79eb5bb917612173448f600f7939549a13d438940616b613416f2aa8a1e28884da267271808ca7ef6f5dd4432550726255c820106464906a9b92ca04cc410c621f4d5c3981aef4825bb3ffc9c48240f61066d0c8111acecf2bf9eed270002b21b6ea494191a3a0d5936492f68e11802fbfcc0f77558519bfc248aa90390c5df005bc3e754d9f4d79fa02291fab8470f44dcb50c52447444216c2b340825a01ae6d91f6b6302bbb389212bd8cce176fc4614b422c933df3b9c5e447663e1e858cf0ab8b082a4c0e34e0524951aa1e424790639195ac8dd4bad14f7f598b38a53a1a225bc390d1955a902ea68e63383025cabade119fb4b091dd531228d4b55a01aeeaaee72c18c1cb9532cb8b57294bb6d9a4a61a7224bbdb56c4ed48709ec812618015e2d3208835170695edf3c8ee7176553b2a4a04c86ee841034de7a35d1601715e6a21a9fecfbfd2c32e9d58e65b7736d351c4b6d9efeb2f45feb5ebdb312dd6bc3c198e0a6d65bf5c4cead95a9a9b62eed592db3a14c4191a963265e831ced69f559b32457bd963b2abaaa0675518b17453a90c79e2342fcce7e85c6bd4e801c87caac24d8f37037e3e25dfa9c738acb6e67a59940922fc1c5d7a551fac306997602f198431ee3c88012fead99e649edae00cf630a58260b1b994bb0e93fddc00f3cf2e6126920ebe50eadf013b2c7f411f0d3d9e9bf634e40bb0821d2957d63d51ddacaea04b6001addfb6564a58b647f57f043e4fdbd6c966f50494e89d38549ec905071175f139569533cf99cb690aed9d929f2e7db7fcdb686b7d0912a64301446839f8c4b1c6374950f92dce0e38069e27f36ba761ea013375b81a334929491db5afb019e33b037e144b2e837e8c330834710aa3d4dcca763fb5ee48b5e20c00ed751b53fc45fa888ac1154329d144b0b4088efbc6790e9d2d9351e59046e8609480fe1582d3ca68a6bfd722444bf1c4552d234297eb5b477916d7b6d1ae824101bbe4f6b13d665f3a7bc0cfda12d45f89aa4b577ac9ba9af057daf3190e869a0064f7a85e3e810e2fefb050f1a986cba93b4c901bb6553af4af57263577021fb97208cf5ec878599c762b41ce4f93d13385d749e14d8d73bc35fe414150bc40fa017f9c6f9ef0ac472f8af47f2a283bc27b3bb547812206da66ea5366b868a8df5901ca3f630f72b5cd021fecf88de77e7fcaeed2e5659739772b3020274b2bb5925c8fd31b61a70d0817111e051d68aceca69e2e33e3c5af8d9c0f5a08c547ed030008ea5000cf649c77a7463b0398f67cc6717a9befe66000ec6cc93613ec6e2144049d3aaf8afec959b64386bac25b1e217625c1affcb38c55c40708b7dad4143800b69942331a971707bd9193580806be98fc3352ea06483b9563b3aab78ce223b5120097bb479f342279e33e456e15548cd9679559b9ead8b72d2a76ca6640f463584baf0f54516db3de138b5b533b6de5171b3604635f3e390b0b4ecd34087161019d4fc7ccbf7b8c9fa1304e8075f3e3fef03391654ebf57749f112646ce2973e17df8bc77c7b279310f15d4deaad3c1348563e58afb925282d66fd294039ab6a101a971a0f4241736faef45eae83b0347d29e0e1a3ad4c5866a4981f2b8db7f7f0e59a573a1e35d22c7380870cc13b7c31a996a984f926e1c62f26ee26ed6adb53798dd291eaab8b9ecc46c5cb432d292f3ab14b1afe9b9bcbcc631505c7d965bb500d34718384b01c323a582a8294608e053899537932bc28f37f8db156b3526840e6bd002ccfe1d3d87d7cfad29b5fa009b7d9cfe2f1c29144876cbc237e6e488ad01710f8c89998fd750b5d89bcf5667718f22f82a62168bdf5891c4936a9f0265855aa62a7c0284d572585456093fca38c302b2af1ada046156b6227ce7cadae608c14b205f758a96cf34f323a3858d18f745a7e225ac520b38270973326dc2fc63237816a924e98b10c5ff8cdf39ae58d494abcc7c0f3750c531f9e99bd3463d9a00f1123f469b80a882b86ce0c9ad0d1ffe3f487db935ffb381f1e1a3a2691785fda7187000010002004730440220119e3e93408787aa607d7a979318bd44be6968bbcbdb3ea78be695a6b75d19c10220412e55dab7c63704e47043563194b334cd8e5a16254a7a1bc7a87631edbbe3800100210388b1f67ea595b7419097ee92c003aacead6e2b7edf313c907cb3ef8b8115b00c", + "unsignedTxs": { + "fundingTx": "020000000215a46d9f5902d605fff67cc8408dec728fbc83038f42544e14c13cf17b5999f90000000000ffffffff2989c5e97c5838d0d3691d7a82e1064cfba7c76320f752c40bea8c1c7f83f09a0000000000ffffffff0352c5eb0b000000002200209e549e4bd0af0ce2c4136d2f12cb8c4c285ef5b71cb82d77d63c50078cb8dc5ae1dcf50500000000160014ed00a91a5a704e3cfc04513e0a959cfaabd56972e1dcf50500000000160014069e6f744b1a0441e79be9533aedd2928acb224500000000", + "cets": [ + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02a51c9b0900000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d305ba55002000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0100c2eb0b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0210e1f10a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30f0e0f900000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff020781860500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30f9406506000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff022cc8a40200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30d4f94609000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0291af100900000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d306f12db02000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff029034cb0500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30708d2006000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ac4e100600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d305473db05000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0203e3e50300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30fdde0508000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0237fa5d0700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30c9c78d04000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02a372470500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d305d4fa406000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02f5273b0200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d300b9ab009000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02dfcf740000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3021f2760b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff020cb0ea0300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30f4110108000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff021c64470900000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30e45da402000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff021390ac0500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30ed313f06000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02558d7b0600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30ab347005000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ba14790300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3046ad7208000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff026ba8ad0700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3095193e04000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0218a71c0700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30e81acf04000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02124dfe0400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30ee74ed06000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0294519c0000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d306c704f0b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff022639e60500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30da880506000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff024f93920400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30b12e5907000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0205bf110700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30fb02da04000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff028a5fda0700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3076621104000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02d90bbe0500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3027b62d06000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02b4cc9c0a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d304cf54e01000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02c097960300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30402a5508000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff024043f20300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30c07ef907000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff026fdae90200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3091e70109000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff023b7b320b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30c546b900000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ef374d0800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30118a9e03000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02d9c4a60900000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3027fd4402000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02575d2a0200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30a964c109000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02054e590800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30fb739203000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02bdbfa60600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3043024505000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff027441250500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d308c80c606000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0215219f0a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30eba04c01000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02cc1ef10200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3034a3fa08000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0260662c0200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30a05bbf09000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0100c2eb0b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0269956f0300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30972c7c08000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff022488970500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30dc395406000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff023ed1900200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30c2f05a09000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff029f3a000b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d306187eb00000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff026d89dc0b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3093380f00000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ef72130800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30114fd803000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02228ba90600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30de364205000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ec319b0000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d301490500b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff025a8f380300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30a632b308000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0266dac00700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d309ae72a04000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02db83de0400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30253e0d07000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff027a22010500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30869fea06000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff024cb34d0500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30b40e9e06000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02e34e1e0800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d301d73cd03000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02e95d200200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d301764cb09000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff029bc5a90100000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3065fc410a000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff024a93220b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30b62ec900000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff029f6bfb0a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d306156f000000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02e77e050900000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d301943e602000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ebf0730600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3015d17705000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0270309e0a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3090914d01000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02afc5d40600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3051fc1605000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02349bff0a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30cc26ec00000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02919d3d0000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d306f24ae0b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff021da9090800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30e318e203000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02e779c10800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3019482a03000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02f8e1a90a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3008e04101000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02b5943a0300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d304b2db108000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02a349060400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d305d78e507000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff020337440200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30fd8aa709000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02b9ce190500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3047f3d106000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ab35040200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30558ce709000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02a788530a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3059399801000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02b376060300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d304d4be508000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff025d1d010200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30a3a4ea09000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff029096e90000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30702b020b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02bde96b0500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3043d87f06000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02eba03b0900000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d301521b002000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff025b09820a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30a5b86901000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02acc8980400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3054f95207000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02d507d10700000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d302bba1a04000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff023cda730800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30c4e77703000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff029eabfc0200000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d306216ef08000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02073da60400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30f9844507000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff022e3feb0400000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30d2820007000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff028db7140000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30730ad70b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0245a0340000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30bb21b70b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02d9a6c50800000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30271b2603000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02be31800300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3042906b08000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0233b2b80b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30cd0f3300000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02b402740500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d304cbf7706000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02ea717d0300000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3016506e08000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0223ec8a0b00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30ddd56000000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0272e52a0a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d308edcc001000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02d75f180000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d302962d30b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff02788f590500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3088329206000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff022f6bf30a00000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30d156f800000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0237551f0600000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30c96ccc05000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000" + ], + "refundTx": "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0200e1f50500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3000e1f505000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652aec8000000" + }, + "signedTxs": { + "fundingTx": "0200000000010215a46d9f5902d605fff67cc8408dec728fbc83038f42544e14c13cf17b5999f90000000000ffffffff2989c5e97c5838d0d3691d7a82e1064cfba7c76320f752c40bea8c1c7f83f09a0000000000ffffffff0352c5eb0b000000002200209e549e4bd0af0ce2c4136d2f12cb8c4c285ef5b71cb82d77d63c50078cb8dc5ae1dcf50500000000160014ed00a91a5a704e3cfc04513e0a959cfaabd56972e1dcf50500000000160014069e6f744b1a0441e79be9533aedd2928acb2245024730440220119e3e93408787aa607d7a979318bd44be6968bbcbdb3ea78be695a6b75d19c10220412e55dab7c63704e47043563194b334cd8e5a16254a7a1bc7a87631edbbe38001210388b1f67ea595b7419097ee92c003aacead6e2b7edf313c907cb3ef8b8115b00c0247304402207f64d4a26a4a26a1a5fe739f308a6a8df71606fd7177ce55b2a86dc59df2c59702205df26eb5616123daa7444697e62c0e34325b959e32edd6d199335f78f8435257012102909f579d4d8569ea9dc69e58ed13b7d400bdc47183ce18144c3f606b0f6a16a500000000", + "cets": [ + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff028db7140000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30730ad70b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe040047304402204029f309c02b5dc06f67a42755309b1ce831b058feca7173225773c240a1294d0220309d21526ad4453b5410d915e0fae4fb47b330e4875a96c6a4c15edf2d9432280147304402204e058e1cfebad4aba1de5e9746ca086dfa91a28dbfd985f4395751da6bd80b5202204eaf65e522aa753d555973286256ae43be1a3d56cab638d441947d94ef2beb9e014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000", + "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff028db7140000000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d30730ad70b000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe040047304402204d05c6326a4904872f3c51f8ee140caec6a7c6d1d8e1ae4f94e80375b66fbb2802205b733536142749f7383386e3660b5a148aee7d1b8ec2153013a2c3602d2d84220147304402207405ae40d70eb1c190db7a63bec871d3b2d42874d9917e9f6236ec8ae7ed0fe702206240b0e957d414f9e14ccdde34674ba6dd49570ae87ca30284e7f91f3961ca5a014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652ae64000000" + ], + "refundTx": "02000000000101b3af686a38136a2c40259d685f5f1e106a407d65e02ba6a3d81022e8d28a44780000000000feffffff0200e1f50500000000160014cf01ee12c06304ea6549f809c2b5f11e3e8c7d3000e1f505000000001600140df47df1b0891073bbec428a9f6e61bde2e67dfe04004730440220237816a924e98b10c5ff8cdf39ae58d494abcc7c0f3750c531f9e99bd3463d9a022000f1123f469b80a882b86ce0c9ad0d1ffe3f487db935ffb381f1e1a3a26917850147304402200aaa53245e08b4b097096d754affdac4510d26d7b106d50c4c5e8fc0870ea3be022013a6445d5e5b9890f52a435caf0cd5c9551573dc7859a9ef8bb87b9889b68892014752210237c83a114a8572bf2eb2fb4a739467cdb86c1989e20b5e29da10b411bc8688e12102c358307b905ab1dce32b3f0f09a504be9615aca9f72c94a71d44f11bfa8e17c652aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "fb4ed7a3d19241225e8dd79ed32da94dd84139bf52e269c6f2868e0e701c5ae2", + "nonce": "a705689d16250e1a71a791934a28c11687d573aef0bc19ec21e00ccdbd94c814" + }, + "contractInfo": [ + { + "preImage": "7978729734393787588", + "outcome": "641bd565dd74dcba227e43c989dc26af2fb6cd1e3405c685297918e9a60d441b", + "localPayout": 200000000 + }, + { + "preImage": "-8027415241516669652", + "outcome": "9c565446be37eea96cb8b74473ac9ad344732a2ca425466ed55520c21eae1181", + "localPayout": 0 + }, + { + "preImage": "-3145508995934347049", + "outcome": "634949973685e969da57c40f8bb1568cd3a1c1068f4fd94ee102ca4a3dd369bd", + "localPayout": 46018687 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "9c565446be37eea96cb8b74473ac9ad344732a2ca425466ed55520c21eae1181", + "oracleSignature": "a705689d16250e1a71a791934a28c11687d573aef0bc19ec21e00ccdbd94c814610df77df8faa2415b1a4c8e20ade4141301e5da5e4e7e9834015ae3a3739a1e" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001402305b3088dc69bae876ed24abf8a045837cf9bc00000000", + "idx": 0, + "inputKeys": [ + "5450fe5fce9ab12c32c672f3c912b3da7296ba69f3d61d24c154b1211c605202" + ], + "scriptWitness": "02002103c6bedb91a0d68d50815ac380538746068b22f79648d787ea87800ca394afa9ac", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q4c6368fdjdjetklj57lxu0c0kydvzn2tcw56dh", + "fundingPrivKey": "f641aa087ac15119141b89eeaae6244dea9a88c192c04373f2bf02c394a832b6", + "payoutAddress": "bcrt1qjdftn5ntf4x0ehtuqd4yd2uswxc3g94zgjvkxp" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204fdf9de735c9353b824b9e1c2a29b084916a399103fcaeb4e7b7bac6021a531500000000", + "idx": 0, + "inputKeys": [ + "7688e4a78cf7905aa250023b6bccc38faf682dcc8c0a48d48940819279258d64", + "5230ecfda35fbece4037d26e44660a31015c3e7cbeddc4c1b6b69a4b93a24435" + ], + "scriptWitness": "0147522103d800871a28a5c52d07529362cf80289cf268b88192e7bb082fcfce0d3cf38b4e210267f88ecae59531f1813823904e6a797509c84b84986f44efe34a319b9394133752ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qmw3nngq36hhu7wgeg07auuf5vgz09knslyuthn", + "fundingPrivKey": "183ecf6c42526a26617a985c0eede2a68b1f2e52da5b67960aa1a047472fc4e0", + "payoutAddress": "bcrt1q2drv2s7sxcmrvawskce37fugft6q2f433usfyq" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71057031337393738373239373334333933373837353838000000000bebc200142d383032373431353234313531363636393635320000000000000000142d333134353530383939353933343334373034390000000002be307ffda71240fb4ed7a3d19241225e8dd79ed32da94dd84139bf52e269c6f2868e0e701c5ae2a705689d16250e1a71a791934a28c11687d573aef0bc19ec21e00ccdbd94c8140303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f3001600149352b9d26b4d4cfcdd7c036a46ab9071b11416a20000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001402305b3088dc69bae876ed24abf8a045837cf9bc0000000000000000ffffffff006b000000160014ae351d1d2d936595dbf2a7be6e3f0fb11ac14d4b000000000000000500000064000000c8", + "accept": "a71c125de4576123cd54d77dbe2cfcc33060068d4e85bf450fcdcc6bf84c3b37a39c0000000005f5e10002727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c001600145346c543d036363675d0b6331f27884af40526b10001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204fdf9de735c9353b824b9e1c2a29b084916a399103fcaeb4e7b7bac6021a53150000000000000000ffffffff00da000000160014dba339a011d5efcf391943fdde71346204f2da70fda716fd01e7030144df9d0ebc46637abb6a8ee0979f2121a6a426d57350ef28701460bea9cec79eaac86cf476d811c9c65884a2ab8ea0d52c22f4fcacdb0516d4597f5e7683b8c60079b6134f5fbfef4b11e0c37f2226e7feb981e7d16e0990ad1af123ff462d1bf7b75a0082941b7bdeac2ff7006f18ecc913353d554630b1fad722c5aa467b631df6868297d0ceae9e905d78f605b7cbdcbf9bd097652c48019045ab1705bcefe801a17c4f028da349c25890995014f15a1c93cfc7d5034685fa341bb0eb2b0b55572d846f55f57210ecaefaff0ddb51da292a43f65c4a8abc20475fd1a7cf706395008682aaa2bd965277ad62bfe535f9cbad5124d4748b55ba396c5e4057ef5f51210144b92f8c30d79e4dce967c4727236eeca84be9ad8f35752e81644eb7be989cb957c07979b4f3ea1d1a78332c4dab3b151f0d96f212e6cdd3cbf22af212c3b900862d76274980af4b821c27bcdbebcb22653a2f78d046862414197e94a38aab6a22a6241ac75064860da635fc047b17c5a6c49a1216efb6b39392a816b05447e10179f6f402f1b315499ade2a4acec0e003714ea552c694d5e58133275070bcc8585f479d9a204c7aefeaef37bb59f497d4b2556d1b91e8e13e89df0d4eeffadabdd29f02179cc7a51314970bd9f3d26e573944b33e3604afc4bb275e4aceb2d0b56b669e44ea326bac05fc3553c8cfb49758c449dbe95709a94e0b4c2a1ca346f94bc3efbb16ef80fa094bb55e9e156c664b002b58f5f55df0ea01b959edbfffb5", + "sign": "a71e7d63e97b1aad278f7c6f053f75d5b8b7cf73041b11f6a33e723b754fb5fabcadfda716fd01e7030008ebea94318ea1f63827721d1d079e7063862ad613e25ca981a021cff60d29c308444ce23bab485df8b7e19e7e314c959cab7659750253af09a4f3ea67d8d45c00e002b955aafc0fcd066fd7bf26a9e2fedb5a42f63304f814d6557a621fad749ad0407bb6dfc79f7a84c98cd011c65053d9abf39883e81ccde7fefc4f09aae0e19b8de29ef0c7a3623d10eaa9545b76706345bd157fa2d288b9b0f77d2a57512a005e40a6848c322cd3c1a84e6ae918fa7e71522602b7560b5e1ea13ccb2ca8e9d3f99754772cc63510b9f4118339d89dd8156fba98e51c456e01996dfa67018a7500c5e28b130d3df0fcf4437cf49005588392501bd012e4cffa3faabf27053e77679acda9e60a317004233a7e91ad638598217f033abfd0daa922afaad0af2877d90c2270dc40717f5dc4e30c56511f55d204db00b4849768fc62ee207a192a11ee00c5c9bb1d919e874c46c16562858eed08ea3930e7f1204dd114b5c4fbc0e608dc8f9aa7a6c8f349d6f161f6b1aaafd3123b06f2bd5134ce9b9293e9366ef43fe60146ab3ff4d12c58454794f39a2e945be4b5ee72230257c9ecd2aa520631491233200294f1d886f18fd52da453f08e3a06776064ddcfe6fed75830328711e98e3784a712b8737b17904db954cf23275d4449a05b7dc4954f727e3daeeca08bd52574b8cf9cd1fa9461ce07c0cef64fd5d7d2cbafa9b1e1350b0ced9453384c7ae02e6483c44ba83cb7aaf1c65ad8fd94d6bd1485f3893080a77e378983ae58b29efda718700001000200473044022002342585e03c5a34dc33c73f76e1914bb22a04365a1205d2657cccb720d0092202203c00b326ae0915cd468a561975925099b846014ffafa91eb7aeb35ff6ff0a40b01002103c6bedb91a0d68d50815ac380538746068b22f79648d787ea87800ca394afa9ac", + "unsignedTxs": { + "fundingTx": "02000000023ab3891a1e4f7ae41d6f3a521ef1ad0dc9852b210203b3708dd688a668dc9e2c0000000000ffffffffd8f697c03069f23095a161687e3b9d5aa1aab72d17b408906fb2427659f84b960000000000ffffffff0352c5eb0b000000002200202458ae384c4cd816e863e9b8a334d323730005a50819591fbc2a331ac1cbaf9de1dcf50500000000160014ae351d1d2d936595dbf2a7be6e3f0fb11ac14d4b55dcf50500000000160014dba339a011d5efcf391943fdde71346204f2da7000000000", + "cets": [ + "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff0100c2eb0b000000001600149352b9d26b4d4cfcdd7c036a46ab9071b11416a20147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352ae64000000", + "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff0100c2eb0b000000001600145346c543d036363675d0b6331f27884af40526b10147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352ae64000000", + "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff027f30be02000000001600149352b9d26b4d4cfcdd7c036a46ab9071b11416a281912d09000000001600145346c543d036363675d0b6331f27884af40526b10147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352ae64000000" + ], + "refundTx": "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff0200e1f505000000001600149352b9d26b4d4cfcdd7c036a46ab9071b11416a200e1f505000000001600145346c543d036363675d0b6331f27884af40526b10147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352aec8000000" + }, + "signedTxs": { + "fundingTx": "020000000001023ab3891a1e4f7ae41d6f3a521ef1ad0dc9852b210203b3708dd688a668dc9e2c0000000000ffffffffd8f697c03069f23095a161687e3b9d5aa1aab72d17b408906fb2427659f84b960000000000ffffffff0352c5eb0b000000002200202458ae384c4cd816e863e9b8a334d323730005a50819591fbc2a331ac1cbaf9de1dcf50500000000160014ae351d1d2d936595dbf2a7be6e3f0fb11ac14d4b55dcf50500000000160014dba339a011d5efcf391943fdde71346204f2da7002473044022002342585e03c5a34dc33c73f76e1914bb22a04365a1205d2657cccb720d0092202203c00b326ae0915cd468a561975925099b846014ffafa91eb7aeb35ff6ff0a40b012103c6bedb91a0d68d50815ac380538746068b22f79648d787ea87800ca394afa9ac0400473044022017111e80e7d35187c3be10bf91486674a248247e2e8907389931eb49cd280a3c02205a6a87b366d7730500ca5fdb4cd84e9b203149ea23b23b8674730274aea07b95014730440220355580e7b51d6c36200c271b184c4be9d4d823e3df6bd6b940e78546427ab40602204e586a9a133217a687427fc5ed13a8f6e457d7f9f44e31605f7d2a85dbb605a60147522103d800871a28a5c52d07529362cf80289cf268b88192e7bb082fcfce0d3cf38b4e210267f88ecae59531f1813823904e6a797509c84b84986f44efe34a319b9394133752ae00000000", + "cets": [ + "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff0100c2eb0b000000001600145346c543d036363675d0b6331f27884af40526b10400483045022100a17c4f028da349c25890995014f15a1c93cfc7d5034685fa341bb0eb2b0b5557022018641b8ecac219318120841b0eeb1d3e4510f2dbe6de3a16883df59580cbb14301473044022063cc6d2f8b36140941c91437809058f515e706f1bfbf1d0eb46525a14239db880220379b65d84b894e0c5272400604b9e0d21afa55882e595008864c1bf4ffb5035e0147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352ae64000000", + "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff0100c2eb0b000000001600145346c543d036363675d0b6331f27884af40526b1040047304402207a5e12d8611199bdddd5996b4912178ebf5142bc631d00d095f51785ec20700b0220255ca876f578fac5d8cda54261b66dce2b5527bc6dc1819305c079851991d1fc0147304402205e40a6848c322cd3c1a84e6ae918fa7e71522602b7560b5e1ea13ccb2ca8e9d302200a34c9804269b408cd8982d98edb992cc5d04a0410e2690ebffb588845bebdb70147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352ae64000000" + ], + "refundTx": "02000000000101311fcd8e038d50bef3acb3ae9e4afec9d788168913bb12abdbea8e7b2c0d3e6f0000000000feffffff0200e1f505000000001600149352b9d26b4d4cfcdd7c036a46ab9071b11416a200e1f505000000001600145346c543d036363675d0b6331f27884af40526b1040047304402206b669e44ea326bac05fc3553c8cfb49758c449dbe95709a94e0b4c2a1ca346f902204bc3efbb16ef80fa094bb55e9e156c664b002b58f5f55df0ea01b959edbfffb501473044022074b8cf9cd1fa9461ce07c0cef64fd5d7d2cbafa9b1e1350b0ced9453384c7ae002202e6483c44ba83cb7aaf1c65ad8fd94d6bd1485f3893080a77e378983ae58b29e0147522102727554a43005ec3bd779de14b66fca6043e0aed1e667e87a28873e8d78be6d8c210303f33e022dac198f010ea124f51fc7ef17c35fb2e08c94d3e0f84a44d3c3c1f352aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "85bd0af5cd6d70ea7ca8854209068178dbbbf4180040798ac3ceb2450374124a", + "nonce": "70a35094dbf82a34aeb1571d2989b10392c62872ae90112db2588f9566bfa121" + }, + "contractInfo": [ + { + "preImage": "-4987769899714139375", + "outcome": "44d9d4dc8836e409922ff39f31b70bd0ee9fe3fc14cdc64cf6f30e48c86c0981", + "localPayout": 200000000 + }, + { + "preImage": "-8873646489770328924", + "outcome": "1ea1743341534101a6d723c3ab39a2b6f5c4cfbd38bd68d38bce17c717ece4cb", + "localPayout": 0 + }, + { + "preImage": "-4801055138791165779", + "outcome": "c368713d97cdfa5259c917bccf13147f5656d0962af9218b31463a8505578090", + "localPayout": 26776378 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "1ea1743341534101a6d723c3ab39a2b6f5c4cfbd38bd68d38bce17c717ece4cb", + "oracleSignature": "70a35094dbf82a34aeb1571d2989b10392c62872ae90112db2588f9566bfa121b9918455b25c04d1e18b39770f02e58549532ab366e0694c66b57e09e5d68602" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600146a88063bfaa49f04c84424db5a32a00c8260fbb800000000", + "idx": 0, + "inputKeys": [ + "b0e3b57619378fa6d9f7bb4c789a5d3dbc4905450e727d3710afd60b23b6a776" + ], + "scriptWitness": "0200210201c94fe2752db52b41388af5dda90e87e6f83da5f59ad1808cd2c23599affc0b", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qypspqkh9kngle26cf0402pjsasy4egf5dmvcup", + "fundingPrivKey": "8c6c01ee0c6d37a5f7e76d24ad413331f803475e3492500bbfa0b47323f654a3", + "payoutAddress": "bcrt1qwqg8we5fmzteptsve7rnns5ctn0lq034t87wf8" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142fb1383d411a30e1fce0a4c45b4b71132f614b0d8700000000", + "idx": 0, + "inputKeys": [ + "ed9c59999e1b28dd9f4ff2554b45588eaa1862cf7b78a759ab5f3c4fe7700991", + "28d99ff5bb8e7a558378a84df14f48bc5bfcfa4ed5143a81873beb6fe17f5a93" + ], + "redeemScript": "00200d9b9af1a972e88760cb65b76e1fb47a512095bb230012a87edb1dce60ba7b81", + "scriptWitness": "014752210257f6041a954570ec6fdb38e8a0eadee0cbc699ae13e4baa0d7558388eaeaed8021022a95789d2ab8f2fd91b9ffb497cedc6c7f5a58112c1d470ef54e902f943b887f52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qacl2f8js748vc49d7lleqddwm689qh83ee0uk8", + "fundingPrivKey": "5f5036f82d2b0cbf0fcf8727f5ef1b2a85edc735420c1057ea86483da1d4489d", + "payoutAddress": "bcrt1q08yzk8y5www5t2nw3ng53cn80crtwpguhqv2m3" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105803142d34393837373639383939373134313339333735000000000bebc200142d383837333634363438393737303332383932340000000000000000142d34383031303535313338373931313635373739000000000198933afda7124085bd0af5cd6d70ea7ca8854209068178dbbbf4180040798ac3ceb2450374124a70a35094dbf82a34aeb1571d2989b10392c62872ae90112db2588f9566bfa12102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea001600147010776689d89790ae0ccf8739c2985cdff03e350000000005f5e1000001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600146a88063bfaa49f04c84424db5a32a00c8260fbb80000000000000000ffffffff006b0000001600142060105ae5b4d1fcab584beaf50650ec095ca134000000000000000500000064000000c8", + "accept": "a71cf202d381ff9396ff6040e75deef303ccb511bcd495f2230f205795f2698538f40000000005f5e100030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f0016001479c82b1c94739d45aa6e8cd148e2677e06b7051c0001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142fb1383d411a30e1fce0a4c45b4b71132f614b0d870000000000000000ffffffff00da002200200d9b9af1a972e88760cb65b76e1fb47a512095bb230012a87edb1dce60ba7b8100160014ee3ea49e50f54ecc54adf7ff9035aede8e505cf1fda716fd01e703009475ff08733abe305333d814dd56cc9b2a434b1f82cba7bf3f1695cdd46dd4b5cbb470de213e10daa84a61eb24a36bf9db2132cb2c79593104d164c98ae888bc00e2fc3bd8393152f695fdcb3b28c97a9ff667c7e9d7f5f41fcfc68766c72e75c4c9b1c03dcd6db0d32aef08c87230d3ae3b8108808828d4868b35a6c98e020ea45f184e7f6fe79e13fb6fa2014783d087c48c40c70433507c76a3de518d9d49700170e4404138279ae483c03abf7b7601ab6a759a5d8463863a756f589e49b6129a3d4de23a148f105394da3bfffb5923e2bcd83d2fe5375a4c7eb99487a0227d090102a659c5c6196183ee167035b76b21bd7df4601489a7fb51c400570b357b735c03bde8da8c0ebb72405e295341a1fce6f52a101936203269f6a70c12b114bbed46c8e176d579cbb4b6ca5ae13a3a4c16886bf58066c352ba9d6b4cc1b2307b5f0091eac465b4da941569ee58b4c1f813345ba840ddf9978b627d02e725ec1e9d7f94bf1fb45b6d82926eb0a2ada6168631f894dbb66067fd38d603e5d1aadae9e1009cc2521031f9803feea08ff1bdf2f1ac51053cbe58ad3d7a7e82146b0e54ef0ab58d517cf16b4f501c15191455cdd732842004a5c95a2eaf1f423468631130b353d103004cf83bbbbf2a16fbd1d8e9a6e47c800708b7e35cef484e372eea68c86e7912580002cff84e929a305ce1932f8a7e1fc19b0614f6dc0d0a9f99f58ab87d080937033ff194192115aa4fbe70e8786145069bc79a271158fc7b80873619", + "sign": "a71e2c524d1b97e05cabf57af9343195be168f8f27fdf94198e2faa83893cb276fd5fda716fd01e7030018eb805188ff76c00f362238f1bbc7c5ff421d0c66aba7c4d32ad23bbf9d3b56d5aa7778c90a8189df172e7ca916e7416b76be79d7be3b6cacdccf3513f935a501f2d2b756221d62c18c5a25be51f650685ae95c3ed219d8d4b59b9295e44a9be7d688a42ccb9ac6bcfb3eb23345869c4595b8f7449217f1a29358b86a1acb11617eaa5f248f33e6b7c43577554c908ddd9ece8e2209d5c4ed8c25f0197334435b00cc5d97dbe39232fc77ee46ce44be680386513bba3d7762d46c8d67a1fdb8085d39574c8066f701f2382e3f96ba8fda2966ec01a266fa54cd2449e980aee32af10020d61b1a182ed8ad6edfd39506ae8d5edbe7b7594977c53b8828f110f105c09f418ae3d5c942ad78412459376ec452ee39fdd11787649a8657251ed8fec19942145fcb18f155b6eb9fa12ea07ca2123d5fe01b788bc8fabc3a23bd96032b3fa401f69f72bdc7f64e6259dc70fbcb34cfe8ca50a4e77c58094aa046c2c4fb38e8984648eeac4f535edeb30b76b6197d259b9dcbc4a13e301de2ffec132887b3b6ab00efe9aacaa3a42c78198a35cd4d13721b3b7204d9f3bce64a5c0d7cc4c1bd726d280b6c11fa9cc54bfb1e9d6d91bc8db485549e724e9cb4143b6dc1c660be9fac5ed4fc5c5ecd05136eebaa15468eefec9701bc010480458bd2db1d2d1dc9db384154fa3eb645df83bab25bd4e525f1359f09139586e78c8964ea441bb3b87ccc0b8e68724aa1168692a02851640a4ba926364c836cd3b5d6726518d748d46afcfda71870000100020047304402207138a5f42c37af2f4f0055d7529ce05bcc67fdce20a36092ba2861a2498afd4a0220561405981bfe77a391870bf3efb07f138670ef61f54785541f8f691862514f9a0100210201c94fe2752db52b41388af5dda90e87e6f83da5f59ad1808cd2c23599affc0b", + "unsignedTxs": { + "fundingTx": "020000000239b44caee266edd14b5e812ee60bfc247d1d8d9e465406571d717b05354fac400000000000ffffffff3e28574b8204514246d44143756e441460f93b3ce0230eab1213aa969aa2b59c00000000232200200d9b9af1a972e88760cb65b76e1fb47a512095bb230012a87edb1dce60ba7b81ffffffff0352c5eb0b000000002200205599900590e53f3d0e9420c965b1b255eff89f747fe4e827092afd4697d62088e1dcf505000000001600142060105ae5b4d1fcab584beaf50650ec095ca134a6dbf50500000000160014ee3ea49e50f54ecc54adf7ff9035aede8e505cf100000000", + "cets": [ + "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff0100c2eb0b000000001600147010776689d89790ae0ccf8739c2985cdff03e350147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52ae64000000", + "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff0100c2eb0b0000000016001479c82b1c94739d45aa6e8cd148e2677e06b7051c0147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52ae64000000", + "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff023a939801000000001600147010776689d89790ae0ccf8739c2985cdff03e35c62e530a0000000016001479c82b1c94739d45aa6e8cd148e2677e06b7051c0147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52ae64000000" + ], + "refundTx": "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff0200e1f505000000001600147010776689d89790ae0ccf8739c2985cdff03e3500e1f5050000000016001479c82b1c94739d45aa6e8cd148e2677e06b7051c0147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52aec8000000" + }, + "signedTxs": { + "fundingTx": "0200000000010239b44caee266edd14b5e812ee60bfc247d1d8d9e465406571d717b05354fac400000000000ffffffff3e28574b8204514246d44143756e441460f93b3ce0230eab1213aa969aa2b59c00000000232200200d9b9af1a972e88760cb65b76e1fb47a512095bb230012a87edb1dce60ba7b81ffffffff0352c5eb0b000000002200205599900590e53f3d0e9420c965b1b255eff89f747fe4e827092afd4697d62088e1dcf505000000001600142060105ae5b4d1fcab584beaf50650ec095ca134a6dbf50500000000160014ee3ea49e50f54ecc54adf7ff9035aede8e505cf10247304402207138a5f42c37af2f4f0055d7529ce05bcc67fdce20a36092ba2861a2498afd4a0220561405981bfe77a391870bf3efb07f138670ef61f54785541f8f691862514f9a01210201c94fe2752db52b41388af5dda90e87e6f83da5f59ad1808cd2c23599affc0b04004730440220488216817d1f344444ace956823d5fa0bf2cedc9309b953674618498ce735bd402205ac2fe05ff71e7349be23ee1eaed73ab0d46b07dc06a760c0710a7e168436681014730440220040fea941ab5af0f33965cc2f3a8490dc948a2d6fc22d62dbcb0c7bc46c4b0ea022004036a31c6678cbc558f948f4b775c09b20e275757971f4fd6f19d660b80b2b6014752210257f6041a954570ec6fdb38e8a0eadee0cbc699ae13e4baa0d7558388eaeaed8021022a95789d2ab8f2fd91b9ffb497cedc6c7f5a58112c1d470ef54e902f943b887f52ae00000000", + "cets": [ + "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff0100c2eb0b0000000016001479c82b1c94739d45aa6e8cd148e2677e06b7051c040047304402202f92706b1674dd574318da30cb350e9bd0829918c9547449931ab3004d597277022007bb0a3d8770827569bd5a8a6a004b8800d546e850953817eb1429b464373d5701473044022070e4404138279ae483c03abf7b7601ab6a759a5d8463863a756f589e49b6129a0220447d8572a12f8ee3babf9ddd34b62cdf555ebcea2e90f703e0b91af08cf9e4be0147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52ae64000000", + "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff0100c2eb0b0000000016001479c82b1c94739d45aa6e8cd148e2677e06b7051c0400483045022100cc5d97dbe39232fc77ee46ce44be680386513bba3d7762d46c8d67a1fdb8085d0220348aa213abeed2aada15afbc0d103e676954ff50fadb1df363eab53ea29c66620147304402204d5e67db6d255318045ef5b612c125b81f816583e84c9968ee3d38db0a7e5f8f022008cc9e6787d16f2640385a03985ceb1c18fa110aac0079e39241482683ed0c7e0147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52ae64000000" + ], + "refundTx": "020000000001012157a2a261adffdaedbbb36c299b9e3adabd66df691e3a9554ca73689a9e50de0000000000feffffff0200e1f505000000001600147010776689d89790ae0ccf8739c2985cdff03e3500e1f5050000000016001479c82b1c94739d45aa6e8cd148e2677e06b7051c040047304402204154fa3eb645df83bab25bd4e525f1359f09139586e78c8964ea441bb3b87ccc02200b8e68724aa1168692a02851640a4ba926364c836cd3b5d6726518d748d46afc0147304402206e7912580002cff84e929a305ce1932f8a7e1fc19b0614f6dc0d0a9f99f58ab802207d080937033ff194192115aa4fbe70e8786145069bc79a271158fc7b808736190147522102349b0eba3f104d860ffa17a1f945bc8182189347819f767cb2747a629a5953ea21030977d990cae4a21dcd4dd42bad1f8c1ba0041f73ec0a145405ec02ea4c84a18f52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "bdeb33654b432a9ca043a2d51e3eeb27894b5ec72b262248388c1f7cfffb0870", + "nonce": "8aede41284bb241ba932e8d8e9a03b7cc070d560c5c7be82f2a06aea227fe232" + }, + "contractInfo": [ + { + "preImage": "8883562695432218392", + "outcome": "86226065eb96e362ca095901d07d96e0dc77619ad3d975e4dd633d48f1e03ff1", + "localPayout": 168277115 + }, + { + "preImage": "6578202344459336638", + "outcome": "d48e5af63b5b14d179e0af1624c091f5de46b9f6dc8b51ded3e9069fe585b652", + "localPayout": 0 + }, + { + "preImage": "-4945008703317130444", + "outcome": "a585a667446d58dd0b2aa10c1a20e5e5706debf8acc45bf954e49f1e8273cb27", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "d48e5af63b5b14d179e0af1624c091f5de46b9f6dc8b51ded3e9069fe585b652", + "oracleSignature": "8aede41284bb241ba932e8d8e9a03b7cc070d560c5c7be82f2a06aea227fe23268254f02c1b6199005307eb2f7e65bcf5a2f0aef02c3abbdd4e9f83dfee574b7" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200207c0c606170047470f0f210bf1b4a52a1c4a8e440bca47e0e84cc75e4fd531bd400000000", + "idx": 0, + "inputKeys": [ + "8463680f166082a2d774d4d48da15a85c0bcd010ff37acde4d08f4b20f9dd673", + "59f452417814a9444eec8111161b21090cddd074f59cfb185026f06ae8a9a3ed" + ], + "scriptWitness": "0147522103e1ecb04d29c004a02e16691c39dbdd4559643e9f838281a73e742e7f91a98ff32102a52553dd923ea4e3722a4d24b5c668d7df853f488d2e4a2c177164218b534b8252ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q7tx27m6cmd7gn2aen8t9e3j7lu6wgtn22ca6ej", + "fundingPrivKey": "e1cf5da8d212185fce30c4789528bd1f53fa1379d54633d9df2e3d07153013f2", + "payoutAddress": "bcrt1qwfnrrvusrcpy9hrnzchgjwe7f7ase98kum8mvj" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600149ce0a1f36003b2ce7875e93e42e17ab448acaa7400000000", + "idx": 0, + "inputKeys": [ + "6843ffdfc59824923d07046face8a69bcff1a6916b805f71095254287bd720c9" + ], + "scriptWitness": "0200210285e011ffdb8190603994eed88550471bef6d4038f9da663852854fdd98bdaf78", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qyhp59smturfy7gjq2qvn4jw5drh202d4svqq3k", + "fundingPrivKey": "f12922d1f66c05915a197805f49e52341aa7764cb1049acc996a7fe6a710f5a6", + "payoutAddress": "bcrt1q44ylrsrehqpv9a6hpukg0323mt4vadkkfzqn6d" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71056031338383833353632363935343332323138333932000000000a07b47b13363537383230323334343435393333363633380000000000000000142d34393435303038373033333137313330343434000000000bebc200fda71240bdeb33654b432a9ca043a2d51e3eeb27894b5ec72b262248388c1f7cfffb08708aede41284bb241ba932e8d8e9a03b7cc070d560c5c7be82f2a06aea227fe23202133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e00160014726631b3901e0242dc73162e893b3e4fbb0c94f60000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200207c0c606170047470f0f210bf1b4a52a1c4a8e440bca47e0e84cc75e4fd531bd40000000000000000ffffffff00da000000160014f2ccaf6f58db7c89abb999d65cc65eff34e42e6a000000000000000500000064000000c8", + "accept": "a71ccdff2205e21aa08d831f13ffd2d265b86450e04b7ae1e95ac872699dd42b12ee0000000005f5e100036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d60001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600149ce0a1f36003b2ce7875e93e42e17ab448acaa740000000000000000ffffffff006b00000016001425c342c36be0d24f224050193ac9d468eea7a9b5fda716fd01e703014fec5f666152a0d3bcbdd144f1c5f62c8012245a63db65b1e354553205da0d6c109731739e2d817e7ee96515a061075470fc09fc3f678a10629abe041e0873cf00ab888cf8e95f8110c1753373d5a847fc8cde65670ee1ceaa40ed4ba44b7f6879d041870413137583238b0187cb01ca7eb803aa546db1d368b5028fcdde49b5d7b47aae7d4fc91660460f0390080c39a66ad8d21e3cc7eb0a7af22445713be5b9003f15145157f6cebc75badcfefe5211fe4e622c1498fa371f8cf0d5cacc7a9801b9c4976bfc83c2a6b94cd7e5a4b6d7a35876dbcce8a4f5130527d424babb41dc00cdeb64d36ae6041a76f4870a22812d528056901ee9f5e36c27762484ce76dc2f4bb655d191f293df229af1f9425937281bd240da63733f14b84ab547d203a84cfef9cbb82d0cc59ed0535e63073365f5160b6af10fd7e77daa05fbb1d8b2151200e99c6d0103bf7e9659579e74d8a92717bc18ed28ececfcde22974276b76c670e51e16db21992327fbaed50721a2f433b29140d34e8f1dc98a91ee1dd3611655301f6c3e1065f392fa6814463afae6189bc638e78f26900041d01b1fabb6ed64a0ed798ee4b8da581b04532d8757acd6f3fcce05b048437ac759dec869c2ec0b8884ddcf814076d9bf1aa16910842cd34020685855b1af427a9192ac5c8a2a1568918ab85afd248d6b6d38de6a9f6d4fb4bad6af4b232a27b2dc79b1223a8ca8e7270b6b3b9cd958d8c8dab46e1dad12e255597f71b78f892e26a247ce3e49a11ec", + "sign": "a71ed98e7fdc597a4066c49ae71856506ede34db76d68e10bd53ee4b9ed3165d7337fda716fd01e703019dedd39639013c86bf7d9951e0e0bd70d07efd6b8f97a22bbfa4ff88ce1bd1cbfb1f1399849695db13baee8c06bb8389650721e05506ded812d84e80be254c850102f32d52e8ff3eb17c961a89c64f5090bba0ffc62e507474eb4e555205b79d038175f431a8dba6a8f357df80f2a5c80ce479ee75578c7c9599e54f3707e3d37334e58cb4d33ab7ce7d33ce36c3cfe6b7ad0cead74443a7b00594cc3a3cf9327401dcd55e0e5ea0c3ebe6860fcb99a1595046af47a878ea3e4f76c9b470e5709ac6b0d6ceed20bed0c5ffa81d5eb94816795f1f81a45c6f39749d1bedccda1eb06f0017ed487e7b28742f04c97f4ed59b6f81b23cbad6696882daf2c5d6e7014512b8c7fd6b5b70040629489bde01b3b7f194f8265c757fd28023b711e7bd3f09e2e7f3935867e381bd31ed531d43b196aee5e09bcb38fcf37e86059d053aa44e22350024f7f17ab0e4027f2d19445ac6b88a06c794a00b46c1099153d15e2cb5808aa4e89c3bec6216ca404cd19e52618ca0e55db3f20b12d63eb89a34b3f17aeed4f5015e189e19317be5c257e1e4e1b661945472dec114902ff4247d40c185ad7bd81b604ff5ba19b5aca6224e8dbbd206a31941f9fca612b6afe2e9f84bd6e1bb8c9fc041a37c17043380bba99796d719d84b73defc1079a6576d74b5b02c56d7ae8f0b2a7f6436721f0b7ba340ede62356c85f90755cdf7987219ca4cd2c296500961bcfd33f3f2fa1fcc81de98eb1dd04a089007afa023b8ff815053ea4b7ceaf19fda718e100010004000000473044022003b0de38c710bfcd5329562b216f648e4a60f75cc5076837e48fc7b9bf01985f02201231410a0d2da1ad45e5d3a54115be780ecc6468488d64b66c36e22cde12884e010047304402207b477b0ac146afaf816e80786c3a70fc06d7678f58dc36bf89b48f7f69f9cca202206df3887dfe3fb822462378e85bb05c6cff59052c76d2eb00ac3418073494f641010047522103e1ecb04d29c004a02e16691c39dbdd4559643e9f838281a73e742e7f91a98ff32102a52553dd923ea4e3722a4d24b5c668d7df853f488d2e4a2c177164218b534b8252ae", + "unsignedTxs": { + "fundingTx": "0200000002652dfaf64128015a2ae1eddc71568f5b887ea4afc7ed49d1f153e901f8a2d6e60000000000ffffffff3dabf7ae7743f7249be0a25986b1acfa46e53ee065ed49aaedd90797d9732adc0000000000ffffffff0352c5eb0b00000000220020a9340059cbdba5fefca2e51e6e3f28c21c8aee6c36a89c537120cfe0fcedbc6e55dcf50500000000160014f2ccaf6f58db7c89abb999d65cc65eff34e42e6ae1dcf5050000000016001425c342c36be0d24f224050193ac9d468eea7a9b500000000", + "cets": [ + "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff027bb4070a00000000160014726631b3901e0242dc73162e893b3e4fbb0c94f6850de40100000000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d60147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052ae64000000", + "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff0100c2eb0b00000000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d60147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052ae64000000", + "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff0100c2eb0b00000000160014726631b3901e0242dc73162e893b3e4fbb0c94f60147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052ae64000000" + ], + "refundTx": "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff0200e1f50500000000160014726631b3901e0242dc73162e893b3e4fbb0c94f600e1f50500000000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d60147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102652dfaf64128015a2ae1eddc71568f5b887ea4afc7ed49d1f153e901f8a2d6e60000000000ffffffff3dabf7ae7743f7249be0a25986b1acfa46e53ee065ed49aaedd90797d9732adc0000000000ffffffff0352c5eb0b00000000220020a9340059cbdba5fefca2e51e6e3f28c21c8aee6c36a89c537120cfe0fcedbc6e55dcf50500000000160014f2ccaf6f58db7c89abb999d65cc65eff34e42e6ae1dcf5050000000016001425c342c36be0d24f224050193ac9d468eea7a9b50400473044022003b0de38c710bfcd5329562b216f648e4a60f75cc5076837e48fc7b9bf01985f02201231410a0d2da1ad45e5d3a54115be780ecc6468488d64b66c36e22cde12884e0147304402207b477b0ac146afaf816e80786c3a70fc06d7678f58dc36bf89b48f7f69f9cca202206df3887dfe3fb822462378e85bb05c6cff59052c76d2eb00ac3418073494f6410147522103e1ecb04d29c004a02e16691c39dbdd4559643e9f838281a73e742e7f91a98ff32102a52553dd923ea4e3722a4d24b5c668d7df853f488d2e4a2c177164218b534b8252ae0247304402204716461bfb65e49a9183aa5a567a07133122de16be463934f7e678d90e198e1b02203cc4355f55c64638662041b64d10f4aec2bb77ddde1cff70ce2a894dfb09cd6001210285e011ffdb8190603994eed88550471bef6d4038f9da663852854fdd98bdaf7800000000", + "cets": [ + "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff0100c2eb0b00000000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d6040047304402205a922f64a7ab9d6aaecb0c8a844abd57bb590f110bd0d5dbb3a240e805f009e402204c3d0aabb291c6817f306de32c5d46c234dac82afca0393e71f5186e7c1949e70147304402203f15145157f6cebc75badcfefe5211fe4e622c1498fa371f8cf0d5cacc7a98010220687942b5e0db8ec5f45816b25a90a57f1b53bdd6e6c7f5be1c1be7f7a3ecf7f30147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052ae64000000", + "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff0100c2eb0b00000000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d60400483045022100dcd55e0e5ea0c3ebe6860fcb99a1595046af47a878ea3e4f76c9b470e5709ac602205569796e265a98410317b3780504cd71b65a1195dd4024ef509415d9f9c9ed180147304402205d28d4570e8be28445817bec3f33817e9566a6401be6375fd0de818668728f2a0220116eb1dc397a5ad40d4a894af3551a89cd9dfe8e0f7f2da83f5f41c8fd6bff410147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052ae64000000" + ], + "refundTx": "02000000000101d96176c24ef739260954f1f49d968b50660b8284e7f48547ebe060bbd95d71140000000000feffffff0200e1f50500000000160014726631b3901e0242dc73162e893b3e4fbb0c94f600e1f50500000000160014ad49f1c079b802c2f7570f2c87c551daeaceb6d6040047304402200b2a7f6436721f0b7ba340ede62356c85f90755cdf7987219ca4cd2c2965009602201bcfd33f3f2fa1fcc81de98eb1dd04a089007afa023b8ff815053ea4b7ceaf1901473044022018ab85afd248d6b6d38de6a9f6d4fb4bad6af4b232a27b2dc79b1223a8ca8e72022070b6b3b9cd958d8c8dab46e1dad12e255597f71b78f892e26a247ce3e49a11ec0147522102133bbdde3a4c9e87f3e542d755771d28e61facb225e20bf6e1cf17ee4e8f648e21036e681171ee71814ceea37adb33836c6ae9eb938ba4756572fa4a8b5ca54fc69052aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "c279da3c380ecc948500103351fbe63f40db7aeb2f0b169e4e481b97771d6340", + "nonce": "6080dadd487e3ae7f2ffaea2bfffd936bc05e84fe4bbeed980f905dfcb27f1bb" + }, + "contractInfo": [ + { + "preImage": "-5313426157761233701", + "outcome": "308900c92a0eeb46da3b8b00c8582ce6dd8d1c47478aa4545ebc195a798478a8", + "localPayout": 0 + }, + { + "preImage": "-5547973457608506349", + "outcome": "a7a700d05acb9df59a4af9cdccca5c44730fce1a194a99b59d3d9af0e9d7b5dc", + "localPayout": 53166319 + }, + { + "preImage": "7060034829094795459", + "outcome": "4637c5f151c0096226a74b3f33430f7ea253f93c3568a3d9f61356c12bcb643b", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "a7a700d05acb9df59a4af9cdccca5c44730fce1a194a99b59d3d9af0e9d7b5dc", + "oracleSignature": "6080dadd487e3ae7f2ffaea2bfffd936bc05e84fe4bbeed980f905dfcb27f1bb658eb5bdc4cc2772b9e997dfcd126eadbbc25a68fa9e790855959cfe1e5e9761" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ec83b68108588b2e3f86095850858f8836b1bf27849a91baa32e968bb91de36900000000", + "idx": 0, + "inputKeys": [ + "9ffafb53ec48fbddcb259249af0f1569a4c8ef34d3c4bf7165d6f9fdc78602d1", + "7dcd4be28b6ee7593e81d3af378258f4079470ad51f0bb49816aa540ea4e83b3" + ], + "scriptWitness": "0147522102c56d5b776005a75b7e661c63722c6448282d712cd4a2dfeef9372e00762e7907210399fef51d4aaf8e465ad32eea0779cb8d028129db615a6898b4f3f30726c0ebd152ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q5vdfurxagd37w2m295e9f3wvrwue2w802c6ral", + "fundingPrivKey": "158af211166320af390d3b579d7e202e1b6c9f839b017e3c3089cc9556b3cbce", + "payoutAddress": "bcrt1qpusjxj0jmcfrd4apmrduaxgjcuh55selzvcakm" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c1b453be89df159797b53d9cf19eca1472eb9c85b4492d0e0ec61f34c71c80a200000000", + "idx": 0, + "inputKeys": [ + "95fe2c9745cbe9f13d7130a02010e3b12583344c8b637532e2c09eb165da912b", + "d8afe63edb28d9687ea0f9c985af84d3c647590dd6947a22e0f7ce4d8ed588a1" + ], + "scriptWitness": "0147522102c25ec659ce2b2af4a6dbd44cd5e44793ed65da192c2186a7cafacf28dc86451b21034216ddb39343136910af0a6cbd51f08e1e94069b2452e4c3911f269831b43f8652ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qk94ehcq7lx8spnft8ktsn4n28z8u8vrk944349", + "fundingPrivKey": "a4222b95ec7b756de95b520855a7e1a918e43d86cbd3abb55757b6b6f568bfc1", + "payoutAddress": "bcrt1qvsyqpqrzxvxhza7mfknwxsxwq5m87tnr97q57f" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105703142d353331333432363135373736313233333730310000000000000000142d3535343739373334353736303835303633343900000000032b40ef1337303630303334383239303934373935343539000000000bebc200fda71240c279da3c380ecc948500103351fbe63f40db7aeb2f0b169e4e481b97771d63406080dadd487e3ae7f2ffaea2bfffd936bc05e84fe4bbeed980f905dfcb27f1bb03419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e001600140f212349f2de1236d7a1d8dbce9912c72f4a433f0000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ec83b68108588b2e3f86095850858f8836b1bf27849a91baa32e968bb91de3690000000000000000ffffffff00da000000160014a31a9e0cdd4363e72b6a2d3254c5cc1bb99538ef000000000000000500000064000000c8", + "accept": "a71c73b923b4d74286f73b7fdf430ad5bf07f2b9a39ea9c2458ee4e211b113ed85b10000000005f5e10003c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f813001600146408008062330d7177db4da6e340ce05367f2e630001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c1b453be89df159797b53d9cf19eca1472eb9c85b4492d0e0ec61f34c71c80a20000000000000000ffffffff00da000000160014b16b9be01ef98f00cd2b3d9709d66a388fc3b076fda716fd01e70301ca40373cac3e17b23235fe57ca9342994101ebd34af283bd2349f4d270e19b1937528d82d913815743746a9b44bf4c4bb68c671ee12c8db430d2d20a112a5fe900ca0b58223e47417d2fa5baee67c1406d4bb2390cab3b78a9701a8aecf15a6f04ab8888c4f9763f89d52cab54aa10739f06a806394dbc1b1d60b1d1a053de9bbb18da945909fc587dee71ccb4a58652b72d1183cd3007686df95a082b8a0281e50125573352519fbd5160b27bea41ac68298626c011a12bc5b4dbc16c6edfa21aece0d24c9a64ebd59415cda28e7eb90b05afbade3446e1715ff3f3dff148a4ed580058cca98f6ccdbd9475e1b2f6fbb3b8bbbea8e5bcc44e316eaeca67d024bb540082d8876dafafcb2c2be7ad0be67b6bf509c8d65b74c188b933a6e7e9ce71c8b228adbe6e131cbdaba81153501bae2d79a1abc0df76112488e08bd0ce06e0add501aa4fc3be5b5fb35eeac526579368369c1fd1cf8e4722481b44989d6dba9fe05da8ade536002d17445dcdfe458cf423a05db6fc9e963b3fd8aa927bb5ebb45c480064fc9fe200d9fc318643b4cc23ff662fd38b29d467b57c9f5aab42daea6baf06e2215d4740886a88718fd54e5ff9271789191ad3fb1fca1941dbb73967b6fdf6b2fd32f964b435f8c0be66fe4f657fff6e5fa01c5f1159a22bc639df65bd69d122b0c4b060e9623efd4989e2634eda8f05ba1222932316a5b20977407073387d4563286e10e79d5954403243c7f1d6be875e0096237ef53a9d6bbff08e679202", + "sign": "a71e389bafd6403e66849b735c9e431e6b9304bb61cf6622d979911efd7e1c7b8528fda716fd01e70301dd4e1506c15969478898193c71ca7d9f217c7b3c1ee8121a4bca75a880ed25832a0cd2137b3ecd272cfa5fdf67e6f3328281b1f0057ca4f77e50421b3ff5f725007d222345e4d49bf305914cf358d8e227354a6bf7376cd1558957c2f132473ca3678e26604c386e1072f6271bb948fd9d074acdee4e7cadf9d6ebf155b229b9631c84d6bd11f45359dcf1c4690ae658b8eb53c64fcbaed60e2978269732551b4300cdb9b4912849594bc6e4ac54512985a890ca4b63c3fa2fc05b5b3575e317889ba1363ddc16880931cf1327e727a3f9998e58d276687642b08a474c71e990707601b0f5e31d3102a1c55f3915816fc84cbd60e141d93aefb28e9417acb9504484d22299a928cfcf8e6e23b4bf798391c8dec7685de3be640d0e40f65fa17348912b7f53f934904ee7706a10c9b4c5128edb3d72a4bdb5c4c445eeedef9f1c782120011cdf26fa8ec8f1ccb3d763d780c5df876f7ef5dd5f00b3d5757609a09f450dbea86b85eff6784138fdae9f46cd9630ead0096a4e1126bb93feb2370abcfb7999008d9bfc5e49d8195cd4bd219ab0d7617f4ce555a6b5a026ca39e37bbb7bcc202307ab29b1412f9a8d650a692c074828245d666213b6b4fe8280d85c0f74a6c604e3f552752f0b8411f45c106cbfb53e66916b8d6fef73e54b6ea19c44bce33207792229a767e7bf77d871aad9420494d1b8db7724320e2f76988650950c8f43e17d06d97371d5c0840c744959f13e097daf5910522ae6e6060d4688b173e61f4cfda718e10001000400000047304402202289f8a4cade517a9b3a2bfa17f409bff52663adcee19e4f47130760970f18f70220125a680cbdb09c76222629ffe1f6bf8f3b268d00b68720f1c007d9e5165317200100473044022036f2a63e1b48cd278c7eff334d24602c26b70ca002595ddb8f258d9701797615022028e6eeb43bac3d456049be73893271b6b3280ba4a6a943514f96468206458a2f010047522102c56d5b776005a75b7e661c63722c6448282d712cd4a2dfeef9372e00762e7907210399fef51d4aaf8e465ad32eea0779cb8d028129db615a6898b4f3f30726c0ebd152ae", + "unsignedTxs": { + "fundingTx": "020000000278ab4b705379b2daafed826c917c09da10a1e45de313663468fa5062f20a8d3e0000000000ffffffff3b7375248ad8a2b9eebb6c0ccc2edf27c6d5003fe41701b98903d21a658891fa0000000000ffffffff0352c5eb0b00000000220020f153a49d72c0b3403949c633172f9d505f4126a6dd1e32def29c14607684d8d555dcf50500000000160014a31a9e0cdd4363e72b6a2d3254c5cc1bb99538ef55dcf50500000000160014b16b9be01ef98f00cd2b3d9709d66a388fc3b07600000000", + "cets": [ + "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff0100c2eb0b000000001600146408008062330d7177db4da6e340ce05367f2e630147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352ae64000000", + "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff02ef402b03000000001600140f212349f2de1236d7a1d8dbce9912c72f4a433f1181c008000000001600146408008062330d7177db4da6e340ce05367f2e630147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352ae64000000", + "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff0100c2eb0b000000001600140f212349f2de1236d7a1d8dbce9912c72f4a433f0147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352ae64000000" + ], + "refundTx": "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff0200e1f505000000001600140f212349f2de1236d7a1d8dbce9912c72f4a433f00e1f505000000001600146408008062330d7177db4da6e340ce05367f2e630147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352aec8000000" + }, + "signedTxs": { + "fundingTx": "0200000000010278ab4b705379b2daafed826c917c09da10a1e45de313663468fa5062f20a8d3e0000000000ffffffff3b7375248ad8a2b9eebb6c0ccc2edf27c6d5003fe41701b98903d21a658891fa0000000000ffffffff0352c5eb0b00000000220020f153a49d72c0b3403949c633172f9d505f4126a6dd1e32def29c14607684d8d555dcf50500000000160014a31a9e0cdd4363e72b6a2d3254c5cc1bb99538ef55dcf50500000000160014b16b9be01ef98f00cd2b3d9709d66a388fc3b076040047304402202289f8a4cade517a9b3a2bfa17f409bff52663adcee19e4f47130760970f18f70220125a680cbdb09c76222629ffe1f6bf8f3b268d00b68720f1c007d9e51653172001473044022036f2a63e1b48cd278c7eff334d24602c26b70ca002595ddb8f258d9701797615022028e6eeb43bac3d456049be73893271b6b3280ba4a6a943514f96468206458a2f0147522102c56d5b776005a75b7e661c63722c6448282d712cd4a2dfeef9372e00762e7907210399fef51d4aaf8e465ad32eea0779cb8d028129db615a6898b4f3f30726c0ebd152ae0400473044022079ef272b7e9b474f933de3cbff101d808567bcc0486aaf1fc1bba586c10e769602205395e6a3d60d90ed8b061933d71ef9a4057bbb07351d2d23c982f6755f52a1b8014730440220745af0087c9063facd869e2d786f3ba16995ee64678d25337078c56a3dcb8f60022037ae079467b10aa6329b60b9a3d456921091997093c191ffc71923afd0801f000147522102c25ec659ce2b2af4a6dbd44cd5e44793ed65da192c2186a7cafacf28dc86451b21034216ddb39343136910af0a6cbd51f08e1e94069b2452e4c3911f269831b43f8652ae00000000", + "cets": [ + "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff02ef402b03000000001600140f212349f2de1236d7a1d8dbce9912c72f4a433f1181c008000000001600146408008062330d7177db4da6e340ce05367f2e630400473044022071342210eb4ef15fda1b0bc9c33f96755f153cb61e821c667194e0f22ae05ce802200a551acca10624353217d28d3f750f5cfb9083fab57661f42c892fd9114b45bf01473044022025573352519fbd5160b27bea41ac68298626c011a12bc5b4dbc16c6edfa21aec0220734a8f3a78a45a747e585550452d59d2db029b489de567de24237ba57310aaa10147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352ae64000000", + "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff02ef402b03000000001600140f212349f2de1236d7a1d8dbce9912c72f4a433f1181c008000000001600146408008062330d7177db4da6e340ce05367f2e630400483045022100cdb9b4912849594bc6e4ac54512985a890ca4b63c3fa2fc05b5b3575e317889b02205a8b32a201f9275137f9274e8931a4685226e5dd4decdf9758ea6ef7a5fc94920147304402203b4c6fee74f34aa95e5eb8873e21b5df57bdca39e79a08a45cee0c63864fd36002201f9dad2923badd1fae377b9257b2ca62c2e9230a8601f5b83ad46a33253612000147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352ae64000000" + ], + "refundTx": "020000000001019900960fcfecfc75f79ce0cf51c202f694d4cb49dd830ca073e07c97628c224b0000000000feffffff0200e1f505000000001600140f212349f2de1236d7a1d8dbce9912c72f4a433f00e1f505000000001600146408008062330d7177db4da6e340ce05367f2e6304004730440220792229a767e7bf77d871aad9420494d1b8db7724320e2f76988650950c8f43e102207d06d97371d5c0840c744959f13e097daf5910522ae6e6060d4688b173e61f4c01473044022022b0c4b060e9623efd4989e2634eda8f05ba1222932316a5b20977407073387d02204563286e10e79d5954403243c7f1d6be875e0096237ef53a9d6bbff08e6792020147522103419cadaf352e70b29522f21650418cf1f4c6ef1960ec8fb908273f614f2a021e2103c5d8b5918c45855455bd7711104efdbc6e0e6271a16618d66dd927137971f81352aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "84199e4f878e19d68f8c1ddd2eae8b880aa5e16e9b0e299bcae6b2e4f5fdb7f1", + "nonce": "ac7e577eab589bbde000999ac5c2eced8d5dc28c542a84395ba67270b2aad66e" + }, + "contractInfo": [ + { + "preImage": "-1996225228809437657", + "outcome": "2be5c2997de289153bf2cd5490c9456d2653a3b6738ada2d23b0cbe2cca2854f", + "localPayout": 0 + }, + { + "preImage": "-1153332463964930662", + "outcome": "0fe37d57648168b29b6ada3b2c3b6a19f2370d2a3ca62a92136c60f65e11a049", + "localPayout": 200000000 + }, + { + "preImage": "-3183632945849220629", + "outcome": "7027d877753486edcb2c546cd22b8c678e64e23d058093ed8ba8283bd49eb76c", + "localPayout": 81178208 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "0fe37d57648168b29b6ada3b2c3b6a19f2370d2a3ca62a92136c60f65e11a049", + "oracleSignature": "ac7e577eab589bbde000999ac5c2eced8d5dc28c542a84395ba67270b2aad66e3d3a8bd7c4c15c82d120f0f7c1d2a915f7987f2765c525b029b88925c64e89f9" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002013edccd1e066b1e0021d108bfb85d650fb1493a34225d1ca2326d11c092f798800000000", + "idx": 0, + "inputKeys": [ + "c9abdfc31f512f0567ae028f22eed9dd9ae684d2a6a635c990c1445860207c2d", + "4c738dab480caef42a9552685b0e0ad593a0b7e9b6229479877e250a04e47326" + ], + "scriptWitness": "0147522103e0442d379cbac87cc8f680b2f7a7da621a8ac53d868e034a45153949fa6d952e210329e1c5238d36676c1fccba9485d9b1bf98c34a763eeddd14bdeb8968e54689de52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qjh7455x5efvdguqevk8srfwd2rmc2kq5d35tyf", + "fundingPrivKey": "00b2cf245ab9e2c70c1225592231c956a145f0bd533be39dbf80850ff12720c0", + "payoutAddress": "bcrt1qds7antvlhx83ycwchtmy3qgp0nlacf2k0q3cqa" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91423d0c7f98c23b4b7e572f6f6125d6c18dd8fb3c88700000000", + "idx": 0, + "inputKeys": [ + "aa79e068f6c4aa9eb2cb4713f17e04923f20f9d6e485d2885d6a429a0a9ad631", + "54b29674efe3d0b19eb31c4229f2022c2fe5544448f4931028034d8b29ba5756" + ], + "redeemScript": "00203512ba274e12990a2feb33d7e46fde040f22439dbaf90f5ba2339f7e41b205c9", + "scriptWitness": "0147522103ea8c49344c505196dfbccf68256b7a1f2f68dd9ca9ee5a459a5577ae3ba16d3d21027671f9c406ac32edb0bebab9506a65b8b0a0e251aa03d4a0bb9519cff62ca0dd52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q8kzg9zyypgmn2cqenmeq885dlvesgtmu2mnz8g", + "fundingPrivKey": "88ac98b799c07c915b9ab9476323e22520fa3640731d91f08a2aefcbf7c7078d", + "payoutAddress": "bcrt1qc352mjvjd4klzmq3mmw6uz9k4ussypqcan9s66" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105803142d313939363232353232383830393433373635370000000000000000142d31313533333332343633393634393330363632000000000bebc200142d333138333633323934353834393232303632390000000004d6ae60fda7124084199e4f878e19d68f8c1ddd2eae8b880aa5e16e9b0e299bcae6b2e4f5fdb7f1ac7e577eab589bbde000999ac5c2eced8d5dc28c542a84395ba67270b2aad66e020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f001600146c3dd9ad9fb98f1261d8baf64881017cffdc25560000000005f5e1000001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002013edccd1e066b1e0021d108bfb85d650fb1493a34225d1ca2326d11c092f79880000000000000000ffffffff00da00000016001495fd5a50d4ca58d47019658f01a5cd50f7855814000000000000000500000064000000c8", + "accept": "a71ccf8d54bb2112c5e51eaf3bc9ec67cf731093d6de59536bc6b2272fc293521a500000000005f5e10003e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a100160014c468adc9926d6df16c11deddae08b6af210204180001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91423d0c7f98c23b4b7e572f6f6125d6c18dd8fb3c8870000000000000000ffffffff00da002200203512ba274e12990a2feb33d7e46fde040f22439dbaf90f5ba2339f7e41b205c9001600143d848288840a373560199ef2039e8dfb33042f7cfda716fd01e70300c4b3e800a474c9ddd700fb448bfd77d082f8924f3aafdcdbcbdd0c8281f695540daff67c28bb1b4023a536afb2e1401175df2d86a263a5a584c188a4365ea9590040bc16a9da158b0d7e9055b15182c935b4f65c026e9741a40ddc2d4b7e7c4944c3b7f086a0f929c3ab36813bc8a1682fd1940885426b7b1d50b72118eb1440e6f7c9b19fc601c3d598cb4ba366e590e7438e7dd27808f9da9cc023420c936656006ea482f8e1bdef04caefe078c7d6350f0c9f0a83de1cbd5b1d423ae2d045afdecfcbc21699962c8f5847cdfa515235a70ebb72b438ab1f486fe665203005fabc00ceacf5e820f73bfadf548785dc7d2d4856ed5068217e2dc57181bf1a374bf39df1e88319f31cf107365c266320a5d3965ed5549218bf68521125f51195c9f5f0f3c5155052e36791157133e1742282c170252a2e5fbc6b4978b97808ef41d6e5005b1fdd528572aed4159e7bb312c59bb84f5b5108fb6b815483ed7f04be8beca90803ad4968220dccf41a031febfa1b748a01ebb55d065a5c40372ffc32d28eab0074da9aaf3ba8751e740a8541b86c14eca63fceced894ff3271a8008163e02d5265021e989bd079de634366eb96e573cb18b14241f781c4a50224e79ccc60eb0eb6f2c4f65a05c21193c9ff76ec6f0fbad8f1eea177f8d5d7652a69939d8a5e580f013922f57fd69440c3c6f02365c6a04b132ec78d043db96de5115cf8e49a7e3935fcbfa8d9b39692d09fa4f278a886e5da01844f8dab2b424703ad0481e476", + "sign": "a71ebe4910d519dd9f9221791a634fa0f1be2b5071b22153b57e65c6b02c799cd151fda716fd01e703007a17a0a51ca5c5dbb365d0aef6b4c1ba9d785a45bb54e8133d17e0d45b85540fe0adaf94c7203a2e1fac664e6b4f903ef1224ff8c194ce7f1e4bf5a60b71a2980065d60c80b7e199c47f9413a8484f7adabf5b63ee4fee181b2e2fddd911068074a268e242968936908c6e6dc27ac738ed629ab32d45e7787646705b3326d5999dd84cb6b15be9feb4ebfc59413eb443b9353e9255262a415284b7733be26916c601127d4822df399a991f7071ebdfa406115ba9f7ac2660c4f8a16d91fe3f5334120909abda95839a1ca7916b082756e5976ceb7d61f8240168e50583d70ea05183014d4a354fcef20c084ee23f0ad81be10418a1d214c1a4436f4674cd1476de68efe3fd9c59ab79a5c607d4619af424c9674e329ae693fea0324e7f0440d04746df471d572cb1e27c52f42eb280ce3982d4f1f77e36959b43e8622a48a61ac0287400d060815e5d7426ffeb9766737f3e463abbb0fe12bff3348db4d6a72dfa8671928e489c0ee319be438d5cf6cdb45aa3fde12881f14e3cab01a12d29c974a01027000dc9b6e7ed8c666b9a1eaf76cda18c70093431f0a1ce1117b7ad4aced864a7630145d57e1112b458af8de877e693558ff7476bd6c8beca2b0352739a3302453f3808abaa3e6e056cfdcb7c45e2a93336ff6fa0214c605b1fcbc0bb0dd1c349bf46c0091d01491e400043406c627dd54d44a45d26a60e0b75b3e7e44910756a1e649e5ff153330a8af8c9bfc8916a1c0d15978e2dbefbe5b1ca0f3a327353a8edfda718e10001000400000047304402207a57899e3f7e61997b108318e94ee09978182b68573dec733449a301ae35bd0f022059a8ceaffc96b2f1144986738737fd857b401ea51e81b250124a7e55fea163980100473044022049d7ae3abf5378568b8b1d9edb2992372979fb99cae9c09153956af67e234ad902205df9d6413dbf4138d8507acb107a952f91ba7cfc39d8e4333093f63a70ecc6d0010047522103e0442d379cbac87cc8f680b2f7a7da621a8ac53d868e034a45153949fa6d952e210329e1c5238d36676c1fccba9485d9b1bf98c34a763eeddd14bdeb8968e54689de52ae", + "unsignedTxs": { + "fundingTx": "0200000002f90680da27047a0a702f7376e333c774ec11fd1d3960e5ad83395ab2e2db4ccb0000000000ffffffff718ce7c5c09de06ce69d48915d3cb5586a4444889496b4fcbfa91f1bfc40d80a00000000232200203512ba274e12990a2feb33d7e46fde040f22439dbaf90f5ba2339f7e41b205c9ffffffff0352c5eb0b00000000220020e9eb906799518f1549bbc1b8dbb402408b39c43c2444ddf037e34577f725a9fb55dcf5050000000016001495fd5a50d4ca58d47019658f01a5cd50f7855814a6dbf505000000001600143d848288840a373560199ef2039e8dfb33042f7c00000000", + "cets": [ + "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0100c2eb0b00000000160014c468adc9926d6df16c11deddae08b6af2102041801475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152ae64000000", + "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0100c2eb0b000000001600146c3dd9ad9fb98f1261d8baf64881017cffdc255601475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152ae64000000", + "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0260aed604000000001600146c3dd9ad9fb98f1261d8baf64881017cffdc2556a013150700000000160014c468adc9926d6df16c11deddae08b6af2102041801475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152ae64000000" + ], + "refundTx": "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0200e1f505000000001600146c3dd9ad9fb98f1261d8baf64881017cffdc255600e1f50500000000160014c468adc9926d6df16c11deddae08b6af2102041801475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102f90680da27047a0a702f7376e333c774ec11fd1d3960e5ad83395ab2e2db4ccb0000000000ffffffff718ce7c5c09de06ce69d48915d3cb5586a4444889496b4fcbfa91f1bfc40d80a00000000232200203512ba274e12990a2feb33d7e46fde040f22439dbaf90f5ba2339f7e41b205c9ffffffff0352c5eb0b00000000220020e9eb906799518f1549bbc1b8dbb402408b39c43c2444ddf037e34577f725a9fb55dcf5050000000016001495fd5a50d4ca58d47019658f01a5cd50f7855814a6dbf505000000001600143d848288840a373560199ef2039e8dfb33042f7c040047304402207a57899e3f7e61997b108318e94ee09978182b68573dec733449a301ae35bd0f022059a8ceaffc96b2f1144986738737fd857b401ea51e81b250124a7e55fea1639801473044022049d7ae3abf5378568b8b1d9edb2992372979fb99cae9c09153956af67e234ad902205df9d6413dbf4138d8507acb107a952f91ba7cfc39d8e4333093f63a70ecc6d00147522103e0442d379cbac87cc8f680b2f7a7da621a8ac53d868e034a45153949fa6d952e210329e1c5238d36676c1fccba9485d9b1bf98c34a763eeddd14bdeb8968e54689de52ae0400473044022006a5d8316f94081d7f87bffaa630432c4c8e72eb9e1aab9e9f3d76b5304fa70d02204822ad456983b52e8bfc832ddc2e3808e66439e411423c260751fff2b31f09ed0147304402201d386f8143daff0e474c4032064ea47792800f86de0a6fa82fbb588b8bf4296402207d81bff1a18bf3ab3be5c0607b4693b5a1851abc9721f14dde59adf4668aedbc0147522103ea8c49344c505196dfbccf68256b7a1f2f68dd9ca9ee5a459a5577ae3ba16d3d21027671f9c406ac32edb0bebab9506a65b8b0a0e251aa03d4a0bb9519cff62ca0dd52ae00000000", + "cets": [ + "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0100c2eb0b000000001600146c3dd9ad9fb98f1261d8baf64881017cffdc25560400473044022078e378c3e5da976f4b795393bf79e565ea71882f735cf22f94fe8c35d015097a02207f8343cfbe8d8e13ccf6bf558dd0d1fbe1b8b1d3ce540fc1fe7f02fd2dc187210147304402206ea482f8e1bdef04caefe078c7d6350f0c9f0a83de1cbd5b1d423ae2d045afde022061c8fe83080c3bfb2cd5b28ef8454e10c3bd2ca642d251384ed6d50fdf245d3401475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152ae64000000", + "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0100c2eb0b000000001600146c3dd9ad9fb98f1261d8baf64881017cffdc255604004730440220127d4822df399a991f7071ebdfa406115ba9f7ac2660c4f8a16d91fe3f533412022058ce300026b6ebc99d2a14eab17abc3fbcad8acd512b8eed32537c424fd01c800147304402207eb6d9f6b7b871ec24a4d6dddf1526157ef524b51d21bc0b2a79b2572aa52af9022039c6d83c0be4e802c4d09ed008044422806380d51eb40a22ef1f69ea15a044ec01475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152ae64000000" + ], + "refundTx": "0200000000010101cbceeaee9fe1d7b8de00786ca7c33bcd3ec7a3aa21d63f775acf386e44c4710000000000feffffff0200e1f505000000001600146c3dd9ad9fb98f1261d8baf64881017cffdc255600e1f50500000000160014c468adc9926d6df16c11deddae08b6af210204180400473044022046c0091d01491e400043406c627dd54d44a45d26a60e0b75b3e7e44910756a1e0220649e5ff153330a8af8c9bfc8916a1c0d15978e2dbefbe5b1ca0f3a327353a8ed0147304402200f013922f57fd69440c3c6f02365c6a04b132ec78d043db96de5115cf8e49a7e02203935fcbfa8d9b39692d09fa4f278a886e5da01844f8dab2b424703ad0481e47601475221020d626c31c7aabc7e6862dffd957f556bdfdddf5feefe81d5975c542644afd92f2103e55b80c28399941a320108669da41cda7ff5db0d402ec557b1090e58bbead6a152aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "36611e1133017c87b654145e1fe6553acd75c66b9b98a72b45e3c5108f3377a1", + "nonce": "20056089e8c29f7bfeb24c71b48638384bab3a481e8009952680aaacf3961b28" + }, + "contractInfo": [ + { + "preImage": "4694830554157634750", + "outcome": "4827a2ea5cb682fe8784fe7b40132803de40c6cbfd2d588b8171f6168b719362", + "localPayout": 114455621 + }, + { + "preImage": "-292898708129236663", + "outcome": "951a5b2672ab194248ffd6a37779bafd2db3af8204596467da6a6e142f29266a", + "localPayout": 200000000 + }, + { + "preImage": "4453656411795089840", + "outcome": "48178367cda0345ed88b4a49b862e570f39e59c57e3a788de6b38399aa935ab1", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "951a5b2672ab194248ffd6a37779bafd2db3af8204596467da6a6e142f29266a", + "oracleSignature": "20056089e8c29f7bfeb24c71b48638384bab3a481e8009952680aaacf3961b2890ede9abfd1a8c08c0b0f13c805c2a65ad12555b0ea7d462a8385c4fdde19221" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146ba7562a1a855268b1d991052542c51175f7d92c8700000000", + "idx": 0, + "inputKeys": [ + "3f51daa7539db6c1f738010cd5f8f46e74ca190627fe807da83b56fd55eecf6a", + "3069b964db374042b57d5176ca3aca9e1456ece145bfb4d3384af58aeebec52d" + ], + "redeemScript": "00202b93265fb53c5257062f55b16f561355051222b7463a7def833c26007782a675", + "scriptWitness": "01475221022004c88f4328efc16fea34d577e5cc9c220edd0df1100b042c1584934976acee2102b5a0dcf7cc062e78b9bef761787c880c1a7175f16aa7fa69e7dc08a15d2c26c952ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qf5wpg0k5muh2n6l9w0yeahqlxsk5yr3ad3yqtp", + "fundingPrivKey": "95f067b4f01e6ca769c935d2bb5d5bb7cb901762d7d4c3a7c63c61e6ebab5968", + "payoutAddress": "bcrt1q0eezwvfx73r2p9m8ddamg3tnw548ar7y3wusu2" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014633f2d4a6052ce6e7f2233f26f9eb17f4bc8793a00000000", + "idx": 0, + "inputKeys": [ + "d8da163fa46fd7cf06a9ae03edb5ba8e058a1ab26c284a7177dad07f7496cb70" + ], + "scriptWitness": "02002103328a3964e8b857367809dfc6f5d5ee976247f5a3c72690637700dab3cfb5c90b", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q954h802nfz3zgssdgkknaka86y2sudjdneqvjj", + "fundingPrivKey": "3374339e131972fc4d74e75640d62b8ccf1b450c03dacbfa2d7899db7311df40", + "payoutAddress": "bcrt1q9aedkl3tzaye0petqj0ryh6k7e9s7tjyggclc5" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda710550313343639343833303535343135373633343735300000000006d27445132d323932383938373038313239323336363633000000000bebc20013343435333635363431313739353038393834300000000000000000fda7124036611e1133017c87b654145e1fe6553acd75c66b9b98a72b45e3c5108f3377a120056089e8c29f7bfeb24c71b48638384bab3a481e8009952680aaacf3961b28027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b001600147e72273126f446a097676b7bb44573752a7e8fc40000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146ba7562a1a855268b1d991052542c51175f7d92c870000000000000000ffffffff00da002200202b93265fb53c5257062f55b16f561355051222b7463a7def833c26007782a675001600144d1c143ed4df2ea9ebe573c99edc1f342d420e3d000000000000000500000064000000c8", + "accept": "a71c1c28ac94365d408629c5362cdfa8423b67e3c208944b13988152f0942ac6bc100000000005f5e1000370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b2991559001600142f72db7e2b174997872b049e325f56f64b0f2e440001fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014633f2d4a6052ce6e7f2233f26f9eb17f4bc8793a0000000000000000ffffffff006b0000001600142d2b73bd5348a224420d45ad3edba7d1150e364dfda716fd01e7030114400a9448d7475af5796529c5046e13fc322e164b3df8f161ada5741b3312bbaf81da7651a3fb818a31e8039193a5988e7052c7be3c77de885a78fb8d7620b800c70b1646f193e135f9cff84d5e8b5813c172ea34997abd68d8bb6d74ae721a254a72ccb8761f70a8bdb7780dd87f5bb039a63a9b0bfcc4051b0e69b8f07baa1ca63e385daed5a4d8bf36b96cfff81f2d09a1e3442ce0786b2942848d18ba26b000c685a23b5a010b9c424a1b39de509a6ce5c42e9fad5a5087125545b09d9393fa41bb62a85b47ce6b3f664449e6872ce9d67f23910abebb4ad6a20eb0e958f4d101f3d53fa05fbbacf86436b13f616da84ef34cf75a4bc495090cd5b93cf9a6fc10e9312a2bf221f60170845d218be0a5dfc638add8aa247b0fc6187bdfdd6a295e1a619ff3405679193691667a039c9060c0f09e9d6bfe6f7b488ee1884125331400790081ee97f8bab1af399f1c0db734a9dc19e7a4d1602a03ea4daa680d500952be8a63f18e1e08cbfb586fef5585385a562f982e5a6624e87a40b57c81a63a95018f0a1e3778b36aab6569f0c9515997e2c5f59c907918ca50b3af734ddd7e157478e55672f69b6d2b6d2ade734746f37204fba9ded8f22a191c557069d71afc36d2c0ccced2ba1d6adf1fa14161756622b526275a7908f5f9b70d2a3d85529e4d560f1427e5e718e29932a5772f9c7cee1d0a43d9c4a54e14a32ed892f0e109bc1b3b84dc2136f8d4b17195dcc0a94b481b166a3548183fac1fcffd5d95886ef4", + "sign": "a71e792659c5004f35a7f3820cc26c11b96d2ca22875828fc6df4b053a20f66598c5fda716fd01e703008b521c132a97607d54840d698259938693283cf598b60269426da76dc15d1c1b2bf8ab375e9a5a5e69cdd15715ed995d95bb4d3c46a7812225fe20eca9f2c946012847c5ed830c48b46e0246b05392d8bd1ca6a50156da565d8f3b516364d1b706af2eb9ef32f3ffb9fa5f6d63f927b94c8f5d41e5bf2d984fe7dda5b8d92828f0a58c5d7d5b04ebfb6ab4d5ce2e1ace6de10b2f90037511b098d108bcebaf33e1015210e77765de823d241fbf0ae075b5909269a7368cb32b69c5d904c65036eb337fcd6d483722004913ecf25a566af48a9a172a048dba45f7a5f8229c09469b2801ab373247f60ca594c2e2a90f5a62872b091ca53d15ba9aec8d422ce1ba0d234d853365944a62d5d4466a8dadf29efdf599287c5b48e287a2c78a7eec8e53835d6366100c451b3f3bd75f1ceb4b1ffc4f7956cac34d4ce0afcaab108d4712e1850052ad1d48fd6f4ddc019a38d6726220b8038cc6ce99b499c133e46d191fd598789fb4df1fe79d706f1e587d082638bebbd18a749cc32e1ed259c1ad983fecf84000b1cda5ee7286563cd04a98a04d5609dc29d6005c3cd085a31012ad67458c57574e02c9cacd872d3ca8c79935e872109ed8c41146c008d4a64bd28de9d25e4b4bc3dffdebe3c49e512972b7714905c3bff56fc4cefd34398e3c223c39870b561753a933a545c72003a694f91c87f8d9518285624c31bf239cc24460f9115915e71120b4256341076de1f6aa733b368301bf2eae4cba489666a75ede919681658dfda718e1000100040000004730440220321d8da8f3b7c12361fab0fccbe3e72135ff22046055d7841e5fde984e163047022016e26ebe6ba69de3fcd9d8242dfd0656bce437ba9fd2709b091ed1ce209ec60d0100473044022035a068c553d145a5ade253ddc965db18f43def550ca1a67c2f423978bf501345022075d315977159d2eb3e0c336bd533e686acdede467dd15949d95504dda23c3e8f0100475221022004c88f4328efc16fea34d577e5cc9c220edd0df1100b042c1584934976acee2102b5a0dcf7cc062e78b9bef761787c880c1a7175f16aa7fa69e7dc08a15d2c26c952ae", + "unsignedTxs": { + "fundingTx": "0200000002c77e32fe76298aae09f9fd63edf80b3f5e91a953b0c17d03e58bac357b59566200000000232200202b93265fb53c5257062f55b16f561355051222b7463a7def833c26007782a675ffffffff256347b6632edca5bf33595e2e10275ff1562a594874c04253620e01e7240d1c0000000000ffffffff0352c5eb0b0000000022002016e04b09ccb51be4ca9601805c085309d1869574224343dfca39c87b524b33c3a6dbf505000000001600144d1c143ed4df2ea9ebe573c99edc1f342d420e3de1dcf505000000001600142d2b73bd5348a224420d45ad3edba7d1150e364d00000000", + "cets": [ + "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff024574d206000000001600147e72273126f446a097676b7bb44573752a7e8fc4bb4d1905000000001600142f72db7e2b174997872b049e325f56f64b0f2e4401475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952ae64000000", + "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff0100c2eb0b000000001600147e72273126f446a097676b7bb44573752a7e8fc401475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952ae64000000", + "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff0100c2eb0b000000001600142f72db7e2b174997872b049e325f56f64b0f2e4401475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952ae64000000" + ], + "refundTx": "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff0200e1f505000000001600147e72273126f446a097676b7bb44573752a7e8fc400e1f505000000001600142f72db7e2b174997872b049e325f56f64b0f2e4401475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102c77e32fe76298aae09f9fd63edf80b3f5e91a953b0c17d03e58bac357b59566200000000232200202b93265fb53c5257062f55b16f561355051222b7463a7def833c26007782a675ffffffff256347b6632edca5bf33595e2e10275ff1562a594874c04253620e01e7240d1c0000000000ffffffff0352c5eb0b0000000022002016e04b09ccb51be4ca9601805c085309d1869574224343dfca39c87b524b33c3a6dbf505000000001600144d1c143ed4df2ea9ebe573c99edc1f342d420e3de1dcf505000000001600142d2b73bd5348a224420d45ad3edba7d1150e364d04004730440220321d8da8f3b7c12361fab0fccbe3e72135ff22046055d7841e5fde984e163047022016e26ebe6ba69de3fcd9d8242dfd0656bce437ba9fd2709b091ed1ce209ec60d01473044022035a068c553d145a5ade253ddc965db18f43def550ca1a67c2f423978bf501345022075d315977159d2eb3e0c336bd533e686acdede467dd15949d95504dda23c3e8f01475221022004c88f4328efc16fea34d577e5cc9c220edd0df1100b042c1584934976acee2102b5a0dcf7cc062e78b9bef761787c880c1a7175f16aa7fa69e7dc08a15d2c26c952ae0247304402200f1f85894f8d7cb07bd3eeab72fa83ff9f757e5818013a151db24fc4191452af02200b2f2c9a9ec70357f61db3a34cf0d1dfc3d96135849629c1d8fc52f1c17c3a3c012103328a3964e8b857367809dfc6f5d5ee976247f5a3c72690637700dab3cfb5c90b00000000", + "cets": [ + "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff0100c2eb0b000000001600147e72273126f446a097676b7bb44573752a7e8fc40400473044022057c64f66d9c5fc484b6a9608d407330f2b6318402a246174cc97bc64dc9e39a9022037a007853cb93d13784bd0a0696eddadbf69f92dcdf9542bb759a29d0f5afda101483045022100c685a23b5a010b9c424a1b39de509a6ce5c42e9fad5a5087125545b09d9393fa0220691b4a7732023d5ed6d9dc7796e5f01bda7a49a39cdd1e4b499fed4357a5142d01475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952ae64000000", + "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff0100c2eb0b000000001600147e72273126f446a097676b7bb44573752a7e8fc4040047304402205210e77765de823d241fbf0ae075b5909269a7368cb32b69c5d904c65036eb3302207e3adec9b72294ad7a90a7fe9dcb383fe69bc318c0f051feaf568364dd5bf1690147304402205cec0947fbda028f3973f26f3fce6696bf52a20f3dc1f15e57e0e89d619c822802204c43710bac6168b1d9dba9d7348d6be0b3631684316778cd83986902b61fc8d901475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952ae64000000" + ], + "refundTx": "02000000000101d524a3dcb4ca57ca47d5c4167dea414b56fbb9b3ee3a47da2175123651f50e650000000000feffffff0200e1f505000000001600147e72273126f446a097676b7bb44573752a7e8fc400e1f505000000001600142f72db7e2b174997872b049e325f56f64b0f2e440400473044022053a933a545c72003a694f91c87f8d9518285624c31bf239cc24460f9115915e702201120b4256341076de1f6aa733b368301bf2eae4cba489666a75ede919681658d014730440220560f1427e5e718e29932a5772f9c7cee1d0a43d9c4a54e14a32ed892f0e109bc02201b3b84dc2136f8d4b17195dcc0a94b481b166a3548183fac1fcffd5d95886ef401475221027c43aef4e1d821ddaa38b51465d3f5e255cbd95c97fecc82c4666a0d23bb399b210370a96bc6afc3448d01e0fb03dba923a20b18e248d3fe0c2d47a49db1b299155952aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "bdf8481f57c36a78bf7fddc92bff797054a4595c1762da7529cedc63aec8cc48", + "nonce": "9690307f50b48c59e817b565550368d016bdf39aef7dddc5aeba975c5d4ad492" + }, + "contractInfo": [ + { + "preImage": "-6280316972533966351", + "outcome": "c1e45e84bfd7b4af8a9aeb273aa1e8023aa7957f2050be109951ae92dbbe8617", + "localPayout": 155901604 + }, + { + "preImage": "-1902527468043555432", + "outcome": "28825d2c869361ff1b4bea222d854049f8d1e105702e2a7c30d02d8704651ee8", + "localPayout": 0 + }, + { + "preImage": "-1733909588420089127", + "outcome": "608b95595ebaebfa7c67980524c114258ff389405be618ba957b695c6f3c0d62", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "28825d2c869361ff1b4bea222d854049f8d1e105702e2a7c30d02d8704651ee8", + "oracleSignature": "9690307f50b48c59e817b565550368d016bdf39aef7dddc5aeba975c5d4ad4920bf1e76bfff7745942a167564c2cb5cc93487e8de7cdc77b2c2f20e83508de3c" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91490e6bc0539bd73099ec44c7473362a8319b9bfa68700000000", + "idx": 0, + "inputKeys": [ + "6d977fca676b76f04637f1a860f71f5b65f8a2ded16c7e2770f52517ded2f298", + "3e267dffe8e39974c28fcd7c31b07c30178f97d8a303766399665612148d601f" + ], + "redeemScript": "00205f91023c5fe1b52fbc675935826013f4a0767aa010a38ac9ed10b7bbfb5b7993", + "scriptWitness": "01475221030d0c0996756cd3ba6f83b12dd1d4268f131e025cd783c7860a90fbc079e4823e21033ee41f1e5d57b55504ed36c725118fe485fa4b15e10e2f4281243d1c2f826e6252ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q8c9h7k8dl2sxn34exa3ukyqptsh226hnsa5h36", + "fundingPrivKey": "ff61dc0445fd743d09cdf609991c73b0b5666ce6de8ea00cd7a4e828645f0297", + "payoutAddress": "bcrt1qra92dd6qdj7daphw5nf4q4gj7qfuaq4ckskj30" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200201cae2ea6a42a3f0289770d7f5c3021f6e4ce9bfb4ef4855efe25fa8e8b9f08d200000000", + "idx": 0, + "inputKeys": [ + "225eda9a89e0f58d31ad6c36ec96e5c5a43ddb8fd629b1033258bdb2b9e3549d", + "b36d2ba0e614ea7e97fd78725a244e716fcfe72d04393b4e5316a8d18ad066c3" + ], + "scriptWitness": "0147522102d4399aa646120dc87e0c0b7cd622f8196928e53f6d411626968688451f1853a0210313870a57f642ef9186ba6bc21aec209ede120967c2809ed430e6730f4d9aa12e52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qw7tty6rqqeg2v29s74myd70g3ykrmjyraev0de", + "fundingPrivKey": "1bc9c46ebda044786f603e0322a3c52128b1cbd241985e16423f6d6f702364d6", + "payoutAddress": "bcrt1qruvq5u2xqgeujepjxpxucajzvh7rq9fz9zw298" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105803142d3632383033313639373235333339363633353100000000094adea4142d313930323532373436383034333535353433320000000000000000142d31373333393039353838343230303839313237000000000bebc200fda71240bdf8481f57c36a78bf7fddc92bff797054a4595c1762da7529cedc63aec8cc489690307f50b48c59e817b565550368d016bdf39aef7dddc5aeba975c5d4ad4920232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5001600141f4aa6b7406cbcde86eea4d3505512f013ce82b80000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91490e6bc0539bd73099ec44c7473362a8319b9bfa6870000000000000000ffffffff00da002200205f91023c5fe1b52fbc675935826013f4a0767aa010a38ac9ed10b7bbfb5b7993001600143e0b7f58edfaa069c6b93763cb10015c2ea56af3000000000000000500000064000000c8", + "accept": "a71cfb6cdf1055e1cf0f9a2924e322d64cc79dcb2f6b6c4e289d81e18bbe7281574b0000000005f5e1000355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d001600141f180a71460233c96432304dcc764265fc3015220001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200201cae2ea6a42a3f0289770d7f5c3021f6e4ce9bfb4ef4855efe25fa8e8b9f08d20000000000000000ffffffff00da0000001600147796b268600650a628b0f57646f9e8892c3dc883fda716fd01e703009f88dee2ce109631ddd13a6de3ef8dfa3df82488bff04282240e42f4bc7fa260c3f70fce1a05d1402f015b3d6b94a5d563a4e244203e6a26dca00f79aa6bec1a01b6e02b4e69dc38c12ee78e207893e82febcffd9a9dc796e629ab30aee93e842d757de36b2e3055d7e1d368a8842b22e8f286089470ebe9bc9185547c06251caf2e9b0ed65a00339f73d3bc31f9ba5e835799c2e1509087275267a8f58cce3ea90032b36fda31b200bb2997dc404ca22b6f1787366c7ad5412e4dd76325561b0e9675a69b3a91392a6f22cd06d653322fd29baa904765af81f6d4e3b09ee07524420090f455f840e2b601476b7f21b7230f0214cd479e0e8ed298adc3e8f56eb7300b5900bf273c82807f9fe26c0c49ba6e34b91c732a341bcfcf5cf438138606b08adbf8b3ef07c5129d208671db1ac6ca65f6a445a6cfd364596ff4ec63acfad77701c01bba1fe1030eebc0f0706b14da83ab9c25627e83517784708be70971b55c9ed0bb8c7f5f96a1fde0a96d653602e7c474a0b9494c657c3b6355b127c0a3754d010ad1e505b9d37c123ef45a110072c776b56db29de888be5b93582632141bec6d5b35e9391afbfeb2bc904ba91549eb3f624434d87b3320f94e6df962fcd39c6bf4f4e7aaa7f3a52109e1638f87417d416c5d9c07180ff934b4517268e8bbffb57ca965d921244e6a3797ceffd1a443716a32d92014ae1b6901e16651891f03822c3f31576a47f55ab1390605cd83398c143834af36293ae57cf9b010c85c0e3d", + "sign": "a71eafa4631d4ccc2020ef0fe1d189f3659a95a46b8826c6df6b1d5c305b705166abfda716fd01e7030166535eafc494a0062e26cdc9673ca84d003108ecd082f98d658b2b1b71d4f13af20ec43498a4cdb462c77d20f51941060cefb1c84a3fcdc233d0d32baeeee490012c94e3a6f280d9c2000b5abe69ae04cf9acbfefcb5cff8dd1092d5d15fa190c001c1860bb5c53c6778af04dcd38eb242e440eee8069dbf7c72be3aaa4a3d0b4f4706dff85cb870b1390f8d43d066017759895e65338f019c704e6fdb99bc13840122dcd6833600b324c253cbc573255bca6acf420cd58819343f8231bb79baec12fef7483bdb350ca99890e35da022494263fd075b09b81e79648227943250a8c10091d3e7de1f8196288a27a6175f7477b997fffd7fb498b0e8ec7733758c21e2c98dadc26d2677a2272961c76b5cd3c555d348b29de61e6782db0f2a114808e53cd11a5b2b22ff2566e69fb88d82d48a6c55da3799493fe35b3c9b1a1c9ede47590113db08c7f204b5f3e1c5250568383ee6fe2970a15bb0a0d0e5feaf044fb6282c14150e277467bfe68f5e3eea53a77ad85fa85c3fd16ceaaa03488603c04ffb280153ba9b4eb962518925c4cf7ab126d83b1a4825b53336b5d78ab27e1374ca680f95c1e92efd1ea033b78b17bee18348b120b5d0de88d15896896fcee188c28824c4c5dae92f6c6d36012d7e5dd7b98d3a1a3814e3e8f5e2cab1e4b16743da608353e37520865dc89ab54a47d18ef447e2a4114126652cb1c817194649f284beb3077c90eb9d2ab3a15a33133c70e80a492853a95cd882ba70f7a3df44370c86dbfda718e100010004000000473044022036c0d00f31b508be548ed7504f444ee9f114ac7487f978fc7753f54dd470571c022072d0fa04e52b4c2105cbace05f883feca4bf3a2ede4d37dfa528d2bccfa923020100473044022006720203fe184f416e3366b3cfd729060aaa948690fe5916f3d6782d0d7483d3022044a072d4d9853f1c8baec12e6367e78fd431e75e361aba7770ba921f5bb11c800100475221030d0c0996756cd3ba6f83b12dd1d4268f131e025cd783c7860a90fbc079e4823e21033ee41f1e5d57b55504ed36c725118fe485fa4b15e10e2f4281243d1c2f826e6252ae", + "unsignedTxs": { + "fundingTx": "02000000029cedd472e849f497a69ca993ce4aa56becd83a82cfcde3b4e264a3133fbb89b000000000232200205f91023c5fe1b52fbc675935826013f4a0767aa010a38ac9ed10b7bbfb5b7993ffffffff0cc058e7d4c1ce270b1431d7d9065b2db369b123ec1241f3a4d4e6801cf2d5410000000000ffffffff0352c5eb0b00000000220020bb758da628d461c96581b30aee6174fcfc9295a9cdffb44fe261dc612ca9c9e5a6dbf505000000001600143e0b7f58edfaa069c6b93763cb10015c2ea56af355dcf505000000001600147796b268600650a628b0f57646f9e8892c3dc88300000000", + "cets": [ + "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff02a4de4a09000000001600141f4aa6b7406cbcde86eea4d3505512f013ce82b85ce3a002000000001600141f180a71460233c96432304dcc764265fc301522014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52ae64000000", + "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff0100c2eb0b000000001600141f180a71460233c96432304dcc764265fc301522014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52ae64000000", + "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff0100c2eb0b000000001600141f4aa6b7406cbcde86eea4d3505512f013ce82b8014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52ae64000000" + ], + "refundTx": "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff0200e1f505000000001600141f4aa6b7406cbcde86eea4d3505512f013ce82b800e1f505000000001600141f180a71460233c96432304dcc764265fc301522014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52aec8000000" + }, + "signedTxs": { + "fundingTx": "020000000001029cedd472e849f497a69ca993ce4aa56becd83a82cfcde3b4e264a3133fbb89b000000000232200205f91023c5fe1b52fbc675935826013f4a0767aa010a38ac9ed10b7bbfb5b7993ffffffff0cc058e7d4c1ce270b1431d7d9065b2db369b123ec1241f3a4d4e6801cf2d5410000000000ffffffff0352c5eb0b00000000220020bb758da628d461c96581b30aee6174fcfc9295a9cdffb44fe261dc612ca9c9e5a6dbf505000000001600143e0b7f58edfaa069c6b93763cb10015c2ea56af355dcf505000000001600147796b268600650a628b0f57646f9e8892c3dc8830400473044022036c0d00f31b508be548ed7504f444ee9f114ac7487f978fc7753f54dd470571c022072d0fa04e52b4c2105cbace05f883feca4bf3a2ede4d37dfa528d2bccfa9230201473044022006720203fe184f416e3366b3cfd729060aaa948690fe5916f3d6782d0d7483d3022044a072d4d9853f1c8baec12e6367e78fd431e75e361aba7770ba921f5bb11c8001475221030d0c0996756cd3ba6f83b12dd1d4268f131e025cd783c7860a90fbc079e4823e21033ee41f1e5d57b55504ed36c725118fe485fa4b15e10e2f4281243d1c2f826e6252ae040047304402201a7e14f5b321808ebf9a033c1aab3a47afe99d817e7b6d1e16281da98e2e9c7602204d115ffd5db7ae429833319feb0cbbf129eff36ec2f23c3a613286106ba4add20147304402203063af1abf266b8e1c52a43a14242928f95123c476e365f64a77038d38c0fcd1022051c9b187651cdfa5793a7e6e9acec97ee347b32b657f82a90d1682c42873c8ad0147522102d4399aa646120dc87e0c0b7cd622f8196928e53f6d411626968688451f1853a0210313870a57f642ef9186ba6bc21aec209ede120967c2809ed430e6730f4d9aa12e52ae00000000", + "cets": [ + "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff0100c2eb0b000000001600141f180a71460233c96432304dcc764265fc301522040047304402204ce0ffae3657a610d04e2c54ba2fdc5246f951b67a9489fa43efee76d2f2550002201534a34c8d52b7325c3eb7546b622c5fb2d8a5facc81bdff17758d853c55567801473044022032b36fda31b200bb2997dc404ca22b6f1787366c7ad5412e4dd76325561b0e96022031f5f36094eb849bc0a9c4ac0f520e76df224c78f826d2e48951d7f56ad2f735014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52ae64000000", + "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff0100c2eb0b000000001600141f180a71460233c96432304dcc764265fc3015220400473044022022dcd6833600b324c253cbc573255bca6acf420cd58819343f8231bb79baec12022057b44e46f72950cb39dd8d745218c0b1f56f39f38b4359dbfdf04e4148f9e101014730440220553360a893fd54b30e9213fc548aaf596f81a2df83c428b97b54444b55b393080220313aca91bafc1cde48bc3d635332614f11eb52e0d2d60a24e22eefd572c129ec014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52ae64000000" + ], + "refundTx": "02000000000101e031d002e5bbbd9cf6f7884ae3446f085d2925ab32c526752fef2d190dbcc8540000000000feffffff0200e1f505000000001600141f4aa6b7406cbcde86eea4d3505512f013ce82b800e1f505000000001600141f180a71460233c96432304dcc764265fc3015220400473044022053e37520865dc89ab54a47d18ef447e2a4114126652cb1c817194649f284beb30220077c90eb9d2ab3a15a33133c70e80a492853a95cd882ba70f7a3df44370c86db0147304402207ca965d921244e6a3797ceffd1a443716a32d92014ae1b6901e16651891f038202202c3f31576a47f55ab1390605cd83398c143834af36293ae57cf9b010c85c0e3d014752210232bad10be5e1b1786b5f135f395581a7c6103cc130c3a10bc1980dabc3bc96d5210355de6267a43f7e623a65069855cb797b123d498ade2172fcf9b6a0c7d2fa6d2d52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "3cd82c49241355a5e4624ae728f864e4700e9c518a0bb96ec5d0260a249a097e", + "nonce": "c1198fdaf380b213f613faa3c3f499922adec8320f3680bd27751fad5c74855a" + }, + "contractInfo": [ + { + "preImage": "8710963126761420356", + "outcome": "e28b99b541adad5792e0954b0203a7d708c79fef1030244f286b3e76887f8784", + "localPayout": 200000000 + }, + { + "preImage": "498398145181784796", + "outcome": "09fe403f473bcbbdff9d27fe1786ef71e9de78a7341b9f68f6c40b6aeaaced42", + "localPayout": 50995713 + }, + { + "preImage": "664209601513185798", + "outcome": "fdb9a4be71d2f488865638d2275e7ccbd881b575dba7b8470393f0c9884cf5f3", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "09fe403f473bcbbdff9d27fe1786ef71e9de78a7341b9f68f6c40b6aeaaced42", + "oracleSignature": "c1198fdaf380b213f613faa3c3f499922adec8320f3680bd27751fad5c74855ac0102d2fdd77be3937ec1d9fe03891fc3679e16a2029443c70538f8203231e31" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9149d22a529e454f5aae14a10bc1c426869325e45cc8700000000", + "idx": 0, + "inputKeys": [ + "114af1fb6058437c0b311d16422592bf07f9e2b9132783a27c33437ff0da2dbd", + "b67daa9965d267d5bd985c74cbc1e3852c54fe1b90e0f4ea963043bcd338a9bb" + ], + "redeemScript": "002029b5ab0d4567fb265dd79a375ad6f419c80253a0ef5c770f61aca11b50137967", + "scriptWitness": "014752210366ca064aaf72bdc300a15c02fe9f7b0704dfd7fff999aa58914fad68ce12ee0f21038229b40838c8788a40d3c9263fdb1d03e6e8a10791a8a169ce4a687dcf280d0152ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qzlk8llqqsyx4l622skl2c9wahda2ud25kf6g36", + "fundingPrivKey": "97c91b241a65f3c9f3db5616fa561ed50e4b4d97c7d0fd43a266a3f81945a1bd", + "payoutAddress": "bcrt1qksv0ml39ynjzvq0f5rad8x6c2lmfxal3m58yml" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9143a9df4479af212ae09037a93d5004c885f5d66da8700000000", + "idx": 0, + "inputKeys": [ + "f7f1356650ca57d6bbdff62fd06e67f9466b497db158b06dc265d3a06c055ac6", + "fb520d65b50fbd5bb8fa0989b2ffb43616e554bb400f6c2af7338864093164e9" + ], + "redeemScript": "0020c86227f6918a2c12013a655c41b57dc4399ce8574e7322e9e33ce05c77477f05", + "scriptWitness": "0147522102140063fe7c00f817bf07b511c919d6eb7fe9c35ba3767dce525993ba54d4ecb5210260cf4730bb8813d0c526293ecf2f4fc30d8275b58ad80a55b90a94a2145b6ee052ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q4h66rxnzcyu8cm8m68a9zqywpxegpec4xm6ucy", + "fundingPrivKey": "51ea2fa22c13e96bea6ac353d755749ab613cbc201e3ee3794e253a25db7b3f5", + "payoutAddress": "bcrt1q4gy92jwdzudxunepgph2u5etkmcslexj0h8gx5" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71053031338373130393633313236373631343230333536000000000bebc2001234393833393831343531383137383437393600000000030a2201123636343230393630313531333138353739380000000000000000fda712403cd82c49241355a5e4624ae728f864e4700e9c518a0bb96ec5d0260a249a097ec1198fdaf380b213f613faa3c3f499922adec8320f3680bd27751fad5c74855a036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc00160014b418fdfe2524e42601e9a0fad39b5857f69377f10000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9149d22a529e454f5aae14a10bc1c426869325e45cc870000000000000000ffffffff00da0022002029b5ab0d4567fb265dd79a375ad6f419c80253a0ef5c770f61aca11b501379670016001417ec7ffc00810d5fe94a85beac15ddbb7aae3554000000000000000500000064000000c8", + "accept": "a71c535148c78dd5facb47dc3536b6a690106595a02975c1e7d9b21ca6073a579c5b0000000005f5e10003ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d00160014aa085549cd171a6e4f21406eae532bb6f10fe4d20001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9143a9df4479af212ae09037a93d5004c885f5d66da870000000000000000ffffffff00da00220020c86227f6918a2c12013a655c41b57dc4399ce8574e7322e9e33ce05c77477f0500160014adf5a19a62c1387c6cfbd1fa51008e09b280e715fda716fd01e70301a45ba7c7996cdea398b6f9d85002d547ea0df25448a497b4febd84f69859252b4e719a1f3155ebba8551ff0ddb2e6a4239e92b93ce4fd0b00c8f02242e4f76f80163cda6705b51907c5273c65120022023a7c9c0d11a75fbe2c48cdf6fae631318d0ae7bbd67c5cd0fcd01aae7fc96120739c1999649ba942e0e0861d2fb80c23cd4e7978232927c6ca5498099696033ee3b53d4228351c5fb071aa257380fe8af00d92aedd30a9b1cec6cc5077a0c998877ef0337ff7c80d5307cf037a79f60999f849d2b1575aa9f23d8abe9bc936546fd2f2ab0496365180ab146719784cd917100d1defc7a1c461c3c6e4156d033014ad1d1def68c0ad12958dcc350042074ffed95570f236d4be1a66cd93b50d21e4d0a5734d3f0fc42c37de8a7fea68f6340a02b3bcc3a2fc1d48a26d4452312deafe55f99013a00c6791c64add287fb8db22c0060cfd613bb97aeb7e096ca8d3154c8201cc1ed4daf6f02174f01a6eb6e516ac8a9de4af945dbfd50c752953323a6ea2be24284f0bea894fd9da8fefcdc8294a60088b96c2a129c6b7b9ca5170e24aaff100ee7c6d5f0ebc4b12f745b196cd20e159117921729dd68eecedaa094d9321a28078c49bc15b737fc0bc9562d3a705cc4c331c56db4d61f47d61139cea8ee5565305c935f58ce79cfdd5c713850c5f9604e6e31bf19c34336c498dbf815c59d83ffbd19fd231ece01e7e6ee9e5e446b006beb8aca13937f03ebdbf4f825f2c6685acf826ed4d2be534ff40c92fcad8bdd", + "sign": "a71e50b509ed287c0d9455eb56db8d14b96d1aff1a67327817ac0fb03926c2fc6da1fda716fd01e70300233bc34151bbcffe37bdd5efdd397c449cade753d61adfbd63d8463b1c4d5a9884e8ad24e00da8b942ea901964e8f5a994a1952d290381ce4fc7df271324174c006237c828e291fdad0e4277940da9b102139ef14463e76821be1ad309d8232955f4cea650ffc0b7835a5f5a98c1360397eadb94d66620d043023d2868decdfb66850c447154df25b49b850f9151ed14ca4bcbee9876432c703c3b2e2b893e742200c4960d4ea935eb32a05530856c8504d9f6227a7bc83c32e9c5e479c5851cba7dfe21e42511b9abb46be95a91e0af6557dff8f8444ee6a7a14f46daa3deb41d7e00859e0438e343b97f3cedae0e7b7f89c6c6feca1560f7f642ef5163092d7e89ed4daa89c7235b02df994a521fdf39b44f2e1bb1510d9e02ec7b39f3786621d4adb91e6af1c10baf423aa7ddba0b312496df8e0dbf4fa5abcfa1da717a23dd4cae011e6e78a1ddbcb64f1d9a8b24ff18710a7603bf77604e41394caa3823215b5c5bdb32a53cb02c60367058deb0872e85b25b7826e8664e94aad4b771831e5d5f6800707cc480f6957cec8f87c41a2d1447db06a543687bdacbce788efd4634f069a046853eead290603e9b9bf43534d5051e20691c44326aad6d88ff895f72bcbf2718fe426fadc306a14799734ee4512991ea304a4fe1e1ad702eb3aa47e6a22f463281701bb81de71319fd252bc0fe17d4ce381c7af24a1d0d7285e0729c34c3f101b39566e4848f51d47290f6ec57526c9576da153f4dbac2d26f163983fb8046fda718e1000100040000004730440220195fa0abe765f46cecf2969d5ee392c3e7bba3cfc7a565abef046defdf3d56c3022057b015640bdc7475e498180825cda11d19acf269c1569f135b08afd5e60e05ee010047304402200980588ad3a957023327e2ee5387ea450080a1723ca3d411f737b416637b451c022077be1053e0e15582f300f087dcf6b412b7cade38bed5b0f305e5e111647f99bc01004752210366ca064aaf72bdc300a15c02fe9f7b0704dfd7fff999aa58914fad68ce12ee0f21038229b40838c8788a40d3c9263fdb1d03e6e8a10791a8a169ce4a687dcf280d0152ae", + "unsignedTxs": { + "fundingTx": "0200000002c1886979db3055ce0977abc33651cc76c9c1898d745262f927ea34888a28ee6e000000002322002029b5ab0d4567fb265dd79a375ad6f419c80253a0ef5c770f61aca11b50137967ffffffffc6f2664882799b13abec085b3405f532f9ad4c7777e1220c5505904a5bbd43400000000023220020c86227f6918a2c12013a655c41b57dc4399ce8574e7322e9e33ce05c77477f05ffffffff0352c5eb0b0000000022002005e42d82bd6f2e438f867c56e27a1b4d7897820c5815254d03238a8d0374f8e2a6dbf5050000000016001417ec7ffc00810d5fe94a85beac15ddbb7aae3554a6dbf50500000000160014adf5a19a62c1387c6cfbd1fa51008e09b280e71500000000", + "cets": [ + "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0100c2eb0b00000000160014b418fdfe2524e42601e9a0fad39b5857f69377f101475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52ae64000000", + "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0201220a0300000000160014b418fdfe2524e42601e9a0fad39b5857f69377f1ff9fe10800000000160014aa085549cd171a6e4f21406eae532bb6f10fe4d201475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52ae64000000", + "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0100c2eb0b00000000160014aa085549cd171a6e4f21406eae532bb6f10fe4d201475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52ae64000000" + ], + "refundTx": "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0200e1f50500000000160014b418fdfe2524e42601e9a0fad39b5857f69377f100e1f50500000000160014aa085549cd171a6e4f21406eae532bb6f10fe4d201475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000102c1886979db3055ce0977abc33651cc76c9c1898d745262f927ea34888a28ee6e000000002322002029b5ab0d4567fb265dd79a375ad6f419c80253a0ef5c770f61aca11b50137967ffffffffc6f2664882799b13abec085b3405f532f9ad4c7777e1220c5505904a5bbd43400000000023220020c86227f6918a2c12013a655c41b57dc4399ce8574e7322e9e33ce05c77477f05ffffffff0352c5eb0b0000000022002005e42d82bd6f2e438f867c56e27a1b4d7897820c5815254d03238a8d0374f8e2a6dbf5050000000016001417ec7ffc00810d5fe94a85beac15ddbb7aae3554a6dbf50500000000160014adf5a19a62c1387c6cfbd1fa51008e09b280e71504004730440220195fa0abe765f46cecf2969d5ee392c3e7bba3cfc7a565abef046defdf3d56c3022057b015640bdc7475e498180825cda11d19acf269c1569f135b08afd5e60e05ee0147304402200980588ad3a957023327e2ee5387ea450080a1723ca3d411f737b416637b451c022077be1053e0e15582f300f087dcf6b412b7cade38bed5b0f305e5e111647f99bc014752210366ca064aaf72bdc300a15c02fe9f7b0704dfd7fff999aa58914fad68ce12ee0f21038229b40838c8788a40d3c9263fdb1d03e6e8a10791a8a169ce4a687dcf280d0152ae0400473044022047d454813510a7b04c74acbac1e9150799f9f2545ca7ad73303a9918726b5c2d02207a2b8a4c675b56c8500f52d4fedb121aa4058d690344a8643f859e927c6f76b4014730440220304307c18d03b9e9ab98ce46d2719c061c94fe26409e979789835e89c9f8a51a0220195e1dee1e8025c251755c05ec3e6dda0b187fd4edcf7950ef98f07fb7013f7e0147522102140063fe7c00f817bf07b511c919d6eb7fe9c35ba3767dce525993ba54d4ecb5210260cf4730bb8813d0c526293ecf2f4fc30d8275b58ad80a55b90a94a2145b6ee052ae00000000", + "cets": [ + "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0201220a0300000000160014b418fdfe2524e42601e9a0fad39b5857f69377f1ff9fe10800000000160014aa085549cd171a6e4f21406eae532bb6f10fe4d20400473044022078848f7ef9738b3da62e7a0ce4b5349814084490901b93183ca067c0d201d3db02204dd0159006551f6afda13b8626591da4c6af137264f2bc6c2b4ae343c91c134301483045022100d92aedd30a9b1cec6cc5077a0c998877ef0337ff7c80d5307cf037a79f60999f02205fc0de156a63b658c2e3773a1ea63003ea2e3f1aab4e8c0f4eba20ccbc1d5c9d01475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52ae64000000", + "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0201220a0300000000160014b418fdfe2524e42601e9a0fad39b5857f69377f1ff9fe10800000000160014aa085549cd171a6e4f21406eae532bb6f10fe4d20400483045022100c4960d4ea935eb32a05530856c8504d9f6227a7bc83c32e9c5e479c5851cba7d02206fd5017197f5035066055d55900896404fbe9d4f687e3126cf999825eac67c6b0147304402206c05ecf3f208b2a34ecc38080d80d78d438544200ba0e44b8a53c84283d8bde00220686a33b9e0fe500b25e4f914ab51fd104fcd4337197dea5687d71cce8f69e05401475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52ae64000000" + ], + "refundTx": "02000000000101faf1abf8219facbd75f0b9474eba6a7f7d29b23bed6337125ff7a9a52a41e4030000000000feffffff0200e1f50500000000160014b418fdfe2524e42601e9a0fad39b5857f69377f100e1f50500000000160014aa085549cd171a6e4f21406eae532bb6f10fe4d2040047304402203281701bb81de71319fd252bc0fe17d4ce381c7af24a1d0d7285e0729c34c3f1022001b39566e4848f51d47290f6ec57526c9576da153f4dbac2d26f163983fb80460147304402204e6e31bf19c34336c498dbf815c59d83ffbd19fd231ece01e7e6ee9e5e446b0002206beb8aca13937f03ebdbf4f825f2c6685acf826ed4d2be534ff40c92fcad8bdd01475221036db4e75f695afcca5db6714ae38fb635a45aae53d95153fc8fd02f2c482db5bc2103ae1b5c505491ba51c359b5657759c542c8e2c8cc034d3303f00259b8cfd7761d52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "390fb355b6c8cb591256170d1d8b7c5429f17ca8d586f5de2ce4e7b64aa96194", + "nonce": "fa26800e90046850887729f82006dc9a257ec6c0cc54f736f4ff6182f7cd9166" + }, + "contractInfo": [ + { + "preImage": "-168965366825102470", + "outcome": "c0c3b60569e1cfa244438ebd7fc09a2b43e7eedd6484f5cef3f74c543b4225d1", + "localPayout": 155992045 + }, + { + "preImage": "-1711871080853985335", + "outcome": "1cd6640c9131791e7fd9933a73717d129c645c1f0b539ef4ed8bfc43bd0aac1a", + "localPayout": 0 + }, + { + "preImage": "2458001942501497687", + "outcome": "1fea162536c2850945611aabbf0181678327623338bcf135abc0e0ffa495928d", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "1cd6640c9131791e7fd9933a73717d129c645c1f0b539ef4ed8bfc43bd0aac1a", + "oracleSignature": "fa26800e90046850887729f82006dc9a257ec6c0cc54f736f4ff6182f7cd9166156ee910acaba8aa58bcad59488323b7b5c8fbb3e5de968e67a36f5a399661bf" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9144d75efd0699ee2f3cbf56da893b6ee50c4cae27a8700000000", + "idx": 0, + "inputKeys": [ + "158edf50d43ab196964493b0492c8d34788f4d0b78941933189569531703c796", + "367ef7210065b58321151ff306b404fe5b61a8f354fdadc352bd858e5e37185a" + ], + "redeemScript": "0020cb3ac2f2b83ea6c2c358d2e2174a8e7f5033d49a5d6a4cfe33a432064326a1b8", + "scriptWitness": "014752210317919c01e82b94b998ba53def05ae6a8b7ea02f1b9cc9afdc156aa928b84be7f21026c83185977dc10f9f43eef7b0f32bfa3ce5f5bbe268c2273b85b76e6fddcc1f452ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qsg928vks55mn46uh33flg7npx7wmfq7d6g8hme", + "fundingPrivKey": "d3f7ecc925f0d765c05817ce10c44de565dd66f1fbce201d1e9091cae863069b", + "payoutAddress": "bcrt1qphvgwhevretnru2xnl2ch4470jltfgt3ppfz42" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020a7440f83ed0a6b070bd98746835be5271444d1dd46b71711a1079e3096f5e1fe00000000", + "idx": 0, + "inputKeys": [ + "c96a691e9242d3b9df7801ed0ed3f3ce336ab816c8a3cd765941b5e64cf9258d", + "9e7d07126daf832602b79bca868bd2979574161e98227ae331d6e828339a3eec" + ], + "scriptWitness": "0147522103df2475195976fbe9b7c545e9234527a5a4f25bf453c74595aff062206294dddb2103fb5b132a3c56480e2477342268f0a5748439709a15dfe22521cfc7cdeb4197c752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020440ef4712bff155229761dfbf991ebcac6327a3c905e24c52a59f10a3402156c00000000", + "idx": 0, + "inputKeys": [ + "e375e3fd7ed23c682da63f648c0dc8331c402c20666713ef7a7c97dc6755662c", + "ea623e227460c29c0c6770c1cca46f0e3ef6608deadb128f3ce0c019fbb6cb4e" + ], + "scriptWitness": "01475221026f62b98e18f9304837f42aba509289bc2daef49bc1aa35e87bda4687fdf17a442103db0377a1273dfda95c5acba2df1d3040ca64731d1f42a9c0f9200f646c338ac352ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q7n8ghfcxfzn9d65lwsxkwwf0sr5rz6xtcwkq5f", + "fundingPrivKey": "6087e18f39345b6a4a17aa5bba10acaeef566d7544125e70f4dac9401f5aa991", + "payoutAddress": "bcrt1q6wsd8jplm0wwda9fwcagvvejxq5wwlalck9tlw" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105603132d31363839363533363638323531303234373000000000094c3fed142d3137313138373130383038353339383533333500000000000000001332343538303031393432353031343937363837000000000bebc200fda71240390fb355b6c8cb591256170d1d8b7c5429f17ca8d586f5de2ce4e7b64aa96194fa26800e90046850887729f82006dc9a257ec6c0cc54f736f4ff6182f7cd916603cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b001600140dd8875f2c1e5731f1469fd58bd6be7cbeb4a1710000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9144d75efd0699ee2f3cbf56da893b6ee50c4cae27a870000000000000000ffffffff00da00220020cb3ac2f2b83ea6c2c358d2e2174a8e7f5033d49a5d6a4cfe33a432064326a1b800160014820aa3b2d0a5373aeb978c53f47a61379db483cd000000000000000500000064000000c8", + "accept": "a71ca23274a73379c1b1477f821a5d8c901110cfbeccf03a3b8c8fd6384fa3686bdf0000000005f5e1000229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc00160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf0002fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020a7440f83ed0a6b070bd98746835be5271444d1dd46b71711a1079e3096f5e1fe0000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020440ef4712bff155229761dfbf991ebcac6327a3c905e24c52a59f10a3402156c0000000000000000ffffffff00da000000160014f4ce8ba70648a656ea9f740d67392f80e83168cbfda716fd01e70300246eff606db0e4777711b626ab525c1a5f2b6e5937eb5f02d163f62df4d289c00c0c3c8a374f59a45833fb47c932235f079724857ae009d57d1d8883286c14e70056ee0c0cb05e1064f0e771f828163ca82e06c417194ab5ed0ac2d0c9a9aff4e8661a910bcf49679024e21e6736c818e90d67c9aefa284d912751fded5f64fa6eb53deb8ae6337343caef30266056b2c01467f1920c371b387a6e109c537fb14d0160569f9f5a4ef986f9b6154d40401b5148555b25231c496935213c3b1d47438e0832c826683f31202b8c68944519c7823e75728eab961b906f0fab897520ad3f010e5c9d114ae6cd96718d0b03f6366bcf4a65c0b24cb7ab91dc3c5bb16f80247f8616db3a76b5bdcf5616fa0ca2d2be4abe24bd8c8564812b9340865c0cb44592d94ae65a31ada8cb52dd2005321d3121fdb0bb207b7814fd7b593f77f6647520009821eefd0cec9ffed1f5cef170fd74896eeb39aad097b5bf359d9929e6d899703b2db53e8fdf214073d304d9156994f9cd69c1feb49bdc26cba81fb2232e45260104aa330b914d352f6421fa34131f9429c6d872fd4990a786b8d4f0cc6b03f03fa890b4ccda7c60190dcf9d1621c941befacb8fe95d53cfa6fca8a40bfbe5c16fb4a1620c9a118ffe99d3d59a1efdddbdae6997acc34c34f33a31e8bb12fe172476569322ae6d22e2dedeac86c8ac05b2fe604d6c0ec91fc4df080e7304b9b6ed5e7884cbf6825e1e6ae59c714621b47e0054aedbb2f36df3e298a82f0e78a25d", + "sign": "a71ea9e5fb31dc74e83680e821fd52569c67e331dbb94292875745bd50b7e4bacea0fda716fd01e703007d61da9d0ed87e4f642319ac3c08eb33f5b1fed81313e2dc81bd5946b69f80b2da5398bc7898c1d1cbda9148faf5aa4c0a898d8da053213b0fd057983450963001fa7bf9e299e6b9e4c3e5d7162dec3461e29ffd04f5fd0d2370822d8ab33fba9d00868024753101ba1220a6ac250c4302e6d91405f84449f7a311518a1e688a6723bf1d327aeada406664491cfe177bd986b612d66d601c45495a9c34c7d61abc012f8ad56e57c4b19953e8a9324a69319e29f47a75a980caeef7c0334d30876865762e77b8a25ff01558590359f2fc39197fa94edfc9e4dddb27e99627e968ec5a008bb47390369275c63dfde8c17c1704b542b1c4ae059e6f21ba7fe85e736c56b00a5aba7ac8ffcd04be9b91a0764f5af5c2f8335b4a67544d08018b48094c93e00d4b59a259e8f0d5b606a3091bd4a4d9cb991971cdd32b558bbc81f1b00d206c0182ec28346c8137b3a49529f7d4e06fc63ec0d83ea306732bfa7ed6bdc0919836750243b56a6131bbada426f54c735bb2c04ebb1ab4b2da96d27d713148745e7200e87284942f3d99ec2a1be2913a54945aa52dbe1d92a3d25ef1a3214ee83fb9cc38df307f24aa549e1443a3a11a5514bce34ab8e4fd4a3046698d6833529ad453c96318a57c18ab13079a4fcf1808c2682b582f0a72c8c2a28f397a85547ad0ca24422f7307dbcdfe938f22349e77b339b8479a5b0b9858ee062b23073d0f00326746a3e9c2140bb5abe5280bc707e6486163eecadf6c64a7b676084ffb714b41fda718e10001000400000047304402206c08caeabbd79ad8c2af388d401f3d43f360107b9c9a5b5d05de885948e9e58602202c228fcd6d4d38ad37cd7f2f5b48827256bca21f62bbeceb8d0d1494ae72be9c010047304402202df5208921deb3cceb87e540500b6f242c0449ebbaafd1a1b1e4de0da15d32f5022060d19117dd3397551b34d9b8bc45107378c40c06bbe783e827b647fba7d68ee501004752210317919c01e82b94b998ba53def05ae6a8b7ea02f1b9cc9afdc156aa928b84be7f21026c83185977dc10f9f43eef7b0f32bfa3ce5f5bbe268c2273b85b76e6fddcc1f452ae", + "unsignedTxs": { + "fundingTx": "02000000033011b726c44235f67664d56930a8a0d563b691abe8ac30c1116429d05aab4b740000000023220020cb3ac2f2b83ea6c2c358d2e2174a8e7f5033d49a5d6a4cfe33a432064326a1b8ffffffff8887df8727cc2c0ff56f910cd8e35427e474ff804476b657654f814c17d619190000000000ffffffffdddce0188afed11433a7130eb4e08c3285b2bc2a6567b4994487962f666e17d40000000000ffffffff0352c5eb0b000000002200205cbab814266581bafa92987ab440e9bd6db101576219d22b1e3774a3a51c192ba6dbf50500000000160014820aa3b2d0a5373aeb978c53f47a61379db483cd7a9ce11100000000160014f4ce8ba70648a656ea9f740d67392f80e83168cb00000000", + "cets": [ + "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff02ed3f4c09000000001600140dd8875f2c1e5731f1469fd58bd6be7cbeb4a17113829f0200000000160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52ae64000000", + "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff0100c2eb0b00000000160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52ae64000000", + "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff0100c2eb0b000000001600140dd8875f2c1e5731f1469fd58bd6be7cbeb4a171014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52ae64000000" + ], + "refundTx": "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff0200e1f505000000001600140dd8875f2c1e5731f1469fd58bd6be7cbeb4a17100e1f50500000000160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52aec8000000" + }, + "signedTxs": { + "fundingTx": "020000000001033011b726c44235f67664d56930a8a0d563b691abe8ac30c1116429d05aab4b740000000023220020cb3ac2f2b83ea6c2c358d2e2174a8e7f5033d49a5d6a4cfe33a432064326a1b8ffffffff8887df8727cc2c0ff56f910cd8e35427e474ff804476b657654f814c17d619190000000000ffffffffdddce0188afed11433a7130eb4e08c3285b2bc2a6567b4994487962f666e17d40000000000ffffffff0352c5eb0b000000002200205cbab814266581bafa92987ab440e9bd6db101576219d22b1e3774a3a51c192ba6dbf50500000000160014820aa3b2d0a5373aeb978c53f47a61379db483cd7a9ce11100000000160014f4ce8ba70648a656ea9f740d67392f80e83168cb040047304402206c08caeabbd79ad8c2af388d401f3d43f360107b9c9a5b5d05de885948e9e58602202c228fcd6d4d38ad37cd7f2f5b48827256bca21f62bbeceb8d0d1494ae72be9c0147304402202df5208921deb3cceb87e540500b6f242c0449ebbaafd1a1b1e4de0da15d32f5022060d19117dd3397551b34d9b8bc45107378c40c06bbe783e827b647fba7d68ee5014752210317919c01e82b94b998ba53def05ae6a8b7ea02f1b9cc9afdc156aa928b84be7f21026c83185977dc10f9f43eef7b0f32bfa3ce5f5bbe268c2273b85b76e6fddcc1f452ae040047304402202fdf3d46b4ac310e4e4f982dbb99b307105f878bbbb4e78d41c07ad52fc722bf022020b44c78c07ae67565d20968cc272185882582e2e6971f5a899047e6162615c501473044022029abba602620ef30de89c4babdf5c711a8ee8120ab7fbf7628b43c9945bd81d6022028a4c3784b0067187063d15fc713a551ea40fdf67ab1e852b0220f95a7a70fc20147522103df2475195976fbe9b7c545e9234527a5a4f25bf453c74595aff062206294dddb2103fb5b132a3c56480e2477342268f0a5748439709a15dfe22521cfc7cdeb4197c752ae04004730440220563e5815c8416de31d9e487d9883b22f119dc0e38f798ad93c87a56734b0c0b8022068012503ff4dc2d71a577f7b0407b3e8ffe91c9bfd580fb85df3b7c45bb0235e01473044022032c7c2380cbeb8dd0b26d8625ff6da132e9a8a546d137da9fae9183ec4ab67a9022027ad3724c69f81f4a0d4c4d22af5cb1fff21fb04af5a33774217db7609bcd2a801475221026f62b98e18f9304837f42aba509289bc2daef49bc1aa35e87bda4687fdf17a442103db0377a1273dfda95c5acba2df1d3040ca64731d1f42a9c0f9200f646c338ac352ae00000000", + "cets": [ + "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff0100c2eb0b00000000160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf0400473044022060569f9f5a4ef986f9b6154d40401b5148555b25231c496935213c3b1d47438e022021bed5b47f7115b5f18b1dd940f6fb7e8e3ba142cc4703b1a67a19d5c53e8a9201473044022043380360378e1ca435da13f458bad4c3b95338c13000580882004f34cb9b0ec30220756af296137d77d379b0e70a329ef622c9faa8e219eef686b492c7595b0a34f7014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52ae64000000", + "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff0100c2eb0b00000000160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf0400473044022071fd860b46f25d18aec0d7bda2e5a6dc1fd1270fe09fed34865187f02fc4b76002203a1f8fd642297e376ab5ee9945056e69669b21b91fb15835386cf3bcea3e60e90147304402202f8ad56e57c4b19953e8a9324a69319e29f47a75a980caeef7c0334d3087686502202aacef170ef8b2edf0d2ccfed0932219fd287d04a278289be7f10517c9f57f46014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52ae64000000" + ], + "refundTx": "020000000001017fa5d247f8686bcadbbca8b27565fef3760cda0fe7a397c787290def968fd70b0000000000feffffff0200e1f505000000001600140dd8875f2c1e5731f1469fd58bd6be7cbeb4a17100e1f50500000000160014d3a0d3c83fdbdce6f4a9763a8633323028e77fbf0400473044022076569322ae6d22e2dedeac86c8ac05b2fe604d6c0ec91fc4df080e7304b9b6ed02205e7884cbf6825e1e6ae59c714621b47e0054aedbb2f36df3e298a82f0e78a25d01473044022024422f7307dbcdfe938f22349e77b339b8479a5b0b9858ee062b23073d0f003202206746a3e9c2140bb5abe5280bc707e6486163eecadf6c64a7b676084ffb714b41014752210229ec3377cd5d0053508a2914c5b5808724e329dd8087e8a33d600bead6ee3adc2103cdcb19157c6d53851f4f4c9782802826451bc58711fad64cb5e440254330056b52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "d7e5ccb869590adf07c8a4c4b8bd949347866f81dc5b9676a040d97688960e98", + "nonce": "25154b6ffa4f5adc609575a0bc2c8da2cca7a2be26e3278760bd965b527b5a2e" + }, + "contractInfo": [ + { + "preImage": "8974853933228678024", + "outcome": "2496164e5291b1e188914178bab8e7b6af27a78ea50ad5fb5509f82acc2f4d5e", + "localPayout": 0 + }, + { + "preImage": "7874025342419108745", + "outcome": "b5416674b31a6d4e973c70c8e13344988056e140926d61209b7552127147c03f", + "localPayout": 70507495 + }, + { + "preImage": "1134236782720308436", + "outcome": "3f4ec55cac4d4684445fbf7148b4f0170cc4354aee6a63062494a842b3201adb", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "b5416674b31a6d4e973c70c8e13344988056e140926d61209b7552127147c03f", + "oracleSignature": "25154b6ffa4f5adc609575a0bc2c8da2cca7a2be26e3278760bd965b527b5a2e0a6f5d82126f17d649ed7d2648f2899c4f950ed9a4d594d6c477d7273b960080" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914cce04d3b22b4bfc9c55444fca0b35f632d8480348700000000", + "idx": 0, + "inputKeys": [ + "94d33f93bfd5b4a94b8b9f3ef8d65ae3c9e9c3258d55a36ad47ba8377fac86a5", + "f28c5be9ffae3d2b292d1f63d1e7b955a6d965a154e52b3b9a6a0aee1e198a7a" + ], + "redeemScript": "0020fea8c57399bb389ee3aaecc3f8eebc388a321b4c51c13af7a0685859b37c0992", + "scriptWitness": "0147522102907305ffd77be7cf6f7142f25056fbdb64d3bdfd54315c1d5abcc7053083e0f72103fded445a3c210c625c0311fad9b98af2211c3a1119cf337fded512faecc6b5b252ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qmsht7tfqgr07xehls9e2w8cmewp34vg48zdce0", + "fundingPrivKey": "be890a2525a46a63f300d012b8d747437c507d8dbdf52aa6d1814e0358cb1ac8", + "payoutAddress": "bcrt1q3z8c5v7356ezx7ef8wht7r5u9tmwask05hqd5x" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206266d6688d55f9f82f5a32f8904e7dd78ad4d964a39c7fcc9eca115c42a3c19400000000", + "idx": 0, + "inputKeys": [ + "01cb8d882b6f452d3fb0331544902a3efaaa0da9dbb628509872ef273a4664d3", + "903a5bc5bd6f3448253cc82d99b1c141b06831c138f7eacad77b4aff4cc35708" + ], + "scriptWitness": "01475221024bc47194499fa42a13c2848a52bcdb425de5617d36031d32400f4dcc9b80b0972103686d6f7635c2327bef785a7ad3e64f5d1fbb662fa31591379d11213c07e815cf52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001468a180c02b2341857a0db7db33fe2b422a4c019700000000", + "idx": 0, + "inputKeys": [ + "9dafdf82dcc2b5f356d241af7df56c1b3da06fb887fefa93c3495b6dcb02e3a6" + ], + "scriptWitness": "0200210329f82f5ad1ce700362ff8d2ba7372675192be2662065da7d9eddfa44db189058", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91494784046f0adce587f8560678f894521f21091528700000000", + "idx": 0, + "inputKeys": [ + "60ca4f470463a239815f1bcf79f006ea6a7b9e63b3fc9524ec537114c77697db", + "d2b50cc45134e2bfd4d669f828eb895cc089a7ab5793ca2961142c050f0dafc9" + ], + "redeemScript": "0020b8684749bb42b31315b52cfdb3c693214d0460800506b3c93ebc7128e90c1254", + "scriptWitness": "0147522102e13d12a71a1f26bf794b384777e3e99749eb7321b76d5d033ad1ef599cb5c16221028598a04af831d2ca6aabec63c3604cc07fcdfb326304ab6976aeb3cefaf8e4b852ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9145f7406e22f7fc82f98ec2e5d778dfd324b11dcaf8700000000", + "idx": 0, + "inputKeys": [ + "2e9f1e4fe22f9a4e1454752bc44c8de78b33093d5e64dd0f85cb4d04a2f5cbdb", + "28ddfc3c89114ce6f4dd7ec2acb6c55bd28e131054b389037c463a4caffe2658" + ], + "redeemScript": "0020b1b94ecf9b2462b36325a0fa3af7f5e6c8349101c99e417e5adf64ee67a2e155", + "scriptWitness": "014752210309eefbcc5481b5924108311d186866400fba3260ca5b92f29fd19fd480d49cc8210399536b16cb0132e7adc064d631007319cb4161aee8620d2056cf208a1375ba6652ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914d2d9cd3faa05f5d22de916ff884311f6876cdc158700000000", + "idx": 0, + "inputKeys": [ + "70259a9ad67968d8aec8e6f47b4a817c7f588f70deec67e8c9a177661aa2403f", + "fca88e2752e9a2118a2303ae786e6fe301bf570940c239fcb1ab46f18614bace" + ], + "redeemScript": "0020e9630b7407ab295083bb26ad5c3b7cbe28ed4c3e4880fcca54ebcb9b911de62f", + "scriptWitness": "01475221028be6ca00824ad9b51d05d1124df6b1e5fe27ce68818b62f0908a95273b21003b21037fc87fd91ae742babe3022c0af7aef3c251e70a17bfe55cd7cad544c09afa48a52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qyclydfhzh8x6zm63wv4spp8dyjp3qxfe9h6cx2", + "fundingPrivKey": "a083693236ea3bf89a039ccd580e7a05658e92ae384aa074944d9155f8cd0345", + "payoutAddress": "bcrt1qxald0d7hes5enwllkavd3m89kztt5qset36pdf" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105503133839373438353339333332323836373830323400000000000000001337383734303235333432343139313038373435000000000433dbe71331313334323336373832373230333038343336000000000bebc200fda71240d7e5ccb869590adf07c8a4c4b8bd949347866f81dc5b9676a040d97688960e9825154b6ffa4f5adc609575a0bc2c8da2cca7a2be26e3278760bd965b527b5a2e03d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c00160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf0000000005f5e1000001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914cce04d3b22b4bfc9c55444fca0b35f632d848034870000000000000000ffffffff00da00220020fea8c57399bb389ee3aaecc3f8eebc388a321b4c51c13af7a0685859b37c099200160014dc2ebf2d2040dfe366ff8172a71f1bcb831ab115000000000000000500000064000000c8", + "accept": "a71c6d85ae742c45ee2de7f36dee1a3720a22d0fae09121fe1104124d66b1fb94e930000000005f5e10002a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e0300160014377ed7b7d7cc2999bbffb758d8ece5b096ba02190005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206266d6688d55f9f82f5a32f8904e7dd78ad4d964a39c7fcc9eca115c42a3c1940000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001468a180c02b2341857a0db7db33fe2b422a4c01970000000000000000ffffffff006b0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91494784046f0adce587f8560678f894521f2109152870000000000000000ffffffff00da00220020b8684749bb42b31315b52cfdb3c693214d0460800506b3c93ebc7128e90c1254fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9145f7406e22f7fc82f98ec2e5d778dfd324b11dcaf870000000000000000ffffffff00da00220020b1b94ecf9b2462b36325a0fa3af7f5e6c8349101c99e417e5adf64ee67a2e155fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914d2d9cd3faa05f5d22de916ff884311f6876cdc15870000000000000000ffffffff00da00220020e9630b7407ab295083bb26ad5c3b7cbe28ed4c3e4880fcca54ebcb9b911de62f00160014263e46a6e2b9cda16f51732b0084ed2483101939fda716fd01e703001ebea857ed03941d311e5aad7f834566355d61e0281a2384837bb331f3a07e37cd21730b46af1cf59e5d9754144cc096235b0a4191e6dc0a99e20a2bca5126ee00cff8aa19f9f12fbee825e0c2703207ceaf2a4faf8577e5f6beed6a7d0bf30f019fc2ded0b38fab609418612fada408eef0f51329bc0fd400190c7d6313d59b631d469f5e3325fcb735eca37ca9228f3712b8ceaf20362327b9f997aa5ca878fd0099d6ec9c5d3a676d2d8bebf863d499a9fd9a03a7f7f775b89e6ce017114afb685373aff9a82c7afeeb910e1431e674c93cf7046d7bb5d7a535e141b8d250021f0085a886137c335287023d58586ae3e47f876c29d4d2e85f6ce063d759843b4b48222a30fe869113e32b3b58f6c4d655e37e525e0db951586d631d21a6ea31f6d5dae0f73dc2acc2e3939dc342f645ae23a83bf12542e0645961e3d6c6ed3d234001e722efe6290651b88ed44f43fe7ac67e9b3203299c955850697e44f3352f85f3978c2bc62dd3f488305db869a60b341ce4b573404d530badb3ebde957bbc7071016ab1caa10a911d534b835b1cb5b043052c4f62c8dbe9187fe6bacaf397d219a3f26102df79af8f9b08cf2d3f6eca26660495550964286c64a99ff714055a4c505d844f275937e9c8bac2b86a514a7642c93f5404e3b965a46b8f80de275a053268b0b661f59960ee1114b919ef4d9699d731304ead8aacc1238cd7b7e28b302c41b909267bd166663a212a9e9fe4c9db47de92945a7f5b8f8b5c2184ee9cae59", + "sign": "a71e3453723fb52e48cccce6ee69c61ccc57aca93883cf497da4e305efa497f4a246fda716fd01e703000938c678e8fe49650658efaedefd762e8f492752c40e81f45ff82469f4ccd86807bc6386bcbb64994b4d916e858e36edabacb1a8bb2f232d7c7ac557e548f27a01098236dff1dcf03f9cda82636bab2dd010f7f93dccce997551f7e69e1aa02320bdc01ef39c8b930e7cfb019369e7f20bcad836b1bec083cc83dc6b5dfb0eb367ac75eb12bcf119fc627de9cfc4249f5a7e83c719ff7803d726d60e35d3e8221000b5d389bd255ce23a6255233fcaeb0febfaf7edd5cef7e82a0cb58c52ced4a1f560966b555e1bac4993f5b29c0728b86e18948a518a91513e638443db2d798ee4005bda0d897a27ce8ae24b43d02843ac71ea24244ccc8b6a14ea39033b7ae6756085125438d6bba48eba2e3c687c43c43db137231ed654f3970e39d608463ca33ff98f1175cdb7a8f271e1b94312afb88f7354b81280a23bc248bbc3f911cacc4b012452c2edef864702cd206062d1b92b79df146396a231d3ba49fb149931737c0d24f4cd85d9f7ae3c87a85257a388975cfb970847047d462e01b8e3e23098a6ac00213242d8d8632ba3ecf7429b2dc9b20554cba8fc46a920715c8b9c66af9ffad27a761bff76f259db05f29734ef4f1ca3a9236e4b423622f08db984474d3fffd6b1e60eff44e7d98743cb8ad30460565f5734d26d89d2e02f65cbb711bb1968211c3dd0eded27133e4b9931658e878adc9ab25d1145d73d136cd82b43d547726405e0b223ecd7944bd441d61ce070c9de63d2a1e94150a635436298d0d9d39405fda718e10001000400000047304402202fb8176a5b63ba1c5f3df666d1d67641a15e3c3659ae2e4c19214673392eac4902204486b5bc2e43a33f9b081f3d2c44205a3855d2a2b0e5e633774997dae5b23ba70100473044022042ed13b0e2756b4759dd5b22c6e9c557586c146475b4892712a322f4404b9003022059f87b6870624a1a81482bf36878600547043aecf0b849496165c68aa59cdb51010047522102907305ffd77be7cf6f7142f25056fbdb64d3bdfd54315c1d5abcc7053083e0f72103fded445a3c210c625c0311fad9b98af2211c3a1119cf337fded512faecc6b5b252ae", + "unsignedTxs": { + "fundingTx": "020000000675774a91ad6739eab0135478a32ca841435eaaa71ea2b035be77ab6c83c8d7620000000023220020fea8c57399bb389ee3aaecc3f8eebc388a321b4c51c13af7a0685859b37c0992ffffffff4044aa39477ea7eb2c631f973bd410225d3ebca973fcf7257467efadc395c83d0000000000ffffffff0a23385adbe7351ca61222711d23be772f97c204cbf9c72a1f341035695a3f820000000000ffffffff2220bbeda998f074b10d571dc03e2045b22f538f26af14b27565d9ab6770cfa90000000023220020b8684749bb42b31315b52cfdb3c693214d0460800506b3c93ebc7128e90c1254ffffffffb597986a2c020e69fd3b58278cf3a0c3e6bed590c5ce36e25627e763d0283e170000000023220020b1b94ecf9b2462b36325a0fa3af7f5e6c8349101c99e417e5adf64ee67a2e155ffffffffad1220615e674f89dff95d21999349a70a81529100a07f3ad91f0c0808e02ceb0000000023220020e9630b7407ab295083bb26ad5c3b7cbe28ed4c3e4880fcca54ebcb9b911de62fffffffff0352c5eb0b00000000220020019cbe66cba7c0c8d64de237c20d9eabc3b8cc83ec598af176a5abea3fad677fa6dbf50500000000160014dc2ebf2d2040dfe366ff8172a71f1bcb831ab1155edba43500000000160014263e46a6e2b9cda16f51732b0084ed248310193900000000", + "cets": [ + "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff0100c2eb0b00000000160014377ed7b7d7cc2999bbffb758d8ece5b096ba02190147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52ae64000000", + "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff02e7db330400000000160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf19e6b70700000000160014377ed7b7d7cc2999bbffb758d8ece5b096ba02190147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52ae64000000", + "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff0100c2eb0b00000000160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf0147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52ae64000000" + ], + "refundTx": "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff0200e1f50500000000160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf00e1f50500000000160014377ed7b7d7cc2999bbffb758d8ece5b096ba02190147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52aec8000000" + }, + "signedTxs": { + "fundingTx": "0200000000010675774a91ad6739eab0135478a32ca841435eaaa71ea2b035be77ab6c83c8d7620000000023220020fea8c57399bb389ee3aaecc3f8eebc388a321b4c51c13af7a0685859b37c0992ffffffff4044aa39477ea7eb2c631f973bd410225d3ebca973fcf7257467efadc395c83d0000000000ffffffff0a23385adbe7351ca61222711d23be772f97c204cbf9c72a1f341035695a3f820000000000ffffffff2220bbeda998f074b10d571dc03e2045b22f538f26af14b27565d9ab6770cfa90000000023220020b8684749bb42b31315b52cfdb3c693214d0460800506b3c93ebc7128e90c1254ffffffffb597986a2c020e69fd3b58278cf3a0c3e6bed590c5ce36e25627e763d0283e170000000023220020b1b94ecf9b2462b36325a0fa3af7f5e6c8349101c99e417e5adf64ee67a2e155ffffffffad1220615e674f89dff95d21999349a70a81529100a07f3ad91f0c0808e02ceb0000000023220020e9630b7407ab295083bb26ad5c3b7cbe28ed4c3e4880fcca54ebcb9b911de62fffffffff0352c5eb0b00000000220020019cbe66cba7c0c8d64de237c20d9eabc3b8cc83ec598af176a5abea3fad677fa6dbf50500000000160014dc2ebf2d2040dfe366ff8172a71f1bcb831ab1155edba43500000000160014263e46a6e2b9cda16f51732b0084ed2483101939040047304402202fb8176a5b63ba1c5f3df666d1d67641a15e3c3659ae2e4c19214673392eac4902204486b5bc2e43a33f9b081f3d2c44205a3855d2a2b0e5e633774997dae5b23ba701473044022042ed13b0e2756b4759dd5b22c6e9c557586c146475b4892712a322f4404b9003022059f87b6870624a1a81482bf36878600547043aecf0b849496165c68aa59cdb510147522102907305ffd77be7cf6f7142f25056fbdb64d3bdfd54315c1d5abcc7053083e0f72103fded445a3c210c625c0311fad9b98af2211c3a1119cf337fded512faecc6b5b252ae040047304402207f74c0ab07cef56b45ac780de39f572c782ef80b6490bbac5c8b54260253f07302203c928526597b17cfcd3b4d5e89d8e65221ab8dd9e974264a3eac437a5343faa5014730440220667839e8779dacfb5829b5232cc67b9921b66d811af3efcd339cc3c8648e6bbf02201cc30725ccd2c46c26e49959d4be39afb6f4e1d8f2d13dd4963116ae970b048d01475221024bc47194499fa42a13c2848a52bcdb425de5617d36031d32400f4dcc9b80b0972103686d6f7635c2327bef785a7ad3e64f5d1fbb662fa31591379d11213c07e815cf52ae024730440220332d93854b0ac07c18f65d3b282e00906a737b04bc67d2b03d129fb6405545d6022034e8d9ee14591fcefc8f512f55acb76469b57e12c5c9f472b7140c669d0fec7c01210329f82f5ad1ce700362ff8d2ba7372675192be2662065da7d9eddfa44db18905804004730440220498a2183d26938fd86cbebbef1caa872faa2e51db626fd00e547e8d3936395f30220196d4f696780e20ff489ffaef782d520d75add387c0e7811b9e4778c3b1b367c0147304402202abff61e0d9306179cb4ca6dcaf043dd26ca49a1199ee3e0398ca8c37b03edab0220021bee7a7c18d1f723d086291323dd96d19153e96eecd627e5870a3641c4c0c30147522102e13d12a71a1f26bf794b384777e3e99749eb7321b76d5d033ad1ef599cb5c16221028598a04af831d2ca6aabec63c3604cc07fcdfb326304ab6976aeb3cefaf8e4b852ae04004730440220447e4710b9d0464cb728f2cb6117cc23b954548d202f929798171148a9fdd0fd0220415ffbfea4109085a49f35ca5fd973fce46018e244252776dea79527ab3493ea0147304402203f6d72303061be979a90282fd8fa1e6e898eab8f4bd96f6950f1437a3625d1d802205a144dd778bbd4bc3eeaaa95a90042a8aa38ebea308f1890be1dad651c56aaa8014752210309eefbcc5481b5924108311d186866400fba3260ca5b92f29fd19fd480d49cc8210399536b16cb0132e7adc064d631007319cb4161aee8620d2056cf208a1375ba6652ae040047304402205cbf54f6c1ba390de676d537f0430005cca95735281bb614a819fa134634a64702202beeecca13e569e459b89730f9e4157a0c6bea7327f74c7eadfe49dcafecd9340147304402200fde5e1637cf9c6baa7e1e5551a6891714742a23d1f8e24dafeb4fcc2a2cc8d00220243ded5428903a8015e0ae8c26d96a4a5f271e785e645ceaa1187b5990e9b1ed01475221028be6ca00824ad9b51d05d1124df6b1e5fe27ce68818b62f0908a95273b21003b21037fc87fd91ae742babe3022c0af7aef3c251e70a17bfe55cd7cad544c09afa48a52ae00000000", + "cets": [ + "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff02e7db330400000000160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf19e6b70700000000160014377ed7b7d7cc2999bbffb758d8ece5b096ba0219040048304502210099d6ec9c5d3a676d2d8bebf863d499a9fd9a03a7f7f775b89e6ce017114afb68022031d726d993c6285bf5b56fdeed210ba47acb1aba8396e63ae6204520060494f301473044022023b4e7f5f4bdf4ed45b109e09e1c40dec0491a834c8c716be3ccdc8f64a532d7022034900cf9be4324ca02e1ed1770d9703060fe9630ce71957569d07c25f3e066160147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52ae64000000", + "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff02e7db330400000000160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf19e6b70700000000160014377ed7b7d7cc2999bbffb758d8ece5b096ba02190400473044022069938d09630663dc9bc75ab05306c7eef0add08c3fd82ba9eeb8c73c25e8a94f0220780455b862ee093761323dc3b6f46dce48f80f7ebea3771c3867d2b3c80a82f901483045022100b5d389bd255ce23a6255233fcaeb0febfaf7edd5cef7e82a0cb58c52ced4a1f5022011667ffc6a8cf9ef7220b5cb2badb646a002023bef542ed6cba62138cc960a720147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52ae64000000" + ], + "refundTx": "02000000000101d5ec4d88cf3921a2b49c56dd8a96a681f5ec2bdc8783152be1a66b994bdcd6590000000000feffffff0200e1f50500000000160014888f8a33d1a6b2237b293baebf0e9c2af6eec2cf00e1f50500000000160014377ed7b7d7cc2999bbffb758d8ece5b096ba02190400473044022068b0b661f59960ee1114b919ef4d9699d731304ead8aacc1238cd7b7e28b302c022041b909267bd166663a212a9e9fe4c9db47de92945a7f5b8f8b5c2184ee9cae590147304402201c3dd0eded27133e4b9931658e878adc9ab25d1145d73d136cd82b43d5477264022005e0b223ecd7944bd441d61ce070c9de63d2a1e94150a635436298d0d9d394050147522102a5f03709b7866c5139b37d543912091fc3eb7a6248da1c3d4cca75bfd0777e032103d45de5d66ea47a4af4671d158e4030ce0c5a0da44f3d83f9aceda9b587dee56c52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "a09b560281dd3442e6de987cf0ffbbc0042ddb561a5801e901fd366ca8d17854", + "nonce": "700d77191ba7f274259af4d720659a03668064e5e995763550c39afddba79792" + }, + "contractInfo": [ + { + "preImage": "5630719370328196104", + "outcome": "0f9f986312b1e6c416dc3eb0bc199a470951934efb5fc39e4dade9c83f410a46", + "localPayout": 200000000 + }, + { + "preImage": "4785246157839668195", + "outcome": "477907609d0143a7572233448851006771d4b3990d5db5e86e8ed91a596f05ab", + "localPayout": 0 + }, + { + "preImage": "1409518350869488252", + "outcome": "6a305122c769f34c96b44e751cc60cb9cb1f16f6040d11502ed7fbb43a14071c", + "localPayout": 161387983 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "477907609d0143a7572233448851006771d4b3990d5db5e86e8ed91a596f05ab", + "oracleSignature": "700d77191ba7f274259af4d720659a03668064e5e995763550c39afddba7979223c013bd01e9745256de3c26227d80b03dcbec7d0df1cc8a63a796691f34240c" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914b8aaf42643039233eef3e13c98c08013ff81d6428700000000", + "idx": 0, + "inputKeys": [ + "ff821fe6c727de85de4e02a3361f8f7d30ef0fb635dea03427dd92dbbed44045", + "45bd6509ba931179e9e635799ed8365091bb7f0dd37401549a6177a9210e1d83" + ], + "redeemScript": "00207e5cdf6b6511be166ea38c28a8526a2d4c44958ba950d18895e00900b6ed0c4d", + "scriptWitness": "0147522103bbb11a171cc3bdc438980a19cb8ad972a3a81e68539ed278dab5e70d2131ce0e2103d5a173fc147c6114e22483aef2ceaf4f1ac4fc35592ca5821a2f0bac003c027352ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014bff29ca8d68c39d57787f2c8141aeb9c4704137500000000", + "idx": 0, + "inputKeys": [ + "9f69effdb504049d54c287ab9699ea7802d342f9249c026c9bb1bcaecdda672b" + ], + "scriptWitness": "0200210296a8774a9e62b5c5f6c3825a295b63f857bf45be7d7272a6dec987781a011068", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qlxtpypuy393ldkq680w6tch49xynzl4mku2ukq", + "fundingPrivKey": "73f68a84a329ca885cd8c1e67538a17561a12499af650147d6eceda0532c9a6f", + "payoutAddress": "bcrt1qwxp0yqaucugz22mcdj76hyzvjvzu99ruusdayn" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e7597cd69e7227c057b4660ac5a06cb471ef3c754d254ea459ea8eb18c1f154500000000", + "idx": 0, + "inputKeys": [ + "c090f3a30d2b4f2d504f07bd89eb29b06fbc077c0f01391a268e83cc596a1057", + "97e7f2635022a0e486bbb5fb4ab9b859bf95b719b4336fd129a8d4c4cf3a2a4c" + ], + "scriptWitness": "01475221030581b05452bc9f18883010bf44ee0fbbecebbf75c194c7ee08ba26d455022326210295395fa3fbfde2f93574630e26df048df6e364c5f1f25e1a196ba14665e35b5152ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qx35mfnc78ejp4qj232rse8jgj4rzhd4wlqj6e0", + "fundingPrivKey": "b8d4d60c2dc5821e62411792d31295d8da9e8d96f551b42111b994ff330e6462", + "payoutAddress": "bcrt1q9cv8ct22kg43w37jj77m7ef8hzpc5za8ltukhm" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda71055031335363330373139333730333238313936313034000000000bebc20013343738353234363135373833393636383139350000000000000000133134303935313833353038363934383832353200000000099e95cffda71240a09b560281dd3442e6de987cf0ffbbc0042ddb561a5801e901fd366ca8d17854700d77191ba7f274259af4d720659a03668064e5e995763550c39afddba7979202dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c001600147182f203bcc710252b786cbdab904c9305c2947c0000000005f5e1000002fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914b8aaf42643039233eef3e13c98c08013ff81d642870000000000000000ffffffff00da002200207e5cdf6b6511be166ea38c28a8526a2d4c44958ba950d18895e00900b6ed0c4dfda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014bff29ca8d68c39d57787f2c8141aeb9c470413750000000000000000ffffffff006b000000160014f9961207848963f6d81a3bdda5e2f52989317ebb000000000000000500000064000000c8", + "accept": "a71c6577c045b2bc5bda13f3e53c4095b0f0ef8067712a3550cdb34a0107d843f8c70000000005f5e10002719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b905001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba70001fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e7597cd69e7227c057b4660ac5a06cb471ef3c754d254ea459ea8eb18c1f15450000000000000000ffffffff00da0000001600143469b4cf1e3e641a824a8a870c9e4895462bb6aefda716fd01e70300f09da1c26f289aec13c159c547f6ae9213818361d60fed5fe9ca94594fdc6aef61a9fd103b7ff01094f0bcdf7f62d1c610d35944d8211241516723055babcc2c015992a5c61556d3972b4ebf3cd9895e9dd7b9d64f4248af5f8b1907f5661c6f5cee7bd33fecb1519c0013f162152ebf23fe3b80f3d420bd7e976c703231010b726f5e04be96fc5d23b415f1548677da3c11713b891478033fcc8314fa5dec362701fa1faf7e8fb7d134987f40b5c0f5609433f01a2a31f1e5db83d7bf3b7a39b328507f6530c518c91c68cbea59b3ef9886b9837612d84c2581834c6296606b2f7f01b70a21553b4f8e7330922da4d28257b9d8fd0127214a398378cf835f0c28c232cb7faa539b375f6062f028a38a82bbf23c16acadb7edc91354e7173097c91c1cc69ffbf2a5dbce3ee81b3ccd8320ceae6993c5e91f7fcdacc1787d48c333591b015ba2f35153e51458e619861d2a6523f514840225715b88c9bf7b9239a2017df87894ae1a7956f721647bbdf2d003acca8cccb56021fd96fbdef59ba866b9077401612951f30367b4050cd5b1708ac79ba4d1c9011fa1b34a6065b16eccba94d4a4d750027398f0ca659707d6c9a87fb119ace14b79abca566bfbf98ff856d76a0f8edeb3d696ba952a977f08572a5eb9b0604eaa107203cc0ea00003554096358e5644a4e730639aab74e5accac5f20b71dae53ed85a208a8955012a27248e64c978516f3844895945a9ca72e8f93110e9223c5f85117fd5d1fd6f98f9775c71a0", + "sign": "a71e946fed9b0270e2e5d154293be2c30f3d1b48b8de805178ce650bbd9e66d11542fda716fd01e70301b3877773cc52921717ff4e8a09b3b8bb8e4ef80a2887cc4b7ffd3eee87d5802a0c015fb5a8c09b43906512c79ed1905abddf4ffadfe7f7040f93bb137159bcde011157e3f0555eedcfbb53b95d207ef79ab599e23b4cfbdef2840065f47dc655683073ac361e1481f50ad648ef8052e1be79810e25a03960abb56da7f9e075a14aa46ddc2b50f6837aa104b70b791455a526324f2c3a864489fa05b17c4abb00f600f9098ca4cfd4c6ef0a7a588dec40518f19bf401263a04c065b8893853670ffcdd024f90460d1041e1da05e3c45880474ad7b086d801f661683ebc9697e164d070081b49769f7a3db37519e300bf395a9325d822a8d30ff94e40b990f1dfee0044b25ccc2ccf43dcb93e17017e68107aa50002c38ddd82735aebea6466a66dc4287409bc6d2dd3cb6a75d49699f26686f22db402ef041f87e4b255de4f273a4f47900661b62c4dd558dd53ec2d943be9f26121b2a7772220dd929062b49739dee2aac2b1a01779dd3928abeb3c46ec1705675576240859372f298c1001c4f870ef06d008ab19005077e873dcadebeb898046a7ce0f93ea165df3a619f77155820840e3a12bca0a87a267fd906f331ddb9390c25f18d06cb5f1c1cc6197abbe19ebb39fdde1cebe1e4e3b50842cbdf4bf2109e942370e0233a0855ab25606388df8e5b1713f00dbf6626d67d26bd147593fc5b4eccf8b2144b82f8ea7009d942689bedd8615a1ea9684dcbbb43ec8ecc88494b0a18b6a809c00f7285c89b5c6f23aff933fda718fd014f0002000400000047304402202bd567124ffb2dee41eec8ae73b5e58cf3b8a92ab95fdcf92732cf1dc4e55b28022077a5005a8e9deaadaad4c24b27749b7133f0af0df0847b53b53f519dc8879d4f01004730440220111c4629eff868b449bd3cf679d8118c93cceb3c1e866f4a04ca36d735dbacdf0220130d59b1b6f6bca2d9b3c631714ed5c1c8b5c57f3bff10b47cafe9f170ce8200010047522103bbb11a171cc3bdc438980a19cb8ad972a3a81e68539ed278dab5e70d2131ce0e2103d5a173fc147c6114e22483aef2ceaf4f1ac4fc35592ca5821a2f0bac003c027352ae0002004730440220313ce9aa775a497b63c9054ad48bc3b97b59e3e817e9311011fc015d9c97ae29022007fbbc31833dfb69a3057659bb5ecda75c4c5a8607089720736540354c5bb5960100210296a8774a9e62b5c5f6c3825a295b63f857bf45be7d7272a6dec987781a011068", + "unsignedTxs": { + "fundingTx": "0200000003bc7f5794a5176fa4211e75e6a60f49452a24553d644293e2989b2e375cd1bba300000000232200207e5cdf6b6511be166ea38c28a8526a2d4c44958ba950d18895e00900b6ed0c4dffffffff465e2937b6bf5b3cee05acd811a79da7503d0c6fd2fc90fe90cd7711e32fea700000000000ffffffff047f29ebe88ce614c74c0e943afb42a3ecfefe0a019dbf59dac939059bdc66580000000000ffffffff0352c5eb0b0000000022002093b16ac7b398c7fc7415b3ca329db30638ea251e6240b2fd67ad5a13a22adcbd579ce11100000000160014f9961207848963f6d81a3bdda5e2f52989317ebb55dcf505000000001600143469b4cf1e3e641a824a8a870c9e4895462bb6ae00000000", + "cets": [ + "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff0100c2eb0b000000001600147182f203bcc710252b786cbdab904c9305c2947c0147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52ae64000000", + "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff0100c2eb0b000000001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba70147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52ae64000000", + "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff02cf959e09000000001600147182f203bcc710252b786cbdab904c9305c2947c312c4d02000000001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba70147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52ae64000000" + ], + "refundTx": "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff0200e1f505000000001600147182f203bcc710252b786cbdab904c9305c2947c00e1f505000000001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba70147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000103bc7f5794a5176fa4211e75e6a60f49452a24553d644293e2989b2e375cd1bba300000000232200207e5cdf6b6511be166ea38c28a8526a2d4c44958ba950d18895e00900b6ed0c4dffffffff465e2937b6bf5b3cee05acd811a79da7503d0c6fd2fc90fe90cd7711e32fea700000000000ffffffff047f29ebe88ce614c74c0e943afb42a3ecfefe0a019dbf59dac939059bdc66580000000000ffffffff0352c5eb0b0000000022002093b16ac7b398c7fc7415b3ca329db30638ea251e6240b2fd67ad5a13a22adcbd579ce11100000000160014f9961207848963f6d81a3bdda5e2f52989317ebb55dcf505000000001600143469b4cf1e3e641a824a8a870c9e4895462bb6ae040047304402202bd567124ffb2dee41eec8ae73b5e58cf3b8a92ab95fdcf92732cf1dc4e55b28022077a5005a8e9deaadaad4c24b27749b7133f0af0df0847b53b53f519dc8879d4f014730440220111c4629eff868b449bd3cf679d8118c93cceb3c1e866f4a04ca36d735dbacdf0220130d59b1b6f6bca2d9b3c631714ed5c1c8b5c57f3bff10b47cafe9f170ce82000147522103bbb11a171cc3bdc438980a19cb8ad972a3a81e68539ed278dab5e70d2131ce0e2103d5a173fc147c6114e22483aef2ceaf4f1ac4fc35592ca5821a2f0bac003c027352ae024730440220313ce9aa775a497b63c9054ad48bc3b97b59e3e817e9311011fc015d9c97ae29022007fbbc31833dfb69a3057659bb5ecda75c4c5a8607089720736540354c5bb59601210296a8774a9e62b5c5f6c3825a295b63f857bf45be7d7272a6dec987781a011068040047304402207e87612576bcbba5db4ee0a46f983e6a7ea495f49abad4b31ba19cd4c6cbe52e0220323b2fedf83956932ec2092f90e7329316fab56b17272eec93b6dd7c8e16be9101473044022063f1037f6b51e69656a28cb7c3807fc03de08f60d53790ee40d5de4717ad33b90220276f7edae2b0f33d87a25f0f14679f966efa7eb5e7b083bd8c200ca25fd0068901475221030581b05452bc9f18883010bf44ee0fbbecebbf75c194c7ee08ba26d455022326210295395fa3fbfde2f93574630e26df048df6e364c5f1f25e1a196ba14665e35b5152ae00000000", + "cets": [ + "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff0100c2eb0b000000001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba70400483045022100fa1faf7e8fb7d134987f40b5c0f5609433f01a2a31f1e5db83d7bf3b7a39b3280220267a3957fd8f7ded9a094b98b10d0e654c0683bbf63f05c4587ec5d951286b6101473044022043e0fa0c0993932faec8c46fccb9f661cf5b2290e23ad3eaed41303f3fe1728e02205a14702bddc8d0ee5dedda448983faf344cca707fd20edb535d673e2c023427e0147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52ae64000000", + "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff0100c2eb0b000000001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba7040047304402203dc0c8ef1493f4291115edcfc89e51778d615f40057d9bb53aaed7167fc64d0f022071f5249d4bd705860d2d83cc639a72411c5f41613d80773f05c6c691335cd4be01483045022100f9098ca4cfd4c6ef0a7a588dec40518f19bf401263a04c065b8893853670ffcd022064d764ff51b686c2650b4ba697c14a35ca1ee3107c4abd947e963c63820ef3990147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52ae64000000" + ], + "refundTx": "0200000000010185ed92be99bc41d6032864aaafdfc8f4cdbf56a207cca7c23fb9ccb0de2d18f10000000000feffffff0200e1f505000000001600147182f203bcc710252b786cbdab904c9305c2947c00e1f505000000001600142e187c2d4ab22b1747d297bdbf6527b8838a0ba7040047304402205644a4e730639aab74e5accac5f20b71dae53ed85a208a8955012a27248e64c9022078516f3844895945a9ca72e8f93110e9223c5f85117fd5d1fd6f98f9775c71a001473044022013f00dbf6626d67d26bd147593fc5b4eccf8b2144b82f8ea7009d942689bedd80220615a1ea9684dcbbb43ec8ecc88494b0a18b6a809c00f7285c89b5c6f23aff9330147522102719f54a577ca4127a4b14f0b5adbff95ba7a3baf44ba3dab270e61340595b9052102dcb598d39c1d07865af8516ee91f18a649d2573a25ae0639fbb63c2a62633c1c52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "1445d6e96a05695c22abf7db0e280f63e0a309dbf178aecd8c942eea4976791f", + "nonce": "603c35a8f70927a6960120d87ca425e0b2177b12c5c109520ddec75ca27a2132" + }, + "contractInfo": [ + { + "preImage": "5810479199940107703", + "outcome": "42fe18b706f600a8844063ce299271f3c555505916b69d93bda5696ddc721be4", + "localPayout": 20811664 + }, + { + "preImage": "1621085837056902642", + "outcome": "4c63dd11fe6268f23dea0a8d30ec0d5cc32dd45dd37afbadf48f28c0f8954206", + "localPayout": 200000000 + }, + { + "preImage": "8927603184677112006", + "outcome": "7820a52fbd7892e0fbd6005e6ff39805a41e30fb767e56d631d07f4118665b10", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "4c63dd11fe6268f23dea0a8d30ec0d5cc32dd45dd37afbadf48f28c0f8954206", + "oracleSignature": "603c35a8f70927a6960120d87ca425e0b2177b12c5c109520ddec75ca27a2132e713914da1c400656b43d9b124163c998da2f01cfcedf9b4c7d49e6790b4598f" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209f47d00553bbc4bbbf56d20602484179823c4307923db196501ef59ba4ac485200000000", + "idx": 0, + "inputKeys": [ + "f2766382f76e2002676ca457188ad3d13270f29322f225210dbf9e8daf6902c3", + "f3b43ed11961b6b1349bc4235f1e2772f4f900201d1fad272634fcbfbb815ae0" + ], + "scriptWitness": "01475221032fff3001ce479874eeffa969ab31ec34eda0b4ae414e6ef1c94757b4e7b7e0dd2103641436b204b98bdffe172600a47cdd9f8a159c5401e730b98ba3e80ea0ef623b52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001495402af84e5d8549c13493648bd55dac1f4794a700000000", + "idx": 0, + "inputKeys": [ + "7e63f0125aa48c63b3c0004275a2716936f84c27360767ed497b2c1ac3166caa" + ], + "scriptWitness": "020021032680b00946edbd2c052dd894449658093428a96c03ea0fb640762ad37579589d", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qjruccgy4nudchsmvnazz0elndxt3w4rhjss6y2", + "fundingPrivKey": "f1e885f2a73e5c5946fd348d8f45cc857ea1094082aa387ab5dd9f6fcad19b0c", + "payoutAddress": "bcrt1q580xp4cejhfltza9yhvr0uu426w43uz9q6wrg9" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914fa0c022f5e1f8c939697272f119c1c874ca60d588700000000", + "idx": 0, + "inputKeys": [ + "f8d98fe472ebba701a5e93697832ddf6675363bcdef4efccc27095818405b9da", + "d7be4db9e17faa41ff7dbd9bf4605e8c1bbba65413cba912f06e8071af1adedf" + ], + "redeemScript": "00203ef989208de63d8094dfbb53ff14246d92e1b66e54a4b627c9f08658f7b2510a", + "scriptWitness": "01475221028643e273b9c42ce5140260e85dcd49e8db246af616768fa6c5ea2391796bf43f21022387f8aca7d766344f5cbc9e211cae5e75140c3bbbb4e72d22f4d4db5326129252ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c5b5c258c74c5e793c6bf858abdab0cfa33f810400000000", + "idx": 0, + "inputKeys": [ + "47d20fbb96c8811001374bd03a85f5aa6fffd00a162e0e34c7c5daeeac85d518" + ], + "scriptWitness": "02002102b8f9e969cf406909a0f6f0f1acb4bbab7b0d5c968d2408043e6e6080b88c16ff", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qgn4ntvv7shy2ts4uuz8wu5jycg8w0nlnnyeger", + "fundingPrivKey": "0af6cf4ffd6f15119cb12d1c888950b6337c7a83417f51f62bfb55b51067546a", + "payoutAddress": "bcrt1qancmaglw4hef56n27afxfzvztp5d45ecteemyv" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105503133538313034373931393939343031303737303300000000013d8f901331363231303835383337303536393032363432000000000bebc20013383932373630333138343637373131323030360000000000000000fda712401445d6e96a05695c22abf7db0e280f63e0a309dbf178aecd8c942eea4976791f603c35a8f70927a6960120d87ca425e0b2177b12c5c109520ddec75ca27a21320366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99400160014a1de60d71995d3f58ba525d837f395569d58f0450000000005f5e1000002fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209f47d00553bbc4bbbf56d20602484179823c4307923db196501ef59ba4ac48520000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001495402af84e5d8549c13493648bd55dac1f4794a70000000000000000ffffffff006b00000016001490f98c20959f1b8bc36c9f4427e7f36997175477000000000000000500000064000000c8", + "accept": "a71c1029c167219d285da8e5f96f7b9847eed03e380015560fc20748e229dc0fe00a0000000005f5e100030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc700160014ecf1bea3eeadf29a6a6af7526489825868dad3380002fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914fa0c022f5e1f8c939697272f119c1c874ca60d58870000000000000000ffffffff00da002200203ef989208de63d8094dfbb53ff14246d92e1b66e54a4b627c9f08658f7b2510afda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c5b5c258c74c5e793c6bf858abdab0cfa33f81040000000000000000ffffffff006b00000016001444eb35b19e85c8a5c2bce08eee5244c20ee7cff3fda716fd01e7030157fd3d5cd610250522960a532a7b5892a02db226adc71da3c73e93b6a3e4ff89bbbda63d54f6699e00947f52472ed675a596ee0544c943d1ba2aeda5b6141c980159ebdab6fe209caf70928936397717123e69508ce0338fdfabb19100222bdd24317a819f9c88d228076388fa57875f0d63bfd5830ada2aceaa896191edb804f2467c8cf83dd37706624b4bfb1f15e3a09436117a89f2da9eec655791c4e3765e0002bde214c26d881822f41df38978ac2bcfdb8073b77934c3195cf8200c0ecda5f04d2a4995dced00e7be219d8cf444a8942ceef55bfcede3024729dd37cad57000484a2fb803470520c222f29bf453700252a20c6f26f505c73ebf0703ce984a3409da2c54ce93cff2792d88e82b4a6a1e755372cb10a1c029eac4035dbde4e03ba2627cb1fd05edc7ddf733d7015dbe447ef2126ab7a325ea80581a7e88c3bce100de776ba5159cddd6616892dab93c7a2dd87b9ae7657b8ef6ff3e020b2556e1c17edaef2378e4c27025e5b28de0e3313ea37832a7d27ba2127f90a36bd9a2a5d1013d71aca0bea782a99a7f5d4de143d2425cf4ff05ae6be3884b2f8d72fb3a5e1c61df276c34e2d26b89c0618f379737dce877a61e101170c35984c622605be88157b399b973ad1ca6d422b26d4d82eebdaf7d8a1ab6dc7124d1f7f27e3e81118508117d363226c39cb4ec57fa0b62d696075fcf31dd0adec19a1792043eca2c245df7e62666883b9fb94bcf9c1ba080d1e4933982589151c6b479d671caad4cc8", + "sign": "a71ebf65f8770fe96e7d57003e55f3c358b74580108b4fec1ff0270130be893a93f2fda716fd01e70301a4e1ed619b87337e7a00df33d4ec641ded35c1b117a2d783d36c7161f3b7fa7ea63f8d051ed74d8e7d33c0ef84e0ae5f27b900e48998050e4c21d21924848bfa002d6dfde9793aa8a94a0a5eefddd6a59d6d54bd256f7880e81ceaa977e7450e17262830cf1a6a41690c278ce35ec1255908cab8f861d435470ee27db144aee09e8ea01d0db4de654c8420fa0d210870894d90063ecbe362a2fbd827bafa4fa13b01a12586fde95318de533b9b5cb35de91f8fdd3a34a1285f629520ba3045cb63be0fc5e49845ebb44b52c1c479b78563a8dac94e298071e1e7d60f357a54003a65007b2fc0274d9f6d38fe62911b8b9f407b56889fecda758d82e1df7897aeb8635e40652944c150750b6c1976bbe2bcfde252f729aa30b603d4b9e3d086359f6b69209f27a04fd2f3291adc3be231c7445954ff21b4c8ad383ec7e665b29648cbf400b66af4abdae2ef2b2806bc7b24ebd7aa8b1499eee01f031efc3b75448e37159ea91cc6e8ed669ce14b0ae57a7a5869bfe058475fe70c50e277609758108550ea000e5f8ff8e37375ed055cb63f78c20bfa2421e8727adf9665807c71f14247be1c2b3c1e329b14626ab35d5482646424f1f4c7ef570904fb2a786843a4cc223669da38cad9464789e56c92db129ac004609acb3cc5e2fe863780734c44d13b90b56edd5742c35c39f2f63584590db7e12c6d731b857d27fb1bd28fde4e939efbb775b244dd315a7e6240aa6e07f027f46bdbd0fac98c950105e020170880e79450fda718fd014f0002000400000047304402201dbdd8c2e7a72650f5c06564b7e005177dc6e41bd933697358fce820cfb256ab022010a9a822f65bd8a7b47c67ed5a21e1fd749a31b6dee6550c58a172622536359201004730440220216d69278f0ffd66e79e48c5aa15e5820222944f6faf6fb76227c487d0676323022057c3e2aadb35e1fa2df9ff4bfa8cec4a4be5ae1cc9baeeba259f4dd845087cd30100475221032fff3001ce479874eeffa969ab31ec34eda0b4ae414e6ef1c94757b4e7b7e0dd2103641436b204b98bdffe172600a47cdd9f8a159c5401e730b98ba3e80ea0ef623b52ae000200473044022064f1acc99c66bc9b5d6d31ecdd13ff1a37e678f3fc61df614a32484525ab2c3302207495bfdf2b983e020cdc22d6ca777a28487cd6daaed3cc3e3e37d6896a337cac010021032680b00946edbd2c052dd894449658093428a96c03ea0fb640762ad37579589d", + "unsignedTxs": { + "fundingTx": "0200000004b293c4f212157b884f7caae1c427774dd1a8f9b2e8c1a4abc6612d3a4745bd870000000000ffffffff4fee8957259816b74d37c1d30b3f3986f382438013a804906c822d96c087e92f0000000000ffffffffd6260734b258fe4b2b55007a5a22461abcd4c8c6dafd31a2edb54583ea6a550b00000000232200203ef989208de63d8094dfbb53ff14246d92e1b66e54a4b627c9f08658f7b2510affffffff9a40015e9d277170df7de6a7c3051af16ead34cd5621f86194f7838aa3fb55a90000000000ffffffff0352c5eb0b000000002200205ab3f288074bd97815a1db4a1def6d591491f179696920a348f3fb113082999f069de1110000000016001490f98c20959f1b8bc36c9f4427e7f36997175477579ce1110000000016001444eb35b19e85c8a5c2bce08eee5244c20ee7cff300000000", + "cets": [ + "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff02908f3d0100000000160014a1de60d71995d3f58ba525d837f395569d58f0457032ae0a00000000160014ecf1bea3eeadf29a6a6af7526489825868dad33801475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452ae64000000", + "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff0100c2eb0b00000000160014a1de60d71995d3f58ba525d837f395569d58f04501475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452ae64000000", + "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff0100c2eb0b00000000160014ecf1bea3eeadf29a6a6af7526489825868dad33801475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452ae64000000" + ], + "refundTx": "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff0200e1f50500000000160014a1de60d71995d3f58ba525d837f395569d58f04500e1f50500000000160014ecf1bea3eeadf29a6a6af7526489825868dad33801475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000104b293c4f212157b884f7caae1c427774dd1a8f9b2e8c1a4abc6612d3a4745bd870000000000ffffffff4fee8957259816b74d37c1d30b3f3986f382438013a804906c822d96c087e92f0000000000ffffffffd6260734b258fe4b2b55007a5a22461abcd4c8c6dafd31a2edb54583ea6a550b00000000232200203ef989208de63d8094dfbb53ff14246d92e1b66e54a4b627c9f08658f7b2510affffffff9a40015e9d277170df7de6a7c3051af16ead34cd5621f86194f7838aa3fb55a90000000000ffffffff0352c5eb0b000000002200205ab3f288074bd97815a1db4a1def6d591491f179696920a348f3fb113082999f069de1110000000016001490f98c20959f1b8bc36c9f4427e7f36997175477579ce1110000000016001444eb35b19e85c8a5c2bce08eee5244c20ee7cff3040047304402201dbdd8c2e7a72650f5c06564b7e005177dc6e41bd933697358fce820cfb256ab022010a9a822f65bd8a7b47c67ed5a21e1fd749a31b6dee6550c58a1726225363592014730440220216d69278f0ffd66e79e48c5aa15e5820222944f6faf6fb76227c487d0676323022057c3e2aadb35e1fa2df9ff4bfa8cec4a4be5ae1cc9baeeba259f4dd845087cd301475221032fff3001ce479874eeffa969ab31ec34eda0b4ae414e6ef1c94757b4e7b7e0dd2103641436b204b98bdffe172600a47cdd9f8a159c5401e730b98ba3e80ea0ef623b52ae02473044022064f1acc99c66bc9b5d6d31ecdd13ff1a37e678f3fc61df614a32484525ab2c3302207495bfdf2b983e020cdc22d6ca777a28487cd6daaed3cc3e3e37d6896a337cac0121032680b00946edbd2c052dd894449658093428a96c03ea0fb640762ad37579589d040047304402200eb0c15067c8b024dbad8eddee45e6ddb5b5042f5dfce5a68e2f7b94fc74017002204f1a238370e609f585bee2217f0bba43d5bd5914de875cebcccba57c6267c35b014730440220744faaa9c2164623d787e922bb3ef19997bb716b7ada367460e902f52608046702200805959f10707ead094b9ae4b498c1384e8bdd0fe6f56fd6b08a781925870ce401475221028643e273b9c42ce5140260e85dcd49e8db246af616768fa6c5ea2391796bf43f21022387f8aca7d766344f5cbc9e211cae5e75140c3bbbb4e72d22f4d4db5326129252ae024730440220586b24877a6514ffc2186c0abeddbaf57aff316f5be24f740239ff8a4b45cf8e02201c987f49b1381984706ce702ec74e732df894e9472b7f2fe3a3818a234f6aa92012102b8f9e969cf406909a0f6f0f1acb4bbab7b0d5c968d2408043e6e6080b88c16ff00000000", + "cets": [ + "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff0100c2eb0b00000000160014a1de60d71995d3f58ba525d837f395569d58f0450400473044022002bde214c26d881822f41df38978ac2bcfdb8073b77934c3195cf8200c0ecda50220290940eb0a368acd629b52c4f2ee661dc7e80aef34f8b0ae7c0e24f227e7c782014730440220079f2de6be8f8c1d9fce51e53c87eaf58e0e3635ee0b7addcb31d70d409f9e91022064b56095289c1c6cc41fef45490414333632049b7cc5dd41eda6fb8748ba9f1b01475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452ae64000000", + "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff0100c2eb0b00000000160014a1de60d71995d3f58ba525d837f395569d58f045040047304402201fd0f2f1a8e3aab3bfa9939587b12fcdc94732ef961a20f959625a2ec67183170220357288e6cb779db0e7383cd71d6837c6f9d8188eba44ad47fdeeffdd5226495e01473044022100a12586fde95318de533b9b5cb35de91f8fdd3a34a1285f629520ba3045cb63be021f251da053d70421723ec3ff6f88a34b2a1cbd25c4e75e57849457146ad926d701475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452ae64000000" + ], + "refundTx": "02000000000101f873355597d249203210ba5a8b28be95591f5b883ac7e5ff2046742e10394caf0000000000feffffff0200e1f50500000000160014a1de60d71995d3f58ba525d837f395569d58f04500e1f50500000000160014ecf1bea3eeadf29a6a6af7526489825868dad3380400473044022008117d363226c39cb4ec57fa0b62d696075fcf31dd0adec19a1792043eca2c2402205df7e62666883b9fb94bcf9c1ba080d1e4933982589151c6b479d671caad4cc80147304402206edd5742c35c39f2f63584590db7e12c6d731b857d27fb1bd28fde4e939efbb7022075b244dd315a7e6240aa6e07f027f46bdbd0fac98c950105e020170880e7945001475221030ebefc8096b667f455c79ffc5a81f4a80d30b76bcde864526b2feba7dd139bc7210366629c345a103e53a48b51f97a573d4181761c3bce9440de3404cc7a18c9b99452aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "c21037865802768db5786f1eda2a7d97d7ec1d818c5e9e146383987d4d14ce68", + "nonce": "985af0f7a7d5c3fb7b593338f39b258cbb23a0966930bfb62bffa0ab7f423fa6" + }, + "contractInfo": [ + { + "preImage": "1810905145112648290", + "outcome": "a63dd6afa8fcf6af4cb985afa90c3c0473bc7d56d88a587c80f7b597379bc9a6", + "localPayout": 0 + }, + { + "preImage": "3773643757804392277", + "outcome": "09874aec30b7576d0e6587c807184a73d8a9963f594365a89459df2d455d756f", + "localPayout": 200000000 + }, + { + "preImage": "1236058416116942992", + "outcome": "6ff55a15c69645db9e3ae64e0cfbad7039753b9df55daa550e2d30f2d282704e", + "localPayout": 183020887 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "09874aec30b7576d0e6587c807184a73d8a9963f594365a89459df2d455d756f", + "oracleSignature": "985af0f7a7d5c3fb7b593338f39b258cbb23a0966930bfb62bffa0ab7f423fa6012c6f8810923ee768006fc1000790351a1ee556e4c68c4aac79789546aaa178" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002046a64939aef8688c4d1073608e924badf215ecf05541770a68cfbd149b3363f100000000", + "idx": 0, + "inputKeys": [ + "96dda7994c268899d63975755ca14bf8a8c493002824d8f6fd40663e6f162102", + "fb2cc72beecf9400dd42ea9eeb73067c1e0cfbff9114f169e5941a240a0970c4" + ], + "scriptWitness": "014752210341df55dd8cbafe737baee90df3158f0a05c27cb5d00b52c8041e808192775182210329bea94423f1ecb6bdbd4eefd33dafbb766ca75c9b01a873beaf0bd6c96b451f52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020183d1d46d55689b74aef2bf6397d4384c0dd193e1d7bb5f7b6989e279c2dfb9800000000", + "idx": 0, + "inputKeys": [ + "529cf868b4cf03253d56b6c2e4c4f052f3cd1e69158aa093ae2a7bfc0a1d6c02", + "b4d3502c8726362be24ae1ac0cd9ca19e3b821c420590f16c2f6346679cab188" + ], + "scriptWitness": "0147522103f9161df30a6c11694e95f647952b91959900b8f7c0a9307c0bf7c5c6187e9ed02102248a7ddcb3743a322a21ad2589c2bedf72ea08c71d17a8c9f8cedc907598c44d52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1quymeax85kp5ap2wae8u6xycvuxcax0z7susw6q", + "fundingPrivKey": "71abf6221b26175e62b878de38c714517a3d42abef785b9397d4096942676d8e", + "payoutAddress": "bcrt1qt9ahwv76g7heml5un9crpgkfx562ed5k4twczz" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ab4f6dabc35b48bf329d54e181cfaebea70eb652145e96757026a5da0e1de22f00000000", + "idx": 0, + "inputKeys": [ + "e374ddd3a51c455e17f7ce4601cc78f33f60b24c85354b008d00a1883bc289f0", + "34d640746e24c1527daf53c2b55c0c93dca9f0464588ce70516fd2252eac39a0" + ], + "scriptWitness": "01475221022f4cf60256508c92a3f2a20cea131c1c0ee67777a15677419aa7ddba16d00dcf21032348d7e4838bdf3d719321254d15758a6aea901122119c9d27c389efe5c034a652ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002081dc1b7f8371a80940b22f8b05c53307fe02eb5093428716c30248b43bc358d400000000", + "idx": 0, + "inputKeys": [ + "9a7c2d806fd8ec388d0d82170b977bbf83ba4bc0f65b2ccb158928e46aac2dc8", + "451e0192103e6c581bc55457d5de35f434786630d4d37ad0706a6d373807dc1a" + ], + "scriptWitness": "0147522103ef3a9d63b101cfa6f210caeedc9bfe873f0000b8363fdb80c577290af7d1d7262102530b995ff01f70d7130ae5c002307452833c0e0e2f1dbbb0ac7dad5e1eb1a1f752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9141599a72907aebd5185029cf7d2bc5bb0e235e9c28700000000", + "idx": 0, + "inputKeys": [ + "9249ed74f71682d0288032c1b156f7f2674d3ea8654f65c6b643f6adc3dea2fc", + "af14744c6e0329b255107ba25f51847778c1fe1595d47ae6bd8a5969b6489e58" + ], + "redeemScript": "0020f5ea3a4eaec8b99eac29d157ff9a069e014214192d256dd4e382cbb3758d83d6", + "scriptWitness": "014752210210bff523a0e042748f85b6647e83ac689d99d9f4841e26cd8459e6342dce9065210389cc804f6534719e8b4e154dfc4f3afd0805f5e25553ed9e0093d15fde0f7fcb52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020b260f876e3d74f839c537c54190c3740607473d56886695c60e77059d97b367300000000", + "idx": 0, + "inputKeys": [ + "be9782c275a2546e79edcb4f944d56377a32b7c6df7f1652c104bae82c923a64", + "62edcf0133631e640808d77dfde05ecb470599feeaf60347cea8932815ae9989" + ], + "scriptWitness": "0147522102409dee6b040e8740c91c0602f099f3e8128260b431d3635dd10b8a54da17fa64210327c58c5585e6f034385b09a198696cdd3f1100c9018e0d029db22a0c4ff76a7952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142001801b33cec041039b6652e767a8c178d403508700000000", + "idx": 0, + "inputKeys": [ + "97ae760be061659c889fcae694d7102df40257149b7d474eb6e434b21133f30a", + "fd69f82ae4fbef98ebc67ea26f0aabd5f1fb8de35d5ef79bb528aada3212d273" + ], + "redeemScript": "0020b65650f03a5eadb820f1b01400902c33954c7df85689c67a96c0e0e6aacb6019", + "scriptWitness": "0147522103c8fdd854951fd9959f8955202a687597a34ec1d391ef7d0abce0f3828284f709210341251a50ca56892387e211b846ad190e956d0519849b4a03f28ddd9d3cf98b9c52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qryrpyx7g6u7c3gyrll5ld7v76hts8msey4qacj", + "fundingPrivKey": "60258bb2e45647f50c20d4ada36b88e10249ca28b5c1767870fdbe7330a4e2fe", + "payoutAddress": "bcrt1qyxwtx2lxnlw8gcylfexllg39eqagcep30yawdu" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105503133138313039303531343531313236343832393000000000000000001333373733363433373537383034333932323737000000000bebc2001331323336303538343136313136393432393932000000000ae8ad57fda71240c21037865802768db5786f1eda2a7d97d7ec1d818c5e9e146383987d4d14ce68985af0f7a7d5c3fb7b593338f39b258cbb23a0966930bfb62bffa0ab7f423fa603dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72200160014597b7733da47af9dfe9c997030a2c93534acb6960000000005f5e1000002fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002046a64939aef8688c4d1073608e924badf215ecf05541770a68cfbd149b3363f10000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020183d1d46d55689b74aef2bf6397d4384c0dd193e1d7bb5f7b6989e279c2dfb980000000000000000ffffffff00da000000160014e1379e98f4b069d0a9ddc9f9a3130ce1b1d33c5e000000000000000500000064000000c8", + "accept": "a71c0606cdf7acf467d80ae00eed1a4bc4c4e368b0f2b416d0dbfa7faa0d1c91056d0000000005f5e1000235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef3900160014219cb32be69fdc74609f4e4dffa225c83a8c64310005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ab4f6dabc35b48bf329d54e181cfaebea70eb652145e96757026a5da0e1de22f0000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002081dc1b7f8371a80940b22f8b05c53307fe02eb5093428716c30248b43bc358d40000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9141599a72907aebd5185029cf7d2bc5bb0e235e9c2870000000000000000ffffffff00da00220020f5ea3a4eaec8b99eac29d157ff9a069e014214192d256dd4e382cbb3758d83d6fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020b260f876e3d74f839c537c54190c3740607473d56886695c60e77059d97b36730000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142001801b33cec041039b6652e767a8c178d40350870000000000000000ffffffff00da00220020b65650f03a5eadb820f1b01400902c33954c7df85689c67a96c0e0e6aacb6019001600141906121bc8d73d88a083ffe9f6f99ed5d703ee19fda716fd01e70300b85a850a474beaf9e94e339b904a008cb859fc5a0a438326c2b4e3b130ec581aeb560667c28e60e3c1fea1967dee74fbac660aed1aeb81eca07a6fa9f315917900c0fb7924ed61e8ff76152c4f4464b56b31a341b349eb0a40e94faa47d9a1efec22072a47fce8f879206ae5513173dccfe63bc88df9f814399fbc6b5b03fe9437e5467a103b6ccd056497d4933a5d87543ec22747aba8ed9eab6864f2bb6c4fd40050939a03fa68761a5e0b6c09210a2c1d6ec179680f394b578a188a21c272fb0e5f0da2e862f810466c2e4514ce8522bbfbcf6523de821befeadba80c2944597d01177c526d11186b9e6724a0c950a4ca3a489ae383da9161037fc24f2fb3be8bd0ef10a50ac61a663d597da6e530e42de92033a6a87d845b403bfcc82571e69ea7668dcf730b50bd9a7a7f5357db7283ff7d32ed9633f5a49d1f5693bb5d07ea9a01618913d25385efa63b42c56d9c1c32241ece6407d29970d481016012ba5e8e9861ed1ba424e499c0692faf0e4a4a1cbda34692b9f55dc5d6f75291f4774f569801b0c670c41d6e351c505d0a07819166caceff290aa1675c8f1094790146c640a2d0cf1e75b267688b052a3109823dcfea687e03451ce80ac8b76f075dbc350082a9672b7ba197c6d67bbe65ec99a70a5e6d8ed361b4d54614417bdb2c7e7b4dd006ed1c4ae8bf1f82656ef7ff3c010e0f49c5c01a1e58ec1961b039e9928a6389263f09b96f6108bf22087f764f82a74612155f4c98c442ea219ad58ca7922746", + "sign": "a71ea6cfe985b63a15b94011b6b3c1f2e599bca148c05b2ddc52857bc2a016281565fda716fd01e70300bbb0de912bdd922af73811a6e5760301a18a7917c76420aa58f630003f658c09fe5cab01b99c376abec4959b765d571be5eed2f49b21fffa953b9e8a1fb814a5017aab995288ffe8467e5bdf534427580697f57fa9670ff9192d7d1f9f07405a66cbbec06fa3a65e9e9c2d539911d135cefac03fef546d0c2c688be5ac5ea052478078d2998ecb8d246ad10b25545c9d6fa2c5f908e273c1a696ed93c2cfc9845900389bddba2cc72d1d5df589277293b6606152f58c127c9f4a955fd5f60b8fb2f4da43f50e007c87f73988a17debcda5ed99c6e5b926506126dca10672050bdf26009f72f4cef7305287159fd4b294c61b8cd8658eb8e1c3d8d66e2621e0c1eb99dc43408874aa0ea44a8accb406b4abd093bc3ab976a81383205392cb55d2765efbdc5277e102b9faee59776da583f3f40892424b18399b28ece5c71af4d8ee7caf018318d6c0264c339fb6259c16a8be9bb444bb55e9e69373fe3a7851077a796c798579b49af744d8ce7f50bb7e8f9451a9665aa0965474af4d61fb3abeb04aae1c017b2a0a8c73aff28dde132b3bebb364b5d7ebf32b2f836e5dd79cc145479cf045418279af09bbb2898705fb9f590bec30ff764f8338b7252a32fbcd12ffff030e23d6e603aa67112f06bfa0bd93255c1db03f204a3da81d77b34336814b4984de1880d78ebde3fec782e6168f7de391b505b44858c2a100bc2ac70281a7fafbde527a8997bcc14466e1707387c5a0dc79e51a36f9af7930cd604df2c0122593b2fda718fd01c00002000400000047304402200c70dcfa7d9a2d5f02c524b6cb04a4bbc35c728cfe517dd895f33b0e74b5b32b02207be85a6160ce8080f4a347ed1c53e32150d9870967269a3e9554edddbba4a55b0100473044022011cda5c21d0382edcc7e50b08cb7c02698d84de63dc570dfe5076d3e1ada076202205ac2e86a5ca58de2e0edb26c35245669f5d5ab9fd7e23e38968d41533dc981da01004752210341df55dd8cbafe737baee90df3158f0a05c27cb5d00b52c8041e808192775182210329bea94423f1ecb6bdbd4eefd33dafbb766ca75c9b01a873beaf0bd6c96b451f52ae0004000000473044022017f1bb40b2d489d5ec5f1a8d7619296a383b1b3962ff40d5285175ba9fe4e329022069b5c16918b92131bf3843378fc145a4748980edb84b574a7c35a003753b453a010047304402203243dc5410ca12d515d8192b977fc642d0e7e4af85858d71256950ae59c53c9b02202a24a07a16dbbe93f49ca4745b8d87222e70fb1f51922872ccbcc5062584854f010047522103f9161df30a6c11694e95f647952b91959900b8f7c0a9307c0bf7c5c6187e9ed02102248a7ddcb3743a322a21ad2589c2bedf72ea08c71d17a8c9f8cedc907598c44d52ae", + "unsignedTxs": { + "fundingTx": "020000000749229dcd387c286889b60610513c8748c7425856b8f57e762694edcbffb18c190000000000ffffffffff5d36eaae26f463f7e2a190f34d2bcee2997956ae031c285da45fde2756c43b0000000000ffffffffa95590b481e6d5abef970bbf452469cad8cbb1926786e7b1ae1f83c1caf474d60000000000ffffffff98deb0c30629f65844d7500cb27e4eb7d6229bdf3e37c8a6f8a6d79fd1e8f93a0000000000ffffffff7168a58b9304af4717ce6428f3668af130c378033d0a51dccf7fdda902845e870000000023220020f5ea3a4eaec8b99eac29d157ff9a069e014214192d256dd4e382cbb3758d83d6ffffffff5f3ca15e656b185186e31e6effc1a81719b2253d71a1f4397ebec8e4b32a98900000000000ffffffffdfc0f9532562bed61ba29e71b4a2cfa83248123bbfa0573c92cb66e19e99b28b0000000023220020b65650f03a5eadb820f1b01400902c33954c7df85689c67a96c0e0e6aacb6019ffffffff0352c5eb0b00000000220020575cbd5034942ec5d5740814f40551bad9e1817d6794327efb4fad9568cc39287a9ce11100000000160014e1379e98f4b069d0a9ddc9f9a3130ce1b1d33c5e81dba435000000001600141906121bc8d73d88a083ffe9f6f99ed5d703ee1900000000", + "cets": [ + "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0100c2eb0b00000000160014219cb32be69fdc74609f4e4dffa225c83a8c6431014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252ae64000000", + "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0100c2eb0b00000000160014597b7733da47af9dfe9c997030a2c93534acb696014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252ae64000000", + "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0257ade80a00000000160014597b7733da47af9dfe9c997030a2c93534acb696a914030100000000160014219cb32be69fdc74609f4e4dffa225c83a8c6431014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252ae64000000" + ], + "refundTx": "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0200e1f50500000000160014597b7733da47af9dfe9c997030a2c93534acb69600e1f50500000000160014219cb32be69fdc74609f4e4dffa225c83a8c6431014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252aec8000000" + }, + "signedTxs": { + "fundingTx": "0200000000010749229dcd387c286889b60610513c8748c7425856b8f57e762694edcbffb18c190000000000ffffffffff5d36eaae26f463f7e2a190f34d2bcee2997956ae031c285da45fde2756c43b0000000000ffffffffa95590b481e6d5abef970bbf452469cad8cbb1926786e7b1ae1f83c1caf474d60000000000ffffffff98deb0c30629f65844d7500cb27e4eb7d6229bdf3e37c8a6f8a6d79fd1e8f93a0000000000ffffffff7168a58b9304af4717ce6428f3668af130c378033d0a51dccf7fdda902845e870000000023220020f5ea3a4eaec8b99eac29d157ff9a069e014214192d256dd4e382cbb3758d83d6ffffffff5f3ca15e656b185186e31e6effc1a81719b2253d71a1f4397ebec8e4b32a98900000000000ffffffffdfc0f9532562bed61ba29e71b4a2cfa83248123bbfa0573c92cb66e19e99b28b0000000023220020b65650f03a5eadb820f1b01400902c33954c7df85689c67a96c0e0e6aacb6019ffffffff0352c5eb0b00000000220020575cbd5034942ec5d5740814f40551bad9e1817d6794327efb4fad9568cc39287a9ce11100000000160014e1379e98f4b069d0a9ddc9f9a3130ce1b1d33c5e81dba435000000001600141906121bc8d73d88a083ffe9f6f99ed5d703ee19040047304402200c70dcfa7d9a2d5f02c524b6cb04a4bbc35c728cfe517dd895f33b0e74b5b32b02207be85a6160ce8080f4a347ed1c53e32150d9870967269a3e9554edddbba4a55b01473044022011cda5c21d0382edcc7e50b08cb7c02698d84de63dc570dfe5076d3e1ada076202205ac2e86a5ca58de2e0edb26c35245669f5d5ab9fd7e23e38968d41533dc981da014752210341df55dd8cbafe737baee90df3158f0a05c27cb5d00b52c8041e808192775182210329bea94423f1ecb6bdbd4eefd33dafbb766ca75c9b01a873beaf0bd6c96b451f52ae0400473044022017f1bb40b2d489d5ec5f1a8d7619296a383b1b3962ff40d5285175ba9fe4e329022069b5c16918b92131bf3843378fc145a4748980edb84b574a7c35a003753b453a0147304402203243dc5410ca12d515d8192b977fc642d0e7e4af85858d71256950ae59c53c9b02202a24a07a16dbbe93f49ca4745b8d87222e70fb1f51922872ccbcc5062584854f0147522103f9161df30a6c11694e95f647952b91959900b8f7c0a9307c0bf7c5c6187e9ed02102248a7ddcb3743a322a21ad2589c2bedf72ea08c71d17a8c9f8cedc907598c44d52ae0400473044022053d8ac0ba71a940ccb007a4ee5421f16f92bf2298b7952febe838d5c1d13cef40220540c65f80b2cd3aaec1f69b398ed85e8dd86453bc33abcb914d19bf4eabf32280147304402206cc114804f8bc9e70ccfaf657de1c993823fe24ffa27b2819f9575ce9dae0e2302202a81c0df65fd1458b1a5974710b7162f592ecf44b91f484fcc372bbac2bfada901475221022f4cf60256508c92a3f2a20cea131c1c0ee67777a15677419aa7ddba16d00dcf21032348d7e4838bdf3d719321254d15758a6aea901122119c9d27c389efe5c034a652ae0400473044022048a56acc41e2de695eb379824a60a9b66f4f9981240152e3866fc4085a68347702204dd38ef731557b164349a7714b0ae98814b679625b6622f1d3a7fec83d39a82c0147304402202b9044467a47e6769e5e8de20cb7e40a957e250f7a707799b3095e35c001b8ed022007a5e0851cfb092af82b2b2b5e7bde59fee3e0984ec9b10f08c9557591af2d900147522103ef3a9d63b101cfa6f210caeedc9bfe873f0000b8363fdb80c577290af7d1d7262102530b995ff01f70d7130ae5c002307452833c0e0e2f1dbbb0ac7dad5e1eb1a1f752ae040047304402206d41792e6ba0c41e3780010e9268bb7cba4ab4ac76fed2fdf427c15f28f4fcfb02205cf56d2c16b18ee66f2a38b303bcac0100a87503f00fbcbfafd70400aa9ba4320147304402202a675551a1bee3e7b2dc8692880fcdc62bc30fef596a7f867978c2e5df7478e8022022befaf2113577c79168e8e32ff114df71e8c75ea3bd64622b2d120cb59b6470014752210210bff523a0e042748f85b6647e83ac689d99d9f4841e26cd8459e6342dce9065210389cc804f6534719e8b4e154dfc4f3afd0805f5e25553ed9e0093d15fde0f7fcb52ae0400473044022001340db54ec7256de29525073b0ff0e0ad02c3a8f9f8c4d9e5a85487d911a856022072c4f44dcf87000b76d3314f290b336d047713060fd20aa672c65aa9a383421e014630430220543b973eb3a886b19fd190b877be4dd8aced27b373a62a3e5b76b29061f63ef2021f72cbbf4a5c102adf29c7d0569c51b88aad3feb8f2ce0d2cd5cb50234f771660147522102409dee6b040e8740c91c0602f099f3e8128260b431d3635dd10b8a54da17fa64210327c58c5585e6f034385b09a198696cdd3f1100c9018e0d029db22a0c4ff76a7952ae0400473044022011675fb6199b94b1ab5d8127752b21d4c3e734a47a7e0e981a849acd0ca52acd02203f464dad5a3389d6ed47c2d55c6adbdc681f0b450febbbef48bccd376ade5984014730440220796bba357372d172bbcbdefc062129fba82dd4c0ee6b52110ab1c57cde405653022000c49514d261d3b1a6f1c3b8b18a58099b70c049a3618e2de1fab42566167ca50147522103c8fdd854951fd9959f8955202a687597a34ec1d391ef7d0abce0f3828284f709210341251a50ca56892387e211b846ad190e956d0519849b4a03f28ddd9d3cf98b9c52ae00000000", + "cets": [ + "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0100c2eb0b00000000160014597b7733da47af9dfe9c997030a2c93534acb6960400463043022050939a03fa68761a5e0b6c09210a2c1d6ec179680f394b578a188a21c272fb0e021f04ec14bc34612b16b0f9e110b3cc334f3acd0aa554d1c591bd5f16255de7f801473044022015966dc26055691f9b537f1c8cfe1a5e12e7d0e4e644847f30491dd50a6e859f022014c6e3ae171a8105612304ee0ec859afccad1bb96f2074e0caf72956bf3fc2c4014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252ae64000000", + "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0100c2eb0b00000000160014597b7733da47af9dfe9c997030a2c93534acb6960400473044022075fd5ae951899cc62aea8d84cd95134450b4b052f904bbd0a160cf90e216fc990220121ccc888f6bc1c791bde246cfc7b7f57c84a056c5d519f51e37aa3988a63863014730440220389bddba2cc72d1d5df589277293b6606152f58c127c9f4a955fd5f60b8fb2f4022021cce76de2e6b3a12228b03373b0a10853024da9bb0cb9d2ef754a7ad6660ca2014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252ae64000000" + ], + "refundTx": "020000000001010810b90aad68047f890c3bef32f8c95f5d21b9db5eb8f14a6172ce1a7224c9a00000000000feffffff0200e1f50500000000160014597b7733da47af9dfe9c997030a2c93534acb69600e1f50500000000160014219cb32be69fdc74609f4e4dffa225c83a8c64310400473044022006ed1c4ae8bf1f82656ef7ff3c010e0f49c5c01a1e58ec1961b039e9928a63890220263f09b96f6108bf22087f764f82a74612155f4c98c442ea219ad58ca79227460147304402201880d78ebde3fec782e6168f7de391b505b44858c2a100bc2ac70281a7fafbde0220527a8997bcc14466e1707387c5a0dc79e51a36f9af7930cd604df2c0122593b2014752210235d7e46a5716223f3789064960f2d98820fd4599d977aa936452cdfe6950ef392103dac1b61cd831c67d9c0ff692b4268f7f056dff64b2c812b9202339f641d8c72252aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "3236402da75587c8d030f66df238f68e941873df4d5340678e455cee7271bebd", + "nonce": "a1f15136e70b167ce28ff5695202595691b14051ae2e1fe1fb1a5e78b46a1746" + }, + "contractInfo": [ + { + "preImage": "-6133047640970666633", + "outcome": "0ca8692c29b618ce295b3a403fb77a373de99221c270d431da8d8f9d957c2a0e", + "localPayout": 200000000 + }, + { + "preImage": "-7060897239396710155", + "outcome": "044baa0d55d67c01d117a93964059d277224e62f8baf924dc682e919a9930a16", + "localPayout": 0 + }, + { + "preImage": "3064722438942047446", + "outcome": "0adc8fce9df7eef8cfce2a0bd0c5b5d93ec304c7d58720de83c4b2baaa440304", + "localPayout": 166468196 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "044baa0d55d67c01d117a93964059d277224e62f8baf924dc682e919a9930a16", + "oracleSignature": "a1f15136e70b167ce28ff5695202595691b14051ae2e1fe1fb1a5e78b46a1746b9e1accb964065baeedc7c36c23406923b4d76fb3b31e61d350d4a13807d0459" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600146e6e8a2e351b4de16051fd1106f5e8c7f2e435b100000000", + "idx": 0, + "inputKeys": [ + "4912cfd4e23c5f76263a3b46dddd9cad1721437f566150375bbdefbe16a2ba60" + ], + "scriptWitness": "02002103c359fddeeeba7e7ff98ac0b1dd862ef7b522244c277f9cac6ade109160f4af94", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914f70508226fb54ed0a4b72b39c01b6e32e4746fdd8700000000", + "idx": 0, + "inputKeys": [ + "e130e2efbef95f1a5d738d228e807b1009fb0133a8667399dcd8e39f2d673ce6", + "a61d26284a3102667e1ec9e6ea87e982709e7001c3ca34bc54f4bc1706dd72cd" + ], + "redeemScript": "002064fccda85ab2212890cda90c09b987ced1995ee88fe45df7384bbdf1c46069f1", + "scriptWitness": "0147522103ff9af6a631cfd23218dd3b5fc94650623925531b890438eda7762221c2d8dead2103557863de872887a6d4887c737bfac0b956209c4b3ca894b70b3222a347da8ce852ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914cbfcb087da5f9a78c8335e93254a8d09eb5bc0518700000000", + "idx": 0, + "inputKeys": [ + "6d64dd784bab485522fef89284ec16bac2380e93f2cc9eb484e36e9491c4a61f", + "8afa31f9decf4b5d42afed58ae462c06451786f5e3f7ca0e1ad55138aad4a860" + ], + "redeemScript": "002030d9f1156c904f13d1c47079d42738fb60d093ec5be87142379769ac3df146a0", + "scriptWitness": "014752210262ddeca4f9bf60a056427929872918806b3dc2d18216e6b7311bcf0e23827b8d2103cbbd64d706a28d38760cdc53908677f6ec0715e2321a987888da6c2d024a856952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914825447feee0bf70217c53cd424e2549d60b6142b8700000000", + "idx": 0, + "inputKeys": [ + "193ced97591e6e5f51ed3f01d7b07706f3ef8686b7fa2a684f77f0d528abec62", + "32817c9128bc5fa9b9c052c88a71fbd65d985468616dbcf323f72854dcc92a96" + ], + "redeemScript": "0020fddcfbd530ebcf8824f9feb1ffa2bc6700f88ee4691e5f490f2f8a4605b9b7d1", + "scriptWitness": "0147522102d38745a7e34d7c6a50f02149d9f1d5d2b83bc3de5fdc2a4f05e9098415cd790321029341c53821cb9131ffd7538b1c1ee84badc9034d21ba2b943cad13ab032b157452ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014519e81013541e8278250cc8f1db87ed66f1672a600000000", + "idx": 0, + "inputKeys": [ + "ae475e693b46562c19ea5fbba99fc1316b3c1c82f36af6b7c5c89a5f6e738dc3" + ], + "scriptWitness": "02002102d3f49413f28b4fc6c03b98c5da32d25303963e1992ecb2482f0d283995e6e198", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qegx662u8l6va23df50ul6rvxh24686f6lrjm5z", + "fundingPrivKey": "4d6b55dbc79c016d354984b7e0e566bc29c135d215a25e348dcc2d86f5d01d2b", + "payoutAddress": "bcrt1qtus0nqcezrs480cgsrjhdq9gmuhy0zx04numvs" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9145d041857317e631f9f69de2237195ac0694a8a768700000000", + "idx": 0, + "inputKeys": [ + "e8d50c6e34a26550354b7d3082ad2d5abfb2c168e24c8ae62079900841c1d7a9", + "c6dbae4f4b607c2b6746c6b5dab891fd330f2689148244241d86ed88ac1609cb" + ], + "redeemScript": "002039208fc2fa7f324a605137b2c1d23919289b015eb27c9d30028adbd817638269", + "scriptWitness": "0147522102e63a117013b2a439a2db2de057b269b23bc87e16bab3fd12bd6702e1cd84527421030d2b75346822123f8afafc70a840928b3dfda6b9720628e890032cd93b7e16ef52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qtr3g5p33r98mu6s9lev599uex2x98fw8pshk5q", + "fundingPrivKey": "734f84d60dd063a22a72a54c617c6d7983bd861de76693281d9e81135fd9e749", + "payoutAddress": "bcrt1quz65z6dntauam9xpsymem4kj245ywatah9xj3u" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105703142d36313333303437363430393730363636363333000000000bebc200142d37303630383937323339333936373130313535000000000000000013333036343732323433383934323034373434360000000009ec1a64fda712403236402da75587c8d030f66df238f68e941873df4d5340678e455cee7271bebda1f15136e70b167ce28ff5695202595691b14051ae2e1fe1fb1a5e78b46a1746029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f94413001600145f20f9831910e153bf0880e57680a8df2e4788cf0000000005f5e1000005fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600146e6e8a2e351b4de16051fd1106f5e8c7f2e435b10000000000000000ffffffff006b0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914f70508226fb54ed0a4b72b39c01b6e32e4746fdd870000000000000000ffffffff00da0022002064fccda85ab2212890cda90c09b987ced1995ee88fe45df7384bbdf1c46069f1fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914cbfcb087da5f9a78c8335e93254a8d09eb5bc051870000000000000000ffffffff00da0022002030d9f1156c904f13d1c47079d42738fb60d093ec5be87142379769ac3df146a0fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914825447feee0bf70217c53cd424e2549d60b6142b870000000000000000ffffffff00da00220020fddcfbd530ebcf8824f9feb1ffa2bc6700f88ee4691e5f490f2f8a4605b9b7d1fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014519e81013541e8278250cc8f1db87ed66f1672a60000000000000000ffffffff006b000000160014ca0dad2b87fe99d545a9a3f9fd0d86baaba3e93a000000000000000500000064000000c8", + "accept": "a71c9cab60b585a0ad0b3069adb9307cacd4bd6f939e6b850325b312706dc7fb1c560000000005f5e10002712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09000160014e0b54169b35f79dd94c181379dd6d2556847757d0001fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9145d041857317e631f9f69de2237195ac0694a8a76870000000000000000ffffffff00da0022002039208fc2fa7f324a605137b2c1d23919289b015eb27c9d30028adbd8176382690016001458e28a0631194fbe6a05fe59429799328c53a5c7fda716fd01e70300978fd7b5e925f6bcd68bd595cf75553742d05a7822e85b52f22c4ee19547eb6cf929f24dd4ee3e8d101ce0ea5b0dada45a9b19439569868907c91d10aaee1586005af3faad46673dc742bd677c0ef937577f4e9c5303d318cb9e69c7d1203acfe085369e3599e34f42e347b0a05f2a2126ac4e3efe485124ab39ef336c5a9d3d89d0ac0937cdc083b0fca58dfbb296ed5f2e939f593041d72c25677f13c2dce671014201765b17247a4e7d9833fbfd83275e77612bcb3683f318f398ccfb57c412b33547566c6098b9f56a71201f2885b2843982425696bab4c1177e32fd2d3343a301bc9e388ee3b48e6608259cea3f18734a13fdf326bb70279e4cdf865d0c0aef6ce70b10c4a19e346e114ceda7d8746699e5c5f58d27bd50f8b4d250b3c1c0078ebdbaa5b7fd50812d54f81194495c4a5d95581487ec2c4af0269db3db45c66e3101fe5a18065a4334ddcb7daf509ccbf4240f265c374bec8623521b3e28b0ddcaf63053caf4939f6970d6eaf9185a6825c962f1aaf30e52b9798bb0719e3540bd1e001e2dcf93508b3b496f96805a33a67e31a9c7295566f371201e60d1fae675d80f587b7ed51f8051cc268b07a0e76bee07c0119b8d4872f923c4d041e155d5bf8a71a1f60d7c0912e211c45ff2101bf1aef9f259330dc6ad535f627d220ff866bf142e75f1d95b254ad7aa5a9e6c0097fc61856521b3b566fc060674496d5569165a64ff47e93fb817a0f29b32b54f297f5f6ec6c2a7aaddde5385f5660f369d6c", + "sign": "a71e4b90eb0e50a746f72ccf23ff0224eeeea5d9fe9bb23e9e92c30bae3e001abfc6fda716fd01e70301486c6a6d67d9e6a32fce45e568e6add932fba0bea232987ac5c7311ac993fe59592565adeff07e6acc28f51998474d6d26b17e8440b5b44ea595c79ae87022e400425f3ca24bc6e661ea5a6d6d2cc8273d50bdb98949d11bd3499d0c12407d6239c95327c02aab7d8859ffac6437dfa4d8e6dfc6e13ca81a298dbb3055c828fcba3931a428988c8d9cec17e319ad407672e1f036a4b854512fdc18cec827535ffa005b57b0603e0289d84ece4b62909bacc2157451ef52e52fae9dc4bf55b1354af519f55b1c8c37c9a936217a70ab4f68e4c4a5d88195abe47992af525c485df0ed012bd047c60b5c719f00de92505d89e414c5bec1f7156f6a0520791b8f344dd8cf6fc8ef2bc2cd3634814a3b3b037468c991089e2cea682501b65059594c8c2fe1ed6ad2ce32a1445c834c3e816887521ce9e0f58b2f6b05c6c0c7c0b1f1c9f54f005161a2adfa10071ebb53c5c6187a6cd6e42b0e32d9eb04e93094863cca01450400b42df2f5de054638747a4d122f470dbad793c78cf3a45e72dfe2ca79575f43018b24bb4a8a2f5a02a988baf98c56dda3040418085d5eabbbac1a481a65f59f542811e3eda850f8019c800fa63a44e0d1b9ce5e1fdcd94b78ba943bae5fcdb2009189e5bf4b5424f646ef1463b13c6d9cfe41e7b5ec1daccdd04fa5dc9638262c4dc30c5d8c7d3ce9ff0e0c35cabf29cdb28bbf3446495817d591e133960ea1581591cd8c3be1cd60919886e89d970938d915b425a3b36d71888efe501ea8d893fda718fd037b000500020047304402200d80656b92beccf16a7c8729d58b627ef4d88445fe5c5952726640c0a89706b3022041e5b0101cb626fa9991e9469f6119cc7f442f8296caa77777fc4ea7918f4c1101002103c359fddeeeba7e7ff98ac0b1dd862ef7b522244c277f9cac6ade109160f4af94000400000047304402206725f642f6dc38fa515ff28c76ebdca9d3ae7cc1869873b83fdebb6cf4cf25b8022079c10b3b7dd1f40ac35d164070d289841a27992ba38596c03bce5abf3e4f923901004730440220033f76b661d7a42614f96d7cd1509e04b91eb7fb2daff2c989c5bb01fe7ecb8502205ef28eb0c5e5ccc665de7f3534e6309b5eb8142d19abc06cc48068881fd7c01b010047522103ff9af6a631cfd23218dd3b5fc94650623925531b890438eda7762221c2d8dead2103557863de872887a6d4887c737bfac0b956209c4b3ca894b70b3222a347da8ce852ae000400000047304402205d317b35479f78c687aecdffbc094189b111a71851c24e8cdd721a0149095d9f022011b2866a1bfd11cb683892673b526a27b5c6ea8728363316d7364fd596e09eb3010047304402200a090df68821fd9968f34d5992fb667f9bcfb1c99bc8700f64f1c98c21c66330022076420fda578b2af10ea5ba10612fd278de8748bf5b73a7bdee80047a2ed3880301004752210262ddeca4f9bf60a056427929872918806b3dc2d18216e6b7311bcf0e23827b8d2103cbbd64d706a28d38760cdc53908677f6ec0715e2321a987888da6c2d024a856952ae000400000047304402206241cb99a2a812c228a2b130a0b2b22d7e16ea4203bfe9291ca02fe1711e17b302205a72a23357127c3b6fbb7fedf766582811d62e03ebafc1372f4c9dc017ff132b010047304402203e45033d52bad21954c147ec00a9ec765f84cdc1ba5dceb5162e91514f28ec130220151500c9c7b76150c3625d0d3f7931649047595842783ec758fcd7cd378c63ed010047522102d38745a7e34d7c6a50f02149d9f1d5d2b83bc3de5fdc2a4f05e9098415cd790321029341c53821cb9131ffd7538b1c1ee84badc9034d21ba2b943cad13ab032b157452ae000200473044022044ed93441ccb76fd067b9218653912550fe0373d0ddfaa3fb16182c7090668c80220316b59d75cb60ddaa2c3bd8191eb391fec09ca5029c28835e4197f8039fa18d101002102d3f49413f28b4fc6c03b98c5da32d25303963e1992ecb2482f0d283995e6e198", + "unsignedTxs": { + "fundingTx": "02000000064abe19656b10f19be01a4fe0eb421d9adab670e4c41b477103e91a31930085910000000000ffffffff00bf82b7d8a391124a02f24175a0851d6eb867ca142e9e78be8c8471cb61b40b000000002322002064fccda85ab2212890cda90c09b987ced1995ee88fe45df7384bbdf1c46069f1ffffffffc633c00f168ebd1b3059edaac399aca39ab5b5b65df0bd6f9546d784914b5a5f000000002322002030d9f1156c904f13d1c47079d42738fb60d093ec5be87142379769ac3df146a0ffffffff659f3dd3f4a8be8161b9b4b795e6bf9ed01a12c43596eef27877940b953c1f5a0000000023220020fddcfbd530ebcf8824f9feb1ffa2bc6700f88ee4691e5f490f2f8a4605b9b7d1ffffffff5b5183dd034acb3e5e40603e6f88bc77289199c25ec75d8e30728a63d93116000000000000ffffffff3bab1d1bb71685873c02d200e67471c8b5607af0f9f10af1d78126afe5ff5b17000000002322002039208fc2fa7f324a605137b2c1d23919289b015eb27c9d30028adbd817638269ffffffff0352c5eb0b000000002200207082b8f403e6834ade2de64fe593413eeb525515543ba2380445998871105982eadba43500000000160014ca0dad2b87fe99d545a9a3f9fd0d86baaba3e93aa6dbf5050000000016001458e28a0631194fbe6a05fe59429799328c53a5c700000000", + "cets": [ + "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff0100c2eb0b000000001600145f20f9831910e153bf0880e57680a8df2e4788cf0147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352ae64000000", + "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff0100c2eb0b00000000160014e0b54169b35f79dd94c181379dd6d2556847757d0147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352ae64000000", + "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff02641aec09000000001600145f20f9831910e153bf0880e57680a8df2e4788cf9ca7ff0100000000160014e0b54169b35f79dd94c181379dd6d2556847757d0147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352ae64000000" + ], + "refundTx": "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff0200e1f505000000001600145f20f9831910e153bf0880e57680a8df2e4788cf00e1f50500000000160014e0b54169b35f79dd94c181379dd6d2556847757d0147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352aec8000000" + }, + "signedTxs": { + "fundingTx": "020000000001064abe19656b10f19be01a4fe0eb421d9adab670e4c41b477103e91a31930085910000000000ffffffff00bf82b7d8a391124a02f24175a0851d6eb867ca142e9e78be8c8471cb61b40b000000002322002064fccda85ab2212890cda90c09b987ced1995ee88fe45df7384bbdf1c46069f1ffffffffc633c00f168ebd1b3059edaac399aca39ab5b5b65df0bd6f9546d784914b5a5f000000002322002030d9f1156c904f13d1c47079d42738fb60d093ec5be87142379769ac3df146a0ffffffff659f3dd3f4a8be8161b9b4b795e6bf9ed01a12c43596eef27877940b953c1f5a0000000023220020fddcfbd530ebcf8824f9feb1ffa2bc6700f88ee4691e5f490f2f8a4605b9b7d1ffffffff5b5183dd034acb3e5e40603e6f88bc77289199c25ec75d8e30728a63d93116000000000000ffffffff3bab1d1bb71685873c02d200e67471c8b5607af0f9f10af1d78126afe5ff5b17000000002322002039208fc2fa7f324a605137b2c1d23919289b015eb27c9d30028adbd817638269ffffffff0352c5eb0b000000002200207082b8f403e6834ade2de64fe593413eeb525515543ba2380445998871105982eadba43500000000160014ca0dad2b87fe99d545a9a3f9fd0d86baaba3e93aa6dbf5050000000016001458e28a0631194fbe6a05fe59429799328c53a5c70247304402200d80656b92beccf16a7c8729d58b627ef4d88445fe5c5952726640c0a89706b3022041e5b0101cb626fa9991e9469f6119cc7f442f8296caa77777fc4ea7918f4c11012103c359fddeeeba7e7ff98ac0b1dd862ef7b522244c277f9cac6ade109160f4af94040047304402206725f642f6dc38fa515ff28c76ebdca9d3ae7cc1869873b83fdebb6cf4cf25b8022079c10b3b7dd1f40ac35d164070d289841a27992ba38596c03bce5abf3e4f9239014730440220033f76b661d7a42614f96d7cd1509e04b91eb7fb2daff2c989c5bb01fe7ecb8502205ef28eb0c5e5ccc665de7f3534e6309b5eb8142d19abc06cc48068881fd7c01b0147522103ff9af6a631cfd23218dd3b5fc94650623925531b890438eda7762221c2d8dead2103557863de872887a6d4887c737bfac0b956209c4b3ca894b70b3222a347da8ce852ae040047304402205d317b35479f78c687aecdffbc094189b111a71851c24e8cdd721a0149095d9f022011b2866a1bfd11cb683892673b526a27b5c6ea8728363316d7364fd596e09eb30147304402200a090df68821fd9968f34d5992fb667f9bcfb1c99bc8700f64f1c98c21c66330022076420fda578b2af10ea5ba10612fd278de8748bf5b73a7bdee80047a2ed38803014752210262ddeca4f9bf60a056427929872918806b3dc2d18216e6b7311bcf0e23827b8d2103cbbd64d706a28d38760cdc53908677f6ec0715e2321a987888da6c2d024a856952ae040047304402206241cb99a2a812c228a2b130a0b2b22d7e16ea4203bfe9291ca02fe1711e17b302205a72a23357127c3b6fbb7fedf766582811d62e03ebafc1372f4c9dc017ff132b0147304402203e45033d52bad21954c147ec00a9ec765f84cdc1ba5dceb5162e91514f28ec130220151500c9c7b76150c3625d0d3f7931649047595842783ec758fcd7cd378c63ed0147522102d38745a7e34d7c6a50f02149d9f1d5d2b83bc3de5fdc2a4f05e9098415cd790321029341c53821cb9131ffd7538b1c1ee84badc9034d21ba2b943cad13ab032b157452ae02473044022044ed93441ccb76fd067b9218653912550fe0373d0ddfaa3fb16182c7090668c80220316b59d75cb60ddaa2c3bd8191eb391fec09ca5029c28835e4197f8039fa18d1012102d3f49413f28b4fc6c03b98c5da32d25303963e1992ecb2482f0d283995e6e19804004730440220697db8e1a1b1c5f76cafe6b915c0a30110fea4c2d2d96b1fd4ad40d5ae153c8102204cbcebe2d2dac898716269afa13fc6ae0083a186d54f7d9cbc19df152c6d71760147304402206434a97159949bd8afc635122910b5eb7d3d4753969c90890fc23695aaa1bd6802207336dd3d4be5a10ce53904a22e70c9465857933ddd24b1d7fdb1f29445ae710c0147522102e63a117013b2a439a2db2de057b269b23bc87e16bab3fd12bd6702e1cd84527421030d2b75346822123f8afafc70a840928b3dfda6b9720628e890032cd93b7e16ef52ae00000000", + "cets": [ + "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff0100c2eb0b00000000160014e0b54169b35f79dd94c181379dd6d2556847757d040047304402204201765b17247a4e7d9833fbfd83275e77612bcb3683f318f398ccfb57c412b302202b3eddaaabf72297ded3dd66abc6ef75f3810d3f283a094967571e2650c6618001473044022033a30155ac2d2f1e73116925eb5de873f781e4bb0cbf7314f84219d380b4ff1802202c03dd150e74d74e904bed05e8e46580af4575ad3f634b6d00a9811098d54f7d0147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352ae64000000", + "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff0100c2eb0b00000000160014e0b54169b35f79dd94c181379dd6d2556847757d040047304402207f11f429c2cb3f974a6ac11030f5b7f3cdcf7177e55cb091c95eae5197d8e220022024a13ba6bfa3482b91507ef35099c7f66acee2e85fdbf4137802c043ca8dd25a0147304402205b57b0603e0289d84ece4b62909bacc2157451ef52e52fae9dc4bf55b1354af5022017ce4a1c23a41e9c6a42494d6ee15fe2a6fb93085bf7bf11056c8bf0969965af0147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352ae64000000" + ], + "refundTx": "0200000000010190a3e1c753de1970b79dbbd9056db6183a425832468ea61cfceb07d5bb8b3bd70000000000feffffff0200e1f505000000001600145f20f9831910e153bf0880e57680a8df2e4788cf00e1f50500000000160014e0b54169b35f79dd94c181379dd6d2556847757d04004730440220142e75f1d95b254ad7aa5a9e6c0097fc61856521b3b566fc060674496d55691602205a64ff47e93fb817a0f29b32b54f297f5f6ec6c2a7aaddde5385f5660f369d6c0147304402204dc30c5d8c7d3ce9ff0e0c35cabf29cdb28bbf3446495817d591e133960ea15802201591cd8c3be1cd60919886e89d970938d915b425a3b36d71888efe501ea8d8930147522102712d77ed6f4863e5cf533ea60c786936622bbc9a09f204c5b45c094f9688d09021029179069b30b867228b2d67b9c66322a760ca1d9dbfd8939309d3352405f9441352aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "106a9880856be622a2f07ace4f80e38208a4f2a1bcbab6e18616414f38e3e7e3", + "nonce": "38274e8b8b8848ba30ec64a3d4faed21642e9119e557498df1f95727d9d1a8b3" + }, + "contractInfo": [ + { + "preImage": "-4574522785871655562", + "outcome": "6ab2a938c6a3a778b758e0ec8296972b23984b808f4c6f5f07eebf08f32cf48b", + "localPayout": 200000000 + }, + { + "preImage": "1832990977243349918", + "outcome": "4b9f005772174c5b0df782c4ee36d5527c55690de96b9a875b46404e2fcbd392", + "localPayout": 115768683 + }, + { + "preImage": "-1841794273540001019", + "outcome": "8bcc455f976881eba6ba8e5cdccabcef8a73ffacc5b0ed2ea483a26b1884db30", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "4b9f005772174c5b0df782c4ee36d5527c55690de96b9a875b46404e2fcbd392", + "oracleSignature": "38274e8b8b8848ba30ec64a3d4faed21642e9119e557498df1f95727d9d1a8b30142b57e27acc1f5ea30f669d8d4e6022af18fd9b3cb0b99d3b1d43127ef2b23" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014a31a5d6ec614fce7007e68e07701dcc2700fade500000000", + "idx": 0, + "inputKeys": [ + "a97bbc8161333d65c98bd34cb95b71182ff97764fc3f4938e6a56a32f6337f1b" + ], + "scriptWitness": "02002102d825a26dfd87b12ed9d2429c1ead1e99702ff600994fd4e4248fb3ae82f7546b", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e1b3dd8af3cb6b627330956810ed39a004f8e94d799ca72ea5320f95c96fd74700000000", + "idx": 0, + "inputKeys": [ + "7e18f7d94e47771cc993e903a3472af25e0ce54d2296d69d202ce1de5e325cbe", + "4c2cf672b20f0c9c9adf8aa56c3aef777000f5ba09c23e0762f40a9d7044a859" + ], + "scriptWitness": "01475221021578e1065469afe4410759fbd5c4179e7c7de6c90adf485e562800df8e9f7fba21028576fa997a47e2035970bcad5bbc1487dfac668e9a3321b23b5a71da187731ee52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014f83a754332a34fdca86fab04c89c365d8e8e65eb00000000", + "idx": 0, + "inputKeys": [ + "bc6ea86ef356a8873736ba2c0ffce13293e263e77a5102dec6811f08bae8b66b" + ], + "scriptWitness": "020021030bb7513dae0d7a578586b1724cf8e7b43863ee0c9ca85749be8aae588c6e4132", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147219573dcdf4720857ec834ce8268005b8cd5d1f8700000000", + "idx": 0, + "inputKeys": [ + "fc64f9fbb910d3ac2b898bfe1506aa83cff1cf7954a89c5533613f9c1362db51", + "2cf2ed7c0d996a5040581db847ea0ea0c7a212a0d78554de59560c3e31f779d0" + ], + "redeemScript": "00206e0cd61629b341aed915fa04a2ce396ddda2e39ecc60b2a97bf6347392460989", + "scriptWitness": "014752210245a6d05b9ca7483d07e02f2ea81b4553be16e316e1224f966dfa7644a1d4f31b2103777a69dfaed1c8fef9fc392917fa9b17b11d1db6a5a4322e0ea4c19ff03199ce52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014a84cba7b8368c7e1b814698b97354002c3d2f3ad00000000", + "idx": 0, + "inputKeys": [ + "89fce235161c6a2d0d9ed7c7aa2faad40facc0291708b1d0e695198c31d8dbe2" + ], + "scriptWitness": "0200210275e3846d26e6b53476d6ca3f71bdce09e82721235300f458732e74accb434ece", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qe7wnr9vpwutfdm374wktrkahhpq9eznpgn4m7s", + "fundingPrivKey": "b8caa0e51a96bcdf006283237affe5145abc9edaf13f66ade362fd8d7337b3f8", + "payoutAddress": "bcrt1q69k3drjgeyk9wltpqppdfckkjy08x89z6qyk0a" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001414327ec7b07f7d3cda92d5b3decfdb608b11ba2d00000000", + "idx": 0, + "inputKeys": [ + "6e75b8a3412c567f60e0bab85badcf6b536b6dcb750c5a1bda1357273b66da33" + ], + "scriptWitness": "0200210331e7862ab28175ad5b0bce923746d729a1ff0f390f2bc29e0e57b3b44f9ed290", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91491321299b2d7f1f8f8dada82482e33139055df878700000000", + "idx": 0, + "inputKeys": [ + "d2a8bb4832c4a8cad360fdb6c8bbc76022450ac11ba5324febf772224c296387", + "1f8d685ce78fa09a93ae479d5c18bf5800d8eb6110276418888e4a2987a15071" + ], + "redeemScript": "00206a5e7b1e1e04402c3529932fb38d6c8dac1d1238e3208f8ce11e7d89da3f5383", + "scriptWitness": "0147522102c82f46f390318fddefefa0cde40b08e1f953ae031e7d9bf8936f39e4ccf8071621033d9cc3a39962219d6d0ceb5bc95d185ed2fd3acb55fdcfdb215d32ea139536f952ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qg5yvluccsjqvkttz8ztkgsafqes6sxf8lgumkn", + "fundingPrivKey": "13edb17823054f47c06783593a38453f53756982328f3b67fd86d5142e8fcd00", + "payoutAddress": "bcrt1q2ju6wfnq5l4eaqtg80wthc2n4f2dlj4cwk6nj2" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105703142d34353734353232373835383731363535353632000000000bebc20013313833323939303937373234333334393931380000000006e67d6b142d313834313739343237333534303030313031390000000000000000fda71240106a9880856be622a2f07ace4f80e38208a4f2a1bcbab6e18616414f38e3e7e338274e8b8b8848ba30ec64a3d4faed21642e9119e557498df1f95727d9d1a8b30354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef700160014d16d168e48c92c577d610042d4e2d6911e731ca20000000005f5e1000005fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014a31a5d6ec614fce7007e68e07701dcc2700fade50000000000000000ffffffff006b0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e1b3dd8af3cb6b627330956810ed39a004f8e94d799ca72ea5320f95c96fd7470000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014f83a754332a34fdca86fab04c89c365d8e8e65eb0000000000000000ffffffff006b0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147219573dcdf4720857ec834ce8268005b8cd5d1f870000000000000000ffffffff00da002200206e0cd61629b341aed915fa04a2ce396ddda2e39ecc60b2a97bf6347392460989fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014a84cba7b8368c7e1b814698b97354002c3d2f3ad0000000000000000ffffffff006b000000160014cf9d319581771696ee3eabacb1dbb7b8405c8a61000000000000000500000064000000c8", + "accept": "a71ca15470ef88b87f0adb8400bcd2e52a895a105953d0328ebc2e051d4b7c2887810000000005f5e100020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d0016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab80002fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001414327ec7b07f7d3cda92d5b3decfdb608b11ba2d0000000000000000ffffffff006b0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91491321299b2d7f1f8f8dada82482e33139055df87870000000000000000ffffffff00da002200206a5e7b1e1e04402c3529932fb38d6c8dac1d1238e3208f8ce11e7d89da3f5383001600144508cff3188480cb2d6238976443a90661a81927fda716fd01e70301c0f34c70e0adf3b24b7c4d4e3c9c57c5d78637429575339a45c2ab9bb62fecf0653ad309a5c0de1907101a59889e81de673a204907f5b37a1589d9780f21c1a600e4c0ac506cb51dd388c46a32fd3583404ea1aec446b5ffc27509c52dec056dd6db61fb0e495d874f7e52f62b8c4ee9b50a3e009cb3ed6bdd79f351b00b12b3e3a9fb6d706e4277b8af9c2bdaa647d3b0d4de71f896193e068a9cfa205d4f9be30103b5db925121d0a065a5dd25f8df0603d849274c38e360a563375c00dfae64d014d50e115ce6c1064774c007cde0151bc0a81de9faca8c4161d086b1ca9be548014de58dd6af30652b4d5e2a7cf4c48a04cb5ad75baa86482dfaa21b53fc7a8c11e928b16ce89926776bf0392c9a2f9a758788df470e76bc5b4c22f321ab1d05878ee5323a46e9208d81743c3bb4924195bd2c735b774ee3e83857450fc0ee05bf01678ba4466e8b2b9144a2b567effa08c2334d211dbb176253770d762f8d1ea4e00a1a911b07d39f7be483264edd2b292bdd0ee2d4f4d65c76778164467d1bd8780007d4593231dff2a2c1c07904283c534fb18a88010aa84bf129495c7fcffb01be6520a969eb740def7e5b5d67f4a014842b4b1daa887a3589c9091190c25b3f31e7c31da39bdc454800e5b71f650d39931713fdef66bd2e3263318f9865a26cb95e5fe3b4d4fd29aa5acfb700126a4f1743c2ae720ae605167e4287d7316f08f9240360fcd37e83b0ff464e6137a7402644c0e6a01adef9f15e0925397dd19a27", + "sign": "a71e3f53a42975bd24ed7a502a5e5e9f58638c5a9c6c0f0057b524b5e85a509339f6fda716fd01e703010e277b07b4ce81ec0ecbcf02e750340e71de9664cefc230583320104f3e5afa8f8ba02cde3d824a525481841d33d34a180b1b85a6926a57007aa194d91462c1900e1d4726826f5d302bd07bd9128f998d29459caa58d44a142af848c3285d4733b8c4f2dc5bb3d7a92fbb38d22fdb8cb865c33ef0cdd0a39a03e536358a0810ab4b64e179811b883fe541d632c8e9708d1368bd45516c1ead445a16bd6efe45638004d4e9e785199865ef154ebed063cfc54f75dc6b2b5bb0f5e5122294710d5c735d132fbdf056f4ac52632e52d6ddefe06e09d4600d95956429a025dcedacaf64e01f242dab78df5bbd99c13afebf3bf6384804c6937637f652035df884d7ab618b103990e47ae2031f6086dbbcbe5788ab6adf6006d975eb25e35e246d3e42b4dd1979bd5dc8446fcfcdf37c34abd688646e90958e3ab1eb7404cc30e1233941ce1005f879ba1692f8a7c220270d50a49b0fdfe3f54661f7c8ec3304af577e26901796ddbc88d15660b8ac09e7e499d81de1e353d52cf9a76bdff14acbf12e5ea62940160bd88e15697b469f71d4c2a07ff3445d16d2fd25b7032b75477ccb4e518d365b912b6908971d3f925936902df69a74c9ffe7c8e2566a0c3e3d096d3249745756337df3aa872b81ec07292a8b4670f1c12eaab720f5b14fff55b73711d698aee1b9096771a1b44608bccba5c9368d59e0dae282d813830ade20153dfc6520dd87b0d92e28a3e2a9959199ec81fa7549e2fa35a5a40f8ce3fffc7155d46aab331fda718fd030a000500020047304402205ac43aa282c21a606d20faa5945041fcb0618c29e78e2c3ddc82dd98059bc1a6022063dc5a6fa71d197c45ea649d7ddc54dc7a8f7164fecf83066bf79db9b582499101002102d825a26dfd87b12ed9d2429c1ead1e99702ff600994fd4e4248fb3ae82f7546b000400000047304402202f101c192772b09d0ef18240dc2e94bc892e9650c6a244d9fbbd441f661043cd02200796ed22c6f241e9cee4f3da341bc69b0160f6377ef84cb7a22088b0117ff1ac0100473044022045a0c159345313c9ef47ef2837dfddcb4818816e9a3aef88e5aacdbacf67569e022013055a596ac3e66a7448193a3eac80bb975cff4a28243025f423d82b85ed73680100475221021578e1065469afe4410759fbd5c4179e7c7de6c90adf485e562800df8e9f7fba21028576fa997a47e2035970bcad5bbc1487dfac668e9a3321b23b5a71da187731ee52ae00020047304402206e9fd2591459f9c9a1f767296380041fd8f46215bdb529937fb6e67cccf91a960220259db8c77a96190004f5eb6c1e49a1e905c69e5032f8868d39835bb9de56920d010021030bb7513dae0d7a578586b1724cf8e7b43863ee0c9ca85749be8aae588c6e41320004000000473044022072a2f589f133dc9e30de1b52aa1a7b555c69a7d2a4d5e8e6d11d45a14e805cc10220052c8d881042a2f35d8f10f338f1f0f067f96261b98a3725d7449312e2bd6b7a0100473044022074309bd6d2bae386e76ecbe67f609ac17467046dd923b6daed835593ecef57b902200ed0b5e706c37c8e061a1ec69f8e062ee7c9d963877a9f6442b85cd99425ef2b01004752210245a6d05b9ca7483d07e02f2ea81b4553be16e316e1224f966dfa7644a1d4f31b2103777a69dfaed1c8fef9fc392917fa9b17b11d1db6a5a4322e0ea4c19ff03199ce52ae000200473044022056a74be6a524659efd3bbc839997b33487db697738e6bd648e389259ff3e64d902203a63aee2e585c3613514336c9d90564f9951b0c61a5014ca0660748f21b3b67b0100210275e3846d26e6b53476d6ca3f71bdce09e82721235300f458732e74accb434ece", + "unsignedTxs": { + "fundingTx": "0200000007645d327e988e9b47faa0d6655faf6c14696609bdd7503ca8902035c0857808760000000000ffffffffbd0d6d6bfd3e42920a5df2445ac9855087c58598d3ba03c0e4b143a7a5062ebc0000000000ffffffff4abd27be59378129207e053e8215029ed3dde1baa1e4442ffc65716bfb8ebeec0000000000fffffffff9eafef1f3e2dd8c5c1208bbe89fe583a8f1fff24b29d4f2bb500e64ad80a32300000000232200206e0cd61629b341aed915fa04a2ce396ddda2e39ecc60b2a97bf6347392460989ffffffff77c84a2dc849c10519c6057f2befb6505839126cf54d73600dd084d5dc0023b30000000000ffffffff255cf4f0cc47cd0a18020938662eca3be20329af5e6e523b99c65617cde304b10000000000ffffffff9d50407203ff654cf858a603a4d3d8ea93271ff99345e9ca1cbcc7c9a8c8db5a00000000232200206a5e7b1e1e04402c3529932fb38d6c8dac1d1238e3208f8ce11e7d89da3f5383ffffffff0352c5eb0b0000000022002019d1ffd612d21c6e2877d929164f7ec7bf8570c802d403e7a7fdf96ca2775081d4dda43500000000160014cf9d319581771696ee3eabacb1dbb7b8405c8a61579ce111000000001600144508cff3188480cb2d6238976443a90661a8192700000000", + "cets": [ + "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff0100c2eb0b00000000160014d16d168e48c92c577d610042d4e2d6911e731ca201475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752ae64000000", + "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff026b7de60600000000160014d16d168e48c92c577d610042d4e2d6911e731ca2954405050000000016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab801475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752ae64000000", + "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff0100c2eb0b0000000016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab801475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752ae64000000" + ], + "refundTx": "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff0200e1f50500000000160014d16d168e48c92c577d610042d4e2d6911e731ca200e1f5050000000016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab801475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752aec8000000" + }, + "signedTxs": { + "fundingTx": "02000000000107645d327e988e9b47faa0d6655faf6c14696609bdd7503ca8902035c0857808760000000000ffffffffbd0d6d6bfd3e42920a5df2445ac9855087c58598d3ba03c0e4b143a7a5062ebc0000000000ffffffff4abd27be59378129207e053e8215029ed3dde1baa1e4442ffc65716bfb8ebeec0000000000fffffffff9eafef1f3e2dd8c5c1208bbe89fe583a8f1fff24b29d4f2bb500e64ad80a32300000000232200206e0cd61629b341aed915fa04a2ce396ddda2e39ecc60b2a97bf6347392460989ffffffff77c84a2dc849c10519c6057f2befb6505839126cf54d73600dd084d5dc0023b30000000000ffffffff255cf4f0cc47cd0a18020938662eca3be20329af5e6e523b99c65617cde304b10000000000ffffffff9d50407203ff654cf858a603a4d3d8ea93271ff99345e9ca1cbcc7c9a8c8db5a00000000232200206a5e7b1e1e04402c3529932fb38d6c8dac1d1238e3208f8ce11e7d89da3f5383ffffffff0352c5eb0b0000000022002019d1ffd612d21c6e2877d929164f7ec7bf8570c802d403e7a7fdf96ca2775081d4dda43500000000160014cf9d319581771696ee3eabacb1dbb7b8405c8a61579ce111000000001600144508cff3188480cb2d6238976443a90661a819270247304402205ac43aa282c21a606d20faa5945041fcb0618c29e78e2c3ddc82dd98059bc1a6022063dc5a6fa71d197c45ea649d7ddc54dc7a8f7164fecf83066bf79db9b5824991012102d825a26dfd87b12ed9d2429c1ead1e99702ff600994fd4e4248fb3ae82f7546b040047304402202f101c192772b09d0ef18240dc2e94bc892e9650c6a244d9fbbd441f661043cd02200796ed22c6f241e9cee4f3da341bc69b0160f6377ef84cb7a22088b0117ff1ac01473044022045a0c159345313c9ef47ef2837dfddcb4818816e9a3aef88e5aacdbacf67569e022013055a596ac3e66a7448193a3eac80bb975cff4a28243025f423d82b85ed736801475221021578e1065469afe4410759fbd5c4179e7c7de6c90adf485e562800df8e9f7fba21028576fa997a47e2035970bcad5bbc1487dfac668e9a3321b23b5a71da187731ee52ae0247304402206e9fd2591459f9c9a1f767296380041fd8f46215bdb529937fb6e67cccf91a960220259db8c77a96190004f5eb6c1e49a1e905c69e5032f8868d39835bb9de56920d0121030bb7513dae0d7a578586b1724cf8e7b43863ee0c9ca85749be8aae588c6e41320400473044022072a2f589f133dc9e30de1b52aa1a7b555c69a7d2a4d5e8e6d11d45a14e805cc10220052c8d881042a2f35d8f10f338f1f0f067f96261b98a3725d7449312e2bd6b7a01473044022074309bd6d2bae386e76ecbe67f609ac17467046dd923b6daed835593ecef57b902200ed0b5e706c37c8e061a1ec69f8e062ee7c9d963877a9f6442b85cd99425ef2b014752210245a6d05b9ca7483d07e02f2ea81b4553be16e316e1224f966dfa7644a1d4f31b2103777a69dfaed1c8fef9fc392917fa9b17b11d1db6a5a4322e0ea4c19ff03199ce52ae02473044022056a74be6a524659efd3bbc839997b33487db697738e6bd648e389259ff3e64d902203a63aee2e585c3613514336c9d90564f9951b0c61a5014ca0660748f21b3b67b01210275e3846d26e6b53476d6ca3f71bdce09e82721235300f458732e74accb434ece0247304402201d08f3269898bee11940c51116231dce9ad6a8ce85a8f584c4e53564f797122502200cd7ca53af9c97a5b7976b1c357f450ffb7107cfd9c5f0b489a234141024c41d01210331e7862ab28175ad5b0bce923746d729a1ff0f390f2bc29e0e57b3b44f9ed290040047304402203a77bdc631da713646046429f78296dfecf5370f45557a5223f414ac94055f6b0220599c03d26079f4ef1b7db4f9d6f556696b53543d984d7e8dede8b795e94bc4480147304402201f3579b3b120b3a3a1c8b45a80ac7251c24f059a6b3472bd92ef67e5cef53dfc02201a292cf258c99a1e18cf00df8f6aa7efe6a0a7e27ea5500a0e699967ed234c140147522102c82f46f390318fddefefa0cde40b08e1f953ae031e7d9bf8936f39e4ccf8071621033d9cc3a39962219d6d0ceb5bc95d185ed2fd3acb55fdcfdb215d32ea139536f952ae00000000", + "cets": [ + "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff026b7de60600000000160014d16d168e48c92c577d610042d4e2d6911e731ca2954405050000000016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab80400473044022003b5db925121d0a065a5dd25f8df0603d849274c38e360a563375c00dfae64d002202c5ddc36dcf45bbfecff4df2be61037d91d2fc4239c68ad824c412ca1477724701473044022047966942750888167d47f8b741163609a234b67f18f31b0677b447ffeeccf1d002205e2ac7db3b2fdce243ec0a3474a26a469d9039bea36900a27ca8503d0bf7282201475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752ae64000000", + "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff026b7de60600000000160014d16d168e48c92c577d610042d4e2d6911e731ca2954405050000000016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab8040047304402207a6fe0ee368f0df42d72e28f8b73454e72286af6504123c83eccbfe99b5e833a02200328ac8d6287b5acce9b8b15e3e2349b256e761e4d2d6ee186b6ac841346cdc50147304402204d4e9e785199865ef154ebed063cfc54f75dc6b2b5bb0f5e5122294710d5c73502202355b2c2a2704c241f49e3b3976819d3b3a1818e1006452f84dcab4682bbc6ab01475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752ae64000000" + ], + "refundTx": "0200000000010177bebb2c11f5b00a09d932df3fc54ad6ea727a8ce22ad4a1e75b05fdc6d4079e0000000000feffffff0200e1f50500000000160014d16d168e48c92c577d610042d4e2d6911e731ca200e1f5050000000016001454b9a72660a7eb9e81683bdcbbe153aa54dfcab8040047304402205e5fe3b4d4fd29aa5acfb700126a4f1743c2ae720ae605167e4287d7316f08f90220240360fcd37e83b0ff464e6137a7402644c0e6a01adef9f15e0925397dd19a270147304402201b9096771a1b44608bccba5c9368d59e0dae282d813830ade20153dfc6520dd802207b0d92e28a3e2a9959199ec81fa7549e2fa35a5a40f8ce3fffc7155d46aab33101475221020b1d37df371df65c580a00ef045576edea07d9c3c1d854c252d374265677841d210354843a793817c3c0c20abbad36a6fe1fb5dee90ce8c20153110ee7cf95d5cef752aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "774883f8f5e9a90358931babf3f8e21c80390b38f7297591052ddde70d391c0e", + "nonce": "edde48eeb804f3ad837e261f4bd8e63d79e6a217e47057ec476b0eb397875c71" + }, + "contractInfo": [ + { + "preImage": "-7523843641052986142", + "outcome": "b79ec07dbabe921db0a1d0115021ab7f6bb2e19c9e7e95cbf7290bce9f31d894", + "localPayout": 185029507 + }, + { + "preImage": "-4445545161092506618", + "outcome": "191c406d4244a023aaad48d6d3a2080fbefaf68d2812f4178fed04c265507c89", + "localPayout": 0 + }, + { + "preImage": "2090594754685762064", + "outcome": "1c682c4e605b2179d9693567c97fe0ac7f2322fe9ea3e68b46fb272033686e86", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "191c406d4244a023aaad48d6d3a2080fbefaf68d2812f4178fed04c265507c89", + "oracleSignature": "edde48eeb804f3ad837e261f4bd8e63d79e6a217e47057ec476b0eb397875c7155401dd9045f45d9aebd376417e8e4fa005e7820f9f09b25269c372dfe7aeaae" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914d8ffbe62d7a9803cc290f5d43828489240f4b90a8700000000", + "idx": 0, + "inputKeys": [ + "7fd28fb0afd7244e154db929b7ca9cb2c3800d5ac1f92ff5d07454744e62db08", + "44464edf93390a21fb7eb8c63fb3d0dedb1ff0e6e621de92b76939ae0bbb60cd" + ], + "redeemScript": "0020980bc8e5040c9069cfd67f70071259f48064843d50923d1c72012980bdec24a7", + "scriptWitness": "0147522102b91665a5ca5a115574006757a23c0a0cee185592b3eb92454db0309b7b1c62962102b81e7baad35f27cf268da156a45a77eb7f8614d022829f63a8187cd0d7c4527152ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600140c14e4f15dde30a39f847182b7a143a85beb32b600000000", + "idx": 0, + "inputKeys": [ + "81a6a3e7a97d5f5bdfbd2e48815adde5849dcd856ebf9c1a01a4a4267138e494" + ], + "scriptWitness": "02002102b8c6bf6fd37ec0a3f945a25965b75fc3ec6998cc57f1a0619c23a723c2ae6fc0", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146d955cf936cf9857892b43f61c4b4ebdf1189ed68700000000", + "idx": 0, + "inputKeys": [ + "9b333f43c0cf1479ff17442a454a2a57c5fcbce663331f8f3ef6d831b5818c13", + "b63f4953a5d45fb3c2f648dca2ec62b272ce0809c96e1b0fe3608a1a45c0127c" + ], + "redeemScript": "0020612a40c29b0c30fe97b232116a200f6b0d01ec589206b2aa392a98ebf0766cb1", + "scriptWitness": "01475221038771868e6fa41e324530cdad446888180b70e4032cf9db8ea704a80a6826c798210327b49d02cf6fff4cf21154230577fdee32bbb9cbae7928275806191ac836b56752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140b42949c33979579985ea6c4173a376060fe908d8700000000", + "idx": 0, + "inputKeys": [ + "38ee9c60cab4f222881a62b511501c455ea694e6b8f77908e9c656a5c8484639", + "42f4e850ca44133d89a5cdd1f1aafa0b6644bbb3bf0f10e11405862269f0677d" + ], + "redeemScript": "00201a8eed15b0d2668022ff5c51cd89f1143c48955bda7b0794392a2fe17c801674", + "scriptWitness": "0147522102e33e5895f7d8ee13ec97d93f9f654b78222e2dc16a94b5f0ce589067c40b0d382102ca7707dfe58e40503e884f7d035a55b78891f5529415b0bca2df0fdaaede724752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001476d4319de3966aa2cc63a9b0973243c66b8781ec00000000", + "idx": 0, + "inputKeys": [ + "664fbe85586dc012106cafdce17796174430931d75d4c1f1cc6e5be783a8d3ed" + ], + "scriptWitness": "02002102564736006c263633d153af9df51fad6a7bbfce1116d507c9fe0693fa46849809", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qzyt8z236593klh4qvlh0jkrtm5zdw436te7tym", + "fundingPrivKey": "b116a833f8c6764a2bed5084714cb305ba39a51d98dc1a0035ae2f6960d852e1", + "payoutAddress": "bcrt1q7zd5crs7xw6rkhwp32k0ky2s46k7k4xm2dx0m6" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209ea8b9632efd7ec87c13fe52a12ec31119ee6f6b402b022a1ae4987de335a86d00000000", + "idx": 0, + "inputKeys": [ + "bba2ac6330f28d73ba4637bd4f950b902b9cf70815a13fc6ec55d93168548cf5", + "c692024472eba489773d6ccd58c4a093d046e3ac821c3bfee2dc5ce7eee63bb4" + ], + "scriptWitness": "01475221023d40afc1ddd96aacb64568a1709a382742d070d9ed4fdfb8302663ab6c7fdbbc2103e97ab90d72be626280ae5f6cfb4db1c6721f1df86b9394172109969e48245c8a52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208c9cbfb7d42cefeffef2142fb591e97862c497ed599bf67c0524c9a9d699ac1000000000", + "idx": 0, + "inputKeys": [ + "6b8d5450af0e31e3469af5fa12619538c8b6d58fbfeb60e1b47c4c1b38c41820", + "814e87a754f9c57999a6ae31a2e34820ad8aeb6f2b3fa0f17fdea21b8441a00f" + ], + "scriptWitness": "01475221020725a4d5d54858ec446e7fce00d8049f96ca46d6050021f4eaf66108386204452102dfd5add1cbf5dc7ebf1b7183afeaab58b6ae34bb5408bb96d9859debc20539a152ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ee3231328f054de70556f2782a82d5c93d62856e00000000", + "idx": 0, + "inputKeys": [ + "7ccc893fdf5e0ded5686fdef03ae25797159a42180bebcb8e5b06cb07482b0d7" + ], + "scriptWitness": "02002103519b6c6cd6be045eb50a9fa97c3941b54d81d664cd6a5ac9895d6c6c91761045", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208f0815e4ec5875bd3cf4de2f11a1d79d7264d770eff03073dda6bb76d16219ac00000000", + "idx": 0, + "inputKeys": [ + "0be433de235d347d9a29a073699f2365bf8b69e34f03b53c9adf9921ac4ba834", + "1ab45c81c4645b89ddd7bffc92bf8324af2242d3f6c2857f9273a4a947be89c6" + ], + "scriptWitness": "01475221025e93aac098b8492dec17ae42398bcb1c9d707583c68d3bf504c29ea41733e7ac2102220b40002135c17af5cbce9d94ba37214717527e2413d0e4ffde54ca524b06ce52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914f94919fd0333705b577c9e7292b21a637c02707f8700000000", + "idx": 0, + "inputKeys": [ + "c0ecc2ac21c8775a5346e3526335531e2a42b039facef56caf4d2fe7dda220cd", + "1d4f324496a049e45fcf145758ec76184cf6d60f574824cd2122ea83c935b3b2" + ], + "redeemScript": "002016745baaf025979c4a812348920c1dd33965c02f540785f6dd547d11350284a9", + "scriptWitness": "0147522103a13175c90dddb73d586dd7756b788e64a98b97afb6ae0c1e2e736de6afbff56b2102c7ce0f63b1b85f76ef728e7d25780f2a3b471b6c0b116580ee4eef9696b850cb52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qcugqqkhmrtcyttt3q7vrrukqnux2uqs057uw9k", + "fundingPrivKey": "38e649d06e4ea60f32aa6a987c923383952f08b815af894bd974f6ecb1870b35", + "payoutAddress": "bcrt1qf3d84fammvff2kr08lt4q8hz8m5mnchk2c2ext" + } + }, + "offer": "a71a0006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910ffda7105703142d37353233383433363431303532393836313432000000000b075383142d3434343535343531363130393235303636313800000000000000001332303930353934373534363835373632303634000000000bebc200fda71240774883f8f5e9a90358931babf3f8e21c80390b38f7297591052ddde70d391c0eedde48eeb804f3ad837e261f4bd8e63d79e6a217e47057ec476b0eb397875c710335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f00160014f09b4c0e1e33b43b5dc18aacfb1150aeadeb54db0000000005f5e1000005fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914d8ffbe62d7a9803cc290f5d43828489240f4b90a870000000000000000ffffffff00da00220020980bc8e5040c9069cfd67f70071259f48064843d50923d1c72012980bdec24a7fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600140c14e4f15dde30a39f847182b7a143a85beb32b60000000000000000ffffffff006b0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146d955cf936cf9857892b43f61c4b4ebdf1189ed6870000000000000000ffffffff00da00220020612a40c29b0c30fe97b232116a200f6b0d01ec589206b2aa392a98ebf0766cb1fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140b42949c33979579985ea6c4173a376060fe908d870000000000000000ffffffff00da002200201a8eed15b0d2668022ff5c51cd89f1143c48955bda7b0794392a2fe17c801674fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001476d4319de3966aa2cc63a9b0973243c66b8781ec0000000000000000ffffffff006b0000001600141116712a3aa1636fdea067eef9586bdd04d7563a000000000000000500000064000000c8", + "accept": "a71cd3a3a9cce1762d1811f4fd2106e506a470b77359014c19759b2f5ace65dbf5a10000000005f5e100038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f60005fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209ea8b9632efd7ec87c13fe52a12ec31119ee6f6b402b022a1ae4987de335a86d0000000000000000ffffffff00da0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208c9cbfb7d42cefeffef2142fb591e97862c497ed599bf67c0524c9a9d699ac100000000000000000ffffffff00da0000fda7146000520200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ee3231328f054de70556f2782a82d5c93d62856e0000000000000000ffffffff006b0000fda7146c005e0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208f0815e4ec5875bd3cf4de2f11a1d79d7264d770eff03073dda6bb76d16219ac0000000000000000ffffffff00da0000fda7148300530200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914f94919fd0333705b577c9e7292b21a637c02707f870000000000000000ffffffff00da0022002016745baaf025979c4a812348920c1dd33965c02f540785f6dd547d11350284a900160014c710005afb1af045ad71079831f2c09f0cae020ffda716fd01e70300b57a2f984cab963c0fa815947ae48285f25c27381653d647f6c29e27ef4d070cef73817fdbc9625105945d8a8d8e27b01028ac6a7d3d97515f137f59e97da53601848118f52d2ad5b2a6f13ec9f892b429bb3ce7ee2381c35133b00daf1144b406ac849241e40121a8ab6b6b70257c267ef87b76217d682814e679aed26ca9c62d0cdb6749987e8b320e3b68451d73dac3df4c1068e7937dad5ec5d86982da5314019d911bb9437cf66a2617100b323b89edd7657288598253aba0cb3aed0c0bb94d3c966535cea0d0940bfb73863b73a1ad8d0bb28ade9007c471ee1a2964caedc401e6c7a68c0baf4576b57b37d6fdedc96aaadac7b53b4fe433e71d9dc505c42754ba1035945adb63c89deff61f9c225944989d5b593eb36bd326aac3f6b4dac37f8a3b6015488bc8a5c1e4c000efa565f3fed8ebd202559ee43da801c102b9f94c005391aeec08d274108df5b741920ffe4ed77c4d1d0af11c2787b50fd744e6bff98d867c09c7616d22c8b079a4cb7e74f761e227b7bd709a6a98ad648aa50a621c011c2faf46d1af94cc29a7149bc48596611a64df5bcdbdfcaa7edce75ab69afac7e701d52a44f369b7acf3a5cfe1c139aaf53085ab9361dcb0f41854a2d5bb72d9de1ba613a29ea05e9dd49202f756c48805a06be1412a4aa443a5e684b40705b96c7e1fc3c9f932500cab3456db39371d236a8ec00de8a89a1a387f850c3c38f026b10c22f86f45d7ed8b364f900b3905b2df067cc44c1ac3c145cc34a369c6bd", + "sign": "a71e40aa428612eb2655844bbbdee2ffaaf8d62c70c42226c0d837996dc986c06d9ffda716fd01e70301294af4a99290b2fb47a725c32d3b8d385f8b879f6060b6e39ad5b130a6878f7b6c8a59419fb74609b3e4740f0d914b8d9ecab380cf9c156c3e4e85d903f64d540021d701f524fb5157b3d867a0c1aaae3736ea40f5fdb3885d92a86f614907068cc4b06a4299a90ab1ef871a81672529d9b863bbc2c9939c14bb777b2d6a329364f1b80341d443d90698814fff1b79ca667829a8176dbbc5bc9aaf2695740ad7690071c78f088382a29ad0c74b068d856866e2cc33e4aa8f41ab2d95f829ec0dc781f0aa9b5b235438ddeb2ca88d6195be901c5dbe0fcbfa7bc7a3ad376e8586e32f0187fa7872752109d5f1f964518ff152fbcec3b15caf465555bff834789716f66bf6d42adf22012ca1470d6d20d73c2609b479767cee479bfd138b87be9c3d23990ed923c2738151050a29b4e55cd8f2e7972f4c38e7a2163c4bc46d271ef28a870000866899b5a64d5237a251b2dbdb4b8a7f5ec6058117489d18015fa44c0faba453afd19a03784fba273338c6cc9e07719da03100b138030594c9e94aac21eba501938c1ba9f14eaf776210e6158a56b8ebecbacb0e1f918384d029ac4a436a0b20421ebe78e0b8db7d809175e47333b29200368eac8c6a4692dddca3ab404dc308162346de357c99a66ef2b8a984480594683a563a2752cd0e1d207b1bee96b9cf29d10655bd81d25680e799e4dd7690998b83de47c346068419a95d68a7ef55610050853c67432dbf70f3bc533d75ce5c61abd45a470d4f31d2d3c57252e9b045fda718fd037b00050004000000473044022075c649ea1486ab862d84fb76395fc60ce00878f07050c328e06e3d9872bfe22302206829c1e8a19a4e86ebd65f93be3035c9a16c17d73faab368358862aea4139ef0010047304402207ba7b3952b32c5b240cb01a24362c4201b0aaf39a572b2468c17b4166544ecda02205b4dcefa57ae535b7cdc505604a53cdc5d1456a089507bbb370ece67f4cd4f0f010047522102b91665a5ca5a115574006757a23c0a0cee185592b3eb92454db0309b7b1c62962102b81e7baad35f27cf268da156a45a77eb7f8614d022829f63a8187cd0d7c4527152ae00020047304402205d0511cdb1219a1f6b76ec493e2a397cbd64b3726fb323ddce5e87210bd523dc02201cfe109e0aa6f057355d010adadf33f42d85d74284bcda0d580d09a4d01f3d2001002102b8c6bf6fd37ec0a3f945a25965b75fc3ec6998cc57f1a0619c23a723c2ae6fc0000400000047304402207ccd6c11b85f6997cdd17c1ab2dbc9c68b6d290872d3def0523ab3d03006009a022004571eeb38ed42b1d91979b009ac641ea75f832850bfd14184ea67680adb969b010047304402201875af040fbd29a0a022ca8fd2ede3042e0647f7b4512f941dd495f26f74dad002203652f7c9b34eb74863df3bd2ecbb21ec53228d8c1957da715e77ea87e23ae2f10100475221038771868e6fa41e324530cdad446888180b70e4032cf9db8ea704a80a6826c798210327b49d02cf6fff4cf21154230577fdee32bbb9cbae7928275806191ac836b56752ae00040000004730440220191d898038b8f3e3395543dd9107acadbef43817a25942e385564ed3077a1717022030fe46dea7ee4621d0835d1b9f0113312c70bea15afa15391d24a719661112ee010047304402203b3d83f35245a1c43ad870d336372df7999f6d0b39909b643ed9f13fdc22fe2e02205772dea8f4b08e442da24b46aab111650fa12cc2edc501e8b86324fc676e8605010047522102e33e5895f7d8ee13ec97d93f9f654b78222e2dc16a94b5f0ce589067c40b0d382102ca7707dfe58e40503e884f7d035a55b78891f5529415b0bca2df0fdaaede724752ae00020047304402202a72f71d142cae9d1c19ebaeecf109a4c84a58d672446d574bee555c7129c23d02203bdf99e0099c57c27cdd5622a4bf363de4a54341b392c8437719df6972dc10bc01002102564736006c263633d153af9df51fad6a7bbfce1116d507c9fe0693fa46849809", + "unsignedTxs": { + "fundingTx": "020000000a6e014266a8438486f984f0b951c85c66f652b3cb632bb02046c2ec9c23f6be490000000023220020980bc8e5040c9069cfd67f70071259f48064843d50923d1c72012980bdec24a7ffffffff51fcdc8caabc4e28b94bae3286611f5fafa00301fb02f25f34d16c25ef8167bf0000000000ffffffff3cfadc971871f1e69414f82cf9094300fb76e7d9cb49affc9d3a02e5a44498a70000000023220020612a40c29b0c30fe97b232116a200f6b0d01ec589206b2aa392a98ebf0766cb1ffffffffa5de1daa9bcd1509c34c1cdc3a2515f97f7059781a29c873f908f4ec4909f0ae00000000232200201a8eed15b0d2668022ff5c51cd89f1143c48955bda7b0794392a2fe17c801674ffffffff0db660f7e1eb8873d457cf0e3d342feab72495e68f6127bead006d42637066c90000000000fffffffffb80ee7e939c3f2340c36f063a3df9622ec49bbe4ad3c661803e539879943a3b0000000000ffffffff136ba30598ee9880bdfac82aa8de3ff36b9053088cdb764a71f64e7e02548f5e0000000000ffffffff340f4daa5ea94e7c97a395f4b1d10e41d0b8bfeb2ad68773b2a19179b1bb909a0000000000ffffffffd3ba184af9f6ad30be6b3263535d511fcca0ccf9b0caa85aeb79d5b7eea182e10000000000ffffffffaf88dac3506550419c5fabab909a206e176967ea95f91890bd40adfb3c72731f000000002322002016745baaf025979c4a812348920c1dd33965c02f540785f6dd547d11350284a9ffffffff0352c5eb0b000000002200202ca5ff36c3dc02ffb01da034d8022ca0e5b137c0236c98357370049a91983818eadba435000000001600141116712a3aa1636fdea067eef9586bdd04d7563abcdca43500000000160014c710005afb1af045ad71079831f2c09f0cae020f00000000", + "cets": [ + "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff028353070b00000000160014f09b4c0e1e33b43b5dc18aacfb1150aeadeb54db7d6ee400000000001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f6014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52ae64000000", + "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff0100c2eb0b000000001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f6014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52ae64000000", + "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff0100c2eb0b00000000160014f09b4c0e1e33b43b5dc18aacfb1150aeadeb54db014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52ae64000000" + ], + "refundTx": "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff0200e1f50500000000160014f09b4c0e1e33b43b5dc18aacfb1150aeadeb54db00e1f505000000001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f6014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52aec8000000" + }, + "signedTxs": { + "fundingTx": "0200000000010a6e014266a8438486f984f0b951c85c66f652b3cb632bb02046c2ec9c23f6be490000000023220020980bc8e5040c9069cfd67f70071259f48064843d50923d1c72012980bdec24a7ffffffff51fcdc8caabc4e28b94bae3286611f5fafa00301fb02f25f34d16c25ef8167bf0000000000ffffffff3cfadc971871f1e69414f82cf9094300fb76e7d9cb49affc9d3a02e5a44498a70000000023220020612a40c29b0c30fe97b232116a200f6b0d01ec589206b2aa392a98ebf0766cb1ffffffffa5de1daa9bcd1509c34c1cdc3a2515f97f7059781a29c873f908f4ec4909f0ae00000000232200201a8eed15b0d2668022ff5c51cd89f1143c48955bda7b0794392a2fe17c801674ffffffff0db660f7e1eb8873d457cf0e3d342feab72495e68f6127bead006d42637066c90000000000fffffffffb80ee7e939c3f2340c36f063a3df9622ec49bbe4ad3c661803e539879943a3b0000000000ffffffff136ba30598ee9880bdfac82aa8de3ff36b9053088cdb764a71f64e7e02548f5e0000000000ffffffff340f4daa5ea94e7c97a395f4b1d10e41d0b8bfeb2ad68773b2a19179b1bb909a0000000000ffffffffd3ba184af9f6ad30be6b3263535d511fcca0ccf9b0caa85aeb79d5b7eea182e10000000000ffffffffaf88dac3506550419c5fabab909a206e176967ea95f91890bd40adfb3c72731f000000002322002016745baaf025979c4a812348920c1dd33965c02f540785f6dd547d11350284a9ffffffff0352c5eb0b000000002200202ca5ff36c3dc02ffb01da034d8022ca0e5b137c0236c98357370049a91983818eadba435000000001600141116712a3aa1636fdea067eef9586bdd04d7563abcdca43500000000160014c710005afb1af045ad71079831f2c09f0cae020f0400473044022075c649ea1486ab862d84fb76395fc60ce00878f07050c328e06e3d9872bfe22302206829c1e8a19a4e86ebd65f93be3035c9a16c17d73faab368358862aea4139ef00147304402207ba7b3952b32c5b240cb01a24362c4201b0aaf39a572b2468c17b4166544ecda02205b4dcefa57ae535b7cdc505604a53cdc5d1456a089507bbb370ece67f4cd4f0f0147522102b91665a5ca5a115574006757a23c0a0cee185592b3eb92454db0309b7b1c62962102b81e7baad35f27cf268da156a45a77eb7f8614d022829f63a8187cd0d7c4527152ae0247304402205d0511cdb1219a1f6b76ec493e2a397cbd64b3726fb323ddce5e87210bd523dc02201cfe109e0aa6f057355d010adadf33f42d85d74284bcda0d580d09a4d01f3d20012102b8c6bf6fd37ec0a3f945a25965b75fc3ec6998cc57f1a0619c23a723c2ae6fc0040047304402207ccd6c11b85f6997cdd17c1ab2dbc9c68b6d290872d3def0523ab3d03006009a022004571eeb38ed42b1d91979b009ac641ea75f832850bfd14184ea67680adb969b0147304402201875af040fbd29a0a022ca8fd2ede3042e0647f7b4512f941dd495f26f74dad002203652f7c9b34eb74863df3bd2ecbb21ec53228d8c1957da715e77ea87e23ae2f101475221038771868e6fa41e324530cdad446888180b70e4032cf9db8ea704a80a6826c798210327b49d02cf6fff4cf21154230577fdee32bbb9cbae7928275806191ac836b56752ae04004730440220191d898038b8f3e3395543dd9107acadbef43817a25942e385564ed3077a1717022030fe46dea7ee4621d0835d1b9f0113312c70bea15afa15391d24a719661112ee0147304402203b3d83f35245a1c43ad870d336372df7999f6d0b39909b643ed9f13fdc22fe2e02205772dea8f4b08e442da24b46aab111650fa12cc2edc501e8b86324fc676e86050147522102e33e5895f7d8ee13ec97d93f9f654b78222e2dc16a94b5f0ce589067c40b0d382102ca7707dfe58e40503e884f7d035a55b78891f5529415b0bca2df0fdaaede724752ae0247304402202a72f71d142cae9d1c19ebaeecf109a4c84a58d672446d574bee555c7129c23d02203bdf99e0099c57c27cdd5622a4bf363de4a54341b392c8437719df6972dc10bc012102564736006c263633d153af9df51fad6a7bbfce1116d507c9fe0693fa4684980904004730440220288189404b66746cd5693b5ebeadb5cfe05d718039c22cf6f70befe291c65f51022022b2d4bb91dba9f3412847ff4d96f6448091f9fa68a7b83b3ddc6a7cc98b769501473044022056a1f3a7caf967cfc53dbb11a7a9e508c1f7e9d78cd14ce3827739be716ece0b02202829244733cfbe6074635577c9d22fa13abff48eb82b9a69ad467a3dcac93d3a01475221023d40afc1ddd96aacb64568a1709a382742d070d9ed4fdfb8302663ab6c7fdbbc2103e97ab90d72be626280ae5f6cfb4db1c6721f1df86b9394172109969e48245c8a52ae040047304402202f4aff1fad685dca2297d8c28a6d3ae3f0d6f3d126ccf01d77db0a4afd35f5cd022078376e465ceec3bccef1409024bb0045bd7018a8733234eb57334258b307cbd501473044022033ffa3bcb1cce8d494448228c7090293069df5aee5f1c4cc60129a63cb95d855022023ab9167673a023e82a64fc1daa3b848db0faa2eb1ee34ee1e3055ea9319daa201475221020725a4d5d54858ec446e7fce00d8049f96ca46d6050021f4eaf66108386204452102dfd5add1cbf5dc7ebf1b7183afeaab58b6ae34bb5408bb96d9859debc20539a152ae0247304402207e7e04284cf831555bed09c7475481b2e43180884aed4a1b3d35254b0700f1bd02204f73620b6df3c83ca6f6ad689904b36088020fe103b2cf67b0df98a241b2e7d1012103519b6c6cd6be045eb50a9fa97c3941b54d81d664cd6a5ac9895d6c6c917610450400473044022076f86dde28a258b6c11fe86079247b86a98e34edf2fc42a981f0f92dfd3a8c19022047aa7e190c30774b96c0be9883b7b05a85b3e15da1bb56e355bb48e98328720701473044022071b6ea2be942b01cbeab1c609011581b04dd110e28036283595ece073d1c19b202207379db3bb5c5ec35beb7db6b5e7afbb45408e12b70330946131a126c5a809dc401475221025e93aac098b8492dec17ae42398bcb1c9d707583c68d3bf504c29ea41733e7ac2102220b40002135c17af5cbce9d94ba37214717527e2413d0e4ffde54ca524b06ce52ae04004730440220074e27a02257de90ec576b65a551fd0f47a7d974e484a0eff18c823f55b0a37802203d1e2de0efe78c740864f28651906940205e3697bb198aa708400c3a69cb56cb0147304402201d133f1a73ca574a8a4bb24ca2d546ea63d444f5d399a6df5d97a667d2b403c9022041498edfdc8c07c2a66b6bbe733b9676431372b820f88182ef5f8153ef40aa180147522103a13175c90dddb73d586dd7756b788e64a98b97afb6ae0c1e2e736de6afbff56b2102c7ce0f63b1b85f76ef728e7d25780f2a3b471b6c0b116580ee4eef9696b850cb52ae00000000", + "cets": [ + "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff0100c2eb0b000000001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f604004730440220676279eb2b6c25602551e0af29ad070d8cc274e9bb6f045f8e65a1bc25f06c1502205d4d0ad8ee3236a088ebb3c105373bab8b603937a91c53c72ae0575551c421f5014830450221009d911bb9437cf66a2617100b323b89edd7657288598253aba0cb3aed0c0bb94d02207925747a6bdd9ff8775d4dedbea18b34608b35259a8129801a14fbb2733669f3014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52ae64000000", + "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff0100c2eb0b000000001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f60400473044022071c78f088382a29ad0c74b068d856866e2cc33e4aa8f41ab2d95f829ec0dc7810220598748395a89820221099fe808d491092ce88c5c22363bc07fdb4d296907b6c40147304402206aafe3cb1d3ac3a29bc302d4ed2ef3395f30ae414670c3bed302668d957d8f3a02200cb4965a35119cfea7475d6df2879ac3f55432ec77f74f6502a6d05fe4943e6f014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52ae64000000" + ], + "refundTx": "020000000001013e981be30737b6acadd96a239d039ba65cac1ae4ff46bf954d0b9df34aeb09930000000000feffffff0200e1f50500000000160014f09b4c0e1e33b43b5dc18aacfb1150aeadeb54db00e1f505000000001600144c5a7aa7bbdb1295586f3fd7501ee23ee9b9e2f60400463043022029d10655bd81d25680e799e4dd7690998b83de47c346068419a95d68a7ef5561021f50853c67432dbf70f3bc533d75ce5c61abd45a470d4f31d2d3c57252e9b0450147304402206c7e1fc3c9f932500cab3456db39371d236a8ec00de8a89a1a387f850c3c38f0022026b10c22f86f45d7ed8b364f900b3905b2df067cc44c1ac3c145cc34a369c6bd014752210335da36d86892c5e9005ca5d8a12d8d351f9a05b46a5122a203ef0e75ccb9d94f21038a6d1669bd5ed6bc2513d02dd98ae4a636af71ab5b10b11994c3fcbaeffb150b52aec8000000" + } + } +] diff --git a/dlc-messages/src/test_inputs/dlc_tx_test.json b/dlc-messages/src/test_inputs/dlc_tx_test.json new file mode 100644 index 00000000..f38070b5 --- /dev/null +++ b/dlc-messages/src/test_inputs/dlc_tx_test.json @@ -0,0 +1,2899 @@ +[ + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "f75073b0f0cdf47d7ffa489cac65dde873d9a49b20d93055edabfe4a501c88c5", + "nonce": "181e26121e619264c382fae05ececcdd0ea21b669937d568cfbe2a5be30c7c58" + }, + "contractInfo": [ + { + "preImage": "8200200127641297992", + "outcome": "d1da3fcea2fea9d819b42670be7fd737cbfc4894ee90cbc325978c6b6157dc80", + "localPayout": 0 + }, + { + "preImage": "-2406860476414668446", + "outcome": "a4dbe52f588d64ed30fe70846682cb5d31d55da391c9ea061b2fee74e2b0c090", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "a4dbe52f588d64ed30fe70846682cb5d31d55da391c9ea061b2fee74e2b0c090", + "oracleSignature": "181e26121e619264c382fae05ececcdd0ea21b669937d568cfbe2a5be30c7c5866fe4a716c7769d44e9f96972626eaacccb1d6cde4c944e17b814a3c8ec7c96f" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001491cf755b8040280ec2cbc624ba2247ad0776bfa100000000", + "idx": 0, + "inputKeys": [ + "7114dd8ee71b609d7e0cac918462cafccb4306b417308994122f78a1d5e6ea44" + ], + "scriptWitness": "0200210268c04f8a0a42a0a9f08e3afa15702dd8f9d46bb5e583c1b8a0f86f11d317d3b0", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qvdjalfg0rqssvh2tkcum8vxgk050hxqpzd7n59", + "fundingPrivKey": "76d6a9ce05e355c8f610cd8112e7bdf4d0108d2836fefc5226139f6c6f174448", + "payoutAddress": "bcrt1qcu8ymh5j7gg2evy9j25r6ys2h4qc5qxvnrgrs2" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b2962d17848f602ea2babb69d215811374de393600000000", + "idx": 0, + "inputKeys": [ + "61ed52090fb78fe8195f3420905c22642eeffe4844fdbf6201996f3c1e2e3f47" + ], + "scriptWitness": "02002102b7e5cb086674e34cbc4b7852d09cc7076f81b6b062924b902fd45327dbc821b1", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q089kdrttpsc6j22aptsskznw4zp7539wty9h3d", + "fundingPrivKey": "ef48817126ce52d3971678dd91f114193b9f303c6fbdd0ca1e912482d1df3387", + "payoutAddress": "bcrt1qs4wfdm4d0aazc9da6zd56a5mx6v87a409xsx4d" + } + }, + "txs": { + "fundingTx": "0200000002f591c27c8ed638995350d68e591d9076857056c7636a5ab5a952ee7fed29d7610000000000ffffffffa279eefe3fb35e4ff2d983c10d8a475a24b07da0bcfab84411d34359091e2b6b0000000000ffffffff0352c5eb0b000000002200204080ca072804e34842643f60162d70942adbd08c6fad9a4645627a39c6a8f2f9e1dcf505000000001600146365dfa50f1821065d4bb639b3b0c8b3e8fb9801e1dcf5050000000016001479cb668d6b0c31a9295d0ae10b0a6ea883ea44ae00000000", + "cets": [ + "020000000001013bca6ea51615208e45fea5216a0d1c2d324578bb9ef76b1c271d3edfbcd579990000000000feffffff0100c2eb0b00000000160014855c96eead7f7a2c15bdd09b4d769b36987f76af01475221027fe83dac71aa851fc2516c2ba15cc154946a39f8341571a2c1a090a75a77893f21036c1fbe19544034b25c3b37c8f5696f63ffa26a8d6abb62fbe15a9bb0898a8d2352ae64000000", + "020000000001013bca6ea51615208e45fea5216a0d1c2d324578bb9ef76b1c271d3edfbcd579990000000000feffffff0100c2eb0b00000000160014c70e4dde92f210acb08592a83d120abd418a00cc01475221027fe83dac71aa851fc2516c2ba15cc154946a39f8341571a2c1a090a75a77893f21036c1fbe19544034b25c3b37c8f5696f63ffa26a8d6abb62fbe15a9bb0898a8d2352ae64000000" + ], + "refundTx": "020000000001013bca6ea51615208e45fea5216a0d1c2d324578bb9ef76b1c271d3edfbcd579990000000000feffffff0200e1f50500000000160014c70e4dde92f210acb08592a83d120abd418a00cc00e1f50500000000160014855c96eead7f7a2c15bdd09b4d769b36987f76af01475221027fe83dac71aa851fc2516c2ba15cc154946a39f8341571a2c1a090a75a77893f21036c1fbe19544034b25c3b37c8f5696f63ffa26a8d6abb62fbe15a9bb0898a8d2352aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "55a9f7d5e5e83fcaf1a6f4c95fe2cdc710eb5d283dccf49a0a93aafcc0185c3e", + "nonce": "288c7ff0e2a4879e4e2e36c8b6e3cfbbda295d0c2b71e2723ef67a98b6189122" + }, + "contractInfo": [ + { + "preImage": "7319200615978707484", + "outcome": "dae9c237b94f952218a368a3fdbb43d03f7cd29e3f20b9e481efe6d18020f86f", + "localPayout": 0 + }, + { + "preImage": "4756645126684352179", + "outcome": "42926b67351d60b128798627a9180255263860ff5643fd9810bdfc67e3928a6b", + "localPayout": 200000000 + }, + { + "preImage": "9034299618657372637", + "outcome": "1d734109f8c9785556ccb3db80232d3442c57a3bb580108bf0349ca6dbd33c69", + "localPayout": 38790487 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "42926b67351d60b128798627a9180255263860ff5643fd9810bdfc67e3928a6b", + "oracleSignature": "288c7ff0e2a4879e4e2e36c8b6e3cfbbda295d0c2b71e2723ef67a98b6189122c0b55a5e0b9c3aa9147f02588589b11cd6e25f1ac12de11b2d3142ac613ec801" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014c4fa69866c26f6cb27eb93dd30b3edfb484e8be500000000", + "idx": 0, + "inputKeys": [ + "9c35f87c3701cbfcd7a8e8cc7de430785e63736b065e1fac8d7281b710009dc8" + ], + "scriptWitness": "0200210346573cbba48f3d94f39706603ad9010c79832b37f0fbae6076b57ddfce78be2f", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q4h795g8x4s62xg294kumqrz766pcuawg99p2xu", + "fundingPrivKey": "20fdbb6a7de3ed6a9f37ce0f7f2ecd02dc0b164f79d895c6f0bf175d22671a77", + "payoutAddress": "bcrt1qpmpf9s702pgn05tz2zfctntrhp5satzj4h2s4d" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148020f45324d4512652f3da5723f70f2d76475ba000000000", + "idx": 0, + "inputKeys": [ + "e80ed3801783893a14f799a80da296bdd19b341e513478de25565054084bc33f" + ], + "scriptWitness": "02002102ba16f653d2f9018944de3a16400da050602444a6449b21d72894f5367921f631", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qg7vk97w67vhngnc207zfw0er8uglgym9zh92qv", + "fundingPrivKey": "e683e7086eb813f65ab28a449ae3b66700995de7cdc92c8fe4a907e0f18df5c6", + "payoutAddress": "bcrt1ql6k3h8chjzl3kev3r93q4vz5c02qeqsn6jt0dk" + } + }, + "txs": { + "fundingTx": "0200000002afc4fc793f9b44739e591cad49ef3b65ab6b28fe88e9cb79e380b4ef5ce63d830000000000ffffffff537f483141ac42baef6767e85dfc11da694109c058db29502fa6e26c75071de10000000000ffffffff0352c5eb0b000000002200204614d35a6de55248cf054f6153da6685271e4d3e1ee8c36f18be7af737c97af5e1dcf50500000000160014adfc5a20e6ac34a32145adb9b00c5ed6838e75c8e1dcf50500000000160014479962f9daf32f344f0a7f84973f233f11f4136500000000", + "cets": [ + "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0100c2eb0b00000000160014fead1b9f1790bf1b659119620ab054c3d40c82130147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52ae64000000", + "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0100c2eb0b000000001600140ec292c3cf505137d162509385cd63b8690eac520147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52ae64000000", + "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0257e54f02000000001600140ec292c3cf505137d162509385cd63b8690eac52a9dc9b0900000000160014fead1b9f1790bf1b659119620ab054c3d40c82130147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52ae64000000" + ], + "refundTx": "02000000000101288d05b93e014dd05d589f66972bc6be0012774d9526e17d54a63c82aca5c8fd0000000000feffffff0200e1f505000000001600140ec292c3cf505137d162509385cd63b8690eac5200e1f50500000000160014fead1b9f1790bf1b659119620ab054c3d40c82130147522102a0e57554e2714d863f1d4c15b4fc5f0a99e69336bf684d7298f9171d2e19a18f2102bd3728737e0171970c87a9142f719a32a0bff81f0bf9c93171f5eff62fd11d8d52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "9b901bbbac8b81e71310644639102cc675a6d669909e8c4b86670b176ea3e02a", + "nonce": "5501d984186f88c570ad98f9d81d8dcc2cdb88d49c65df6993a4f496e4680dc7" + }, + "contractInfo": [ + { + "preImage": "-1622030369901458720", + "outcome": "92fd68ff9c0cd3574301f2902ea3488c4d52987c2f9873367291b59d9adec1f7", + "localPayout": 110995412 + }, + { + "preImage": "7038199812558559489", + "outcome": "d94e885fc935906152d31b6438821f03d79a2cc54d519123b88965c58df0e727", + "localPayout": 63649671 + }, + { + "preImage": "8470821416703332139", + "outcome": "23223c6fbf3dc76fd32d728ac96de5463122fedc776f63d75ef5c933018e3ff7", + "localPayout": 169463715 + }, + { + "preImage": "-6987012607586805058", + "outcome": "c3be02d4edbd52d67886a019f7996e9f3865ba842e76f87b54eab07b3d2f5ecf", + "localPayout": 200000000 + }, + { + "preImage": "-2539659022645005896", + "outcome": "cf3966235bc3202c615ad4e5d9c71a6e238080f4772e433f3c05a154f914ea1d", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "cf3966235bc3202c615ad4e5d9c71a6e238080f4772e433f3c05a154f914ea1d", + "oracleSignature": "5501d984186f88c570ad98f9d81d8dcc2cdb88d49c65df6993a4f496e4680dc70cbe9cd5005765d371437dc04b47c1cf42b442d9b4bf5f1483d3b4a1c4263cb6" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ed5807aa5824c660a7f60f21cce636f1fb7da81600000000", + "idx": 0, + "inputKeys": [ + "52574de89a1ebb49653f74881186b9678935ee4edf8e5ce6e46d393722657e7b" + ], + "scriptWitness": "0200210238d81e28bee7aebdc27c529e3bdc0fdd8555a00ea3d2efd9aedc0370ab7906d1", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qf49m8f8wjmfm40ptpmg6d86klm5cnd3eay668f", + "fundingPrivKey": "ce270d3e2be099f4a6f614b2f1c89a2082403e5b54f7863cec8dd12a3583e045", + "payoutAddress": "bcrt1qz5ewjjdmhq32gpnrjp9nf0d55cex7cvz6f8m4a" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147aed80106979c197295b8c841287761f7d03dfa600000000", + "idx": 0, + "inputKeys": [ + "9fc78773574ba0ca9310c7263d5d99eca48160ad7e21c894e814beee1482214c" + ], + "scriptWitness": "0200210237dfc1290d45a6e28c4ebe98ca6a2609cf8c06d9c0c682f588b4e140cdc6daba", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qvqy3vpq2zp28qmdpj9nr05dakvjm7j5vf3hfhr", + "fundingPrivKey": "6968293db6772286d25e07bc7cce4120b33de8e9bcc9fd73a81cff7411872391", + "payoutAddress": "bcrt1qnzdn5hr5k0uevr7e4ujk7xtq69qd7m9l6ymln4" + } + }, + "txs": { + "fundingTx": "020000000201c719f7cc5f570c52e39a5d636456463a51f5fba665ac929a59ec4814878ff20000000000ffffffffc119dadc65bb28bd993f939718c8aa622d6879c064725cefa685e79135fbe95f0000000000ffffffff0352c5eb0b00000000220020958dc5bd0b9005ecf8ca4542d6fecd71c2d5e35aa2721ef9b9f8d37a45e86f7de1dcf505000000001600144d4bb3a4ee96d3babc2b0ed1a69f56fee989b639e1dcf50500000000160014600916040a1054706da1916637d1bdb325bf4a8c00000000", + "cets": [ + "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff02d4a79d06000000001600141532e949bbb822a40663904b34bdb4a6326f61822c1a4e0500000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", + "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff028737cb03000000001600141532e949bbb822a40663904b34bdb4a6326f6182798a200800000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", + "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff02a3cf190a000000001600141532e949bbb822a40663904b34bdb4a6326f61825df2d10100000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", + "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff0100c2eb0b000000001600141532e949bbb822a40663904b34bdb4a6326f61820147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000", + "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff0100c2eb0b00000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252ae64000000" + ], + "refundTx": "02000000000101ea24cec6ae48658294f30199bda48e9eda14a9b2b1fdd2d7e731d5fda28eebd30000000000feffffff0200e1f505000000001600141532e949bbb822a40663904b34bdb4a6326f618200e1f50500000000160014989b3a5c74b3f9960fd9af256f1960d140df6cbf0147522102968d16fae12d6f9bd99c5d1f46f69b6bc3b6ef48a35a72fcd75b7388b153bc692103c1b868f6591e57fd19a0f1ff5437fb7acf6e5c069aef0f684a2c5bac2ce9808252aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "d5f01ceebcf4b93f1391f0afa542e1822aeafc265282d0d7394e338d5c09d154", + "nonce": "5e78bc137672332988e8b52e16ae2fc55c9eef3458c524294bb028070efb2628" + }, + "contractInfo": [ + { + "preImage": "2076676570806623143", + "outcome": "7833ab29e8174973c07b6a6e0d6d8ed3d215c58387a5c9097c296385fe44ba0f", + "localPayout": 62765625 + }, + { + "preImage": "-4584218225950914765", + "outcome": "07f2daa849798a55aabdd7fac9ffa9d70b40b5c2764c257f65fa916fd8563b9d", + "localPayout": 71971251 + }, + { + "preImage": "-5004681866969112874", + "outcome": "7d0688dd20dec6ecacc332a8d40f2231a6fac759379f6724567fc76e631eb33a", + "localPayout": 200000000 + }, + { + "preImage": "5624571172014708739", + "outcome": "8b41ade47414e9b297a145796c03291ea84ff8f629c5d8bda597b8de7de6a05c", + "localPayout": 0 + }, + { + "preImage": "-4825975299734043269", + "outcome": "b1876b811a6fb10bf4f19dab399c98b143f236366193088840ba296f80f98059", + "localPayout": 195581877 + }, + { + "preImage": "7365669815691055680", + "outcome": "6705dd17f397fcc4d25e885350263e5eec4b47c3269081076eb7f964e07415c7", + "localPayout": 21069228 + }, + { + "preImage": "1458010264905361074", + "outcome": "ff8d561b40fbe8c860f44112d169b4fa9b732559ea749a45f7366b603badc0b4", + "localPayout": 55438035 + }, + { + "preImage": "-5206417675885659052", + "outcome": "e91c3f394d1c5519274e0301ff90a6684eafa29beb935fd4556d3eddc0567280", + "localPayout": 150852983 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "6705dd17f397fcc4d25e885350263e5eec4b47c3269081076eb7f964e07415c7", + "oracleSignature": "5e78bc137672332988e8b52e16ae2fc55c9eef3458c524294bb028070efb2628efebd6bbb254172330b26b3122a00f7319b0e234dc594a9671350aa2772507ab" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b8d5d463f013efe6cb58e33cba1de7c09b42055600000000", + "idx": 0, + "inputKeys": [ + "3675c661d4dade73533475222c4b608f0276be7de05ff88e8d1a69edafb181e0" + ], + "scriptWitness": "020021022594e21257e3ff15a97e6453fb12d3983ac9375f75ecb31a8b2cd629a6952e3d", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qpl683u20uum94lexxjaed7k4c3k7p9z8786w7r", + "fundingPrivKey": "c41df75b0675c45b184d6c954129cd25752adf9b1edaccfed96d954889b69e7e", + "payoutAddress": "bcrt1qln507r7ds5e8wp2vf9wxrkjme9rmx5fjmc4j2f" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014aa8ff3ddb376b7032d69d70f41c7e49595e16db500000000", + "idx": 0, + "inputKeys": [ + "4b3559c29d0b1f5cc4f61638e7b6ded66921afd96930a91d62f95073f4903c58" + ], + "scriptWitness": "02002103e34c2a857cec3478575cffde521a3e87883dd42fa9aa6cbd59498c355d58edb0", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qh36l9v3sdk4z83k0m8resgaxlvagulau0kfnrs", + "fundingPrivKey": "b6446099c43d36ea382a5b8d03e8132a23e55ccf6c3496d9eadfadfb862f6591", + "payoutAddress": "bcrt1qhz9nkqylg6xujzr0sjsd3nacdwn0883chcfkay" + } + }, + "txs": { + "fundingTx": "0200000002343bec49cf86168bf7fee6093bd2311a5ac4b3f2d7c5f54511fa5e448e31408e0000000000ffffffffa0fbaa7f55ca5e94a4b7d18aa82d077544502a18ce31a175383fad69cea348c50000000000ffffffff0352c5eb0b00000000220020694b3fbb6a39b70d8a8a972967335af50877f4514e40db5c68fcacf59dd2c66ce1dcf505000000001600140ff478f14fe7365aff2634bb96fad5c46de09447e1dcf50500000000160014bc75f2b2306daa23c6cfd9c79823a6fb3a8e7fbc00000000", + "cets": [ + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0239babd0300000000160014fce8ff0fcd853277054c495c61da5bc947b35132c7072e0800000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02b3314a0400000000160014fce8ff0fcd853277054c495c61da5bc947b351324d90a10700000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0100c2eb0b00000000160014fce8ff0fcd853277054c495c61da5bc947b351320147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0100c2eb0b00000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02b557a80b00000000160014fce8ff0fcd853277054c495c61da5bc947b351324b6a430000000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02ac7d410100000000160014fce8ff0fcd853277054c495c61da5bc947b351325444aa0a00000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff02d3ea4d0300000000160014fce8ff0fcd853277054c495c61da5bc947b351322dd79d0800000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000", + "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0277d5fd0800000000160014fce8ff0fcd853277054c495c61da5bc947b3513289eced0200000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52ae64000000" + ], + "refundTx": "02000000000101a42e80bd441077bc7d5b69d5581a239b061641051762442e1ac686bfbd9ba8100000000000feffffff0200e1f50500000000160014fce8ff0fcd853277054c495c61da5bc947b3513200e1f50500000000160014b88b3b009f468dc9086f84a0d8cfb86ba6f39e380147522102f412d2eccd3110db29588ab2bb42803f8370135f46dcbbd68b58738d5f336af42103c83f92088d3d3bca64da4d6f15467c7841e0242dd7a3eaa5968651cfdebc585e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "d653d922cb34dec6fffc2098717c391ffdc80b928277928430f5dec972a21b2b", + "nonce": "ffb83e40ae08865bd8083cebc24d1df4801e32f729315a825323b5d3718c3366" + }, + "contractInfo": [ + { + "preImage": "7631900657305541231", + "outcome": "f228084d38881379646c1b90135b1cafec5405e72df140dacb9c90267477d617", + "localPayout": 200000000 + }, + { + "preImage": "8023966992817187513", + "outcome": "4e7105f72a59e5a88b66de280214dd836f4d50bf3b9924327d14c744ec89676d", + "localPayout": 142265665 + }, + { + "preImage": "6393832948409354937", + "outcome": "dc215822caf4ea91cc0c4f92342e09224dfdf02a1f18a8e8f965d525287886cb", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "4e7105f72a59e5a88b66de280214dd836f4d50bf3b9924327d14c744ec89676d", + "oracleSignature": "ffb83e40ae08865bd8083cebc24d1df4801e32f729315a825323b5d3718c33669b5565aa4e1b56ee9d6da4ddc87e98eb3c2c0ac30dee1eb1386a8bb5b9550b73" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ed5a90596573bee762794e5558ab13bc7aeb104300000000", + "idx": 0, + "inputKeys": [ + "4bd4c9c038c9c6ba02032b10bf0ad78fb2c1b9981bb8258a4c4d49c59ccf3760" + ], + "scriptWitness": "020021026617b0e87571c54366f03293f1e401dbb941a2cb1990a982669929615e16b86d", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qe7rvn8fe2g20fl55z3fd54txlugcys8sq5x0xs", + "fundingPrivKey": "5f261ec3522b649aaab5b1d115167272d2d7d345d563f032095f607991511cb2", + "payoutAddress": "bcrt1q7r0v48mcnwzh442a76hnftpvvkcpmlazg9nauk" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020d7212370090862192b4e40d32472aee3ed66d844653671700bf4ad55d8ea928300000000", + "idx": 0, + "inputKeys": [ + "369ace68a8747d4f739dfedd90801654a7aa473f57ce59fecfe314233eddde9b", + "b58d9b4ba08ec7fb19a612f0cb2d78a0a22fa07e078f722e3d5ce2c204c40b1b" + ], + "scriptWitness": "0147522103fccf58836e6b26a41f918ba71eedbceffb901e6b3cd7f4b744af0a415dad20d02103f2e5fd859f1c6f94dfa84d70411210edbb8fb7e8b684cbd0986a102f02411b0752ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q4q3phg7thw4jfawluaz3xdfme7tqaxwj3ta5rg", + "fundingPrivKey": "3e7224f326e3fb4750f5aadf6f7b879ce7964691649048659b670d8d760e6836", + "payoutAddress": "bcrt1qwwkuu3klct4n2tr9fg6f82vqjcswmv653zgyh6" + } + }, + "txs": { + "fundingTx": "0200000002144d3c364ffb9d1f36388364e4ac0b808ca89612f1e882828f199f4c77dd16470000000000ffffffff78348a5d64f491cef6f3746893141a5c2cca69b81b37ae14f18e629d34d98d200000000000ffffffff0352c5eb0b00000000220020514894dd2d868e01c534e85536940f6457bfca01f6643737f42ab95fe8accd0ee1dcf50500000000160014cf86c99d395214f4fe941452da5566ff118240f055dcf50500000000160014a8221ba3cbbbab24f5dfe74513353bcf960e99d200000000", + "cets": [ + "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0100c2eb0b00000000160014f0deca9f789b857ad55df6af34ac2c65b01dffa2014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52ae64000000", + "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0241cd7a0800000000160014f0deca9f789b857ad55df6af34ac2c65b01dffa2bff470030000000016001473adce46dfc2eb352c654a3493a9809620edb354014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52ae64000000", + "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0100c2eb0b0000000016001473adce46dfc2eb352c654a3493a9809620edb354014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52ae64000000" + ], + "refundTx": "020000000001014ee5171f6005284ac9469458080990c4147616e27e0674b3e4386906832b07e00000000000feffffff0200e1f50500000000160014f0deca9f789b857ad55df6af34ac2c65b01dffa200e1f5050000000016001473adce46dfc2eb352c654a3493a9809620edb354014752210298a28c9aa28d7b3d5e7b12f9ca912e72510358f9ce84bd6cb9345c597232e2d42103b97ced82e0b25dbf9334e820a965fdbd233df1231fa9ddfdb59e7955c6b3b9fe52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "116479fceaa8125c5838cf970e58fdcfc5ccac9c6e7f1b7349e38b5c5720a102", + "nonce": "9ba77d9e25e9d148eb29128f34f6acd054ea385a48f47d6480226228a0cfc1ef" + }, + "contractInfo": [ + { + "preImage": "-8699234770448594327", + "outcome": "b0af554afcab8ef5f78fc2f7e3a166ba90b083adfa534a4fbb6f2170089a0141", + "localPayout": 160398403 + }, + { + "preImage": "-5501605811668115912", + "outcome": "60b2533db462537a95471c1b6bf2490083ae1341b75318c900c81ccf44509fcc", + "localPayout": 200000000 + }, + { + "preImage": "1663691386589006329", + "outcome": "47443c2fa737de6d35c7eb968b8452f46d451db85bc8128909386cc74175e5e2", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "60b2533db462537a95471c1b6bf2490083ae1341b75318c900c81ccf44509fcc", + "oracleSignature": "9ba77d9e25e9d148eb29128f34f6acd054ea385a48f47d6480226228a0cfc1ef3bc07a799d4814ccdd12531efdc0cf341d8bf2023a60f5967cde31fe0901f17a" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001426f319a023c976632cbcb2fb32cfef40b78e811200000000", + "idx": 0, + "inputKeys": [ + "e7e2d3e3149478994ac0a8239811d4e8225e6c328a2e88151746b53ec24eb145" + ], + "scriptWitness": "02002103f314c8286842b36b5011f88a910b400f1a4a6eec1871942dd2a294514e210e23", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qtsv3ks4zr5muj4tlschq08x7cydvmrme5ssuja", + "fundingPrivKey": "75703f8ab44f4ab4f839a23f4d05e682285e11ecc94c3916834104831a7f72e0", + "payoutAddress": "bcrt1qq9sv4cd3g2p6srwqr7v6hwgjslwx6dukaj72f0" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ff195578bc029342b6fa317c8f82654b9462f7528700000000", + "idx": 0, + "inputKeys": [ + "e9978b5bcd6eb4d835c8ef3f0307376a727fc1cd1d5775a7e9820cb86ad5eaf1", + "66b656f3d7a652d7ae444f1443efc42751489809b554f2a91d2eb8f847a3a25a" + ], + "redeemScript": "002066a4e16d1ac28a73c08f0abccc6f523c5d8790ab24ea6cf011e00f51527dee43", + "scriptWitness": "0147522103f691c4c0994e048ee2f3eefa04e82da78cc31fc6c14ac45b2865bce92ec47e1f2103ab58cde6bb56ed85b76a004e1f2617ffec7c9471c7537fdfb546c7ddcf8ee9e552ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qkmn5j3g9tsyl5sz0yhckkhp5x4ke0wz5meeegl", + "fundingPrivKey": "f364e6e95164c8141f5235ac83953e5042bf38db5522b5cd3dbb51811577559f", + "payoutAddress": "bcrt1qpnysyfxw2707t8frm0tr89nvzjutehalpfglhd" + } + }, + "txs": { + "fundingTx": "0200000002bace664506a8941fe8a30dc589567ecd350c0813f682285d94cc0fffade91ae20000000000ffffffff20725907ab8ba38d280c8c3507b3c15bf78ddb2aaf3dc360beb52bcd1b7e868e000000002322002066a4e16d1ac28a73c08f0abccc6f523c5d8790ab24ea6cf011e00f51527dee43ffffffff0352c5eb0b00000000220020342de835b6523d50f58850b27b9cc29a1b9d1f01d75e3e30f892859632d2b6b3e1dcf505000000001600145c191b42a21d37c9557f862e079cdec11acd8f79a6dbf50500000000160014b6e74945055c09fa404f25f16b5c34356d97b85400000000", + "cets": [ + "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff02437c8f09000000001600140160cae1b14283a80dc01f99abb91287dc6d3796bd455c02000000001600140cc90224ce579fe59d23dbd633966c14b8bcdfbf0147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52ae64000000", + "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff0100c2eb0b000000001600140160cae1b14283a80dc01f99abb91287dc6d37960147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52ae64000000", + "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff0100c2eb0b000000001600140cc90224ce579fe59d23dbd633966c14b8bcdfbf0147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52ae64000000" + ], + "refundTx": "020000000001012925ab00d81cea443059eb80d947d7ade2cc1dc8f069a29b8131a11dbaaa22af0000000000feffffff0200e1f505000000001600140160cae1b14283a80dc01f99abb91287dc6d379600e1f505000000001600140cc90224ce579fe59d23dbd633966c14b8bcdfbf0147522103427935bb2ade9310c88b5d1bd604cd41ea7b8183439c30729ef1afa3ca5c6cc32103d20948d6eda0a47b53f313a76e1187d5d9c4dba42fb44858fa2e3e024f857deb52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "2e47826381204b48aa52b3b9031ba05ec4a6f79c31ad904721ffd73dfb9db736", + "nonce": "10bd7a9b3e37d0e674daf1ce0145c66e643ad2bfb601a66e71cc19e2de33b95c" + }, + "contractInfo": [ + { + "preImage": "-5022698024122430856", + "outcome": "91fa0bf2dbe58e490c8e66eda7a09aae4d3b92f3afb49b33699dfe85232d8426", + "localPayout": 114977017 + }, + { + "preImage": "-9109724228812523165", + "outcome": "472eb657f0eec3b31d08de7d2c616d8c0e758b5c49557b584d9aa824c36a24b5", + "localPayout": 0 + }, + { + "preImage": "-3905123686520536138", + "outcome": "93266d9928fafaea36aef42e0a60c58e38af745864764b7ed64c2c2549ebcdfa", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "472eb657f0eec3b31d08de7d2c616d8c0e758b5c49557b584d9aa824c36a24b5", + "oracleSignature": "10bd7a9b3e37d0e674daf1ce0145c66e643ad2bfb601a66e71cc19e2de33b95cf8a6095be1cce5ab1ab2f871808110a83b6ba7968ef1c4747e81afd0f57a75e6" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ee218e39f0d782f37dc136032ba88cd455efbc502c89228727505068a8a6759400000000", + "idx": 0, + "inputKeys": [ + "36ae899c4bd1b7b75dd43509cfb44c17d12089092a0b48bfe7302d3a1223c521", + "d4fecba8339d66431dad1c979683ca11455f845e9ec7503a778f02c493f1126e" + ], + "scriptWitness": "014752210322c23e183a41568cb6c962627c61cde583fe8b5c042475ce0f9de0dbf839b7672103af604692e1d6946f03886f3b1a6c7700a1373d8606cbc06733f9e9f7706049ea52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qlmk3uxhfw0mutleje3nfmwlg62e42afqanrtxn", + "fundingPrivKey": "783e649f8c45c84dd14b414a724e070be9e290d62d54cd36977b6b72fb77878a", + "payoutAddress": "bcrt1q9srkh39v5sffn33h9gwzma2rrx5zvq7f9ze3gt" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014622bc990ccdd17b628c8f4c1d73d156cdd4efb9400000000", + "idx": 0, + "inputKeys": [ + "4f8db41d748de418bfc1467ba33fb1415e11436358d22ec9fee45b7cff1de18c" + ], + "scriptWitness": "020021037abe91043024a1a295c43ce38cd8adbfbe9c673e25699d19befce21064bd36ea", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qh2yqekmhnl0tdmupvv4tx5j5l5lwvuc9ex05wr", + "fundingPrivKey": "095abd0bbd827b55e3b744cabcc1840675cd8ef861e600a9360f2872609c0661", + "payoutAddress": "bcrt1qy3rhhdx4ssdafqf4j4l9a0slqtq5v74ae8yue2" + } + }, + "txs": { + "fundingTx": "0200000002cbcbfa44997b9aca00a908c9c9b984b487cffde2e10d833bee2f7b71fd1c722c0000000000ffffffff6ad59deb0745948dc2dc293581b953be37fcddff6236765a97be1f864d10edd50000000000ffffffff0352c5eb0b00000000220020b634d8a04ed3e69e23592a40f0d30a5dc1f8376ea57ef6a10423ffd896178c6455dcf50500000000160014feed1e1ae973f7c5ff32cc669dbbe8d2b3557520e1dcf50500000000160014ba880cdb779fdeb6ef81632ab35254fd3ee6730500000000", + "cets": [ + "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff02f968da06000000001600142c076bc4aca41299c6372a1c2df54319a82603c9075911050000000016001424477bb4d5841bd48135957e5ebe1f02c1467abd0147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52ae64000000", + "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff0100c2eb0b0000000016001424477bb4d5841bd48135957e5ebe1f02c1467abd0147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52ae64000000", + "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff0100c2eb0b000000001600142c076bc4aca41299c6372a1c2df54319a82603c90147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52ae64000000" + ], + "refundTx": "020000000001011f1ebe082e76966fd44f47cfb83d8d991b1561bc0837cc534167c126d07555770000000000feffffff0200e1f505000000001600142c076bc4aca41299c6372a1c2df54319a82603c900e1f5050000000016001424477bb4d5841bd48135957e5ebe1f02c1467abd0147522102db4ba9f9201dd401b192ff6b6f652269b35ae23c3225547948c63a9d780a24662102f61d8ab33b62f2642491b2b5ed71942a522ebc6315e90a8f02f4da7321a5397e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "4daac61d88197d6817671d47d228c8c5ae95fd146aa802af9042fdf586dcf51a", + "nonce": "7551570262f5cbc492337ed9072e6c83d292d4b08a0c85380f7fbca428ca7417" + }, + "contractInfo": [ + { + "preImage": "7343396950470698908", + "outcome": "1993b051d11fef552d09efbb18773b6e35de8f7dd577080f9fd25d68c8fc16d9", + "localPayout": 126847988 + }, + { + "preImage": "5063277641255111107", + "outcome": "abbe9b579c6026c17b7a88bf705c670bd83792b936d3992dd69bafe9e165df1c", + "localPayout": 0 + }, + { + "preImage": "188040828025985198", + "outcome": "d17bd6901aaf43f29be0a91dc5c43cb44d9997c3f14a9b36436ff1198901b1b9", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "abbe9b579c6026c17b7a88bf705c670bd83792b936d3992dd69bafe9e165df1c", + "oracleSignature": "7551570262f5cbc492337ed9072e6c83d292d4b08a0c85380f7fbca428ca74174d788eb7482764d662aba16ad9ef652b633c1b78b4d5a14a2a31b48598aba78e" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020b62d136c540e04148f673f167b22c702b6aa5555fed18621dbbf171e1a4f33f600000000", + "idx": 0, + "inputKeys": [ + "8c278e30bfac47ed1b6f263a1b9ca3174e11650399c9f8c3097ae002db436073", + "2e96ad551487f320d6d57987916ec2c06fbad8254533fb901468983c5e4c33f6" + ], + "scriptWitness": "0147522102ae476d016dd4dee4aaab5836f5c43bd65d2242ce77b963f274f46535c55a795c21035d341f860faaeddb8f2a6f2982b7fa07dbb8f96a3f8f1370df8b8e5ef121bc2452ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q0rt4g6dqu0l8nc9nmhy5g74dhfr9707w54fj4h", + "fundingPrivKey": "7f47e2885fff05e893a2a449d50034100186a9e6aa97dcb7a725faf20a5e2e8f", + "payoutAddress": "bcrt1qtgefw9entmyfeg2t5c99f48tmgy0xw4hp0jge9" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002090e01eb12abac099978f6256328ec7555e54fbbaf8d5ed17fee071ffb51b6e5e00000000", + "idx": 0, + "inputKeys": [ + "37257b3acb49573a9729d34d62d55cb24478a4f1e2ef3c0dc8f83cd078a185d6", + "9a9ebc527a71acfb010b8ac5d383d81669007397a388444c34e38ff1da685935" + ], + "scriptWitness": "014752210388afa14b5d0f8d1e4115a4e6e10fe137a723fffbb2ee954b2c270a1c14349d70210373b354c686732d302c1fd09fb19f97c7a7922f0bd882c79f551930805b59bd4152ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qe6v47jdm6leeyp2cnm5sysyws27hv6pl49yjrq", + "fundingPrivKey": "666a874c0431e4c0ce4e3ce8def1667771d5e696c87602fe769152a56fb3751a", + "payoutAddress": "bcrt1qgv9v82c72y4ny47pu40whlndqvev86a9hesm8q" + } + }, + "txs": { + "fundingTx": "02000000020639144f33ee539398d0819c4a341b766ad96b71e59bd910b20a54f386265ab40000000000ffffffff6d05a9cd32f75f02961c85dcd4b98c8170344bd7abf925bddf6c51cba75ff4fb0000000000ffffffff0352c5eb0b00000000220020537d86da4fb293aa2d1899f0d211f76211df942ae7773109f89b57eb5e0e203d55dcf5050000000016001478d75469a0e3fe79e0b3ddc9447aadba465f3fce55dcf50500000000160014ce995f49bbd7f39205589ee902408e82bd76683f00000000", + "cets": [ + "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff02f48b8f07000000001600145a329717335ec89ca14ba60a54d4ebda08f33ab70c365c0400000000160014430ac3ab1e512b3257c1e55eebfe6d0332c3eba5014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52ae64000000", + "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff0100c2eb0b00000000160014430ac3ab1e512b3257c1e55eebfe6d0332c3eba5014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52ae64000000", + "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff0100c2eb0b000000001600145a329717335ec89ca14ba60a54d4ebda08f33ab7014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52ae64000000" + ], + "refundTx": "02000000000101c749bf0626f7cac25118019c62aaf2584e62c14b7d1aac7b4350bc76a0897f9a0000000000feffffff0200e1f505000000001600145a329717335ec89ca14ba60a54d4ebda08f33ab700e1f50500000000160014430ac3ab1e512b3257c1e55eebfe6d0332c3eba5014752210254113ca54adcef44aced823d5b25d99f01307423ff0e7f6f419b8decbab4010c21029aa373aaa52b413561b954ebf03209118be149e68f8621dd20eae1f6119c77bb52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "4243769e10d6cfa4c8d74f2716df03611da16882628c5f6ac7c8381e35c31a72", + "nonce": "31c31c72cc3f076f696bbd5e45d261c2a9943a3977b6fa4977a7dbd0f090527b" + }, + "contractInfo": [ + { + "preImage": "1384705059680254057", + "outcome": "a505dd32c9c8ea8dc32cc310795732769dcdad8a9c3e35f0db871b893a85022b", + "localPayout": 130826147 + }, + { + "preImage": "-2787378124336014564", + "outcome": "c9c78caa337ba70e4887972b6d3ce26adc5e91e176fc9a7d60cfe0b01065fdfe", + "localPayout": 0 + }, + { + "preImage": "-1154462628261842555", + "outcome": "61762e94dfb0d1c5de0c425d6650f758fed3dcc3aa724afdf15d9aeac9116864", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "c9c78caa337ba70e4887972b6d3ce26adc5e91e176fc9a7d60cfe0b01065fdfe", + "oracleSignature": "31c31c72cc3f076f696bbd5e45d261c2a9943a3977b6fa4977a7dbd0f090527be15102b0aaba3e006ac36743461e9a0fe852da3475d9b5a45ebd04cbee486a26" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204eff971df2a1c65e583ab8c611d84b0cf97e0dec8cb7941c7b9558ba241463e200000000", + "idx": 0, + "inputKeys": [ + "ea8ee9687e5a43553e60d53a50bb15488417aaa97c0cacdbe18ad9072e175066", + "d64f77967332a309d5cba21f629df1de00c7ab6cbfdf778a0a4bc205821a0995" + ], + "scriptWitness": "014752210357c06a0e2236f06c0004499750bec34a4e80d15625103ba27905b33647a5b16621024eb265c00ced7551e68845f28a329625aab8f7c75b8dca59a5e8342d4a29c3c752ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qp0rrfz7s8aem637uhe2qv4jwrtqj5macvhkvpr", + "fundingPrivKey": "6eec1c965ba1d4c37dace6ed17dbce6ebb8c2fc71e2fb589cde1773c4dfb5749", + "payoutAddress": "bcrt1qvuymkxgpyqjaqgmcqnujjm2qfxvej29uuguwfx" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ce62f6df5280c1ef634472d4e11ee5386861895e8700000000", + "idx": 0, + "inputKeys": [ + "2014c3326ddb437ea5752daadf4dbedb446b98eeccceff9de7e6484f725d3206", + "b598058f126cd9486644e3d32fc424049c6fdb22ff2a4f5cee2f4ed21d119059" + ], + "redeemScript": "0020975bc0f2cefae1303897b20581e58f197199198a436d5148d1e625f25d8c2d2e", + "scriptWitness": "0147522102d4bdadd0adbd21029a3acfa26a512ef47d560f1002f931abafcb7c5d50f06e28210331a70df9017be103a82f82248a23d9619d35d54faaf1a5c8329532c983d24f8252ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qy09vuvp8m97ypqra9f5q3uf3nklnl0jv74cl5m", + "fundingPrivKey": "dfc62a1863c5cd8c0444f039def010dc33fc3ef028477a666ea85332542e2295", + "payoutAddress": "bcrt1q7j250qn8a26rr7puywrp9yrcgyy2jrn4hyfp3p" + } + }, + "txs": { + "fundingTx": "0200000002b2dda409b538ff0884f955497921a57f40805037f7e46b0044ebf5a0463a7d480000000000ffffffff247917f8f6df28998fd17e14d43eedbcba449077473f4cfb66d201ecb02ae2c80000000023220020975bc0f2cefae1303897b20581e58f197199198a436d5148d1e625f25d8c2d2effffffff0352c5eb0b00000000220020c0cd4f69998f123ad23700324ef2db1cffed7b353ef6d49360d86a2484a55ff055dcf505000000001600140bc6348bd03f73bd47dcbe5406564e1ac12a6fb8a6dbf5050000000016001423cace3027d97c40807d2a6808f1319dbf3fbe4c00000000", + "cets": [ + "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff02a33fcc07000000001600146709bb19012025d0237804f9296d4049999928bc5d821f0400000000160014f495478267eab431f83c23861290784108a90e7501475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52ae64000000", + "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff0100c2eb0b00000000160014f495478267eab431f83c23861290784108a90e7501475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52ae64000000", + "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff0100c2eb0b000000001600146709bb19012025d0237804f9296d4049999928bc01475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52ae64000000" + ], + "refundTx": "02000000000101892c570f57cb6453e2b81f06a15dbb0f80ad76a49c857f0df3f36274333563fe0000000000feffffff0200e1f505000000001600146709bb19012025d0237804f9296d4049999928bc00e1f50500000000160014f495478267eab431f83c23861290784108a90e7501475221028914b347f19a07cfec76a4fc5a8711f6b9d2f599db3107d7ca2520d34afa44ed2102cdddc19a318193e7cff2a57796d1ed026943c2213ca467e0c277a0dc81f6211e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "f33cfed40169977cc2c1e8f3b75b897ab3b0a0ffc4eeea18b4bb36501b05a8fa", + "nonce": "178b6207035d1cd2aef930a77fb86aeef571d4fe2ce0d3d946a65742e7c79ddb" + }, + "contractInfo": [ + { + "preImage": "-8995151701377482240", + "outcome": "d49b9cfa8879203b67a206f02f0225d199735b2be070e4faf4a2795d5a26acf1", + "localPayout": 200000000 + }, + { + "preImage": "-1854830731646103122", + "outcome": "55f72456d4a0a1627eca5cc59e828687abe6b08387c68500f7a84d31af172452", + "localPayout": 0 + }, + { + "preImage": "5821248891314283074", + "outcome": "4575a0dc910f2550025f0f042f8ecd74e82f0e577359db41fe40d68a9532b689", + "localPayout": 191982543 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "55f72456d4a0a1627eca5cc59e828687abe6b08387c68500f7a84d31af172452", + "oracleSignature": "178b6207035d1cd2aef930a77fb86aeef571d4fe2ce0d3d946a65742e7c79ddb895d64c69e2d61ae95efc380fdec03e15cb9a2ee495ab90f53a4e0762b2b0c46" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ef5accaf9394fe15688e1a98744594572ee165498700000000", + "idx": 0, + "inputKeys": [ + "0e1d5b27ba9752fbea80d2e66adbcf1247291a65eba9d25caf621fc5ee794572", + "d8474d30731d936fb1feba42aafa243e2c124b473d6ab5017f860a980fb60dfd" + ], + "redeemScript": "002060516992e32dc018ba540cf8614ddabd034fa3cc80ec221d7864951289b0843f", + "scriptWitness": "014752210213437466a7de61bde814e2e240260799e267f2504065f48bf590c8547e3c804221033018195736197ba3d47de82a00d376e4f50f4bb51e55e849a49d0f350db34e5852ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q7tnuud6fkz8w7q8p9fgtp6uzgghj4qcetcwmcz", + "fundingPrivKey": "2cc33a7b9146f7c66d09838d5a7fe06bb8c438613997f88a398a3f4dc88043c8", + "payoutAddress": "bcrt1qxuf7ssc4l26vzgprawvayzyxxw4vfk5wxusc06" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142efd5edaa7fb7264b3ad8d7ba9806fa247d00b1b00000000", + "idx": 0, + "inputKeys": [ + "7b7d53c9b272bb7fdc761e996bddf65c91ad1922039e9fd32be83fadc23eb6e2" + ], + "scriptWitness": "02002102acd05b54379d171327589e2894ad98a94754861c2f286dc881e97dfac6164d3e", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qkeuksrj2pvkt4g5y3tr6tcca2gg287vvpvegnr", + "fundingPrivKey": "0583d99d99161e3c0c1811f50d7de35d3f11964bf3b263b2761c7b0785225706", + "payoutAddress": "bcrt1qmm4fcmclm6zgvxw060fstcdlq36qv338qv77hy" + } + }, + "txs": { + "fundingTx": "020000000218ff72055e66190f416653b874a2a65e0ab0a462a8d717eafa5b88fbd3e7fc62000000002322002060516992e32dc018ba540cf8614ddabd034fa3cc80ec221d7864951289b0843fffffffff660784b871d2232edcbed834f57f4c6231c8d3e4cb2f06ccf1a9ffa61ae6e3930000000000ffffffff0352c5eb0b00000000220020509fbafd246b5ad5fec0b7c21639cc8d99ee7aa68f422e3ab481a0813373db3aa6dbf50500000000160014f2e7ce3749b08eef00e12a50b0eb82422f2a8319e1dcf50500000000160014b679680e4a0b2cbaa2848ac7a5e31d5210a3f98c00000000", + "cets": [ + "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff0100c2eb0b000000001600143713e84315fab4c12023eb99d2088633aac4da8e0147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152ae64000000", + "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff0100c2eb0b00000000160014deea9c6f1fde848619cfd3d305e1bf04740646270147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152ae64000000", + "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff02cf6b710b000000001600143713e84315fab4c12023eb99d2088633aac4da8e31567a0000000000160014deea9c6f1fde848619cfd3d305e1bf04740646270147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152ae64000000" + ], + "refundTx": "02000000000101217d0aaee21ba9ff3aaf9c6fad3675aab663d727f9b67fc089a8c8841895370b0000000000feffffff0200e1f505000000001600143713e84315fab4c12023eb99d2088633aac4da8e00e1f50500000000160014deea9c6f1fde848619cfd3d305e1bf04740646270147522102a8bbf918aa6498ae8ff9f14972847f6c9fff8f26543b82028a08ff69c7ebc2682103ddb89b39ee3a9b8c25fb1272cc54f6c2df1a25086a9d472137001af6ef98d7d152aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "0720999ec40c81d7400b7286466703e758c3a13023944a73390f97c1837a091e", + "nonce": "87ab80b38d37112086c3d8a3bb9f7f7b7a1490167d495d9399bc26d4e91e8e31" + }, + "contractInfo": [ + { + "preImage": "8469552611251101686", + "outcome": "4832d2338025fd91afbd22fbc40eb1796287eac59f4a915395dbfff05f6dce9a", + "localPayout": 159071262 + }, + { + "preImage": "-4028593065698166533", + "outcome": "5c74de0430471d16ee3bc56674cc2b6e6b24256b14b5f1e0112531095cf9d99f", + "localPayout": 0 + }, + { + "preImage": "-4584213225836449497", + "outcome": "9bf755be70086ad6e0a9d66b6f8800b9e160fab2a8c6764ac199247eb1a44f3b", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "5c74de0430471d16ee3bc56674cc2b6e6b24256b14b5f1e0112531095cf9d99f", + "oracleSignature": "87ab80b38d37112086c3d8a3bb9f7f7b7a1490167d495d9399bc26d4e91e8e31cf3ebaef643957b423bbc938467dd3450eceee6ae742164f61845f0a83ec8106" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9144cc3f31ae807e93d905ec013348d3641fc3f402b8700000000", + "idx": 0, + "inputKeys": [ + "39467ff937f136816bebf0aeb03849b15ab91118bb1e3058e1fccd354134be3c", + "99bca8c61ca2e28fbf6d706a444f18ac6a493dedecd169b21a5951ccdf750828" + ], + "redeemScript": "0020ba02af941998457dce68b8ecd3bde6ba95f77a49c597e26cd34510b4d675c661", + "scriptWitness": "0147522103dabe66ec3cbbb97894435c0c379db21835fe6e904c595effc7667821f91215d921030e5823725c5ab205fb89540ee78dd7e9a4e705bb1276f3b19724c915b4c28b5452ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qxf9a09sj4uylrv050hmlw8xqqf8exfcad7xs7l", + "fundingPrivKey": "296c999aeda13458babc304f1f30dc563a27db64d0e1f82ef5ae688d605ff69a", + "payoutAddress": "bcrt1q22smlduhex7xgx00y5nux8ulaeeh27rkkpt77n" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ceb44e921cc670250fe65398ae1a507cb0f7522bde85249f66e535a08489bb8f00000000", + "idx": 0, + "inputKeys": [ + "c584936d7c338f10f7d23e8e15b4d0970fbe2d62582c80626af9c69f7052e83b", + "a284220a8b83b718c7bf2ae3b7298850d8a18224ff1f0947496189ccb6e399a6" + ], + "scriptWitness": "0147522102cabb8efdcddb0545cf8a7b24d86b5d208a9f76b5873592d0a76950666e667b342102f9d519d9d56e54f75bf5854c8b5c1d20b35ccd43e65e3373f2a98a0fa944a94e52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qp2g2cxz0hupf3nngl92yx6nnndsdqmgfvysags", + "fundingPrivKey": "88c1fc088375aad9036d0c753dc27379b7d93f70d333f25630b9151a7ca34f49", + "payoutAddress": "bcrt1qyl9650w9teq55vtvxmmjsjg25r04wvd554zgl3" + } + }, + "txs": { + "fundingTx": "0200000002dc095645c0a20bca5da8dffcb979c38568bdae8c56612de557e99b966332a5180000000023220020ba02af941998457dce68b8ecd3bde6ba95f77a49c597e26cd34510b4d675c661ffffffff1cee9dacf7def1045676b7a625bd6d05fa989fdebc3cedb5ffcaaac448a5ce7a0000000000ffffffff0352c5eb0b00000000220020b04dd607aa6a6f0001efbbc68c64a3d6f901ca7cd387f73f8b14d22f46c5006fa6dbf50500000000160014324bd79612af09f1b1f47df7f71cc0024f93271d55dcf505000000001600140a90ac184fbf0298ce68f954436a739b60d06d0900000000", + "cets": [ + "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff021e3c7b090000000016001452a1bfb797c9bc6419ef2527c31f9fee73757876e28570020000000016001427cbaa3dc55e414a316c36f728490aa0df5731b401475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52ae64000000", + "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff0100c2eb0b0000000016001427cbaa3dc55e414a316c36f728490aa0df5731b401475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52ae64000000", + "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff0100c2eb0b0000000016001452a1bfb797c9bc6419ef2527c31f9fee7375787601475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52ae64000000" + ], + "refundTx": "02000000000101d73da7e14a778992a4ae84d512bc8cb8df81e61379333cf8f503d5a3e0a0906a0000000000feffffff0200e1f5050000000016001452a1bfb797c9bc6419ef2527c31f9fee7375787600e1f5050000000016001427cbaa3dc55e414a316c36f728490aa0df5731b401475221030b886f02a60c9b5f5145b06d987e71dd2063792e9a20da121db7b65be3bb7ca52103f0423472992b34d1689e2b9ce287ff8a6ecbd1f99fb2405f779cf4365cb2860c52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "c947b9d9d33bf712390822fafc7ccf65e474378d5bbea477e1c434311d18ee43", + "nonce": "84d720e380f8a788fb69f45b7d77f005231d30ff94990b21e1d26241cf62589b" + }, + "contractInfo": [ + { + "preImage": "7216759102276770250", + "outcome": "3dc4eba950c8a4d6e5a2a4f47324e295a6f14574e4b2368b9a99ade942f0374f", + "localPayout": 0 + }, + { + "preImage": "286554657180017357", + "outcome": "6377106f5a515438cad350bf8a948e2322d02b4d26634dc6a9f34dc316168df3", + "localPayout": 157140129 + }, + { + "preImage": "-917667172428359157", + "outcome": "442c2bf862781fc3401cedcca96b71e33c4c0ecd78b0f3632bfec3defbd31b59", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "6377106f5a515438cad350bf8a948e2322d02b4d26634dc6a9f34dc316168df3", + "oracleSignature": "84d720e380f8a788fb69f45b7d77f005231d30ff94990b21e1d26241cf62589b09ec0ffe0d5e472a7a692b6804c5396c4814722243b0030907fd819807453fb2" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9147ee9d25f6209606e970a9ee99b871100e42e88018700000000", + "idx": 0, + "inputKeys": [ + "49aef4e2ca544156a6a1da50090dde2867e45fd90cbd5ac9308e2f8d54b1d407", + "a3a849bbd2b8390a44faf607b5f3b85441a05d3f962b6c5d3464025a0bd9fd0b" + ], + "redeemScript": "00206d1aae7aa202761f7edcf09d36f54ce02c380e20d42165ed82bb842ebd32fa70", + "scriptWitness": "0147522103bec8b1032114326715cf6884e2f8fe229deedb8a1e2ca9bfc3d9d1153ccbfce5210312031dba875fd42bd86e2e02806bf3e7107a9188f86bb7978001bb80805b705652ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qve4twdznql8sgza5he7ravdc383dyq9cwkf922", + "fundingPrivKey": "9afc0af152847be982a97b3b3173ab6ace837b4895048a44f31dd45ee58afd2b", + "payoutAddress": "bcrt1qehj9gg8mlprruwgvhwt5c8u3vmduf9lqgh3vua" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142d2ae09b908cb69a9337f7fb8d4c0e2bccd7b6da8700000000", + "idx": 0, + "inputKeys": [ + "4889c5619315a9d966b1c63cf9df1795d62df885ca6452f433b59d68cb04df12", + "fe8047651abb5caf46a8f31acb15c0ccc8bdef92a7a060631278a5bc89bbdcb8" + ], + "redeemScript": "002030b7fbc4f8b178db74fcedcde4b3be841e93badb794ab73d6a08511439a24e4e", + "scriptWitness": "014752210366a0f55caebb7bf32ecff21f0a089cbf7525f9f6985283068798993b3ded90562102b56cbc26796155dc22e8c783b08c4977966b67affc527fa62555bde5db2e055252ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1quj3tfavl32jqhca78c0grfny4ddeeykewvmhzu", + "fundingPrivKey": "c795953b58025baeae523670339b08795c08698458813bcd0e36560cb7d7365a", + "payoutAddress": "bcrt1qt5pe8adxdq39sjqeg44kx80duz5gdua7rzslpx" + } + }, + "txs": { + "fundingTx": "02000000021e048b5c7d1dcc87529b2ad4b48c0b87450d857dc8e91fa6d586e7ca8279ea9800000000232200206d1aae7aa202761f7edcf09d36f54ce02c380e20d42165ed82bb842ebd32fa70ffffffffd2945579193609785579fe3c4b97f724ead6904b42b0c76db6e02881c06d379c000000002322002030b7fbc4f8b178db74fcedcde4b3be841e93badb794ab73d6a08511439a24e4effffffff0352c5eb0b0000000022002020981e2479bc92f4ca1bbb9afc5bebcb81834f3572c489482e4f1250d16623a4a6dbf50500000000160014666ab7345307cf040bb4be7c3eb1b889e2d200b8a6dbf50500000000160014e4a2b4f59f8aa40be3be3e1e81a664ab5b9c92d900000000", + "cets": [ + "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff0100c2eb0b000000001600145d0393f5a66822584819456b631dede0a886f3be0147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752ae64000000", + "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff02a1c45d0900000000160014cde45420fbf8463e390cbb974c1f9166dbc497e05ffd8d02000000001600145d0393f5a66822584819456b631dede0a886f3be0147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752ae64000000", + "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff0100c2eb0b00000000160014cde45420fbf8463e390cbb974c1f9166dbc497e00147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752ae64000000" + ], + "refundTx": "02000000000101d002515bc51225d2ee27c1c7dd8b2f6a8692883cc1ffdb21f77cf799a9a33e680000000000feffffff0200e1f50500000000160014cde45420fbf8463e390cbb974c1f9166dbc497e000e1f505000000001600145d0393f5a66822584819456b631dede0a886f3be0147522102a5c69d9540124dbf73122707d09dbfe2735ae6167e73681a925d74a185dca4872102b5193575017432d0d74253250d8837aa6ff7e52d1bb263490620f9ff70a18d3752aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "d58777f414ea2791a9452d4994d5e7fa2e0bc4f0052b78e13c804c0da2f97e58", + "nonce": "fc2a0b9d24c6f9fd72b1eca48079cbfb9b8323c62099906c272c2cf8bf370ff9" + }, + "contractInfo": [ + { + "preImage": "-8178467244852833766", + "outcome": "c93110bef620b0fb3bed6a9cc70821da8dbed0d469feeb41b53354d2bcefdc02", + "localPayout": 0 + }, + { + "preImage": "-5053191014914856086", + "outcome": "e4966f7b8b92488acadba8d80f47bb526ee63335b6470130061d6a2f9a70b48e", + "localPayout": 63281269 + }, + { + "preImage": "3819476481835830143", + "outcome": "6f6a367ecd79cfa82ec30266c302fd01056e903487090e5cf1f7809df649fa0d", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "e4966f7b8b92488acadba8d80f47bb526ee63335b6470130061d6a2f9a70b48e", + "oracleSignature": "fc2a0b9d24c6f9fd72b1eca48079cbfb9b8323c62099906c272c2cf8bf370ff9e6324c5ba045d5c060022615b66d678d6d8188d5599f4b5e8c775e89375116ad" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914f6c44a44b0eb47b09af326f49ca6063596ec23eb8700000000", + "idx": 0, + "inputKeys": [ + "a7270886e4bdfc7d7a8565da8fa841f8e9208ae8060007c910c3de91ab3f877f", + "fdd0b280be9e7d8cf6d0c0dce4a4ce1439ae12534806b717f2be722050e3afa5" + ], + "redeemScript": "002055e1619795081d9693a827acb4cfeeecbd430b80d9e408ee66d33c17f10cdc4b", + "scriptWitness": "0147522102bc25e5bb463c1bdb8361fa24b4c767c3be929d54ba20ac23bb8d02fac11ea8bb2102a0e69c92c8dd44c713b0b38f3d4a8d915db5502aa2a97fb1b7e0e06bb081d64952ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qz9gf8rn4rf33cagcghzgpww27rrdugtlef2ddm", + "fundingPrivKey": "3cca8d64b09ec0c9c71f671eea465b01dff50930efe721ebb1d08709ac670256", + "payoutAddress": "bcrt1qqawyqxe4ea0yzwk2dvjjvrl7vwak3dygvr8pev" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c55cbaad1714b598cf92f96c6f4f37453e46573522df48363c876f635ebb54dd00000000", + "idx": 0, + "inputKeys": [ + "44677c73f0ac8646128c2289b3f073928740f0dee7fa9ec60fe3c68869bf94ff", + "d66d6654067bf9937ce159a155eadfc77d23522fb270b449829530bd1072c66c" + ], + "scriptWitness": "01475221026be459d8ee09136b9f98c1e22a459902a03074c878be3b2b0d859c6f0f493cf3210224987b957ebf00ac49e2d44fa3ff11e718ec922db02d63dd9659022d58114ea052ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b42a54e008e15d4cbabb733c3098e039854d952800000000", + "idx": 0, + "inputKeys": [ + "7f016bc0e1c10e3f05ff8eee345da075c47a1a146aee57ba2d5da2346b3c89f8" + ], + "scriptWitness": "020021031e0ff6c02e20cb121a959ba31509c9db46aff6a90fa38816c834a9fc57ba83c8", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qqhj09t6jgw835pjm8y6phjy94t084pc027xg72", + "fundingPrivKey": "5d01a3a3ca05440ada9e1e93b1ee7ee7244210993d8391ec2a5d74b18cada4b1", + "payoutAddress": "bcrt1qn0y8sz5k0t2y0wvd5dp4ysj7xysmy2dudww5zd" + } + }, + "txs": { + "fundingTx": "0200000003f7f4f84437b21a2d592f947fa00071a7680784ef6b74db184ba592e0780ab9bd000000002322002055e1619795081d9693a827acb4cfeeecbd430b80d9e408ee66d33c17f10cdc4bffffffff499106ff7b917aa36d8e2674d09da6b6e7940bd4bff88dd583440349c24050dd0000000000ffffffffd812c525b253b0fde1ee0ecef043260a41c542f20ce8e67a780e01680baa18a70000000000ffffffff0352c5eb0b000000002200200e85df632fe8bf5b7df03ae0490dacc4f30a21fc10e3b85dad11fc72a102fe05a6dbf505000000001600141150938e751a631c751845c480b9caf0c6de217f069de1110000000016001405e4f2af52438f1a065b39341bc885aade7a870f00000000", + "cets": [ + "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff0100c2eb0b000000001600149bc8780a967ad447b98da34352425e3121b229bc014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152ae64000000", + "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff027598c50300000000160014075c401b35cf5e413aca6b25260ffe63bb68b4888b292608000000001600149bc8780a967ad447b98da34352425e3121b229bc014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152ae64000000", + "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff0100c2eb0b00000000160014075c401b35cf5e413aca6b25260ffe63bb68b488014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152ae64000000" + ], + "refundTx": "02000000000101506c2a4b5b5a175a5d1921eb457817ab9380a6c4c4a0fc7826b189fdcd4033ca0000000000feffffff0200e1f50500000000160014075c401b35cf5e413aca6b25260ffe63bb68b48800e1f505000000001600149bc8780a967ad447b98da34352425e3121b229bc014752210352e15dc3c46b3070294a9e48cb277730ded7d956faa59a9650f2becc9851031f2103e8dc471e514db6b957529f7ee0e8d6fe4e536f7a691b8b87b3b77b37fd223a9152aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "6e8568a8231899aae960f0013ef37b65006a1cba7e876d039e50b4d19ba11107", + "nonce": "3d63c54994eeb66162cab3f58644ce227f247a37e227158dec2cfd7562f5d50e" + }, + "contractInfo": [ + { + "preImage": "-6873713138300158220", + "outcome": "cb3b56273eb740ad4927de70ed1d0498d8df14628f39abe87abb7ec683441b8c", + "localPayout": 108825558 + }, + { + "preImage": "-4354377474623678594", + "outcome": "6ddac22b4e0297455dc428f62b44ab1449023c94dcaac70e13318f7fcf19e853", + "localPayout": 200000000 + }, + { + "preImage": "-7202377403661074921", + "outcome": "9d35d74016441d725d3eb2f395bd70dec04605cb96a1bf37ce654828427232ba", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "6ddac22b4e0297455dc428f62b44ab1449023c94dcaac70e13318f7fcf19e853", + "oracleSignature": "3d63c54994eeb66162cab3f58644ce227f247a37e227158dec2cfd7562f5d50ebc2e1ea152e471ad5a8f5d4b0d7c675e7f8fdf28771f7477066b32277e7b3e76" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600142bd9797d024643a3e65493b9d1577c4607bc1ee100000000", + "idx": 0, + "inputKeys": [ + "92d07f40860c1fd55d36153e00e5e32e1814ae0f520560a422cafbefda9daa0b" + ], + "scriptWitness": "020021030b8d959acdcddba7dc93415d1d8f487118a18808ee329b9ab34f3090f9dff9d2", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q97784kc0cqnf5llyaham84qt42d85nsm3kad2k", + "fundingPrivKey": "eb9071ea092d5229f783fc3753c62ec041755a26b6b0a74a239ccb39dd906764", + "payoutAddress": "bcrt1qqp4akrlu5yfgrmph55sfxhxuuwnxhykwjnl7he" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020874016cb493de6bb37143b69d1e07bf3861b0b949b5de883484e7b81eb1bc5c500000000", + "idx": 0, + "inputKeys": [ + "15e9a6acbfcfa206fec4d2b342f391976b53d5bd95a178a3c50a04c519f82a37", + "f4ca1f803ea49de3a58d7f5daffc2ba7d3aa35e8d0bc147b7c7239e6c19df8f0" + ], + "scriptWitness": "01475221029f66cfa2af5d4a06104d9f43ab6081e720faefe3b354c48561a936e011d26fd42103baec773746bf1163e436ada69f8dde05184f6086472e5324152847e2e911a23752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91473e7ef849361f64052b6d574c317fe07163c6f9b8700000000", + "idx": 0, + "inputKeys": [ + "75ca04c922b5018f0846ade3a359cdaec70cce89b871c4a2cb096f4d5ec73471", + "472894fd3459f3553a52fc999c72729976727cb329bcea23ad8faf2d85c48fb2" + ], + "redeemScript": "002090f6058d638ab74117e6d70953aebe9e8943c5381364b24f4c73af7cc6ad7647", + "scriptWitness": "01475221028db7fa29c44215d40ae0ce4e65941015ecbdc46a23113742c0f6306ec37352722103fa093059d5a677cade147b71d60b46907eed301be306576527a5a9f9e29de25852ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914396edfbca959942fd02c701562f982fea07d1f418700000000", + "idx": 0, + "inputKeys": [ + "a4bd77fdbf4fcf088c9b13b34ef7da8a3151e0ad2724e0b2dbdf87befc473e12", + "a13fcca60fba89d1e41b997d1358dbafb726db90f11cf0d0a82c41e767ab82d4" + ], + "redeemScript": "0020a028198c78a0b9a9dc34580111a2dff7a2676da08dd5e1049226a001fcb1224f", + "scriptWitness": "014752210349d76dac60f7d3b191b63580d77a05c365293351c6d0e498e301912ef6717d8b210214a793d702aadeb4a980ecf10c9dbdd44c8dbb13596d64e9a247641eb7d1840052ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q38rkgj6t23mn5tc66dhjv9udcrzk9a45ptdx0j", + "fundingPrivKey": "3830da98d64e4d417a7c6935d5b8e7efa97302cc0b79130f3f62beac91d22dd8", + "payoutAddress": "bcrt1q2t830ldmha62nwymcpm588m3yvcqfkxlhe8ek7" + } + }, + "txs": { + "fundingTx": "0200000004f4f7f2fd275d8f69e394e9dbf94dd7c7e71dea86bb706752cf2f5c7476281b7e0000000000ffffffffea8fac2de537912f3f34867d8d80edc3351255af540d4265eddfeb8e7aee8bf00000000000ffffffffa6101dddf58afbec300d8506f8f1ee4fef516dfbcc97dea181719d8c3759c3d1000000002322002090f6058d638ab74117e6d70953aebe9e8943c5381364b24f4c73af7cc6ad7647ffffffff21286c302d52d20c2b5afa57c5844ce2497412a22e7adc24edf978574d1f774b0000000023220020a028198c78a0b9a9dc34580111a2dff7a2676da08dd5e1049226a001fcb1224fffffffff0352c5eb0b00000000220020df7d18ef3ff021bbe73a77ccf6a9079511afc48df784dd5d57ac2310b53ebb51e1dcf505000000001600142fbc7adb0fc0269a7fe4edfbb3d40baa9a7a4e1b3c5bcd1d0000000016001489c7644b4b54773a2f1ad36f26178dc0c562f6b400000000", + "cets": [ + "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff02d68b7c0600000000160014006bdb0ffca11281ec37a520935cdce3a66b92ce2a366f050000000016001452cf17fdbbbf74a9b89bc077439f71233004d8df01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752ae64000000", + "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff0100c2eb0b00000000160014006bdb0ffca11281ec37a520935cdce3a66b92ce01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752ae64000000", + "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff0100c2eb0b0000000016001452cf17fdbbbf74a9b89bc077439f71233004d8df01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752ae64000000" + ], + "refundTx": "02000000000101c0af82b203a152aaa2f27f5fa1c5e32804ac3b38d40826ec53a10ca7bfe2a2520000000000feffffff0200e1f50500000000160014006bdb0ffca11281ec37a520935cdce3a66b92ce00e1f5050000000016001452cf17fdbbbf74a9b89bc077439f71233004d8df01475221028916e232718b585c21def39859cfc104c41f190ef519249da798c8db05bf93b42102fd73617b42f444c86613328702e91868039b2be156db4bff8c134e89f26eda2752aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "7269c3b9ddfef5d107183e5f89125af233fe3660e8d6b30c78389c53e9b6bc08", + "nonce": "123489ea5a833821399ed57dd21a2f7114ff3e2249cc8965ae90622e475bd7ae" + }, + "contractInfo": [ + { + "preImage": "-8982444808279970336", + "outcome": "b4688ead29e47e6afc60b7f9c605ccaa2d3ae0a098983f2603f33399e0f2857c", + "localPayout": 148258919 + }, + { + "preImage": "-879491289648572849", + "outcome": "dff8046ed12fc03283fa0f216dd1a4755bee7e5de8c5ed68a367ba13bd2c3664", + "localPayout": 200000000 + }, + { + "preImage": "-1319665636595198880", + "outcome": "916d3b50afd4539ff76e738c574a636b45574f11eafebb31b271357fe8e17311", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "dff8046ed12fc03283fa0f216dd1a4755bee7e5de8c5ed68a367ba13bd2c3664", + "oracleSignature": "123489ea5a833821399ed57dd21a2f7114ff3e2249cc8965ae90622e475bd7ae66a4f9dc2910b9cf3cfac0a178a3fa132435d5c2b711ddabbd81b57bbbf14b90" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014f12e4beb653eeb5f931d24359c16f8ce1e2f908e00000000", + "idx": 0, + "inputKeys": [ + "1bdf4aa022a3550f68e0268d91dd9f35fa31a6eb0e7a8a8d3b60f90e1dbaea47" + ], + "scriptWitness": "02002103cafcb5a7b2c3103994c02f1c896d6b952f7bce6025a4c66b8e8b4ec24aaf974b", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qrp7m2jja4sfc40438hr4lq07uvgm5q3wq4gv7h", + "fundingPrivKey": "ff6c7f99855366afed18fa1a528acd76c952b6be8c1ab69bb1ce1e426f8d1a3a", + "payoutAddress": "bcrt1qwrxal9003mqwmh6yt408nsqwrknunp86e0qg90" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140970a118f71d96645b5d6d0b8bd657eca55936d48700000000", + "idx": 0, + "inputKeys": [ + "4955ffe3056d53228d177c6bad1659817ff17991f095abb0a12aae14ef849aae", + "65140092f44dc6c3feb1e7efd8f65e79b12cc86dbf1ee373dd06d9e54807f412" + ], + "redeemScript": "0020b5c5fa9c23c0fb056bf7c782d0a861c1ae9cb57a48d332cfd31572144f00221c", + "scriptWitness": "0147522102765b10b59e0c9d0123317f779c01d31c6d1b57925505e5fdd410b1eccf8383c521033aaf66e36f89b57c73b63bfcaa42df922904acdac488cf24ffe4a4754296196752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cea6bafc962610df8534380b88fad55a4104312300000000", + "idx": 0, + "inputKeys": [ + "0542e50b53060b8c921a027e359d588c52bacad881be33e34d3d7b36de50dbc8" + ], + "scriptWitness": "020021030b44ba5b6f5156183f77e3b83cc5b4d34016a751084abe97ade86aa17d8073ad", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020f25a20c1607c7370712b27c9353eb283ee975e2438b90346df623b44df2f1b0200000000", + "idx": 0, + "inputKeys": [ + "2e794a3133640b888a412777d045e2f2e39f14840736b24e209f2cc3ae74dab2", + "37013b55d092b206b870f1c351e5ed8289fc2147c33544e540d8bc77c53706cf" + ], + "scriptWitness": "0147522103bf63d422c5ad7d5ec15fb2c8cf2fb98d3a74b17d9e34b82bdbf8281dd1bebae021034214f782770aa1b001c3f5d8cdbc4d83c8817a05fe246e06267ce4b2f4dd3fe752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001441ef9367e957e6930bf8f3b262794192b086b41b00000000", + "idx": 0, + "inputKeys": [ + "9914cc074fc9688f2dccc2810ca41329208f2a31d66326373d03b166282bbe1a" + ], + "scriptWitness": "02002102b409ad2d9b164c292816a5acb153591e8ce5ffa54d94d2a3f3e93d33a98dc7ef", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91407808b181e2f9861dd7bd17be1e768c82011bf118700000000", + "idx": 0, + "inputKeys": [ + "6739b2523cc2ac348928be48c3d9fc8ede91fee92393bbf191109527fd59ebb0", + "cc26d342606a59cebefcf0e0838ab9f34e1de4a036e8bf8b19b0a20168e54c81" + ], + "redeemScript": "0020b35667bb96f5450e936a5e90e35e7fc4f000370c191f87f5e687b56a2d1be90f", + "scriptWitness": "0147522103caab0d8609254b09c0ee2a5a7bb150952ce87f168b1f17931e08da38f0127e582102e0a3ff9b2e56a1f96e0d29a767f8c69c8a7af5dfd0336e6f8ae21f5db727769952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600144c1069770c5cb6552df67d90c8fbb5aa827520e300000000", + "idx": 0, + "inputKeys": [ + "6a6186a98bffdc3716c509e61bebaaa5d2edaa1ff02c0c5b32e34c7da9e7f3e9" + ], + "scriptWitness": "020021027133811687fa1d2de795a5dfaf56607a91c72461e815fd8c51b091a0591ded82", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914251de479809f3c579721236c22cfd569c497b4e28700000000", + "idx": 0, + "inputKeys": [ + "8b0064308af624f149d74f188d881354af7d1dc4e277cbdabb6af7e2d7302c56", + "f427b9258445de433467e87eab01423361f346e10a236a866ed5fb26c95bf0db" + ], + "redeemScript": "0020e910320cda42447721ed4cc087180e6ee803d724a2b0c148cab0380c2588411e", + "scriptWitness": "01475221029409f63554955fb09c052a9d48866853ea44fe7f6d60cbe88fed9af4c22648a52102501ff43e6555e35b6173c779baed8ed21f598f92438fa74e7776adee53d93c8352ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d4ec70efccd9f0147da3889489bca72f052709d900000000", + "idx": 0, + "inputKeys": [ + "a8e9a05e886e2538c878f80d49cefc8d8812e5d8cbee6ac235484d7e0bb44a00" + ], + "scriptWitness": "02002103566a65b0f1aa7189f80a2bbd394e592bb140c5eacced5ffdcd98a88517aa20dd", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qk5svnddqzkzaxpm3ldrqtr7hy7fexsza5tff42", + "fundingPrivKey": "a1de0682206ea5a7bd0982278190b0c93712b2aa0384e63c33503f73d745e896", + "payoutAddress": "bcrt1q42atxeuauxrvprt3jp770zpmacv3jgm9d76yef" + } + }, + "txs": { + "fundingTx": "0200000009be5b019dc943e311cf3f316f036f7e9d689ee3af9c1b1e7cad8bbef267a74bd10000000000ffffffff5bc1320c3fa944d61738c847738d9aab375e921c3a8ab14732312852836520390000000023220020b5c5fa9c23c0fb056bf7c782d0a861c1ae9cb57a48d332cfd31572144f00221cfffffffffd991a2b4a999de20fa3e09125d57943ec3550167365baa1b6d2b6886f7db1980000000000ffffffffa921157c8a79a82c1b182824b4d7afd88d0c571a1f926ecb273f725e8e1aeab90000000000ffffffff22f9b89b337a7201d02be3b5f8584b7cf263ea0e5b5824d68b7e3c2d4b08d62c0000000000ffffffff295d46a0567b6319cc1b630fc712d933db6cd0ff6aa39740895733a119d61f640000000023220020b35667bb96f5450e936a5e90e35e7fc4f000370c191f87f5e687b56a2d1be90fffffffff66025e81ee3b85c80e5f75fe2a2ac79f5b999677825986277631353052690e570000000000ffffffffff715105d4aeb1a460b3719ca134246661b1bc36046bcf08c5a445f6d8ab6aaa0000000023220020e910320cda42447721ed4cc087180e6ee803d724a2b0c148cab0380c2588411effffffff1657c07b97f92c5bb39e1fd731f8db696777a68c6c16d64620723522304b30380000000000ffffffff0352c5eb0b00000000220020fb4ec6fb37ef277f4b53bbcd73f82774cb2e5c4f97a95557076b4ce5a06cf666e1dcf50500000000160014187db54a5dac138abeb13dc75f81fee311ba022e671d685900000000160014b520c9b5a01585d30771fb46058fd7279393405d00000000", + "cets": [ + "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff026740d6080000000016001470cddf95ef8ec0eddf445d5e79c00e1da7c984fa9981150300000000160014aabab3679de186c08d71907de7883bee191923650147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652ae64000000", + "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff0100c2eb0b0000000016001470cddf95ef8ec0eddf445d5e79c00e1da7c984fa0147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652ae64000000", + "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff0100c2eb0b00000000160014aabab3679de186c08d71907de7883bee191923650147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652ae64000000" + ], + "refundTx": "02000000000101a71400cfad5e15d77497185fbf33c068931bee24111a463628467f1ade0877680000000000feffffff0200e1f5050000000016001470cddf95ef8ec0eddf445d5e79c00e1da7c984fa00e1f50500000000160014aabab3679de186c08d71907de7883bee191923650147522102a73e777cff05b4a43d3fbdf36a8c3be508c2a0b133d0ef2d91f42ae5265327c12103e2d2d296db3bf5e15352c4a1ecc7c8505c6a52d974eae558c6b428baf174bfc652aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "44c309f9f31510244c0652783329cece975ed988edd694bb100ecc0155795d7f", + "nonce": "b4f4fb6f1929d26e2b70de3a02fc505933aa826ed3208ab6aec23eb84c24e040" + }, + "contractInfo": [ + { + "preImage": "1999090168215671133", + "outcome": "ac730230a534b75074eafb5bebb352132dc0c8c822a1d118312f9073391fcd32", + "localPayout": 200000000 + }, + { + "preImage": "-5219030132316997323", + "outcome": "9abe565185d012c60533fbfc39f95e39b4f42918b3238790b2982858035ae57a", + "localPayout": 0 + }, + { + "preImage": "5540975711006882993", + "outcome": "8fc30f034e6aaff8120d012d787591485db2e715f56ac27003ecd7266648daa5", + "localPayout": 50275717 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "9abe565185d012c60533fbfc39f95e39b4f42918b3238790b2982858035ae57a", + "oracleSignature": "b4f4fb6f1929d26e2b70de3a02fc505933aa826ed3208ab6aec23eb84c24e040049d5c2ac62132697c7bd66ef25698c330915c0d7a330885608ebb8192fb751c" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140442fe42c836d47aef5f93248fbeda74215235f88700000000", + "idx": 0, + "inputKeys": [ + "49ff2ada9f3f72217b585c9d2fef4eea9094a09621021505ed4c8ff1a8dafcd4", + "91b6eb77863242d02e975f372e73822136a4c5f27677f7b529d3b0b5387220f2" + ], + "redeemScript": "0020ab5a2ecccdbb767a90c1be2ad63089a334d1cf96b634417b22fc830faad13fc8", + "scriptWitness": "0147522102a6606dd5c5fd245ce0171195c78b45fd52a3dd009e928460bf287d713315b8f1210214da31d4b102a455df171a8610f9f33dee26fae7183051e5c4f7fba71baad3f152ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020407d490e11ad82e7be926f42f6aab0f9e8b6881a2b0ad9bd3da533663dbc6ce900000000", + "idx": 0, + "inputKeys": [ + "cfa6f0f232697e2090dde377bb996f5119a9abaaae63902c012b4b2a35885225", + "54ccd694e37db3adcea1692c3f0dc880b48d208afe3d1223ef1be51d732205b1" + ], + "scriptWitness": "01475221039972a5d6fbe59a489647e0efbeef236d5a5898e6f16b3bb79f19dee15b94535121029fbb035c238add2dff0a2733875bb73fb8e8f9b9600c359a203f1e7cecf87c9152ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qhlaunqc9t6p5hkscmyy58us5skfhe0t2c9m3h9", + "fundingPrivKey": "e55a91710476ed21ebde8ca3c5faf9d339a339a7dcd6fa4a43e4e55fd687e093", + "payoutAddress": "bcrt1qdsxkkuz0dq367mf2sqg2570c04ytu8n82lpa4p" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001495ac4a2d46c1a8d720db3853c665800b4043972e00000000", + "idx": 0, + "inputKeys": [ + "f11e42dfd7592b4e9a07136bd171cdaff4e7a089d60220a752641269eae3955a" + ], + "scriptWitness": "0200210312d29b5fed9312dd0ab50fc49a6e881895bf10592efc69510a2eb7a77771523c", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qja5e4g2yzkrsay3mcczfmh6fmud2wmfy9kl80e", + "fundingPrivKey": "198cca3e18887377b66435a6d978cc2548f880e6578150a349c24f4705a1bdfb", + "payoutAddress": "bcrt1qqs5zu4z8ujeew65pcgzxpt7n80gpld5x3tpq9c" + } + }, + "txs": { + "fundingTx": "020000000366b3e09c0c361bc3f6273b0028279c882d5ff3c39bedbe6e360b54b3e616552b0000000023220020ab5a2ecccdbb767a90c1be2ad63089a334d1cf96b634417b22fc830faad13fc8ffffffffe337e36105c2f3164c6b03f9d850d5e61244ab6f9c4a0c1a723521b069c15e610000000000ffffffffa57bf9ce5c384c0bf5724cb19f2219c5b8f47295d8e0c946da3a5e3acce7282f0000000000ffffffff0352c5eb0b00000000220020b3d351cb4a01fab71ca8816f89b329b4adc638a4fcf6ab6ff1c5c2c844a92ccdcb9be11100000000160014bffbc983055e834bda18d90943f21485937cbd6ae1dcf5050000000016001497699aa14415870e923bc6049ddf49df1aa76d2400000000", + "cets": [ + "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff0100c2eb0b000000001600146c0d6b704f6823af6d2a8010aa79f87d48be1e670147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52ae64000000", + "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff0100c2eb0b0000000016001404282e5447e4b3976a81c20460afd33bd01fb6860147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52ae64000000", + "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff028525ff02000000001600146c0d6b704f6823af6d2a8010aa79f87d48be1e677b9cec080000000016001404282e5447e4b3976a81c20460afd33bd01fb6860147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52ae64000000" + ], + "refundTx": "02000000000101dc1a23d3e3f2b9869f32d1a760a7052bc1276f65837aa6268ef661b2d8af82640000000000feffffff0200e1f505000000001600146c0d6b704f6823af6d2a8010aa79f87d48be1e6700e1f5050000000016001404282e5447e4b3976a81c20460afd33bd01fb6860147522102bbd22b9a5c31239975d6b0204d6bb1867782d08817ed133eb9133efdb924489c210360ab0f90b94abec2264cbfb7caedcf8b4e23e452cfe1e367159137ecd5c6a18e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "574bf27ca10ef24521f186dfa7a9f21a44b62e89e0eeb5d0d9a9060e7cf47e9d", + "nonce": "9c56f5d7ca56461e2e24cf6b2888358cb1a42f20f8759f6248e3e2d0a188bd17" + }, + "contractInfo": [ + { + "preImage": "-2148823220573528725", + "outcome": "e15a9ca766f53fb3f073a8e62a87ebb0dd1b33ce26da3271afbe979249d298bd", + "localPayout": 200000000 + }, + { + "preImage": "-5375060586493177617", + "outcome": "d5fc21b26d695b8072f86593f25d09bd623c99c6a023c97916a1f5a6bdd4a365", + "localPayout": 95763100 + }, + { + "preImage": "7677473478775863100", + "outcome": "c68e1cf50ea454538895bbeb38cc13aa43d39d90922c6433634b5c4cb0923f01", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "d5fc21b26d695b8072f86593f25d09bd623c99c6a023c97916a1f5a6bdd4a365", + "oracleSignature": "9c56f5d7ca56461e2e24cf6b2888358cb1a42f20f8759f6248e3e2d0a188bd17eff0b47596232bd316480211ce394e4ce5ae8d9ff9fd7a4af3e5823029662b6b" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914e17945adfd9117c164469021cf389d0b5b81a4248700000000", + "idx": 0, + "inputKeys": [ + "e7e217af50bd0f52247ce22fb706edaed7baed77aa003905f000c4f1eedfad93", + "b0ab814f00321280dbf2490020f3d55d673548a48303a829dbdded3151c5b082" + ], + "redeemScript": "0020e804d5d69f2c2d6513041127734940ebf10005895d0d3700d0813e6edc491be8", + "scriptWitness": "014752210244f8aa155ed8bbf2c29778879e78fbe1f9d8e00cd23d21a91810dd52c6efd0a72102e51037140a94d6e8f745697cb6230dbbfcb215622d308339258766f9770115c752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200207ce92b489aed8ee5c620279d46459b56e5e94dc2c2a7acc0ec7b8393922921e200000000", + "idx": 0, + "inputKeys": [ + "16c92d375f6826973295a9526772657d1a84e0e6fff0cc32610fe7da827f1ede", + "e2dbe87c4c4c08457fc3496e13c4a32528ee0950da42facff848ae13a33677ce" + ], + "scriptWitness": "01475221025d02a383157336450331fccc09250e9d274f5cb35d3b40a3ceaa4e31cc73e8162102635b7f6c098c584ffb7c7621a2a85e278978a08354c5381d7c29a570d70bfe4152ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qurfe9emaye2msqxgcqnv70gehe00n6hwpkrucy", + "fundingPrivKey": "1a6f9bbd48f9d89d612c61c494aaee985446cd77f5f97199b171751d1e645768", + "payoutAddress": "bcrt1q62tc76w3yqpfewytt9z4ewf6spel04ztgnkfzn" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600147d110e28e7de2d8eddc54af068018e321789755600000000", + "idx": 0, + "inputKeys": [ + "a9db89258553344bdfd2403e003f9fb179221e279d73ea4cf4a2018286b14f56" + ], + "scriptWitness": "020021020bfac8c76076020d82587d2c7e7ce0f12329655479ce1be64312937131376e79", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914fe5a6510e4f1952b636a356282876fa900730bc78700000000", + "idx": 0, + "inputKeys": [ + "d909d3a38af703826dfc254c078eb34abe3309bf1476738dcbaa6cff78c84b3e", + "7b854a326cf6b978996cb8494a3e2b608aebc190db76e263f7c031a27d14e5bc" + ], + "redeemScript": "0020bfddbf231eef804e03794b3769cdc74bb7308904a588ff5c2343cf935d67da7e", + "scriptWitness": "0147522102ef6bff0899749c7caeccb06bb8f77d016f7091735efbdba0c5503f8a6571f3a02103d70a7c81d5c0ad29c49d8c21dcd6049f779649752e2c6038c86b5c0a5aaa491a52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qt98wlw833np0x6wg9e8su9wh8e2463zlhjtqj3", + "fundingPrivKey": "bb5b56ba546a6f9b5f0ce24762c08f1e1fe98f35382e3ab1edafd7f6577254d4", + "payoutAddress": "bcrt1q832n4hcr6yhngjskd03g8hmc48ala979klj7vx" + } + }, + "txs": { + "fundingTx": "0200000004ba1ad4608d545d875acec45cf4d35bf76acecee87810d655d749f8116bd20c760000000023220020e804d5d69f2c2d6513041127734940ebf10005895d0d3700d0813e6edc491be8ffffffff4461694f9ac1c1511d5aed311ef3e11cc81593b49f66a25007d8b23ca6901f960000000000ffffffff7e8db729d229b5fd66384ad1a5568b1dda26b8f198d106c331b03eacf409454f0000000000ffffffffa77487d8af8e9e21ce1187d763dacd0dc90d58bbbfb648461487b6d80b75f3760000000023220020bfddbf231eef804e03794b3769cdc74bb7308904a588ff5c2343cf935d67da7effffffff0352c5eb0b000000002200200c2ab98ae91e7c75a977047b35841dc19b6863c2cc0136766d1e90636b55ff9acb9be11100000000160014e0d392e77d2655b800c8c026cf3d19be5ef9eaee579ce11100000000160014594eefb8f18cc2f369c82e4f0e15d73e555d445f00000000", + "cets": [ + "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff0100c2eb0b00000000160014d2978f69d120029cb88b59455cb93a8073f7d44b014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52ae64000000", + "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff029c3ab50500000000160014d2978f69d120029cb88b59455cb93a8073f7d44b64873606000000001600143c553adf03d12f344a166be283df78a9fbfe97c5014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52ae64000000", + "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff0100c2eb0b000000001600143c553adf03d12f344a166be283df78a9fbfe97c5014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52ae64000000" + ], + "refundTx": "0200000000010183aeaf678aadff5ea3c361e4543b277a9c825797e40ca55f425e2fc18df91a860000000000feffffff0200e1f50500000000160014d2978f69d120029cb88b59455cb93a8073f7d44b00e1f505000000001600143c553adf03d12f344a166be283df78a9fbfe97c5014752210287a75bb2464df8806486a1640fba34b21384bc3bafa9971e0b77c2868c70731e21036bb9bcda9b9a46daad6b1394e5baf61a50cce7d9393f9fecde7f2b78f9c1795e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "860ebce7a0f2fb2c80c33aaefcfd4a2336f6c009e236b27e1f65b68252a8b797", + "nonce": "600c59b0fc0acda3a3cb5fe357b02798f87d8ef8015f5dde80d1ac04b1c7d2ae" + }, + "contractInfo": [ + { + "preImage": "-1036259599405533416", + "outcome": "bf26b78f5e8a75ce4ef23817e1a75168dbc1fc42ed3ca5368bce74e9c9c26ec7", + "localPayout": 141955175 + }, + { + "preImage": "639670333397925842", + "outcome": "1ab484c192825cad5644cefeb54508d91b8d243d55400ee8d90fc5062f666895", + "localPayout": 0 + }, + { + "preImage": "-1095642857779625431", + "outcome": "46abe95c373e914d0bd26b91499d7eb974ae6f72ab35bb4b964e014f9d4a8d92", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "1ab484c192825cad5644cefeb54508d91b8d243d55400ee8d90fc5062f666895", + "oracleSignature": "600c59b0fc0acda3a3cb5fe357b02798f87d8ef8015f5dde80d1ac04b1c7d2ae6be91695342af48f5c11ecc4550f4004f224fe78296a9942553a18a16e8667a6" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9149094c44c321c988d118a3051e59da1e6ff4711d38700000000", + "idx": 0, + "inputKeys": [ + "0368214eb033efca772387acfd78cc02a439c8aa43e08ec53eb300d19644aa8d", + "3302929f01dc5537e0787578616b86a3dcad045977b9344c7ae3f1766e0e2e36" + ], + "redeemScript": "0020e68bc54e2964824724316ee7aa6b8e33c7af0a640ab724a87968259015a439b6", + "scriptWitness": "01475221024cfa41eef1c8bcf7b8de01cde7cf88afe1458812854707e08e39892efc8b6257210290ab55ed2f95404a4554648ff43490e0d0c34de4640adee11d4819ede958462852ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91472881576b111ed98cf0803eda2670202586d39918700000000", + "idx": 0, + "inputKeys": [ + "cbc43cd3b16d09f8ce9a89d142fcc55d389a73f1efe5afb2926270aee6913826", + "f00ed3e405a1493bb385d887a561e2636336ea7c99c9462e1d324b601cccf731" + ], + "redeemScript": "00201a9a23c8b03604f7d25de65815122c7a6b509d57c73883a52daea388627e5c1d", + "scriptWitness": "01475221036e486d6826fa4d5c69a47f470eeca4b92bc180c450fc8a6bea72f5e46a751ece2103af5386d719c9fc5f7d932aac6d0a972f8a8cc40d8fa2bdb8402301a947ab34e052ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q5ryf2x2n4xn86v22phaes2q8rkknnkkwxsmcz4", + "fundingPrivKey": "17c7c4f121d2efadd6ddc66cb789da8c187e63a3989ee8658141f91bf9ac87d7", + "payoutAddress": "bcrt1qy38ny4a39qsuf5dd8rxs5yzj76wptym50e7qnd" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001478b73ea6df73a244fc94ace01347a6e3239986de00000000", + "idx": 0, + "inputKeys": [ + "034329da675633dfb1118ffaf5e07ddca147f57b97f51374d3b6164885bec2cd" + ], + "scriptWitness": "02002103014c9a43b66d1101f84fb37d567671edd355e46ee01aeb0878b43ac2521d39be", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020a2b0af90babddb1ad16fc33ba9c59715116cf58f1c2577b1298a969dc5cb7a8d00000000", + "idx": 0, + "inputKeys": [ + "b95995c647df656b6af469b785d8c75a592388a1d647e00a506322bfe113b525", + "79c7a0e31fa2392ddf3b4a8113fdbf3e65f89d6de3f595cf038ad0aca60a897f" + ], + "scriptWitness": "01475221021b717fe1d08a67dea55e81a9a4c71351802211ce3ffe84c823dc1c309aeefde721034a2fb5c73611337d6cdb5bc796ae6a73f5094802786e45ffb6dfd91bbbf2566b52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fff53e72a97ee584278c00b2e56519959499c50700000000", + "idx": 0, + "inputKeys": [ + "7fa756e4c86db6d62da97a92cf9977840e391e3c3ded77fae08c6d07f7b6293a" + ], + "scriptWitness": "02002103637778a81baa44b1a33cbf239186b76f61aa3e19e14ca702b2fd17f0dbf03ced", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qn767r0dgugv7577ylw8v69a4y36nspx74ny0j0", + "fundingPrivKey": "64a16e85ed1fa1c73c8e38d748ecf242e3285e5705fbba7e619f3579a8df2a03", + "payoutAddress": "bcrt1q6mecxlymvzedn694rm6fxkqq4pv0tgstunknat" + } + }, + "txs": { + "fundingTx": "020000000569d2329af58d249e20ab112f439e12b1a58fc4e7b0f97cf691d96a78e82a0cf50000000023220020e68bc54e2964824724316ee7aa6b8e33c7af0a640ab724a87968259015a439b6ffffffff923808ae5d074f12bb6d5f71485868bf4e3b48a129945e82a7c0d9c806d3085e00000000232200201a9a23c8b03604f7d25de65815122c7a6b509d57c73883a52daea388627e5c1dffffffff3b23d6ba50d93c4e6d5d2de8abaa58a691bd95512f1ef9e80e3e8d6ce77a05130000000000ffffffff95dc6233c3775107f9c4c0cd5ec5ed40851900dddc63f09be495e278320429bd0000000000ffffffff1de565098793510f126945b8f0b9fa12abc0bd87b26b3bfb5c0fb50363a6f4190000000000ffffffff0352c5eb0b000000002200203c364804b437fddae6a1455ba18e52ac81760cff47ed24a33c7725f0524f6cb61c9be11100000000160014a0c8951953a9a67d314a0dfb9828071dad39daceb25dcd1d000000001600149fb5e1bda8e219ea7bc4fb8ecd17b524753804de00000000", + "cets": [ + "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff026710760800000000160014244f3257b12821c4d1ad38cd0a1052f69c15937499b1750300000000160014d6f3837c9b60b2d9e8b51ef4935800a858f5a20b0147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52ae64000000", + "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff0100c2eb0b00000000160014d6f3837c9b60b2d9e8b51ef4935800a858f5a20b0147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52ae64000000", + "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff0100c2eb0b00000000160014244f3257b12821c4d1ad38cd0a1052f69c1593740147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52ae64000000" + ], + "refundTx": "020000000001019e80a1b7d28d2aeeb410624efeb4626751910ccc20f1dd4dcdd401db4191f2260000000000feffffff0200e1f50500000000160014244f3257b12821c4d1ad38cd0a1052f69c15937400e1f50500000000160014d6f3837c9b60b2d9e8b51ef4935800a858f5a20b0147522102b700c1c65fe4ff62a06c2738e9f0cc61ac7e8b668d4eeec5809407a5dc1eead32103b55e23ba6cf18c78af05900b1f322a4b5f714f3652ad2c1251a6eecf39d74c1b52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "785a66316660093c805684beaf8e4755bd9b683d227bacbdfb31e07537679b1f", + "nonce": "c592873ba8f369b709de18189464db79c605e3d45876bd6ac172809b09ca2d60" + }, + "contractInfo": [ + { + "preImage": "-1304922976098312616", + "outcome": "54089e32fca86da43dff7f0e826363b88513b7bf345653c8c45a6f83e6b6f322", + "localPayout": 134643755 + }, + { + "preImage": "-1810654198992477831", + "outcome": "ab145476a3171514169c8fd9140545abd18cef0e04ed656714be044f2269601f", + "localPayout": 0 + }, + { + "preImage": "-1175599216752989091", + "outcome": "30eae1eaf0489ff2835b5539038df67cc302a2f6c03a71cb5f2ad06c1271d60a", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "ab145476a3171514169c8fd9140545abd18cef0e04ed656714be044f2269601f", + "oracleSignature": "c592873ba8f369b709de18189464db79c605e3d45876bd6ac172809b09ca2d60afabdf0a72d0e7e694117b567a73b3c7b9df95145b0047edfc0b9d6df3548c18" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91469e7b259c39b8ccb6100c059a2c984d437e2f2f68700000000", + "idx": 0, + "inputKeys": [ + "67d42b7a5aef7e29ba1a100bf44c4db510e52b91b57e8cddcf2959fb2415670a", + "73341d958d22d775399a4f3880c87327e33102acb2b50e24837226c40caea17d" + ], + "redeemScript": "00203e4ffb8eedd0079c582e66bf02cd4f49da4d0f8a0eb353f62da3874bfde7ac45", + "scriptWitness": "01475221030b00fa0c4d02575cd821bb2b386faa057e30e5dfc9e49309ff067cc7691417ae2103f67a8b64597a4c257d16ef4e90a2c888ef26b86795bab59e3c3a3da697d19d6f52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914fff5f08345e01fb146be2eeedac0cfff0baec8158700000000", + "idx": 0, + "inputKeys": [ + "bd0929a6f251a1477e46e8b3c7d6b2e1797ec9dafa70befb29dac14cbd03efa3", + "13af2dbc0362527f23b5a8556f77de9f2a200a2dc24d2a2aa4d8964ba552c8ba" + ], + "redeemScript": "00202d891adba8557dea066b4774cbbb9e3e46151fba30a0e73b1716a9daec3e348e", + "scriptWitness": "014752210384d4f5355195d3e41b804c8097b64caa8273756db58dcc74cf8fb4feb6b3363a21025dbe3e75e2cff43e04a788c77fd9e2d3fe5e7e2c32242cbb87d14d63ff7efbad52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q84vuxatvkkcrc95v6fnt8ez4rxuj7wsqnrkrqt", + "fundingPrivKey": "ac459e1fdd01f881dfa0a0b080f1f5d512c77f44d144bd8ca17ba6ea681b955f", + "payoutAddress": "bcrt1qjq5d8fcalxqhd3uwv0w3xmc6zu6xsw9sw7wpfh" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020104876d654388384805cf78de355d759bbe0436596a222a5b08f137236ca80e000000000", + "idx": 0, + "inputKeys": [ + "235a498ed9929f42bfe07f575763e8a04cfe2b874e5acb588249d8532ad848a2", + "f4cbdda272bf0d45b29f3cba2e67876e14669af8e7284269396137d40bfbd9ad" + ], + "scriptWitness": "014752210205ccd4e386a9706a5cc3d17d9584422c9a4d8d7441e385e032d0c437bad0e58921031941e6e9cd0f1640389d098f1da698d2e5cde7c9dd9c457c6d751a473cc03dc552ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014740714ae5ef7eb579cb841360b22f209fffe9b6100000000", + "idx": 0, + "inputKeys": [ + "295fc1ffa80148e7d734f6886b61f17914c15f364c4255140ef7a93be58d9e4b" + ], + "scriptWitness": "02002102a98ce814b18e103630cbf8aaca2b6661011a91014dfb78407febf101286893c5", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014f0929a006726f8f043b1127ad14f92e6d8667c3600000000", + "idx": 0, + "inputKeys": [ + "a325bb8de5f7f75b9f9b162000b443ec5a87aa1cdba4e55b32c83059f3185294" + ], + "scriptWitness": "02002103536845339db56eb43f69639e51e44c5cc741490d97ab8bac39116d83ac40508c", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014b686dccd92a5eed30dd7ad22f5cd0397c40a450a00000000", + "idx": 0, + "inputKeys": [ + "a832b0aa15c847ec4f7a314c341fda4ffa265804ac348b2848deb0a214b52007" + ], + "scriptWitness": "020021025f7a02c6bbff745f599e96c28ffe3c2a5276825f505b627b90945ae214d1b3ba", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014489c5b80d903bacb973f0d09c5d9c2c2cc41351b00000000", + "idx": 0, + "inputKeys": [ + "77bdcc921e36b61b375974e6caed4a528cf38a6d0ae8818e4ed281aacc68cc1b" + ], + "scriptWitness": "02002103926e8814ddd7b14fc628a837a693cf3b72f6809545f419633d369237c8547663", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148d7d4d59a1af799ed9f072328859ed69d5c5ecb000000000", + "idx": 0, + "inputKeys": [ + "4cce707a12037b061a3189381eaf8bc8cfd0ab840f7330937c9f4dd5382a5f6e" + ], + "scriptWitness": "020021035af048c3118f1af1f4517c351e7d5e01c80ab3ebb037014c8791cbfe6ee93c8f", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914035162c491bf028e3aee57e8d8877d5c3039bde88700000000", + "idx": 0, + "inputKeys": [ + "37fafe1a60f5713fea80d69f928591c4fcf839adc92de3d8557948f80a561fce", + "13bf39630f7af8244c8fda2aa0ce0887fc4df6d043532a56a831d368774ecf3c" + ], + "redeemScript": "00207233ad052f93bf38366024d88ad2de7c4e5fb0fd1cdf3df8a26f6f3ad1a44815", + "scriptWitness": "014752210345e7fab044cd3d8074876c6a9faa73de6059bc395a37f7d4dfa8a21d8b26587521034acaf9a8cbb5ff0b729d06450fb4f92edab47ac512bad1fcc9ec00c469a61b3952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020e03fc390bb3cc7d9a3397bfcae34f80579b3aedb5bb7570c61cb6a9b37db350300000000", + "idx": 0, + "inputKeys": [ + "da002f0e752339de7e2daefacd8ab577f0ac85b568dc99cdcc2eacf9e824f170", + "20b2e2fd151a56ee46f54ab9a61dcbada3e478614c6b5e784ef108c1a32f62be" + ], + "scriptWitness": "014752210371d2c43cf0bd6956bbc892b310266c170e0a2eae38207655b3066135944d452321038520a1c9ab531b99880d2bf0fba3d6c45f3c1a303a72a06021bc76e313240abf52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qn5jpws04exwam0jkxf0s35yhwzwrw02fzp6gxr", + "fundingPrivKey": "c6602ae798499f64cce396324b40fd757e0a2a223aa16fbc1e886405d9e273a3", + "payoutAddress": "bcrt1q70nwl5tenx48yy34mpcg8frrzkzukms6693rjt" + } + }, + "txs": { + "fundingTx": "020000000a611866b903a7a429ee589980a2c238e309d75914e132cf821d4e9f8ff4198e2400000000232200203e4ffb8eedd0079c582e66bf02cd4f49da4d0f8a0eb353f62da3874bfde7ac45ffffffff90c9a159b9812d30f4b02977febf64d01a1c0f9e0685e7832de730b7896d10d600000000232200202d891adba8557dea066b4774cbbb9e3e46151fba30a0e73b1716a9daec3e348effffffff7a225de6eac4817a64da19964243f997b381c85026477abe8ec2b7ebcce3ab1b0000000000ffffffffadeb3e8214fd98726959e69685122fce14b3e39129c83ad7c8aab33df9508bd50000000000ffffffff1c9af3ab7147bda25528c8edcdd2400cd518f10de78132790e0ad45ed9f2a4880000000000ffffffffb083f642a8f3a61fbf9678ba3a6abdddf0b0b6c4a45f360fb7a4bc1660a82fa40000000000ffffffffa3ddc52c42480827a1ef4c024eda58a40aa617c51eb046510517a8bec217d3650000000000ffffffff0a980161addbb91b700942a4917a90fdfaab36f7a004b343217092b8c0d646ec0000000000ffffffff3f8a12d82bb48362310399cfe66770eb28725181aa90fba5db13a73d2091461600000000232200207233ad052f93bf38366024d88ad2de7c4e5fb0fd1cdf3df8a26f6f3ad1a44815fffffffff2cfeec6cb04a358bd1c93e7af6bc7133f89e1d4f9065c089759c5ddcaa07d160000000000ffffffff0352c5eb0b00000000220020feac1916badbdaef7e4ec96998c1aeab954f16b327512f6bb5fe995a4b1fb6981c9be111000000001600143d59c3756cb5b03c168cd266b3e45519b92f3a00511f6859000000001600149d241741f5c99dddbe56325f08d097709c373d4900000000", + "cets": [ + "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff022b800608000000001600149028d3a71df98176c78e63dd136f1a17346838b0d541e50300000000160014f3e6efd17999aa721235d87083a4631585cb6e1a0147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452ae64000000", + "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff0100c2eb0b00000000160014f3e6efd17999aa721235d87083a4631585cb6e1a0147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452ae64000000", + "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff0100c2eb0b000000001600149028d3a71df98176c78e63dd136f1a17346838b00147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452ae64000000" + ], + "refundTx": "02000000000101e4b618fa9e4e4535317edd6d7fe955fdf11150ea486f86cb812b6956f536f1e10000000000feffffff0200e1f505000000001600149028d3a71df98176c78e63dd136f1a17346838b000e1f50500000000160014f3e6efd17999aa721235d87083a4631585cb6e1a0147522102b58d8f1b153c3749c31f5915ead19ff16e1e52ec93686083edfdb2fb0dc928dc21038e1cc25c03cf9b2a2f49bc0a5041befb20358a9af71cf2b5ee332c0605098f2452aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "5cad082a09cde11bae5f51ed973ac2b3ce2082cabe6539848937a71e5dd6c776", + "nonce": "0add8b2358ce07d6dd4a453a7f4bf9e9b2d49e07c4f334b059d678c7cf077190" + }, + "contractInfo": [ + { + "preImage": "3934555244322946130", + "outcome": "d0e24f25bbc8e767694984aa07e414dfe5c10557bef6ef1bd984ffe1b38ddede", + "localPayout": 140425255 + }, + { + "preImage": "5204213191340129185", + "outcome": "f3c3003c290b8fe1f485de1103aec0c920ef7421a37818761feb914ea90a1d6e", + "localPayout": 0 + }, + { + "preImage": "2691963294600851606", + "outcome": "76e7c17d59a79fc31dbb9b5b6775a632732f26cc76cb33366d3437b83e9f6eff", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "f3c3003c290b8fe1f485de1103aec0c920ef7421a37818761feb914ea90a1d6e", + "oracleSignature": "0add8b2358ce07d6dd4a453a7f4bf9e9b2d49e07c4f334b059d678c7cf077190941b2b30155842b5f50660cb6ef1c6d6674742871cf869ea9f6ea3b8612ce9a0" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ca3ba68bb3850e6b71c770f23ab5441653a950b500000000", + "idx": 0, + "inputKeys": [ + "ef4af2e82517a53a0ced3887ee3570444b24f55bb6394fcc03c7d4ea106289d3" + ], + "scriptWitness": "02002102563d37cc3a45f3c199e4178b1d81c121f2459bca8d3657394c3353067c98b68c", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020eed6acdc91f8f3ffe6b5bb5f05cdef9a3e66dfa5e6117d870c1bb29f74a0ffe600000000", + "idx": 0, + "inputKeys": [ + "219967f18f239a5f704510e7f018dae7529472ea6188d12def2c2dee11c7e549", + "6670679dd9f7bb02edbf3760c621e59137841c0f0a366418d5ab95ca61523d92" + ], + "scriptWitness": "0147522102aeaa1a9207c06bc4430d9ab73641f0c8479bedfe25f5ee16a2602393da9b3eb62102498f0d2887b00bba0436485eae84ce1818328287758a086517aa3aad7692749752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020412c896aef3c5808f07e8f963b5e3ca4325d815df5993a358fc48b9f1feac78d00000000", + "idx": 0, + "inputKeys": [ + "ad063ffcbfef41c8ce3bb0e193475025ead409c8d5cadb9ec725ed38d90ba1c9", + "c300c061f6e9611684a3a9931eb74e3bf05e77ef2fc6acee90a10edfcbe2c4c3" + ], + "scriptWitness": "0147522102d0e3d2cb4b06cef24f009e4e4c5559615e00729c1ef92275b9a88f15629dfdc72102eeb33b1058a5ba6153bf3e4d4804a4aa9f0997fc8ef3a9ad98d231244e409cda52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qlq6fe8lp00upy0wvjgu0fxt3mhdh5kfnp83d02", + "fundingPrivKey": "817bb05b3d76093bfa3991441a62c5d6773acd5f1b4bc7e7d10d85966ab8c71a", + "payoutAddress": "bcrt1qj44f44tvjzlff87zdxhz8gpzn3a795x8v7x8z2" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014fa6e587409a1fe9843f48c92555bd2709d4aa20900000000", + "idx": 0, + "inputKeys": [ + "e81a335903935b537d253cb0d7c7e10ccb980f2682a3d06d22267a1e46c8464f" + ], + "scriptWitness": "02002102c1866867d675915c410366a9776c10ef40d5abbd6b9ccc19e0f293c919979c98", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qz63ztm6yrewsklzcglf373ddwjyl9k0qu5hww2", + "fundingPrivKey": "87d3f9b9eb9329c4a139c375226abe4a03988cd93b595297c4958611d07919b7", + "payoutAddress": "bcrt1qg830zhyndhmjrmtpfypxy0p8javwn83zmmhela" + } + }, + "txs": { + "fundingTx": "0200000004c92d95d6eb5861e64fdc82e7f42ad7b9d600212d50ec008963b669c298f9d70b0000000000ffffffff0487ede92e49c2d0b351063057acac2032506c7633a1794a1134e9d385a658d00000000000ffffffff044d7a42eb77619a2129baf1d002a0aeda49e11686a69bb5bbaa1c8fa7e534780000000000ffffffff146923a54fd466bedcb28d328d251a5b63682e1778f7affad4de0899f2c2012c0000000000ffffffff0352c5eb0b00000000220020cd240bf7d9f758ed90fb7ffb578696133d4223b4502b4f8a88d4c06d2a1aea63265dcd1d00000000160014f8349c9fe17bf8123dcc9238f49971dddb7a5933e1dcf5050000000016001416a225ef441e5d0b7c5847d31f45ad7489f2d9e000000000", + "cets": [ + "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0227b85e0800000000160014956a9ad56c90be949fc269ae23a0229c7be2d0c7d9098d030000000016001441e2f15c936df721ed614902623c279758e99e2201475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52ae64000000", + "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0100c2eb0b0000000016001441e2f15c936df721ed614902623c279758e99e2201475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52ae64000000", + "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0100c2eb0b00000000160014956a9ad56c90be949fc269ae23a0229c7be2d0c701475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52ae64000000" + ], + "refundTx": "020000000001013cbb7607044d4bba50bfa9fe2793455c74fc8f877bfb9b39f561749ae82b27480000000000feffffff0200e1f50500000000160014956a9ad56c90be949fc269ae23a0229c7be2d0c700e1f5050000000016001441e2f15c936df721ed614902623c279758e99e2201475221039d06ef7213724d7e90c9bc58c85cecb40e6fd0dc7c41ca89ad0e3002e215a9052103bdbdd3724a553b9f0baf76276a643f676805ac11d86199fc7baba2639936b04e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "fcdc6920743070694b5b98b8ba4a80163c647813620745541bdbdcd26a1e9184", + "nonce": "cf9524461b4c74d3a5596dfe57f0e3ac379018b16af274c48a0ddb487c95ef34" + }, + "contractInfo": [ + { + "preImage": "-4433314534670692301", + "outcome": "e44ee40699550da02f6376ea1d1ffae6dd390a56a05f4620ed69c17a907128b4", + "localPayout": 98069162 + }, + { + "preImage": "1581360096782273206", + "outcome": "ece9516f04803b78868acc1d58a87ef5ff2353e3af0ad9e2c703583d1112315e", + "localPayout": 200000000 + }, + { + "preImage": "-8322539809162522645", + "outcome": "416f3c9456bc67b4697b7d808708e6550a30024f63b9b915e84af8b5d604c8f8", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "ece9516f04803b78868acc1d58a87ef5ff2353e3af0ad9e2c703583d1112315e", + "oracleSignature": "cf9524461b4c74d3a5596dfe57f0e3ac379018b16af274c48a0ddb487c95ef34aca0090b4b296e5d7afa74775a9ee51273c869b064240f1b173b0a51e6a945c0" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020f033db130c2b972753f18a46447e1ef964615112c6704c974e20f4bddeaca0d800000000", + "idx": 0, + "inputKeys": [ + "0265402f6a9030114720f1ad768f6b11c806086a9e3c5e0216bcbb268837be27", + "51865cf6b341f691e06c51977cdb2414eee9d0419d87a67092471cb4497e3904" + ], + "scriptWitness": "0147522103d49fca9b40514c0720e4fe74924217b925ec59a362a96e4cb8529013987e963d2102e273fc2bb82f197717e8af23f839ba7f1711f4e40b545d9d4cb01119ee7d959a52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91469497235bb87ea0099cac5ca5d1a9d1ff630de908700000000", + "idx": 0, + "inputKeys": [ + "66f721edb6e73ca517996a0e9ba0e5c71d22fee015c6e1d5a33da71bf1301302", + "b1d269dc0e6e30f544b6587dc3dedd587b2aaf7393a7d9fd8d09c207f3bba38c" + ], + "redeemScript": "00203f2b373095bf1d09fe4ca6f033279a69a5dcbec7dc15379a0b1126ff4459dab5", + "scriptWitness": "0147522102a0d6b8f4b76b3d34436f8a3683ba322b08bb03d21df0898b5528fe14a894b88321029fd82cb6ab4ddf02da977a23f841ddd7b6965fe1acf0240908f1c1e46c4e5d5452ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143f1e04f9b4c1305064cb9d495c81c9aa016ba92000000000", + "idx": 0, + "inputKeys": [ + "92056d780de8b4bd94a02e8793a3405d4c7c38804d2903b48846e09597a8812c" + ], + "scriptWitness": "0200210247b151610dce31b32e3824732d0ca0f63f1f95e19cf60aae23a2077ac4208162", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q9klddcjcj6zcnulpyfaahddkzea0mx5pqedwp7", + "fundingPrivKey": "1d9d7960f9b90098c30e181aeff2776c51b06cc0f814e32afe0160e2e0eecbc9", + "payoutAddress": "bcrt1qgksfw9jq086uwh7zl5mans3r46phwmf73e2jr6" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d7adb4837207c92ce88bc5c8b56c987ac7766f2700000000", + "idx": 0, + "inputKeys": [ + "97b1e11df35bab415454c2a47f315d796c6dc956e1785844903b400bdacff88d" + ], + "scriptWitness": "020021028e8dcf93ad775898f8ca0dbe2ce3137dfdce220e499153921dcef7aeaf04edb0", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914346802093b9fdc6483e1f2037b4c502cd92efb1f8700000000", + "idx": 0, + "inputKeys": [ + "f1f68c6f8c00c9506338653d2f50f8b192539fa487bb31909d673ef897662e34", + "e685989230222860b6af75fb1e61d00426dab7e5fe1c1f27bb3a9501b09e9066" + ], + "redeemScript": "00209c24c9957289cc30ddc2118b4e0de7d1d92e7f112ff1b4d5b9887dd6b236fa92", + "scriptWitness": "014752210397b72e1825fef7b988e34d991d520727e4c68981b395bbee68a8e936c8b281bd2102784420c9eb31d4dc61e5007ebbf96588af16cdd853631a73983ddacbad173e1652ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q7kh4qw5aw4s4cpffejm3e8cqkmfeq3503gnppg", + "fundingPrivKey": "3567b08d30a21e6f8cc830415139926dcf643e6bc3a312ee2653c8890e4768bb", + "payoutAddress": "bcrt1q8rjufv660xcr4j7jv3pekdgvjf2pdfq9a6hs8p" + } + }, + "txs": { + "fundingTx": "0200000005e656e8279086369c315e31321e556ccac2dec607e57d77e4d2fc9844319794690000000000ffffffffffa24a6dbd18f9beb45ea05596da11058024e6e55bbc4bdcefe5472281c23c8400000000232200203f2b373095bf1d09fe4ca6f033279a69a5dcbec7dc15379a0b1126ff4459dab5ffffffff68efb93f5a6c68264aa5d7cfbe812ba42e43bc1ed0ccafdc99cda5bfe82956d20000000000ffffffff67088242eb6623a4b83c65f93716f07ae0ca1f6ae520f51919c51516b10a21b90000000000ffffffffbad8d3dc205e660c7aa99fec879746266d53bc4b790f9cf657861a83f6e1e69500000000232200209c24c9957289cc30ddc2118b4e0de7d1d92e7f112ff1b4d5b9887dd6b236fa92ffffffff0352c5eb0b0000000022002055fbd0a6d3eb799edcc05070a2e4a354e6c9a31c9c6ee0f12a229dca678d3e39775ccd1d000000001600142dbed6e258968589f3e1227bdbb5b6167afd9a81579ce11100000000160014f5af503a9d75615c0529ccb71c9f00b6d390468f00000000", + "cets": [ + "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff02aa6ad8050000000016001445a097164079f5c75fc2fd37d9c223ae83776d3e565713060000000016001438e5c4b35a79b03acbd264439b350c925416a4050147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52ae64000000", + "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff0100c2eb0b0000000016001445a097164079f5c75fc2fd37d9c223ae83776d3e0147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52ae64000000", + "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff0100c2eb0b0000000016001438e5c4b35a79b03acbd264439b350c925416a4050147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52ae64000000" + ], + "refundTx": "02000000000101587051b111aa45194dc939672558ca320c977daef3f0ae9d58fc94e4c926bcb80000000000feffffff0200e1f5050000000016001445a097164079f5c75fc2fd37d9c223ae83776d3e00e1f5050000000016001438e5c4b35a79b03acbd264439b350c925416a4050147522102b3af76d9abd0e5fc8ebb9901062c81068d1d2b3b15eb1568e873c633c8f5600d2103ede081891bff261ffa86b5ff4fa384000a55879e4f2bcadb53b37c78cac5df9e52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "93ac5d71510cd89aefc49149d8d9280a029021082d1332b9046723fd6dd869db", + "nonce": "5fe68c2690fc94a28f5957db198ec7d17cecc03c53149a2765d035348d1d9ab0" + }, + "contractInfo": [ + { + "preImage": "-2860241903555639506", + "outcome": "798dffbef81456499b025ac58ac8f9e885821c9f40e92de421defaed5b9f2551", + "localPayout": 0 + }, + { + "preImage": "5550694627404132930", + "outcome": "9092b5ed9e35ca832bef7494d1e1a14ef938e1968352f3cd8f0fb261e85a4f30", + "localPayout": 77817481 + }, + { + "preImage": "-7884928063193393714", + "outcome": "496262caf94d3a65153d563b8f7e3ccd8d9130fcd697197d9b32875b5b54a476", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "9092b5ed9e35ca832bef7494d1e1a14ef938e1968352f3cd8f0fb261e85a4f30", + "oracleSignature": "5fe68c2690fc94a28f5957db198ec7d17cecc03c53149a2765d035348d1d9ab0a91294d60eecdc97a1d2dc9ea0bf572d3951c1b1bf918b27581537c619d78ccd" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002011fa77d954e333a73fa7bdb1651607b1f415e43dca12ff19b899ba2ef8d5fa9700000000", + "idx": 0, + "inputKeys": [ + "f68f2f5ade3875e286ec0940903b8a0db6efc4fe70df3517d671f798a71fb8af", + "66ca311abd8fb100e38b9e15a47fa1ae2e318fe9851d194a2b36b2c86505c6b0" + ], + "scriptWitness": "0147522103c9497349202d143e206aaf62ada97d670f211f8187560a5d04e05338ee8c5a6c210290096fe1f15e4a8dbda4b37f1328cdce4bc198c81c7691249e8b37f87d30536852ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014cbc9e2679593bffaca4ae977e08f103f03d9217b00000000", + "idx": 0, + "inputKeys": [ + "640e74aca479e46dede870f117694a6f5f7bc0681822d81d05fe4a45855b91ac" + ], + "scriptWitness": "02002102933ab85cee0a317d9bcf95e196737341bc4fe9e5f9aea4cd9cab67adb42004cc", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200207bac9b92f9a6947f175cc37796d15693f09a92b72f97f88e59cb7eb4beae7d2b00000000", + "idx": 0, + "inputKeys": [ + "5e81071952e70c62e75ec548993d44fa81c7441e9e9686f966b3eb991768a843", + "6c214d69b60b76345767311ab64a26a57c239d0203768d48d6eb07c6cf2a173a" + ], + "scriptWitness": "0147522103c01e1af3cbad38f055463e376e4fdb6b86e7e166447562c36642d17a2eb3ba3f210266a5f620e0f97f89f4f550a9a1a3e506f9cd8fb8aa894263bb7dbcee5b955f8552ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qutze54rtykzan3pgzvmxak2rh5gp3teyhgfry2", + "fundingPrivKey": "d1c4cc1e08481ad884eae6efabe161c4ee24d2c146e844059ed599d9c028b4cc", + "payoutAddress": "bcrt1qlyqtkytqmyrt4mk43t6llpe9jp6zk3x7vf79l2" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91499d392729f32f75caeccb6a1830979c54eba41da8700000000", + "idx": 0, + "inputKeys": [ + "a1046c2097da20bd003a410dad533fd3d50ffff115e8307bf3ddd1950c322424", + "5e0273dfa3ee8cdb77dd0ab575141a6bbc5eecae46ef4c0d1c171a559233af3b" + ], + "redeemScript": "0020b75a9b15644cdc3bd527f052623ef403cbb66b8fa1d2affe7e2dd3d56ef2b076", + "scriptWitness": "014752210295a6450cbf8cfaf6725f38d9466c002ed19d254e995c16d53e4a3c899c7670672103e3d1e76289d74e9b74cebbfbc45023e1fa1e39e919c2e0b09e4fd6de25cc04b952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e641d7f8f016e87759990435f00dc0b593802b2800000000", + "idx": 0, + "inputKeys": [ + "ed5e72ae2c56ae64040a6ec614cfdb18ac73c243980be29a6b88ce2af79b1a78" + ], + "scriptWitness": "0200210351fea567816e9938fcdf123ffcfb3968c188355f4ca828374d39b8be50ed0352", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020996660cde5caa0a39db44645fd49d5934101ca77cbe66ba4585b6ebd112d8dbe00000000", + "idx": 0, + "inputKeys": [ + "3d7d8cbff6d3712b7bbf54e4967edf70aa5e75bb4a29b47697e0f7e27b235812", + "d78292bb17fb2c027262c51ac9f8e3619644495f0a578380da1701a123cccde6" + ], + "scriptWitness": "01475221037e6179a2194e6e71733bb722596c6925f7a93db9db977afedcc161e763c377cc2102d26eeb46aa671b60c0739b1e502ec61097e2612a455dde323c3d3087e3301db552ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qfq3ptz8gn88plewjglm24xr3czgt4vhnnw7nvg", + "fundingPrivKey": "8397ef4ca4a3cb9d8132d5a6f6dce4f4026eeda388a478a94b9e3f4fec6998a2", + "payoutAddress": "bcrt1qz20wl37ulycsjerux7da72zz93zs037lc3cts0" + } + }, + "txs": { + "fundingTx": "02000000064d51de25f8ab5661705ac87b6f2c39de37dcba93692cdf4ab087b5b4cdf833d40000000000ffffffff319dbc903d2416483f65496c56d457929f891ead54ef4900ee1a26dfaddf6db70000000000ffffffff6f5e563f6539d1a9436f0444db246edf92a72a5427ea68f70de6eef864470dde0000000000ffffffff79d1e161887746a78eef3ee5d92f63af0d16f987d469a95b2628662b7f6a1f7f0000000023220020b75a9b15644cdc3bd527f052623ef403cbb66b8fa1d2affe7e2dd3d56ef2b076ffffffffbf42d454d3190cfc189ae8e67d377a2536569c32bcf13c4d700df960cbf96c1a0000000000ffffffff5778a79697ed1092af87ca73c6269f2101e3dcbe882e1047aa8301a1ecb3cb400000000000ffffffff0352c5eb0b000000002200200bd53324a2b2dbc3fc9aec03f1e76904b528459fad1480e81ec387d698a3c2df265dcd1d00000000160014e2c59a546b2585d9c42813366ed943bd1018af24775ccd1d0000000016001448221588e899ce1fe5d247f6aa9871c090bab2f300000000", + "cets": [ + "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff0100c2eb0b00000000160014129eefc7dcf93109647c379bdf28422c4507c7df014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352ae64000000", + "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff028966a30400000000160014f900bb1160d906baeed58af5ff872590742b44de775b480700000000160014129eefc7dcf93109647c379bdf28422c4507c7df014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352ae64000000", + "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff0100c2eb0b00000000160014f900bb1160d906baeed58af5ff872590742b44de014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352ae64000000" + ], + "refundTx": "02000000000101f4dba77d24cef539ccb4b35920877323ce4953a805dfe072ebe6ce2980bdcfe20000000000feffffff0200e1f50500000000160014f900bb1160d906baeed58af5ff872590742b44de00e1f50500000000160014129eefc7dcf93109647c379bdf28422c4507c7df014752210249724dd02442039a6909e0263827f2be4e0d02d4bf0f6626bad2e7dae5c3f5c82103efaf9d0bd13266c5ab1ed8900107e38693f349695ffbf1aa9869c6d41e688bb352aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "cbb868a282adf475b494414c0aa27c63f1bb9ec70fe0ca0edb27fd13c5e08c10", + "nonce": "dc79fa50ebcebf681049ebee4f0f2f65a84166d8ae0a2155f920d9cb4970fbb4" + }, + "contractInfo": [ + { + "preImage": "4544391953555568416", + "outcome": "5f5836d43285c12673c2e595c371f4d8c4c9561104086100d0a27d2dd5e2b584", + "localPayout": 157758230 + }, + { + "preImage": "8080010761764790180", + "outcome": "50cae17fa326f1f4834e7d8958575e984652c4a54f70082a0040c5451ab6f09b", + "localPayout": 0 + }, + { + "preImage": "9207698247640169180", + "outcome": "cfe81d5b48d6cccf9dce2ad2f487314292ea9764bf30cfa4126529a8938fddc6", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "50cae17fa326f1f4834e7d8958575e984652c4a54f70082a0040c5451ab6f09b", + "oracleSignature": "dc79fa50ebcebf681049ebee4f0f2f65a84166d8ae0a2155f920d9cb4970fbb46bfabc409a9f2f1b982e776d808b01ca190e1a3e240036bde43dd312b045d150" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914ebe098a6f1435a18f61ab640359e4e26e6ce8b518700000000", + "idx": 0, + "inputKeys": [ + "392a9ca3cefac8c216a3a946bc957d3dd7cc4cb71b5bf60014adb201a3836a49", + "f84f66ee0a63ca772736faeb4c7eb2386d16e73e97f33a3ee284b5885cff3547" + ], + "redeemScript": "002017a28323c56f6f3e92a2d3455d0076bec7da5c960fc5a053a84b1df3b38cefc1", + "scriptWitness": "01475221026027f2608bed3aa5032a9102d4b572744e0ec045deb5e3aa60b36a4e3218f4da2102dad9cb179798606f2cf358b934ac05421864c0e2a4ea725834ae16b68fd6b95952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148f31dc6dacd2575813742ccbb5c47c76be79c10900000000", + "idx": 0, + "inputKeys": [ + "17f75c31fb1a042516d0fb5cc6c8df6fe4d0ae9b1305586641a78cd25b65996a" + ], + "scriptWitness": "02002103fd6887e97159f9d982107bd30847fe31b9a0681c10b1373f60fd53e047f9213f", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001482bc1ecbb3f961397fc2fc0eae26fb0bda22635d00000000", + "idx": 0, + "inputKeys": [ + "b95351bc77a69f1f07d1a49c11642a358c554319d8e72ea4c8d0bc71708df785" + ], + "scriptWitness": "02002103c674199b61785106a38788f0db5b22e912b3c1a3af5eff31252bdfe9f6f517f8", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1q4lvfmwk4v0cm320sdcaraqww7g724d7xu42mzw", + "fundingPrivKey": "e0ccc87ba1421be90d73823dc2f639b0c5de1679f18e55d26841d667e62ce9a5", + "payoutAddress": "bcrt1qsq35senquuajy9gp4f3lgeg3veatw9u8nd5fak" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001443949b12082432172d70af36c1be536d96c0790300000000", + "idx": 0, + "inputKeys": [ + "4a34f2c1077398c2f7f33f986cceed79ba90bd991f4ee7746fc8a15e0d6f28c8" + ], + "scriptWitness": "020021027435d5121740ebbe711e1fe61c56f21fb5ed358a2d95abcacadbbc96a74bfb4c", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020fb2fe0294dc016f1da6be1de6fad7f08455e85479596cf51698683f7de6592be00000000", + "idx": 0, + "inputKeys": [ + "39450a746b2e3a93d81a93be84e4be0b0786e601c145340ff7f1a8fc5e34f284", + "c31299d822f1c160547087e86ca1dc08fc4cdffdd16379a800fd674690aee94b" + ], + "scriptWitness": "01475221037e2b0084041ee23aa858da083bd5c7970cfb8fa8dc5f1644896de9a8545aaa3e21022a7a2c0f5913d82a2db046091826bbad5da1944e178a1e4ff1c2f3572358ff6e52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600148510ed7297083e003f98a8ff9bcdb538376e95b800000000", + "idx": 0, + "inputKeys": [ + "b9abe838de831a17ff88e398b59e130abd9e72539480f8f49892fa3a16924a57" + ], + "scriptWitness": "02002102e6fba8ba953994b38985eafcc1390625050ce486a6c83eeb13d3eb9af9da3ad4", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ac0607ab903330f3601617076eea95f6124ccac8a33a0c272edd6822f564ffda00000000", + "idx": 0, + "inputKeys": [ + "1b84cbb23df32b421582b7b1b6dc3448a9307104f3c7e8836a75a1d456dff82a", + "cf5492b21b0869f8a4ef7aa625cdc4bf9456e4ae675aa9fac0895d4c0a33aa4d" + ], + "scriptWitness": "0147522103cdbe36b5c821527d73d944baf3a7c4e68e1b9b7cf39865611b40aa418cb6de1021028675d661bdca709d6cf6bbba63e5f1689948ac52e3d38ffbb3eab1f672e7b02e52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c42c2f44167e9fed08c228056ae083fd4ed29b7d22572edcaa39762dc8c1802900000000", + "idx": 0, + "inputKeys": [ + "35031da729c2710ae06384cec3ef62334b864419d0e1d09f1bef7b750f88e5e2", + "f2a41c776d0fea2b6b75548d3d5bc73d32e8cc057d89c0e550902f3185ba8d9b" + ], + "scriptWitness": "01475221037e52d089cc9e6908bfe810a3b89651eb685cb63c47810e6398625b8c75437bbe21037015b47269bc69f085a23ca348b1ae856e6c36b6b86f776794372a19082eac9752ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e69c4e3c7c4bf488053e5b584bb8f9c13a06383400000000", + "idx": 0, + "inputKeys": [ + "1e0681987aa0ccb0ca38a1db6909015b833aa6c7408cfae2fcfc2d5101951357" + ], + "scriptWitness": "02002102e4232940f682f46aaf068a153c0b5e07aaad34b7f51a730ac61cfd1cc83a6a83", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600140ecc1896d6e7932bc317980c6ad592b90a7f7ea000000000", + "idx": 0, + "inputKeys": [ + "d1bd4da1a8f85914332365c36ee85f9509eacb8f609f245dff2f7bae86c1dd36" + ], + "scriptWitness": "02002102525b4f19d61c6701b0462284edce52afff8cd5e9282623a5bf8c394baa63096e", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9140085451578277a8f913f9c646246e12f306c0bff8700000000", + "idx": 0, + "inputKeys": [ + "aecb48f77647a4c91cda6b6c45550a026e7b8117f189df6b2810a335dd94eb45", + "a5b160317ed0b7227e76a24219cbd2fa1529cb2cd410dea820c1864bd3aed5ff" + ], + "redeemScript": "002005173f81562883b7f7e65bef2a1a8eb364314dda97794c4d8eb048792d3773a7", + "scriptWitness": "01475221025422a84aee7d19bd29a3e499a8f091515e7b7f22e97762b92e9051e3bf4b0359210218815504f0db6a971153173d9ee58b4fc2f3ec604ee89ac1c14623ac3cc6625552ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qa89x4gwr4y5xw7up7n2m5jvkdtjee8dkqunhmj", + "fundingPrivKey": "5ce65e9768f431e3b90ffcc9509d737adf262ac07f0e40d519c258fa3d0d0434", + "payoutAddress": "bcrt1qqd5fdpzk0utum7ur0tk9g78jsqqy4l0fds36d8" + } + }, + "txs": { + "fundingTx": "020000000b6073d704c46da2e723ff4d717d289f88cdc94e3f36f5bb9c82d76404a021afc0000000002322002017a28323c56f6f3e92a2d3455d0076bec7da5c960fc5a053a84b1df3b38cefc1fffffffffc43b63b1d5917b8584ee53935ef21a0174f60f0d43352878d38b6dc6a028b360000000000ffffffff03655ee44734408751fc78074318648feaaaf735ab6d91af7a30098d270568d10000000000ffffffff9de54194da5c58fd9bfffacec386ecf7bb728d7712058060c7dcb100e430dea20000000000ffffffff4cddf28015778bc75b2e61b2da1f15a91447992d40ac0075ad059693a7cfb8470000000000ffffffff00169fda41fffab871890c174e6f9f776176a03a73effef0488167fca25ea4880000000000ffffffffde4c5edabef65554855fd67027b39b2b0c0265955ef6117bc603e6c5a5a6a4720000000000ffffffff731f9ffb528284043f28dbd70559032e0ec1b69cbeddbc8738e5eec8db1343040000000000ffffffff231bb41ec08eec59e22ed3103703e5091e5ac7a164f82f2943cfb145de029f010000000000ffffffff18bb541d491bc2086ad228799694a5b60251db6015a8384f6c0018d95a0851630000000000ffffffffc8a78b2d920bba407ead27b2791c49465960f9f48ed390666b5f5f04bce8302f000000002322002005173f81562883b7f7e65bef2a1a8eb364314dda97794c4d8eb048792d3773a7ffffffff0352c5eb0b000000002200206fda5f81e4988ef373d085d39eecda7611bf1c419d75317522e194c12f4754e2035dcd1d00000000160014afd89dbad563f1b8a9f06e3a3e81cef23caab7c6c51e685900000000160014e9ca6aa1c3a928677b81f4d5ba49966ae59c9db600000000", + "cets": [ + "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0216336709000000001600148023486660e73b221501aa63f46511667ab71787ea8e84020000000016001403689684567f17cdfb837aec5478f280004afde90147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52ae64000000", + "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0100c2eb0b0000000016001403689684567f17cdfb837aec5478f280004afde90147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52ae64000000", + "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0100c2eb0b000000001600148023486660e73b221501aa63f46511667ab717870147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52ae64000000" + ], + "refundTx": "020000000001019acac086845dbf7e07d0ad1dae7987ef989fccb9a9ce3aef7ec2ea228b78989a0000000000feffffff0200e1f505000000001600148023486660e73b221501aa63f46511667ab7178700e1f5050000000016001403689684567f17cdfb837aec5478f280004afde90147522102d1bfecee5fb0b48fd4f1eb18b266464d4c0f32493a603edeab51c28ba179e2802103d42d8d22749f8efae492cffa04b252233036f4a234e4f2ba2d4f88a68e0f29af52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "d749033a7eddfb846cd832dbe456e9e429dc3fa49829dd5491685caeb1559cbf", + "nonce": "0c26f9f172981b3f4c995647e13004b7174fa720680a4b452660dd48cbc96bfc" + }, + "contractInfo": [ + { + "preImage": "-1659167550529929111", + "outcome": "63f8399081394b58e4250b65258a6a4b8bd05e1bf72dcfa8d48b688e8e26d1d1", + "localPayout": 200000000 + }, + { + "preImage": "6219388935345628528", + "outcome": "a14802052d0b0b468a9c03f114f811914a76dc648b923f6ff77622ea290cc97b", + "localPayout": 0 + }, + { + "preImage": "9217239319575883915", + "outcome": "f63450f6b1181c1de5f88804de43d5b63ad19954a82d5c0334734c8c7769d4f5", + "localPayout": 9677875 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "a14802052d0b0b468a9c03f114f811914a76dc648b923f6ff77622ea290cc97b", + "oracleSignature": "0c26f9f172981b3f4c995647e13004b7174fa720680a4b452660dd48cbc96bfcea182c6dbaa9d29c7362cf752499c50cf04db333de24a7b9f7f4f905380bd3e0" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208809d1371bdcf3a474fbc824ea6c1fbe301ee73e193f103fcc18f023f1c3901800000000", + "idx": 0, + "inputKeys": [ + "ff47336df5a3c04ff7210c5d2638262c82c6056642d2cb0d8d629b0aae8d3f23", + "e59495fb894d96a6704f5f85f7da1f9ddfca737ba91ddf32792668a300858d80" + ], + "scriptWitness": "01475221034e9e9d9552193973ed2d4414fdd82ade7621a5e2c18b39f7d37410cec427d94f21032852e5904e6cfd60e9c47895d0ab798e1734a764c0298fc100e70dfd6854c62952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ab446c7102a98e2786689c22398bf3e6b3a82c69682171dd465e5b99e51e487c00000000", + "idx": 0, + "inputKeys": [ + "ec03b2b063d00672532eb7634f9f42ac7e3e85d67d853b31712c0f5bddc15524", + "5c4cef4427abc8563b344d15481a0a49b47f7f11844ec7fbe192888b3faf7c56" + ], + "scriptWitness": "0147522102875de586a5cba38dcf05c76364decdccd2fb89e24365753b9c34bacffc3f14852103bcda93ee6a454a6ad330207190c53c1f8f974c247117e40c64f91db0f0c9d6ad52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200204f571eaf9ec4a3cbf1695845c07fe9f060531a456d4fdcf747f971955a52c9b500000000", + "idx": 0, + "inputKeys": [ + "a62b43e57e3fed03313fe03e3fb3ee9e71d44afbef98eab16352e8c879e11c3a", + "05a2e00d038e5c20ab09d339a37697eea7ba1967626e101df50bdd0837d6fcf5" + ], + "scriptWitness": "0147522102f2bc20f7f9bd697f55a696b20c041ba77480184bb184b1d78725f82878c63df4210265e542ba81d3d59d34d072f7d81c99a4ce0072db602e0ba796b804fa61b149e252ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91474c2fe1624092cf5d9280c517b2d2e89e630e38d8700000000", + "idx": 0, + "inputKeys": [ + "39dde32ec3a098ff95b336e7b2c596bacf0ec9b027e8b4a634ba5b96acc934ad", + "c4635cc9420f97d7a8011d78e30bd711ed0a84d215d9da25c95dc12e3aaa4b68" + ], + "redeemScript": "00208afaa056f90ad79e17cf6d9b971ec8da35118000d0d5a938f196c291d6055d9c", + "scriptWitness": "01475221031a25fe6d3001e7f680c1b5595cd9ecde5584b4d9ef20a96558cd87cf649c0cf62103b83456fca32fa8394c2b4b0998a4a62e408aada840e3c5a72eb3d7f8d292299052ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020d55baae178af77cd7be7680276410728e9ad634331c828ceefee7b3d1eb5e5a000000000", + "idx": 0, + "inputKeys": [ + "95c29ade047b1cb5e0b5213e7f5efa9d9cef926a60a14de85ee84c4e39d3f8b4", + "aaa26e7b6f925da7f9b4c0a213e3ac5893971db5366ffb7ccb98b89c8563c76b" + ], + "scriptWitness": "0147522102c23a1c79a73f0e5aaefdeaba840a1ab0500d683721d63bc63c6d19c9d57b467c21024b814cf2f5ced3168620f21b2928799c42308f93bb50a5b304e672ffc2e9910552ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9144b32c81f799492fe342580b23ef4ca0e9aee33498700000000", + "idx": 0, + "inputKeys": [ + "a7b8ac52a75e454464f7d9853fe8eeaa94dfb1bb02c36ffe17389ab240ad1d32", + "f15bc74057b06977cde192d68447782db9d62821c41dfe071843f1a1cb0c8a46" + ], + "redeemScript": "0020bae0247f65637377b4c2bc43220cfa5770aed8798cee99dd7c639c36c05d65ad", + "scriptWitness": "01475221035770f2128f74b8e883d73973695829a85639bf230fb2b9dba7138eb65fb68197210219448db4441c769c8ab2617d57b1635141fa5599f5a7858c08a1428ff0b546b452ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914c56802dd47e68dc2e00ffbd477bb46d103c832bc8700000000", + "idx": 0, + "inputKeys": [ + "fbd64e8bbe0b91d0a167b2d05501d928c31371388597909ce3a2112f3aaff987", + "3d7d04f0cf5da2a8a3e7e9eac73d23edfe1c16d257071236fd9e92cabc36ff55" + ], + "redeemScript": "00201c60761ec0cc6af8cb6af8b1931c2f24df947921932a8b64958600f0cd27b472", + "scriptWitness": "0147522103474ec105c2b9ecbfc281613d05dbeeccf927ace7517165bcca89a9bae4ec3d472102977c7c19cad7941a273453e5c6647bd939a65814d09097257c4c9b95f9e4591952ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014bdeddc2821956fab73df1327e80febe6ce5da5aa00000000", + "idx": 0, + "inputKeys": [ + "58d77b5cb70b464bb635707ab8fb541960a1a99c2841f45815fff10d91160577" + ], + "scriptWitness": "020021037649e8f5a6eeb4d1c1ef671d2ac5550d352cc8a31f736d0f45646dd19e626fb2", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qjxvgkfm2uxxlrf8gxe6m0nx3ym6v8yew6cxlev", + "fundingPrivKey": "b1f00fd19e8802ba8f571333055527f25c5128af592947e4f84b2c1eaae106d7", + "payoutAddress": "bcrt1qjg6vpdvdsyyl2p9aannpguwd9gtyc0ep75xmcd" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914937b46566d18f3581aeffce2a0c95b48a13c31eb8700000000", + "idx": 0, + "inputKeys": [ + "2ccf62d4c8969dfe26ef20a6095f6e6e8eadcbecab922ebc31dd1cd515987594", + "551900f2c8cfc742061ec3aa54764060ad642ac76d4c84f956544a51b54062bb" + ], + "redeemScript": "0020df67b988a7b1657e816c2f8c8096d7c8bbe0c3c8fd4bf0906018bd62aeed2134", + "scriptWitness": "01475221032c9f625a878ade4760f9f3c259b1e24a9a7e45a9c59ecaa5b26a21a8e214c6382102cf342a38f2d1d9fdb2f540f5157c62b0d47078a8b8e34fe4ebb1e023bcc7d66c52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qy673kax2p62mp79vuyezsy6jjhdxsqdwrf9npn", + "fundingPrivKey": "169754ced2445f544d2947209dfb01534028fa309a8d9ad4cdbe13f18fdc71df", + "payoutAddress": "bcrt1q2rhsqwqw4npyurzv0tx3vwg8f9mjts9pg8t4x4" + } + }, + "txs": { + "fundingTx": "02000000095cb66e9169c39e2062ecc2822783327dd13987d85437824bbe97581178b677d50000000000ffffffff8dcda6a2caae9f3d565e0d2f67070bc76edad0a0f791a6c946ae7f2a794f52690000000000ffffffffe88ffa3af10cf31423f371df3634a029892fd35860baf061fdd073a41ee29c410000000000ffffffffc4c66f9c64d9cf3e657aaa4398ca74e9df7f296b6c1ba135d09544e271636d3700000000232200208afaa056f90ad79e17cf6d9b971ec8da35118000d0d5a938f196c291d6055d9cffffffffff67e72a795a490b07ece41437fb4c50f2699bba1e3425985992a7f4360679b80000000000ffffffff22cc3d02c4d1e2229ef7c681c35e0c3ca1ec354e47a41f5a999ae693d732556b0000000023220020bae0247f65637377b4c2bc43220cfa5770aed8798cee99dd7c639c36c05d65adffffffff12f1f26f0753d994504e86bf29a9acf1f78d1d6c6f246dafca3cc65e5b2da8cf00000000232200201c60761ec0cc6af8cb6af8b1931c2f24df947921932a8b64958600f0cd27b472ffffffff1ac339b89830ee64399371a822d8bde7199c39da3600b725b0bae2c2b49395000000000000ffffffff2b2e2dfefb55242a5fa8a97af48021a69d05f2be816fb314709547de2f331b0d0000000023220020df67b988a7b1657e816c2f8c8096d7c8bbe0c3c8fd4bf0906018bd62aeed2134ffffffff0352c5eb0b00000000220020577a9d3317da1a28bb3660eea702089e2ceebd5a715ff72bda1c9a65b97067ebc81b68590000000016001491988b276ae18df1a4e83675b7ccd126f4c3932ea6dbf5050000000016001426bd1b74ca0e95b0f8ace13228135295da6801ae00000000", + "cets": [ + "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0100c2eb0b000000001600149234c0b58d8109f504bdece61471cd2a164c3f2101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052ae64000000", + "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0100c2eb0b0000000016001450ef00380eacc24e0c4c7acd163907497725c0a101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052ae64000000", + "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0233ac9300000000001600149234c0b58d8109f504bdece61471cd2a164c3f21cd15580b0000000016001450ef00380eacc24e0c4c7acd163907497725c0a101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052ae64000000" + ], + "refundTx": "02000000000101a18c7ea6bb30e6bbf5ddac0ebeee981ae6663dfc31e336834cd797d5904a59cb0000000000feffffff0200e1f505000000001600149234c0b58d8109f504bdece61471cd2a164c3f2100e1f5050000000016001450ef00380eacc24e0c4c7acd163907497725c0a101475221031fcdd02e227a128f35a5d8923374418c42996b41269c58570fe20f2388d3bda5210376d87c32d3692510f28ce2ab7c0f935c74a2838f1c22fed22e9eb8e5277f9fd052aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "e7b3f4829b513961fba9bf216ba107c64beead3343dfd0ce25d20a006d443d54", + "nonce": "c1e1634b9a0697d8bd60c8e4874a483b45395c4b20d02eacea52702b3a8dd65b" + }, + "contractInfo": [ + { + "preImage": "3786215049925999740", + "outcome": "bc3b08433a05340ea750d0cb7354206caa42a88d7da8b7a906021f173dce8f1f", + "localPayout": 0 + }, + { + "preImage": "8594279409804965449", + "outcome": "803c5fcc8056aa5b09a3f0796de82f6c0ba9676dbfca6cd0120d00af5ff84a65", + "localPayout": 40873766 + }, + { + "preImage": "-8936502121529092243", + "outcome": "816ebb97221c8f715177f4f7c9fce4c0da67b3d89d367832ee15ae7757cfd5c2", + "localPayout": 200000000 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "803c5fcc8056aa5b09a3f0796de82f6c0ba9676dbfca6cd0120d00af5ff84a65", + "oracleSignature": "c1e1634b9a0697d8bd60c8e4874a483b45395c4b20d02eacea52702b3a8dd65b68c69af39b618026e909d4073ee45a97c58db9eac8d61fe33d253ca3b5dc65a1" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9143c3709d63a827985fcaeb9cd8ef3d8324ab87b288700000000", + "idx": 0, + "inputKeys": [ + "77d430faa7c3167d0c017970a92ecae66a9dcf4a68546564b6b2fd0feeb8fd0c", + "728cd2df41b24830ecf3d2175bea4bc8e41df392774813d97518dc3ffbab9691" + ], + "redeemScript": "00206913da1d2286fe9e612287410be5bc0ab4540cac72186ea2d2a3c43952b89ec2", + "scriptWitness": "0147522103004a46f28946c10d7ef3a0ff1f9f5062d8a2f4b4d0d6474907760088ee8d125d21024c801e74d99b8017923af9c0329055c57446e37b32399eee5fe1d4f8dee99ac652ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143d5dca1256300728b224e5013780aab21da1de6600000000", + "idx": 0, + "inputKeys": [ + "c82c97f770aa20dd4d621761d32d4bc655ecd3b33564f0eeca7792cdff0d5039" + ], + "scriptWitness": "02002102d8a8a0ef4d104af0c5439a91fb0e16660a7ddfb3e7758140aed6e66853c45e81", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020578a49a7d2935d0cb430e271919b0210114f1538b72fc132d542281c2ed02f3800000000", + "idx": 0, + "inputKeys": [ + "fb042da2a5afa4069d5ce52245966c83467e4cbb66ba22c7a1db8d89c99e8560", + "7306517155c46f7f6e8b190a26d507d572c296b7d10309bbb71c9ca59cb55928" + ], + "scriptWitness": "014752210271c5e285dc865798be07604d580e9d46e2d427702f03e0d7bdaf8f5bad564f4d21022f6a280fca9d5d1b12c6b59873989e8d05c57e456de2759014623f650131f72352ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200206439b26394b3ae20df0a04e8be4aed52f1f17727769c540468ff770ed9e0949800000000", + "idx": 0, + "inputKeys": [ + "ef656abf58925f2b351c073bdb387be505a42f412943042043a14faa69615a2d", + "711d18d1837269ffaf8d114838d65aeced5baac528175e7b6814d40fc782510b" + ], + "scriptWitness": "0147522103899c6953942fd789fb7f67b542732953a2c3d0260cd72fa6f01d7ee7f0760333210369401c270c20bed70984d1ae0adb53dc1c1cd76d6eb0f6eef211bfb08cd76f6352ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020049f85cf78e95788183edeb7324b6982826ee69cf2b97e17b6a3f7463efcdf8400000000", + "idx": 0, + "inputKeys": [ + "579e90ce0463093099c407ac8eff6ab6dbf16d73522b8a6d9347af759bf21798", + "550758396eb6a6657a8e1f6ebb9935700ffc1f85a6b7e100ca344aed033d512d" + ], + "scriptWitness": "0147522103f3b9d187f9275ba4abc48eaab2d11a4b6a38a65d216e08fbe6b0aeefe678d9a92102160dda1b211761004cbb907e80940ba1cfc5e9ff13394b3361cd4c171ffe1e6b52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600146f9347bf74b1e24d077f117504bb0932bf03833500000000", + "idx": 0, + "inputKeys": [ + "eb329d49fcf5d549c31b066670c66be787412969c3db1c5474b920b12c365a4f" + ], + "scriptWitness": "0200210301481723dce60e76f72db6fc2b06e020c27878e3c560da8cc168254569c3ce7e", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208735dd9ea777eeaf5a1b1700d3af242187f6b58d63b45faceec65d7df4168cde00000000", + "idx": 0, + "inputKeys": [ + "f3efc285c7ec64f0d100c2408982f7e7d363fc3851e8140b61c5574fc19ceeda", + "03072346861c9c294d061e6d58df399ec2ff71d09c2070e9b8c88a01e96e42a4" + ], + "scriptWitness": "01475221028b482f985b0bd28d03951ea80b107757e267dd5d51b343de8f85adc78a2f1f802102e16303871c55d805d9d1c35cf31b93d1be9d9e0b04687b974c635d004ea3bab152ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91426c67946be6552045545f636b952c3750161e7538700000000", + "idx": 0, + "inputKeys": [ + "519abff8398a04e2512215114127c9a8d35fb9384ab5f0ed5a032d83b6b51fd6", + "2d9eea7447bf6911f10c4a422b5626b1ac7c0cd8dd5cee7306045ab76a928b61" + ], + "redeemScript": "00209abbc8f87ab0837aa18a60340a7b3b54666fd518a7907a096d2cb753b20480a9", + "scriptWitness": "0147522103dbc33b031cb1539b51ff81d7ee9da1640372a178cf6d5d6096bccdd2b2715cbe21026036831eb0bc65a0ebcf8f7faece76fea17a44165d62a4d1955d8cd33800927c52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qltrgkxw8ykvkuzfrumw7tjlh67wvwej4ldn7v8", + "fundingPrivKey": "12a6fd79e2075bb809c404c6382eae4635022987227ab815a9b1b6365432a0fe", + "payoutAddress": "bcrt1qwls8q5xm5ldh5ap4artwux75uzdcjp46xcanf7" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d6feacea1f0196dae6de3e8f4246d9e56461a0b600000000", + "idx": 0, + "inputKeys": [ + "560ed13df0fd9e05ba1b6ff045d1a6c55d313a40b35ca46b83f2f7c58df16afe" + ], + "scriptWitness": "020021036dbf66e84d2d3561243ca420431bb8be399c3788b00089af4744ca7e986c95df", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014e7eb96be28cde0302fb2bf34135a46c19f0b8ea800000000", + "idx": 0, + "inputKeys": [ + "82df6a92788575acb66ccf3b18df05464a32c596aa9174dc10d9529a85d11436" + ], + "scriptWitness": "02002103839b991d63a869bee27004af822f177926946ffa76840ee606b674aafbea8e90", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qgzfrw9k0asq4z0xczdhpwept2tjtxuw0gur5cg", + "fundingPrivKey": "891065ec0db911f9b69001b2a0d49406272bb55edca43ac5b4c8a5b2492eec8c", + "payoutAddress": "bcrt1qvdegfz8w52jrsnnrnh56pjqxzhl96h84wwpatn" + } + }, + "txs": { + "fundingTx": "020000000a5a9aa43b02c50e2522a761dd5a79d57d293f04b23e35b36bc036571b2377766700000000232200206913da1d2286fe9e612287410be5bc0ab4540cac72186ea2d2a3c43952b89ec2ffffffff4b9a4bd6896bca22af50d25229fcc3a139bfac47270403c7428759c27e84a78b0000000000ffffffffc834492e8d2db15f05cf120d7aa4877a673eee6316509d66666bbd406a01fb900000000000ffffffff2470261c37e9aa72bde3ed25b30c0faa228d69b55eb4c3793835558aa1f2b7b50000000000ffffffff8cf5997a69327881dbbc25e8a8c217821450d15e96d4bfc766e14f9d8551e7090000000000fffffffff1c1ae468143c8618ae2b80a7a6bce425b68ca28ea5d1aa27dd60d00ec777a5d0000000000ffffffffa40757577d5c820496654979d9774a00fa3644c51896f0818917ff3ee3e588770000000000ffffffff8f58a3c9fb52bba297ffe0555d5c33a558249ac9fcc03cb2ef1d51928842129e00000000232200209abbc8f87ab0837aa18a60340a7b3b54666fd518a7907a096d2cb753b20480a9ffffffff30ba3ec5b2781d44ca18af598b3bb9d811ef35b374b5973aebfde286423a51910000000000ffffffff8f13f86be6c01eba02dbc51ea86d620f9c92474239207a8c1a4a791e518d63750000000000ffffffff0352c5eb0b00000000220020dcf17d6d57e8af33853ea92211c570f880cc9d19e53d906b2b56e99140a6f491fe1c685900000000160014fac68b19c725996e0923e6dde5cbf7d79cc766558d9de1110000000016001440923716cfec01513cd8136e17642b52e4b371cf00000000", + "cets": [ + "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0100c2eb0b0000000016001463728488eea2a4384e639de9a0c80615fe5d5cf501475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052ae64000000", + "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0226af6f020000000016001477e07050dba7db7a7435e8d6ee1bd4e09b8906bada127c090000000016001463728488eea2a4384e639de9a0c80615fe5d5cf501475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052ae64000000", + "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0100c2eb0b0000000016001477e07050dba7db7a7435e8d6ee1bd4e09b8906ba01475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052ae64000000" + ], + "refundTx": "0200000000010184a12c01e05a95655133f47821df30cbb1f7c678a59741a8cbaed35d464df9a20000000000feffffff0200e1f5050000000016001477e07050dba7db7a7435e8d6ee1bd4e09b8906ba00e1f5050000000016001463728488eea2a4384e639de9a0c80615fe5d5cf501475221028fee90fa20f48705a3fe415c91f7213486e9c5cc0da79991ec7ae0596c1cd3662103aa6b75414e219ae44193802b71e2aeafc657e0980eedbfe0f88681835a616b0052aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "f35f9b062b0c048608c62ba51ce83e6ac5f50d95d3c97ea1e3aacc95739f6390", + "nonce": "8fe3878967f6ed874b568a5fd5b596e12af52bbffc5a2a993ab28a5ab54ef32f" + }, + "contractInfo": [ + { + "preImage": "-8611831950814159402", + "outcome": "11700c0743762c73d3c18dfa063fec9710e989c56f934894d113cb2fac372afd", + "localPayout": 170163182 + }, + { + "preImage": "-3108780768253003905", + "outcome": "7face0ed29680ae709b76292e451477858cba1a2f4480f0bc1862ebbc4740d20", + "localPayout": 200000000 + }, + { + "preImage": "1850873207173744127", + "outcome": "630014c2be22e5bfd88a0e24b8e5ce1c743ef2c8b79c6589f4750d1631ded88d", + "localPayout": 0 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "7face0ed29680ae709b76292e451477858cba1a2f4480f0bc1862ebbc4740d20", + "oracleSignature": "8fe3878967f6ed874b568a5fd5b596e12af52bbffc5a2a993ab28a5ab54ef32fb8712f1a707c8cc89a4fabf527122beb726ff9befeb5ee25230dd5609a1922f9" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200209839fed2dfe8b90be4f5d053436f7e1233449f2004dcae9a29f44cd63567f59a00000000", + "idx": 0, + "inputKeys": [ + "f3c3ed0bb50cb8294c94bcebba565eaf88f71b93fe76367bff2cd05ae389e2a5", + "a7a24ce2b0eb7251a39506bfa008ce115904599b2d0fc081349b76a662d387d3" + ], + "scriptWitness": "01475221032ac200d22cf87a35cf583e62db5ab6f0e7942b371c79f556346e009df7a353492103da934267e072c1a4a766f54a1b43bac0f40fa03fca2aceb094749269b585758f52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014bd41d65f6627c6adb2ea44432605a0e808eb78ba00000000", + "idx": 0, + "inputKeys": [ + "7acbefd6192ad68cfce7a844e7abacf601a00535ef6c7241e8df179a534bcf29" + ], + "scriptWitness": "02002103faac71ab8eeca8ab7a4323d58c3ddf8be70d8f24b796ab37f86c10ab91434568", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914705484515b6669f6a26cd87fdf1aade8e98f47068700000000", + "idx": 0, + "inputKeys": [ + "aff92d2f3a3e2cf2dd355bce812e8038495bcf025576a8e22d99b10d9acd2cac", + "cab833c2d89c5bdc7d80e9578b4fcf6e14e447c107e7a302c4c5c2a219558ec7" + ], + "redeemScript": "0020a4616f5b8c508f888f2856d5112f0cf034194c0e47859f3c0872efe1ff3e429c", + "scriptWitness": "0147522102b5128765d59f50a73511447da56af2b3cf94d23ed205dc85cac813374767561821039bdd854d542a25532687d0927cbee8cd4c8993eb054a2f3ea631a20402229d5052ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914c859b8dceee3038907f75a940b07ea6baf2e112f8700000000", + "idx": 0, + "inputKeys": [ + "8fd590934c67df39b68cc6784fb03476276470772fdbe82b53e6f743cb9c0e08", + "aedfe075fec9433fa09a93de946e68865709ce563ee6a96fdfd9f8d3035c620c" + ], + "redeemScript": "002037de01a75e02c53447198ebf7229a25dcaed62bc007d73933362036b932e8b30", + "scriptWitness": "014752210315b3b6f66e3863b3000ddd53b1f581f9af100ec4bea3ac428c253387a937a3f82103a646d432aede619791c80a36adc7e5ae4842325f56af74a1f3a5e81356c3176e52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000022002069e318e098337d7e5389346f02f86fde99ffad0d491fa8bb490ba8db3fc4ff1000000000", + "idx": 0, + "inputKeys": [ + "6d143d6f9c788f24535fe0d6768f9dd2a1bb779d2db5f984fcc27536159829b5", + "305f42681ed6f8277762ed5e19a37e3b88b40ce2406dd301c754573ac61cc144" + ], + "scriptWitness": "0147522102c934221dd13ce88b6d060a5c4fac801273c762985e4fefdcf536d8f293ef3a2a2103901d6c3cb6c1882e863499f5bac8b0597bf386e7ba179ce657e79cc47c43877352ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001406308f96d0c1629474a29ad0c67707899f7f520500000000", + "idx": 0, + "inputKeys": [ + "946e1d1469f4f036cc20bb9653e0c739b31a6e06d08a6b4c7eff62d1ea3ec808" + ], + "scriptWitness": "0200210205b34481e04f725ffb4da5c4492f831480b1eccf6a90ee399f8c2cbacddbf8eb", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a91474c3eabf189e80eb244579457518c9455e15f8618700000000", + "idx": 0, + "inputKeys": [ + "077d11b15e6bb6d431969902116b0b16dd507f09a8e813e303769d35663581ac", + "ba2c033eafd9f8017182236b4199aed89e565d4a9771a5a48038dac82217cff7" + ], + "redeemScript": "00203a806939ee507738a9d918fc6810b07c6b8f2b03b508ec6c62064b39ec3424c8", + "scriptWitness": "014752210348a211cca8c3e776f866471d313084d494fa8ce8f93674f193d9d5303bb419b42102ba13a4d8fea25e3ae204756eec88849c0523fd21a7e7cc5004e6135825c0655b52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9142e32970b6a784dcb1ab042a322da3ca5ebab722e8700000000", + "idx": 0, + "inputKeys": [ + "5129529265ea9a3cbf19031daeaa9c6d82096fadbac0d806f1533a9ac9257944", + "ddb46b010b69961d96525a530b3fed51e6e6f3658f9042a34de30d552b876871" + ], + "redeemScript": "0020edb47c30fd229d969d2c637aa23bc15ab290365fad32554167c92b707ef8f323", + "scriptWitness": "01475221038c52e80d2516393edfb3a886868b0b34744c96e69579586b0d581b940ba08dbf21038eaf456adcad8de681c77fd321f7dc1eda04fc36b90aa2973981a8ac98832ab052ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1qqudqaggftn4k8nc4yexujdfeqg0jkjlrevzj3k", + "fundingPrivKey": "c9d2f93cafc58666111c44983040fd43f38450dcc35c0cadc6f43d735db311f6", + "payoutAddress": "bcrt1qhp9jx3c6wg5xvjjehp9leftgjx00uj2et7q246" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001471fcae3b160d6ccbccdc94981b89254f36114b9500000000", + "idx": 0, + "inputKeys": [ + "2116ec6896fb274522fb74c3caa163c41b254312aa2b45e4a6d5668db0ecb86a" + ], + "scriptWitness": "020021034b51e93ec4997e800e5a03e9b24f8a532fcdc4f69443da770479d8718811a9b1", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9146c69103862ebbcb88344520da7515528db5932378700000000", + "idx": 0, + "inputKeys": [ + "242a70aad560e6077ef76e1acccad06cd71275de2d6c1774334655adf38018dd", + "0b8c71608035539a49eda34a799981bebad495f71e0404f9695c1ae0ccf74a32" + ], + "redeemScript": "0020f666c89666e0f81dddb01b6a4293d3f1051e6911e1167a27203aa98ae0cd1b11", + "scriptWitness": "0147522102d78cf329c8b3a3160d887c3ed31756aa294d7edb480df015a685cf35789e3dc92103abfac1bcd414b3440fa1219cf0f4204946f88d5e19d917fae74112ce899d6c9252ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014d2d604e693c50fab67f711a5fd407acb9cac83e000000000", + "idx": 0, + "inputKeys": [ + "cf6254b974ba88fb574662c480af1dfc1770ef4055f3858a6ec117c42e69c582" + ], + "scriptWitness": "02002102cac3bbf5c85c08e549bfd86c44ccdb86fd1e6e78f20fbc7623ebc58abf061a06", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qy39p9ekdk2ws2sk32vh6ctrdnm7kr9r2c790un", + "fundingPrivKey": "88486a59ac12b5995209d3bb8289a1015c64d0352b2a22fc96d3d6115b5fb1af", + "payoutAddress": "bcrt1qaruxtlydae3s9zduhm09246vsggk7cylyfav3c" + } + }, + "txs": { + "fundingTx": "020000000b5b2ca56029364ebc71d9eb4dd751464e86d4a2e58c2d7cb5538b9e85204de9540000000000ffffffffae068581ecf3d801034fe64d3a34e0a66bd8c418f3a6793353d7c1f1216e28900000000000fffffffffa38b4d25de598040e95b9748c39bcac16dba7e46658a569c52236bcb91505a60000000023220020a4616f5b8c508f888f2856d5112f0cf034194c0e47859f3c0872efe1ff3e429cffffffff279fa160e02d63fbfdaaeeeb80f59f964f999eedfcce3fc5548f7a89b918c95e000000002322002037de01a75e02c53447198ebf7229a25dcaed62bc007d73933362036b932e8b30ffffffffdbfb6c0977d6ed42de83932f83c4a41bf28c38949b7c75294299f35a00eeaede0000000000ffffffff42dcc47f46b6d2323a9594a328e0c6ecee1bbbd1d8295e716f5cd06a74e17a8a0000000000ffffffff0b4c1e8026b34af94aa6f63d8b66b96f3669de4a2df1f2a487498cc6966da0ce00000000232200203a806939ee507738a9d918fc6810b07c6b8f2b03b508ec6c62064b39ec3424c8ffffffff333e6e9b11bfe8f90bd18448ace312d49eb72f213d29b8800d553f1b810dbcb30000000023220020edb47c30fd229d969d2c637aa23bc15ab290365fad32554167c92b707ef8f323ffffffffd9d16098edae428373ece726496f54e20084b880497c0f0b3ee8d55d3d73d36d0000000000ffffffff5e8c20924b532521ce1a3b6fc93210099ece4654b39cca0f47374b7c1a9dc9000000000023220020f666c89666e0f81dddb01b6a4293d3f1051e6911e1167a27203aa98ae0cd1b11fffffffff10c99526ba5067a0105d61c15297dccf8269a48ff7487a3f08b7ca86803b3060000000000ffffffff0352c5eb0b000000002200208ef43f8280d18a877a7b003b2960ca67e3d4cf98e279c5f421c119fc65ccd83ba01b685900000000160014071a0ea1095ceb63cf15264dc93539021f2b4be3035dcd1d00000000160014244a12e6cdb29d0542d1532fac2c6d9efd61946a00000000", + "cets": [ + "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff02ee7b240a00000000160014b84b23471a7228664a59b84bfca568919efe49591246c70100000000160014e8f865fc8dee630289bcbede55574c82116f609f014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52ae64000000", + "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff0100c2eb0b00000000160014b84b23471a7228664a59b84bfca568919efe4959014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52ae64000000", + "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff0100c2eb0b00000000160014e8f865fc8dee630289bcbede55574c82116f609f014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52ae64000000" + ], + "refundTx": "020000000001013761b55aafcdeed976d1e9c45ed032e2f07473aa88eb8519a44acd84d3183a300000000000feffffff0200e1f50500000000160014b84b23471a7228664a59b84bfca568919efe495900e1f50500000000160014e8f865fc8dee630289bcbede55574c82116f609f014752210306ac10d29a8aced395b667dd52d262771085bcfab6c48fcea20fd03f970d225c21038bf9aae8a8a89e97018d942e9fea75be101c04f9186a12e0971d1483cadc9cde52aec8000000" + } + }, + { + "inputs": { + "params": { + "oracleInfo": { + "publicKey": "79cbc967d80f635e70082ebd151701f47368bef826f6764dcbb6e701eb79688a", + "nonce": "28e56a6a8e52efd6c364b49344c1f079dac6e66066e2d910e4e0c807b02af9e8" + }, + "contractInfo": [ + { + "preImage": "180283582877937499", + "outcome": "9344aab2b4b017e3518645f7687636b84dabc81516f16dbc36866fd09d024a79", + "localPayout": 200000000 + }, + { + "preImage": "-7011066972155496222", + "outcome": "7eb4a63c9e2d86b7369656876368a76066f8a9c25a161e2a8c34519c53d40c16", + "localPayout": 0 + }, + { + "preImage": "2863382793087547155", + "outcome": "f34529ef2afe86b4a867eb52dbd7d2baa0d6a636806edc1f33f5871dcc8cd2af", + "localPayout": 183121304 + } + ], + "contractMaturityBound": 100, + "contractTimeout": 200, + "feeRate": 5, + "realOutcome": "7eb4a63c9e2d86b7369656876368a76066f8a9c25a161e2a8c34519c53d40c16", + "oracleSignature": "28e56a6a8e52efd6c364b49344c1f079dac6e66066e2d910e4e0c807b02af9e8238b03cac5fd91e597d814b9d4a2ba1a265a94fe029cb777f70bb70bee0b4b3a" + }, + "offerParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143dbabe325c673a2085149463e61502433bdd587700000000", + "idx": 0, + "inputKeys": [ + "e3e77795ff20a02060e1a10e31d47e366d1dfe1110e0bb76489f2afdd3e32f98" + ], + "scriptWitness": "02002102776bf66fb6dcd08f2351c54041c9766d5ab78d07372b64ba0a6679c9ba4df33d", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014ae612e835d504c52c2316a041c9e4edfced90c0500000000", + "idx": 0, + "inputKeys": [ + "7b5fd93de358810e265cd8d2da494ac07fa4a61807a93f8dcc948e3f541c2c22" + ], + "scriptWitness": "0200210300278957a0b78d7025c018ec6e79fbbf7a5737c2bb3fc6455cd929445bc72d13", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a9141fb7f6ffcd46db586b3bc802b49725a47fa8825f8700000000", + "idx": 0, + "inputKeys": [ + "067f0aee1437cef4af15d8dfe78e459acd353dd1f790aab9dceec5cf2862514d", + "5f662cebf8aeebb3fbb61f07e3895931d82720b645242f0b85c2e677badb1f4a" + ], + "redeemScript": "0020500920ce687635f6a5b9885187b5005361f93bf91aa19d251bc8f2c5c12fb18d", + "scriptWitness": "01475221037bc36e915610d9f7b2e127e8233ca2da5380846fe60e2dd899ff62d59f313a7621036461f8bd8d3eba7c1c9bde364e5befadd1d4238c5a4c4038f4c34368a8c11d0252ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914b5cbe948d66732d9836eb5ba14f22e18929bf8668700000000", + "idx": 0, + "inputKeys": [ + "154d97656b67d591ade9a821c50799970cb1fb7f1ec2a1cd09251ca718f06e72", + "7fde026542f3b75c239ea436cd8019e5e885ef78f666d91ba249e7d5e356e0a4" + ], + "redeemScript": "00201d45f51c03707ef348b6737fceab2ab6af2ab63af9acc95f150eb6c6b304a4f1", + "scriptWitness": "0147522102ed48b56f412ff53a4e008fd5133299d93ad89e0de22cefa31cd1502c2a7194ce2102b916e37339d4d2e772d4ad0d2d24269add32c7f716a69be0dd9fd515aeb0bfb352ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600141f1ae5802cbdb972a2a39af5be37e0532e8b0d0900000000", + "idx": 0, + "inputKeys": [ + "458a06fad590e6cf57e843a97084e4b5ac4ed464997d2e0760ca88fcab5e450f" + ], + "scriptWitness": "0200210207ed47bb4233f6d0b761d3d4abc6af7d3b42203bf8491632fecd71dcea6056b5", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000160014414e77318c96407650257e25013c733bfd28ebca00000000", + "idx": 0, + "inputKeys": [ + "2c4d001aac58a2f477d8c6ca50d742658b4e85cd025dd3d8e3638068c89a9446" + ], + "scriptWitness": "02002103368db32128087cb6b09d03c955c01b6857c702cda23b334d2c9db380327031fe", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200208ffcbccc30951c00ea7cabe04183a3665b55ee90504d270cc4d477bd9782ddd900000000", + "idx": 0, + "inputKeys": [ + "f1d7799dc06af2bcb5031c51c8a02b236aa69dca36ccc9d34543e55bf4c5510e", + "99e2f02d613ba538338d51b83000ab461dbdcefd877d6e529d9d5b92bdf8727f" + ], + "scriptWitness": "014752210217c1c184e59cfaebeda1ea01f11b8055e70af2eb9bd79e0e2e2520aa463133912103ef0cc74ba368c69031c7b68ec5e444274ea56e05db355ea96cddf969ecb429ec52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000017a914db5252476be0cb41e32861b387cf51a7413d7dd58700000000", + "idx": 0, + "inputKeys": [ + "8c000356f73881012355e0e0449add9a7aec9b94b1b6527df404b4d005ad3d3b", + "32bac6329a54eb0c7429a3ed2d68cbd61a526ae068db973f992fba91cd466088" + ], + "redeemScript": "0020c5517f5df6c37879445f3b180addca82a6c3f1aa5d9566eef7ede3cb19c85420", + "scriptWitness": "01475221036b8abc502660b3222f8186957fdf94b3c5abce37140127091a010f2bdf69fbef21023bbc56df3e48461a7a8b3bfb9b5e442e35279d3b54e02d5cefe4c22362617feb52ae", + "maxWitnessLen": 218 + } + ], + "changeAddress": "bcrt1q5zy45nne9kmeteqwlfwpnkcqcpdtpun8s45g0h", + "fundingPrivKey": "6d9973c7c74d7d529e3a15d1f3650a55a72d7b02e90a9c07f02db2851cac847b", + "payoutAddress": "bcrt1q9w9fdyj6nnldy54hdmmj0smsc4n4j87hf9l9xq" + }, + "acceptParams": { + "collateral": 100000000, + "fundingInputTxs": [ + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600143bfef687635ab43fa90cafe67265a9e51fdb3eec00000000", + "idx": 0, + "inputKeys": [ + "cad18ea35d1566cb70f0f9621aa38ef4f3e0c1138cebd2249cd4d94a22f6953b" + ], + "scriptWitness": "02002103ef268468b6dd2680eb318c9f96c90cced49c678f16dcd71814ad1f9f921da1b4", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000001600149591f237a03a6f6c431d6b7c44fffa0e7038742f00000000", + "idx": 0, + "inputKeys": [ + "90907c2914b69bd893273347cae503dcbbc206354fd9435ac613648676986d39" + ], + "scriptWitness": "02002102ba26eddbd81cf9887bf5a507b66e8e1cee21f67b86de0f9f4aa83449aed49793", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020c6744ac4a48d1ea11dcc4ddd6e94546561c7ab792ee6a7764c39bf148e1d816d00000000", + "idx": 0, + "inputKeys": [ + "4f39e67dd8bbc64761d3869ae4446ce612959df55aaf1ed3a55e291313358dff", + "3711c789d4e73a132c5698a5447f0e9848a616919cc7f4bba6a762b1aa0cec2a" + ], + "scriptWitness": "0147522102edf5b76d494ed16be3f626167a0a9d7d08cb96cd6a55b711c4efb39b765866b92102619542ac7ac67fc1ab96303ee6a32ac3227fa0513a543d8ec25e612ae704edd152ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001427270e9b97e372a398fe2d400a65552d3f80574100000000", + "idx": 0, + "inputKeys": [ + "b8a05a715c4da7f3aa46b67b65d364bec08af1c9d91a7d74f9b3b9a7187da52f" + ], + "scriptWitness": "0200210298f161d64d82b9cb98243c7d16f66c6b645aada5922bc1937c4d0249a5186008", + "maxWitnessLen": 107 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b000000002200203028f773013459e4cdef9d1e601aedc40349267275d98af1f558bebbc727128a00000000", + "idx": 0, + "inputKeys": [ + "4af7edaf7c0fa9e38452070d62d7a4a15c1c5cc6597cf122636ea04b4bc91f21", + "3b113182d45d87f58e7caa70b80c96126c5161ae6dce5392a0a8bf48a47c3d79" + ], + "scriptWitness": "0147522102693351c1b963b31b3cb152726312a3ded1ebe4980a9398323b685dd3c6313750210308386798355f526c7685044a96a0db4fa7a3400e2c17b972b36f17a583dd410452ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020ff04f96a38a0658fb8b6daac94f82dfbf410908b6d3a374f27f8dc1c656d271700000000", + "idx": 0, + "inputKeys": [ + "ea3d5128ed90bbbc3971e45905e5385da219445d706402f9807d48bb5024cc27", + "9c258532bfb479ea7dc0bb6eefbe208d3ac251b9dcf1279724ba158ac6e1a376" + ], + "scriptWitness": "0147522102ce3a560664dcea78d24dfc45da03da97e9d442e7f824a9bc074c41766b84f0112102f43975e777017255ba6c991623fa774f382e0c3936e816815fc06075b8766a3b52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b00000000220020781e81c396a24203890e72de4e5c36066ed9e723b0f5ecdcc73f50ef46b2e3dc00000000", + "idx": 0, + "inputKeys": [ + "64e807670fa0d755eef33559380668ca8aae74c72ed8930b59dd2cdf9812bef0", + "7eb52d85cbbe30926b49ca42e622fc9223917398f16f243bcf0ccc14bc54e5de" + ], + "scriptWitness": "01475221039dcff5549f9f0d081423726ec7301b3d30fbde3477e96b72ae8a8dcf4449205b2103a5ba7c3b869fa6106c5310de67e0a3c99a3dc66beb33f76baf29f4b6017944cd52ae", + "maxWitnessLen": 218 + }, + { + "tx": "0200000001b34e4345b6a07226f1aa91f2515096574fd6099eef1cd9885c8d069e5198cf760000000000000000000100c2eb0b0000000016001421d3dc7fc6ed3f971c07098e757d56e84bea724900000000", + "idx": 0, + "inputKeys": [ + "6416f79c44f88fdb3747d63a872d7e52368079142cf2b10e84c04c68ebc8ba68" + ], + "scriptWitness": "020021032797a6cae53b592d5e9803aebafe3496ba7e146e4a5768946666218749e23f06", + "maxWitnessLen": 107 + } + ], + "changeAddress": "bcrt1qpszdvz3n760erqs9qnyw7ja8ff745psjg3r79x", + "fundingPrivKey": "548b675aba9c9e657830a8235f1fc42803cee34e65c623c3247c0ef5cbc6987d", + "payoutAddress": "bcrt1qvhszskh4zuyq2gmfz264as9fag0tn039qudvc0" + } + }, + "txs": { + "fundingTx": "0200000010caa1c1353a70799e9468f13be0eeb331a8b867fbcd18ede18d52a2818adc971d0000000000ffffffff3f35a1dc6d4edc6ba01a89cb04d17b05225d76efd4aaf41ecb1203c4a39bb7dc0000000000ffffffffb2458b0088486a52bcde04c5c9d392ffb5e6ad395c90399731877475347540ec0000000023220020500920ce687635f6a5b9885187b5005361f93bf91aa19d251bc8f2c5c12fb18dffffffff5abee939130eec2c9377386fd7db6bc89a3c127e8fbecdd958a990a5c1621e8000000000232200201d45f51c03707ef348b6737fceab2ab6af2ab63af9acc95f150eb6c6b304a4f1ffffffff0eafe3974b1671e1cdfbdaeaeee657c2e214e6c88d8d87dc79c84d5bbec4f5910000000000ffffffff467b7b106f64970a1bdb134a679b251cad36d7fca1354147dfb3e2306e9cfd0d0000000000ffffffff8d3c39384bae97064b58ea11a98b12b3b2c6be02a4f2bd00e4a7532b2dbc96940000000000ffffffff858b2c036f52bf978ea6dc328d65fd5d25ddf900965d49d291a988c82db1b0520000000023220020c5517f5df6c37879445f3b180addca82a6c3f1aa5d9566eef7ede3cb19c85420ffffffffb65f4c6d41aa23bda098cf08a18358b7470cc9ff9db661c3c2c4502b3fad3da10000000000ffffffff699972f1a48331a4fa255fcfcfad0687b21e49263d3db6a1ad0923be878041060000000000ffffffff13b5acb23a97fd8daaca9dcfb000aec6c24d18175f5b2d28bae285267ca8b16d0000000000ffffffffe76f99a273370e3851865e2e3426d1b49707ff638a2b62c93ae6843c98156e790000000000ffffffff82dd88082a337cc5371adfe68aaae4923d49f64b7abb964da5268154921f725e0000000000ffffffff0887bb0796acb54774825d6a67e2c67e70892852a2e9a9a897fbccdeb4ede5530000000000ffffffffa3ccb42bc38cdd8a2c148c5388b2a2c6d94d4c942dece61e60876c9b7ec30e7b0000000000ffffffffedddc17c692d6f225d73b88dc1b55ec4a349991c65fd670da05f5b5879946f690000000000ffffffff0352c5eb0b000000002200201cbce2656fbc781147a965e0f83bc5787c761a218cd28866635a547c9164354e671d685900000000160014a0895a4e792db795e40efa5c19db00c05ab0f267741f6859000000001600140c04d60a33f69f91820504c8ef4ba74a7d5a061200000000", + "cets": [ + "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff0100c2eb0b000000001600142b8a96925a9cfed252b76ef727c370c567591fd701475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852ae64000000", + "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff0100c2eb0b0000000016001465e0285af5170805236912b55ec0a9ea1eb9be2501475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852ae64000000", + "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff029835ea0a000000001600142b8a96925a9cfed252b76ef727c370c567591fd7688c01010000000016001465e0285af5170805236912b55ec0a9ea1eb9be2501475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852ae64000000" + ], + "refundTx": "0200000000010140d3270b468c9780988b9b35483483eb98bc1bf0e5c21c2ffd5b09d41780050b0000000000feffffff0200e1f505000000001600142b8a96925a9cfed252b76ef727c370c567591fd700e1f5050000000016001465e0285af5170805236912b55ec0a9ea1eb9be2501475221022fc4d2d0729b24311641c430b84268e4884b9fe8e7bdb0c937df8c92cbf20eb62103df09ad6ab6e2140a5355f04c89434e828a478cb075f23cdb45cb3176410f5b0852aec8000000" + } + } +] diff --git a/dlc-messages/src/test_inputs/offer_msg.json b/dlc-messages/src/test_inputs/offer_msg.json new file mode 100644 index 00000000..53e4a97e --- /dev/null +++ b/dlc-messages/src/test_inputs/offer_msg.json @@ -0,0 +1,163 @@ +{ + "protocolVersion": 1, + "contractFlags": 0, + "chainHash": "06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f", + "temporaryContractId": "1212121212121212121212121212121212121212121212121212121212121212", + "contractInfo": { + "singleContractInfo": { + "totalCollateral": 200000000, + "contractInfo": { + "contractDescriptor": { + "numericOutcomeContractDescriptor": { + "numDigits": 13, + "payoutFunction": { + "payoutFunctionPieces": [ + { + "endPoint": { + "eventOutcome": 0, + "outcomePayout": 0, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [ + { + "eventOutcome": 3, + "outcomePayout": 100000000, + "extraPrecision": 0 + } + ] + } + } + }, + { + "endPoint": { + "eventOutcome": 5, + "outcomePayout": 200000000, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [] + } + } + } + ], + "lastEndpoint": { + "eventOutcome": 8191, + "outcomePayout": 200000000, + "extraPrecision": 0 + } + }, + "roundingIntervals": { + "intervals": [ + { + "beginInterval": 0, + "roundingMod": 1 + } + ] + } + } + }, + "oracleInfo": { + "multi": { + "threshold": 2, + "oracleAnnouncements": [ + { + "announcementSignature": "b6a9f79a3c352ffda73ef8db9c37dca6b7310ea4ad96094c7d29f276d72e89c8caebb8b80daa1a69360a5366280e519a58e328d1e3ee89f32716e4ce336607e2", + "oraclePublicKey": "66c05e5845f330791028c62aa2cb5cc9b88145f8295f7ae9e5f044a537b2a560", + "oracleEvent": { + "oracleNonces": [ + "3b584a4049fb2e4f51a0a55e371bc72a55ece6678c89414450f26543bba800bf", + "cd9433d185d08452302e24019134089c38c5b35ce2709398fb2793079ba3be4a", + "e9f506c24e86106ca7e67fa7b38576e868fba87b805386cca622ec7fc67cc781", + "1d23bda4d41bc3829a5dbbacdb94395cf95700ad3e9d84c2ccdbd016699b5aad", + "7631072764bce0db2de17273d48b084e67a5e47531bcc8da4444dd5a41f42c15", + "0876f61639e0cb6845008a43a24eb5110482096de6db5d1e9f03712fa92a0eec", + "cc669fc02f8b1005b92d5a292bde27488fad4d38f61087ed3e2731a62b65b801", + "768145f4edea846adc2a519add9f52b343f31afed366074ef7140b5d272a1a04", + "ae4278283bb7a27c841ad2083a9af1d8e6de0734c756319558bbe18878e01f65", + "df37b1b84d03bc4addf0c902c3d25311a55ce8cca1bdb298292e57e62eb3a51b", + "3afb1b0bdca1e8caff93f984f2ee640c8f766007cf843fbea49386cd97fa27b7", + "b597125db6d01b899ad1b383ba26741766754befd0ed7ff18ed9e2dcf84ed757", + "2bb73e1389ca2bbcb360d52b303d54968b9b614e5e730294fab13cbe39872733", + "2bfbdd9d12e9d7b98c34664bd87d53ca80cf21abfd2e0abc18d9ecaa6a1311d6", + "e586d07ff98f47d1d4e871b7dd2df84c91bd84d352d0fc357cd49b54476bf155" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 15 + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "e3b1d3c8c874c339141fe0209dd48c01c62a2fad5668093e2e96be0a88be37a5e7163f7d4e0c9f9111fba60503b775e464d1c798d843ab80a9f1ceacf52a2aeb", + "oraclePublicKey": "97e61039bfdaf898391b8b9825934802b7960a01162d9b4f8a000ae8ce9e1fa6", + "oracleEvent": { + "oracleNonces": [ + "baaa6464e8cfede79012a02723301d7595cb506ea846ac2f5da45c726b003766", + "5970ae9ec1b131ff157da44c204ce1fdd70ad670ece8c704cea32ef7b0ebf462", + "62b5a76b68629d963bb4718ca713e8171365ce51c29941befe0e3dca99cea126", + "5dc0318d4195801ed9b5b86afa12e744ccf7e15e68bc46ef7a30ddb5652d8264", + "18346b71e012f91ac41f222817722717e33c351e19ccf7c9f4378d8e3fd56881", + "4254d6e692e620c080fb29a4e9c67d35e62feb7629d964bed71ac6679414bdd5", + "36d610e88e1fe491fc1055497017e5babc45f17f7aadf9c35800f529a93fa2a6", + "60ff8f86ff75d191bc7cc74dbc31d9f031c54654406fe8ef5f802c9622afcdc4", + "890bd95edc36570b61d3750f89bbb0b6e5a10f12692431e57d7f9362c3f31436", + "3ef80333f95f0277206dd693d5c9362b6326b991c44b7d21f3a63dd8931314a2", + "4b209c8b2e0fdb1b910a57135e146bc0cef46d21915e0bf17cfedb5c7c2296a3", + "49ce4c0b32fdc717d941c87137b9c7b26726236f256a2abf28de9e4870e79d08", + "a9ded37ffee3d0d35d9fb3ae8e0984c250fbbc1db32c08baafee3154bb6e0f51" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 13 + } + }, + "eventId": "Test" + } + } + ], + "oracleParams": { + "maxErrorExp": 2, + "minFailExp": 1, + "maximizeCoverage": false + } + } + } + } + } + }, + "fundingPubkey": "03c12e81303c79abf90a81b900aa3bd3ba8f47ef84c860cb314fc58d531a4d37c6", + "payoutSpk": "0014f65cd6349437fe1f35cb27628f112d7885a5c644", + "payoutSerialId": 4752179201940702056, + "offerCollateral": 100000000, + "fundingInputs": [ + { + "inputSerialId": 3784123604127642354, + "prevTx": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a010000001600143d7834074191c93d7fc2c0a54a6d40efbbfe76430000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "prevTxVout": 0, + "sequence": 4294967295, + "maxWitnessLen": 107, + "redeemScript": "" + } + ], + "changeSpk": "0014bf1b2161a681add692a326ace320bc4d8451ee81", + "changeSerialId": 11805380369894479502, + "fundOutputSerialId": 17245645112901355593, + "feeRatePerVb": 2, + "cetLocktime": 1623133104, + "refundLocktime": 1623737904 +} diff --git a/dlc-messages/src/test_inputs/offer_msg_disjoint.json b/dlc-messages/src/test_inputs/offer_msg_disjoint.json new file mode 100644 index 00000000..9533144f --- /dev/null +++ b/dlc-messages/src/test_inputs/offer_msg_disjoint.json @@ -0,0 +1,352 @@ +{ + "protocolVersion": 1, + "contractFlags": 0, + "chainHash": "06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f", + "temporaryContractId": "70cd7bae325b7ac63cd92f15b9bbe5d342c23fda8ca01de2ea1d2a227a3c93f5", + "contractInfo": { + "disjointContractInfo": { + "totalCollateral": 101000000, + "contractInfos": [ + { + "contractDescriptor": { + "enumeratedContractDescriptor": { + "payouts": [ + { + "outcome": "a", + "offerPayout": 101000000 + }, + { + "outcome": "b", + "offerPayout": 0 + }, + { + "outcome": "c", + "offerPayout": 101000000 + }, + { + "outcome": "d", + "offerPayout": 0 + } + ] + } + }, + "oracleInfo": { + "multi": { + "threshold": 3, + "oracleAnnouncements": [ + { + "announcementSignature": "909a7dbba1180d50f73f0e595b20a5120a6da0aa461c81e50c54273aba6f46f7a661ffa6d3a164ed503ecbf9256f7c9fb265ca7c0bb8485ba3737e1b99a8fec6", + "oraclePublicKey": "73fca9bb2fb07f932a522cadc5ef3795f6bdc1624341dd342115e54aa016a3fa", + "oracleEvent": { + "oracleNonces": [ + "0689b7bc48b55b02ff9fb29e569c02a67f4c1523eacf515e1504d31f6b6890fd" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "enumEvent": { + "outcomes": ["a", "b", "c", "d"] + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "2059ae07da56544c50cb4ad1b30055450429b8bf696609fb56e4e7b96bdb41bf0de5819d9e2ab8303c110f137ef00a365533ca155a4ea093ecd8837a7116eafd", + "oraclePublicKey": "e3ddf669b499bec6f95b9de9b3dd6f47068c68cee3897a673134ba5457f75540", + "oracleEvent": { + "oracleNonces": [ + "749a8dfb7855b610458651c9f5fc8064058305cf0b8e88ff2ab2a70cff7c155c" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "enumEvent": { + "outcomes": ["a", "b", "c", "d"] + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "a036e6e89cd34ceec53974d0513b567e03558ef63b4bbd4e13dfc15c451fbb79e90c9191b7b28d2122387a7ef12e984d5cbff474ff44d86f5b57092b49e14faa", + "oraclePublicKey": "64ea9b9a6786d2242ea99299fa9d4fce9515d99b4bedd884bb417cd7c1ee3a8e", + "oracleEvent": { + "oracleNonces": [ + "37faf17a1ebdd2b558ac3547b3935b2903425fb1566e42329b8b0011027bbce8" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "enumEvent": { + "outcomes": ["a", "b", "c", "d"] + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "79be467e5f2db1bcc974b9f0a046f797bb2815455b05aa292745a0c5821a19851a4e7d67ccc3e5a48668d4869f57710b9de31e81d3388d5a3a19e5ac967a6cfa", + "oraclePublicKey": "21be122c6ed2b4dcbea17729664b3799f868b54c0bfe37c680ec53e2ac0a1e14", + "oracleEvent": { + "oracleNonces": [ + "c6f2925f4a87c0dbabec87dfdf9c26efc147a80f09434383bd7a5125ac411c07" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "enumEvent": { + "outcomes": ["a", "b", "c", "d"] + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "03117364ded4b7425782d722a63c4d28ab18bff89b08899b083b797f10294a6380881024d35dcdccdfdae23f2119c316797df79632306bdeddbc4ab5fb411dd4", + "oraclePublicKey": "5faa94d2507e143e96b85bcf06ca582fac6950552ea2443bae54634e71872b92", + "oracleEvent": { + "oracleNonces": [ + "0be0dde239f6b90e677f0d2a1f945bdd373667ca34be72d06ca9259fed2d48df" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "enumEvent": { + "outcomes": ["a", "b", "c", "d"] + } + }, + "eventId": "Test" + } + } + ], + "oracleParams": null + } + } + }, + { + "contractDescriptor": { + "numericOutcomeContractDescriptor": { + "numDigits": 10, + "payoutFunction": { + "payoutFunctionPieces": [ + { + "endPoint": { + "eventOutcome": 0, + "outcomePayout": 0, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [ + { + "eventOutcome": 3, + "outcomePayout": 90000000, + "extraPrecision": 0 + } + ] + } + } + }, + { + "endPoint": { + "eventOutcome": 5, + "outcomePayout": 101000000, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [] + } + } + } + ], + "lastEndpoint": { + "eventOutcome": 1023, + "outcomePayout": 101000000, + "extraPrecision": 0 + } + }, + "roundingIntervals": { + "intervals": [ + { + "beginInterval": 0, + "roundingMod": 1 + } + ] + } + } + }, + "oracleInfo": { + "multi": { + "threshold": 3, + "oracleAnnouncements": [ + { + "announcementSignature": "751bc676adfc3aa9855a411e5a7097537b67784c97e0a7128d56cddb6efaf87852fcbcf90a9cc8154a07f51607dd9b3584301ee9b2cf43cdf76df3fd0241c06f", + "oraclePublicKey": "b395df6d3b8cb48e452452ef4479f2198b555acaca6cd22bc183d38bd3e7cfd1", + "oracleEvent": { + "oracleNonces": [ + "18c9cc2a169096863b6b0342bd8871708e45b1aa0d779c1fc7eadbe09ff64d96", + "ab532fba44d2ed03ac6a7d71068d3361f531dfdb2c2d6fb3652421418970979b", + "2997ed2014d127d553cedd50f996a910f15c37830a90ab7e3886054009643385", + "78505cd545e5b183f556a69b2d296794fd88e7ee1efb9fd0f676b25113d0caf9", + "c7f2c221181e701e6088ddbc38828bebbc2482c3b671918f95d070545405895b", + "461e7ed8f29f84c8b99c6aba48bb86a4b8ca50a3c2da2eb78dfe2c5afbb4ba4c", + "84036ba82584dc58a33b100b99644bcd3543310649dd0714781178b787b94325", + "550f10c452c49a0ef3c8c7834fb507fd887914fcdd0cb37351aa1301ed0535cc", + "3e52b88c9618bb52b193f6bc9183e577b2f6f884c81816236f0141d6a8d3808a", + "05004deecc0dccfe42b4344b80c74b641d61b9fc2af690b81170a608f45dd369" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 10 + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "97f4bfde486b1c9e9fea1268ae3ea71ed767e778a288c43304b3c0cc368d61e215da5ce32935981fd92dd2b2377fcc79e61d2dc51796a7e8603385b835aa61d8", + "oraclePublicKey": "2bdcaf1b2bbcab9e07d62e5db42cb22b4c6d95ef9878ab2a7d8ce34fa07a669e", + "oracleEvent": { + "oracleNonces": [ + "8e10ba33f9fa3e3bca8208cc2d56105e5098ec88d0eaa5108ab67cf79d687b59", + "1fb62b0416c164628399a664b6a0475b91b9c16397d7f62ef584d548ad0b5976", + "9be4e66be2f60e30725c5b53657fff711246a324dbc2d24e1e483b673bcddd47", + "0baf6885af3088990f25f1796db6e24b909814a940743b2ac2685827942586b2", + "9f5cc9c323689c39f2d0ea93003db474a3b6b1a68e49f56c42ab4fd7d8656e25", + "e497cc3c87c44d746d02906c68cecf9e367ac09335911517735dc7f0c9e4e4c6", + "cb44681c6f391e8ba50d63f720b24cfd01fb3cf19635ac79d2dc88be95d3141d", + "adc82c94b445f7023415d314156e45e41e1e4e74200b15cf20f8d20e961196ab", + "6c05a77acff21c5f2db436366a788a0fc485d451570d6e57ffa1251f083e6afb", + "1d29ba8d77e3adce82ec16dcae4d3c6c4a64d885c038b3559343a6421e2b098f" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 10 + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "42894f2a9e0696e1d9d65d43e77b1a097ed71ae2840d3e31c3027d202475b4a099012961d831a208d23ec002b05feba88ce001b9ba4b0b2f5a3bbb8e15bb3b22", + "oraclePublicKey": "1d7abfa96498cd21f7b9e4cd51f98e511c458e668d578c291b29ce8175363c1a", + "oracleEvent": { + "oracleNonces": [ + "fcab0ade72974956cb175fe0639c9d9ee883109b82108d0ee132140d7384081b", + "c1a4cd76c6310bfa34799cfc310b74cd1027959cfe56b3fe625b7fa465399f5d", + "821fcc46e9d99e5ee0fd5ab273e01b4d4456284936e8710440b8b554b42bec7b", + "ca3fb3dc8f2f8012fdab224b0f14a8e5d6db3d5753b0312efee3d7a46954b9b5", + "443fba71df6e8b6fa9953c2a9290d1db9ff346a5cbdf1d5ba21923f3b8bbf734", + "665aae3c8f4055d9f046cbb15d43684977762066e6e83517ac884c55c64aba1c", + "8f574d20840e4eb5ea051a37226dd30e42f86438af67bc24c36aa5a76f526c99", + "2b4a55a85732fbd710e235040b70b23224f78434cbeb929dcae228c677bd79cf", + "74429c0262812a2dc91b28997588dabbe76b658546a1be48cdea7d5720191d74", + "cf620ae820f821bfef413146d07bb47f0bc6d48dbedc88e74d922b088b967951" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 10 + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "adf2a3a91c1c4a8226135d14ff076be5b295238e8453a0ea638cc5fb965131fd18b4b13d6826fe97cd870872ad2e67f89a54fa80662bc377195b1fb293c1cca6", + "oraclePublicKey": "e33670b49d4e2814a9cc5642e1f301c901903bee3c578cbfe8df639db811f130", + "oracleEvent": { + "oracleNonces": [ + "16d2fc35e31422b8797089fb31da6f8669af27e11979c087e338bfc2621360eb", + "5bdfbb6deeb2d381d3db004bddb396f3731fc2a417fcff258020ec4a7484b88c", + "206d1d8f31b8b088ca1c728123714a0d36673ccbbbe1da8824472c7841fdd46c", + "f902051374546edc4cfaa87c348facb14ccc3996fe52d72fe16901c388e292d8", + "d5deed626f5c5378e2500f7a69b47fc37567b0ed9e40d7ca125eead5c4b8725d", + "c7efddd2a0d15d751503b30d74276432ccd003e40d0d1a864086d5d8511abc93", + "19027221efbb9d6f6aa6de66e2d47298d265c96060204b1e4db40880bfd67f40", + "0a88a2dc8bc2ed45f9fd26e85a1b087c8dd3e2b2f49c1e413a29e4360e508ab8", + "01bd9da1d6e56e3fab0dd2b6423d8cf5519c03f05360165ccbf01ae1c6385baa", + "af36ca9d53e70f1205afa7cae3895244c7a96076c4d4cdfe27cca9c9828b3ee5" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 10 + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "c3d807b20990c019b5b40f9bf2ca67ae83c180b1a9ac23d3e7e619d1761f5b61dae92412b97a04806c020ce89cd82ab8b67451fa2e7883185d250980806a1da1", + "oraclePublicKey": "ca6c44779d14b0fa65e14e0f2be793185fd5bb9bf339d82da3c394cf57ea978c", + "oracleEvent": { + "oracleNonces": [ + "f561a86ddefb5649c1cfd5170526b06ef64904a4beba284227e8d6b7dbfb9c09", + "de8dee18e15ff727933b18060a30be3f67b79ad166525e0d5af37185ddff2979", + "052614bd80c7def1f9b2057885a6f8ddab1145f1e9b7dce1e8d021c7432ad3b9", + "0dc2c0d5613160779668881ca6970c2b51a7657aeb57029037c66ca5033cf2f6", + "fe545e6bc2f1e2b87d53c71c2910f37cacfb0edc48c4fd03500345c09226ff7e", + "7f0a629e8f65459d4e5e29d835977e19dad54fa8d8512b5789ea6f32870bf008", + "12c4f51fe2769a3da88cdd41471adfd2da14237eac5c2e5ed9f90bdf2cbbc239", + "339f9dbc7b1378f146307d56bbb9244472bd2da3aa212c7602889c370d46622c", + "d17a88dbecba813b2e6b2cb50e1529383cc037cca19b9bea073c67f43ff7470b", + "0a79cfd88e81adf74d05979f7c4f2028560012a430daa9b5a866d973ce54341e" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 10 + } + }, + "eventId": "Test" + } + } + ], + "oracleParams": null + } + } + } + ] + } + }, + "fundingPubkey": "03c28fffdf0cb2dd94cbf15b1aaf34dc10fa219def98c4e03244061e5de2e0b3b2", + "payoutSpk": "001477a7747f013439bd0c6f1d348890a3fb794e9319", + "payoutSerialId": 1976867744843505251, + "offerCollateral": 90000000, + "fundingInputs": [ + { + "inputSerialId": 6635442967122272045, + "prevTx": "020000000001012e87fa61f0e308efc0e69f2fa5a37877273062197be7619440d4e4316bd739240000000000feffffff0200c2eb0b000000001600147f605c960f6c1d344aa1c2aaea467fb32becc9cffc2b17890000000016001421f94088f0eae145772c97232a46b810d12079b602473044022026a6a80db8da759e78de7caf94d46f304ecc4e0f0a99787ed66ffdee1934cd5a02207956faebd0132076cc94e8b1699eedad414f49ad6dac097f6f569b6208d669650121031afe05dfae23c60b1b1fdf704067923674f60cc762233ed9205954f28ab934fb4e010000", + "prevTxVout": 0, + "sequence": 4294967295, + "maxWitnessLen": 107, + "redeemScript": "" + } + ], + "changeSpk": "0014ec9652702cb715dd563234d01ce41ee83789c8b2", + "changeSerialId": 11651058207702948365, + "fundOutputSerialId": 16318646099148843066, + "feeRatePerVb": 2, + "cetLocktime": 1623133103, + "refundLocktime": 1623737904 +} diff --git a/dlc-messages/src/test_inputs/offer_msg_with_dlc_input.json b/dlc-messages/src/test_inputs/offer_msg_with_dlc_input.json new file mode 100644 index 00000000..470ae0ed --- /dev/null +++ b/dlc-messages/src/test_inputs/offer_msg_with_dlc_input.json @@ -0,0 +1,171 @@ +{ + "protocolVersion": 1, + "contractFlags": 0, + "chainHash": "06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f", + "temporaryContractId": "1212121212121212121212121212121212121212121212121212121212121212", + "contractInfo": { + "singleContractInfo": { + "totalCollateral": 200000000, + "contractInfo": { + "contractDescriptor": { + "numericOutcomeContractDescriptor": { + "numDigits": 13, + "payoutFunction": { + "payoutFunctionPieces": [ + { + "endPoint": { + "eventOutcome": 0, + "outcomePayout": 0, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [ + { + "eventOutcome": 3, + "outcomePayout": 100000000, + "extraPrecision": 0 + } + ] + } + } + }, + { + "endPoint": { + "eventOutcome": 5, + "outcomePayout": 200000000, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [] + } + } + } + ], + "lastEndpoint": { + "eventOutcome": 8191, + "outcomePayout": 200000000, + "extraPrecision": 0 + } + }, + "roundingIntervals": { + "intervals": [ + { + "beginInterval": 0, + "roundingMod": 1 + } + ] + } + } + }, + "oracleInfo": { + "multi": { + "threshold": 2, + "oracleAnnouncements": [ + { + "announcementSignature": "b6a9f79a3c352ffda73ef8db9c37dca6b7310ea4ad96094c7d29f276d72e89c8caebb8b80daa1a69360a5366280e519a58e328d1e3ee89f32716e4ce336607e2", + "oraclePublicKey": "66c05e5845f330791028c62aa2cb5cc9b88145f8295f7ae9e5f044a537b2a560", + "oracleEvent": { + "oracleNonces": [ + "3b584a4049fb2e4f51a0a55e371bc72a55ece6678c89414450f26543bba800bf", + "cd9433d185d08452302e24019134089c38c5b35ce2709398fb2793079ba3be4a", + "e9f506c24e86106ca7e67fa7b38576e868fba87b805386cca622ec7fc67cc781", + "1d23bda4d41bc3829a5dbbacdb94395cf95700ad3e9d84c2ccdbd016699b5aad", + "7631072764bce0db2de17273d48b084e67a5e47531bcc8da4444dd5a41f42c15", + "0876f61639e0cb6845008a43a24eb5110482096de6db5d1e9f03712fa92a0eec", + "cc669fc02f8b1005b92d5a292bde27488fad4d38f61087ed3e2731a62b65b801", + "768145f4edea846adc2a519add9f52b343f31afed366074ef7140b5d272a1a04", + "ae4278283bb7a27c841ad2083a9af1d8e6de0734c756319558bbe18878e01f65", + "df37b1b84d03bc4addf0c902c3d25311a55ce8cca1bdb298292e57e62eb3a51b", + "3afb1b0bdca1e8caff93f984f2ee640c8f766007cf843fbea49386cd97fa27b7", + "b597125db6d01b899ad1b383ba26741766754befd0ed7ff18ed9e2dcf84ed757", + "2bb73e1389ca2bbcb360d52b303d54968b9b614e5e730294fab13cbe39872733", + "2bfbdd9d12e9d7b98c34664bd87d53ca80cf21abfd2e0abc18d9ecaa6a1311d6", + "e586d07ff98f47d1d4e871b7dd2df84c91bd84d352d0fc357cd49b54476bf155" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 15 + } + }, + "eventId": "Test" + } + }, + { + "announcementSignature": "e3b1d3c8c874c339141fe0209dd48c01c62a2fad5668093e2e96be0a88be37a5e7163f7d4e0c9f9111fba60503b775e464d1c798d843ab80a9f1ceacf52a2aeb", + "oraclePublicKey": "97e61039bfdaf898391b8b9825934802b7960a01162d9b4f8a000ae8ce9e1fa6", + "oracleEvent": { + "oracleNonces": [ + "baaa6464e8cfede79012a02723301d7595cb506ea846ac2f5da45c726b003766", + "5970ae9ec1b131ff157da44c204ce1fdd70ad670ece8c704cea32ef7b0ebf462", + "62b5a76b68629d963bb4718ca713e8171365ce51c29941befe0e3dca99cea126", + "5dc0318d4195801ed9b5b86afa12e744ccf7e15e68bc46ef7a30ddb5652d8264", + "18346b71e012f91ac41f222817722717e33c351e19ccf7c9f4378d8e3fd56881", + "4254d6e692e620c080fb29a4e9c67d35e62feb7629d964bed71ac6679414bdd5", + "36d610e88e1fe491fc1055497017e5babc45f17f7aadf9c35800f529a93fa2a6", + "60ff8f86ff75d191bc7cc74dbc31d9f031c54654406fe8ef5f802c9622afcdc4", + "890bd95edc36570b61d3750f89bbb0b6e5a10f12692431e57d7f9362c3f31436", + "3ef80333f95f0277206dd693d5c9362b6326b991c44b7d21f3a63dd8931314a2", + "4b209c8b2e0fdb1b910a57135e146bc0cef46d21915e0bf17cfedb5c7c2296a3", + "49ce4c0b32fdc717d941c87137b9c7b26726236f256a2abf28de9e4870e79d08", + "a9ded37ffee3d0d35d9fb3ae8e0984c250fbbc1db32c08baafee3154bb6e0f51" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 13 + } + }, + "eventId": "Test" + } + } + ], + "oracleParams": { + "maxErrorExp": 2, + "minFailExp": 1, + "maximizeCoverage": false + } + } + } + } + } + }, + "fundingPubkey": "03c12e81303c79abf90a81b900aa3bd3ba8f47ef84c860cb314fc58d531a4d37c6", + "payoutSpk": "0014f65cd6349437fe1f35cb27628f112d7885a5c644", + "payoutSerialId": 4752179201940702056, + "offerCollateral": 100000000, + "fundingInputs": [ + { + "inputSerialId": 3784123604127642354, + "prevTx": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a010000001600143d7834074191c93d7fc2c0a54a6d40efbbfe76430000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "prevTxVout": 0, + "sequence": 4294967295, + "maxWitnessLen": 107, + "redeemScript": "", + "dlcInput": { + "localFundPubkey": "03c06fd4dee6502848b937840019effbab0856a227d984785367b079969471a6ed", + "remoteFundPubkey": "03c12e81303c79abf90a81b900aa3bd3ba8f47ef84c860cb314fc58d531a4d37c6", + "contractId": [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + } + } + ], + "changeSpk": "0014bf1b2161a681add692a326ace320bc4d8451ee81", + "changeSerialId": 11805380369894479502, + "fundOutputSerialId": 17245645112901355593, + "feeRatePerVb": 2, + "cetLocktime": 1623133104, + "refundLocktime": 1623737904 +} diff --git a/dlc-messages/src/test_inputs/segment_chunk_msg.json b/dlc-messages/src/test_inputs/segment_chunk_msg.json new file mode 100644 index 00000000..d349eebf --- /dev/null +++ b/dlc-messages/src/test_inputs/segment_chunk_msg.json @@ -0,0 +1,12635 @@ +{ + "data": [ + 123, + 15, + 1, + 47, + 29, + 228, + 213, + 25, + 208, + 188, + 168, + 64, + 59, + 166, + 96, + 179, + 199, + 24, + 144, + 140, + 14, + 11, + 10, + 124, + 133, + 136, + 136, + 176, + 47, + 162, + 204, + 189, + 118, + 31, + 72, + 22, + 193, + 237, + 221, + 39, + 95, + 15, + 159, + 160, + 30, + 55, + 27, + 198, + 31, + 78, + 195, + 58, + 202, + 217, + 197, + 43, + 154, + 96, + 138, + 195, + 122, + 110, + 189, + 223, + 168, + 235, + 78, + 185, + 23, + 189, + 11, + 16, + 156, + 103, + 96, + 119, + 232, + 42, + 166, + 165, + 72, + 209, + 72, + 77, + 227, + 181, + 196, + 49, + 188, + 77, + 73, + 25, + 2, + 4, + 4, + 154, + 224, + 146, + 12, + 92, + 39, + 133, + 185, + 111, + 15, + 94, + 11, + 100, + 32, + 228, + 146, + 66, + 19, + 7, + 231, + 128, + 91, + 14, + 28, + 11, + 211, + 171, + 252, + 175, + 146, + 2, + 185, + 6, + 156, + 220, + 158, + 103, + 111, + 111, + 94, + 103, + 203, + 251, + 118, + 109, + 239, + 68, + 39, + 246, + 214, + 74, + 249, + 17, + 202, + 189, + 255, + 14, + 186, + 41, + 141, + 10, + 70, + 236, + 232, + 50, + 38, + 93, + 78, + 23, + 39, + 186, + 175, + 122, + 73, + 22, + 62, + 91, + 90, + 50, + 113, + 113, + 220, + 209, + 54, + 249, + 196, + 18, + 74, + 117, + 220, + 78, + 121, + 230, + 217, + 35, + 164, + 101, + 213, + 43, + 133, + 170, + 91, + 43, + 116, + 45, + 212, + 251, + 48, + 217, + 215, + 45, + 139, + 163, + 203, + 199, + 112, + 199, + 166, + 146, + 164, + 74, + 102, + 53, + 130, + 140, + 83, + 214, + 66, + 28, + 153, + 142, + 187, + 62, + 234, + 235, + 31, + 242, + 28, + 159, + 172, + 115, + 98, + 155, + 21, + 197, + 81, + 230, + 231, + 57, + 130, + 167, + 20, + 128, + 168, + 61, + 83, + 152, + 195, + 88, + 3, + 138, + 102, + 248, + 167, + 60, + 147, + 221, + 166, + 129, + 90, + 132, + 132, + 41, + 120, + 241, + 156, + 252, + 182, + 7, + 229, + 77, + 193, + 137, + 45, + 253, + 20, + 239, + 210, + 172, + 115, + 1, + 149, + 2, + 96, + 255, + 140, + 199, + 202, + 14, + 113, + 83, + 122, + 97, + 68, + 205, + 32, + 199, + 123, + 136, + 186, + 228, + 184, + 126, + 169, + 73, + 67, + 61, + 96, + 21, + 241, + 248, + 236, + 27, + 52, + 4, + 7, + 88, + 76, + 49, + 72, + 36, + 251, + 251, + 113, + 165, + 99, + 167, + 237, + 238, + 34, + 30, + 214, + 55, + 160, + 181, + 197, + 56, + 59, + 34, + 103, + 102, + 186, + 77, + 10, + 179, + 170, + 148, + 194, + 179, + 241, + 164, + 245, + 26, + 146, + 97, + 228, + 98, + 41, + 62, + 74, + 243, + 121, + 241, + 152, + 33, + 82, + 102, + 149, + 139, + 49, + 19, + 122, + 193, + 246, + 163, + 229, + 189, + 162, + 32, + 184, + 251, + 205, + 170, + 23, + 250, + 16, + 160, + 42, + 25, + 167, + 97, + 65, + 28, + 149, + 4, + 41, + 55, + 229, + 143, + 247, + 124, + 112, + 48, + 120, + 184, + 97, + 221, + 141, + 189, + 165, + 128, + 3, + 243, + 207, + 127, + 243, + 28, + 113, + 18, + 45, + 249, + 161, + 44, + 54, + 172, + 57, + 223, + 211, + 10, + 96, + 3, + 47, + 22, + 11, + 28, + 217, + 90, + 61, + 132, + 190, + 212, + 21, + 28, + 137, + 2, + 108, + 33, + 92, + 8, + 87, + 188, + 36, + 3, + 243, + 90, + 92, + 59, + 172, + 168, + 86, + 213, + 6, + 80, + 220, + 194, + 176, + 34, + 110, + 167, + 189, + 192, + 205, + 147, + 82, + 222, + 210, + 241, + 252, + 176, + 41, + 182, + 136, + 143, + 64, + 236, + 99, + 255, + 239, + 135, + 17, + 183, + 3, + 20, + 145, + 170, + 50, + 134, + 219, + 87, + 26, + 224, + 136, + 43, + 236, + 127, + 39, + 205, + 171, + 57, + 180, + 102, + 153, + 71, + 81, + 19, + 38, + 86, + 241, + 222, + 150, + 252, + 91, + 22, + 108, + 77, + 140, + 90, + 212, + 87, + 241, + 186, + 212, + 182, + 54, + 210, + 223, + 84, + 182, + 182, + 148, + 74, + 198, + 174, + 141, + 119, + 72, + 111, + 152, + 223, + 193, + 96, + 242, + 159, + 64, + 141, + 207, + 215, + 221, + 181, + 60, + 182, + 69, + 108, + 136, + 200, + 167, + 69, + 40, + 184, + 150, + 19, + 40, + 212, + 3, + 184, + 59, + 234, + 214, + 68, + 66, + 11, + 223, + 136, + 61, + 174, + 129, + 28, + 48, + 221, + 47, + 125, + 207, + 7, + 99, + 191, + 116, + 143, + 235, + 105, + 92, + 245, + 27, + 95, + 146, + 242, + 181, + 2, + 177, + 48, + 195, + 29, + 237, + 14, + 99, + 40, + 222, + 90, + 223, + 62, + 28, + 22, + 149, + 69, + 210, + 6, + 32, + 45, + 224, + 15, + 29, + 134, + 102, + 30, + 157, + 60, + 182, + 88, + 39, + 82, + 69, + 236, + 4, + 120, + 191, + 195, + 66, + 26, + 158, + 12, + 139, + 187, + 83, + 114, + 218, + 13, + 65, + 12, + 108, + 132, + 32, + 162, + 221, + 70, + 0, + 35, + 69, + 164, + 210, + 108, + 127, + 255, + 79, + 156, + 179, + 157, + 32, + 142, + 235, + 92, + 37, + 51, + 133, + 217, + 236, + 216, + 173, + 108, + 59, + 136, + 67, + 8, + 50, + 2, + 142, + 61, + 3, + 182, + 47, + 81, + 212, + 162, + 32, + 149, + 212, + 33, + 76, + 118, + 129, + 80, + 193, + 155, + 137, + 208, + 253, + 28, + 87, + 134, + 226, + 59, + 82, + 207, + 200, + 213, + 34, + 143, + 22, + 255, + 126, + 217, + 241, + 38, + 193, + 46, + 29, + 104, + 3, + 88, + 100, + 208, + 7, + 114, + 155, + 43, + 160, + 180, + 254, + 201, + 36, + 83, + 254, + 106, + 206, + 234, + 127, + 154, + 240, + 200, + 36, + 98, + 195, + 88, + 193, + 167, + 181, + 169, + 35, + 84, + 48, + 3, + 127, + 144, + 78, + 165, + 1, + 218, + 18, + 52, + 139, + 157, + 138, + 19, + 10, + 197, + 241, + 111, + 134, + 61, + 196, + 2, + 214, + 130, + 120, + 246, + 119, + 129, + 45, + 11, + 100, + 0, + 239, + 227, + 46, + 156, + 20, + 135, + 201, + 159, + 48, + 48, + 198, + 15, + 44, + 59, + 237, + 5, + 49, + 85, + 238, + 206, + 179, + 208, + 233, + 193, + 151, + 92, + 22, + 99, + 209, + 20, + 161, + 210, + 28, + 73, + 247, + 154, + 121, + 78, + 114, + 12, + 233, + 88, + 128, + 236, + 244, + 230, + 153, + 129, + 218, + 15, + 106, + 247, + 43, + 5, + 245, + 126, + 113, + 235, + 196, + 114, + 4, + 59, + 70, + 47, + 203, + 92, + 229, + 238, + 132, + 207, + 250, + 14, + 28, + 211, + 232, + 64, + 218, + 206, + 158, + 44, + 186, + 210, + 38, + 147, + 1, + 71, + 130, + 188, + 0, + 179, + 129, + 97, + 208, + 127, + 147, + 181, + 121, + 39, + 3, + 131, + 101, + 131, + 55, + 87, + 237, + 91, + 22, + 12, + 69, + 150, + 243, + 43, + 179, + 220, + 133, + 209, + 223, + 58, + 200, + 220, + 43, + 59, + 19, + 255, + 200, + 235, + 192, + 169, + 112, + 87, + 0, + 2, + 169, + 50, + 86, + 16, + 107, + 13, + 254, + 105, + 160, + 141, + 104, + 220, + 75, + 141, + 159, + 73, + 148, + 175, + 222, + 228, + 50, + 64, + 155, + 47, + 111, + 226, + 36, + 61, + 47, + 246, + 80, + 108, + 221, + 68, + 191, + 82, + 141, + 161, + 177, + 69, + 112, + 40, + 11, + 55, + 196, + 56, + 83, + 6, + 42, + 48, + 241, + 65, + 155, + 151, + 107, + 54, + 71, + 229, + 49, + 186, + 93, + 241, + 63, + 59, + 114, + 96, + 235, + 99, + 193, + 166, + 13, + 101, + 150, + 21, + 131, + 59, + 142, + 22, + 150, + 97, + 112, + 251, + 193, + 147, + 115, + 82, + 212, + 254, + 232, + 106, + 25, + 128, + 213, + 122, + 84, + 203, + 253, + 164, + 5, + 246, + 246, + 19, + 152, + 57, + 168, + 236, + 132, + 19, + 71, + 168, + 240, + 201, + 188, + 30, + 250, + 123, + 0, + 238, + 98, + 214, + 189, + 56, + 248, + 38, + 229, + 87, + 105, + 74, + 2, + 162, + 178, + 216, + 92, + 72, + 17, + 249, + 95, + 121, + 244, + 52, + 87, + 133, + 198, + 30, + 41, + 16, + 191, + 84, + 137, + 160, + 83, + 179, + 47, + 31, + 157, + 195, + 76, + 121, + 155, + 118, + 203, + 3, + 156, + 214, + 171, + 235, + 184, + 45, + 229, + 97, + 26, + 190, + 238, + 3, + 61, + 169, + 164, + 47, + 14, + 147, + 90, + 175, + 74, + 96, + 73, + 77, + 29, + 31, + 155, + 42, + 145, + 70, + 58, + 147, + 43, + 13, + 126, + 111, + 41, + 38, + 221, + 233, + 84, + 170, + 170, + 230, + 245, + 12, + 237, + 151, + 75, + 191, + 197, + 224, + 222, + 123, + 94, + 141, + 170, + 119, + 214, + 24, + 73, + 169, + 151, + 81, + 171, + 42, + 187, + 216, + 233, + 170, + 67, + 5, + 4, + 76, + 119, + 195, + 180, + 184, + 175, + 30, + 34, + 21, + 34, + 160, + 143, + 139, + 1, + 58, + 193, + 70, + 150, + 179, + 11, + 54, + 103, + 230, + 205, + 164, + 2, + 211, + 38, + 53, + 235, + 117, + 253, + 55, + 57, + 118, + 91, + 25, + 161, + 146, + 164, + 236, + 179, + 32, + 66, + 36, + 86, + 161, + 228, + 210, + 89, + 202, + 1, + 85, + 91, + 41, + 2, + 55, + 230, + 49, + 73, + 183, + 248, + 124, + 58, + 175, + 131, + 69, + 253, + 170, + 146, + 210, + 57, + 251, + 211, + 196, + 174, + 35, + 157, + 96, + 75, + 26, + 89, + 169, + 14, + 72, + 235, + 25, + 55, + 2, + 149, + 251, + 180, + 183, + 200, + 56, + 233, + 218, + 117, + 9, + 68, + 199, + 54, + 183, + 5, + 197, + 73, + 134, + 66, + 181, + 92, + 95, + 145, + 144, + 199, + 234, + 182, + 133, + 226, + 46, + 219, + 84, + 172, + 153, + 77, + 217, + 138, + 178, + 157, + 235, + 156, + 190, + 140, + 189, + 207, + 37, + 152, + 117, + 63, + 175, + 140, + 201, + 70, + 35, + 196, + 75, + 30, + 119, + 160, + 149, + 77, + 195, + 118, + 148, + 235, + 238, + 83, + 44, + 63, + 34, + 12, + 164, + 125, + 34, + 213, + 16, + 102, + 175, + 231, + 253, + 167, + 33, + 177, + 70, + 149, + 223, + 118, + 235, + 189, + 175, + 88, + 27, + 213, + 42, + 37, + 27, + 139, + 71, + 6, + 160, + 214, + 34, + 194, + 40, + 53, + 188, + 44, + 14, + 68, + 107, + 80, + 216, + 181, + 117, + 126, + 109, + 147, + 92, + 28, + 207, + 84, + 124, + 196, + 180, + 131, + 78, + 125, + 224, + 3, + 99, + 149, + 79, + 245, + 237, + 15, + 157, + 199, + 231, + 71, + 212, + 237, + 203, + 137, + 153, + 71, + 161, + 241, + 154, + 47, + 46, + 63, + 202, + 90, + 202, + 246, + 87, + 197, + 13, + 218, + 213, + 127, + 2, + 127, + 57, + 191, + 106, + 22, + 32, + 84, + 93, + 233, + 39, + 231, + 172, + 117, + 191, + 221, + 55, + 134, + 93, + 118, + 82, + 95, + 117, + 27, + 180, + 241, + 43, + 172, + 15, + 146, + 35, + 96, + 224, + 175, + 160, + 56, + 10, + 3, + 134, + 55, + 254, + 201, + 159, + 49, + 65, + 237, + 160, + 121, + 118, + 105, + 46, + 32, + 27, + 6, + 228, + 110, + 63, + 254, + 133, + 25, + 24, + 209, + 162, + 166, + 46, + 90, + 22, + 28, + 214, + 63, + 111, + 25, + 54, + 54, + 127, + 94, + 250, + 196, + 14, + 136, + 102, + 3, + 225, + 184, + 197, + 226, + 53, + 113, + 43, + 83, + 94, + 3, + 111, + 188, + 170, + 248, + 16, + 186, + 9, + 152, + 130, + 51, + 34, + 60, + 160, + 55, + 230, + 2, + 188, + 118, + 66, + 147, + 220, + 138, + 31, + 224, + 251, + 52, + 224, + 219, + 193, + 187, + 150, + 84, + 108, + 129, + 224, + 6, + 206, + 3, + 163, + 15, + 107, + 44, + 149, + 151, + 255, + 215, + 42, + 30, + 80, + 34, + 64, + 135, + 220, + 172, + 58, + 73, + 255, + 183, + 194, + 146, + 91, + 182, + 154, + 0, + 123, + 152, + 115, + 98, + 39, + 24, + 2, + 219, + 167, + 33, + 215, + 119, + 226, + 113, + 13, + 175, + 243, + 75, + 35, + 186, + 219, + 81, + 193, + 157, + 77, + 144, + 137, + 93, + 19, + 197, + 192, + 141, + 166, + 6, + 148, + 131, + 237, + 181, + 66, + 173, + 55, + 86, + 158, + 44, + 253, + 176, + 20, + 109, + 164, + 170, + 16, + 247, + 20, + 121, + 245, + 105, + 56, + 182, + 65, + 228, + 43, + 96, + 28, + 42, + 219, + 73, + 158, + 69, + 254, + 178, + 190, + 129, + 245, + 144, + 111, + 34, + 114, + 5, + 24, + 120, + 148, + 123, + 149, + 131, + 138, + 246, + 29, + 111, + 146, + 225, + 185, + 242, + 212, + 246, + 90, + 143, + 59, + 65, + 152, + 72, + 59, + 146, + 70, + 221, + 239, + 92, + 254, + 167, + 19, + 164, + 122, + 200, + 195, + 166, + 207, + 251, + 108, + 243, + 181, + 200, + 235, + 71, + 86, + 226, + 117, + 121, + 92, + 201, + 74, + 156, + 225, + 140, + 113, + 17, + 163, + 2, + 232, + 116, + 10, + 51, + 230, + 92, + 2, + 18, + 146, + 224, + 197, + 54, + 179, + 162, + 133, + 0, + 197, + 7, + 218, + 189, + 191, + 170, + 49, + 206, + 12, + 247, + 240, + 6, + 253, + 177, + 66, + 67, + 3, + 212, + 143, + 104, + 25, + 164, + 91, + 34, + 50, + 20, + 13, + 165, + 240, + 214, + 0, + 64, + 252, + 183, + 240, + 74, + 118, + 185, + 113, + 113, + 103, + 169, + 36, + 34, + 84, + 192, + 234, + 7, + 91, + 202, + 254, + 121, + 99, + 231, + 13, + 204, + 131, + 53, + 17, + 201, + 131, + 83, + 205, + 74, + 43, + 129, + 16, + 82, + 200, + 0, + 108, + 107, + 30, + 150, + 105, + 224, + 245, + 221, + 222, + 209, + 122, + 20, + 214, + 192, + 17, + 191, + 120, + 189, + 114, + 202, + 121, + 74, + 238, + 24, + 28, + 188, + 8, + 199, + 75, + 130, + 153, + 215, + 243, + 83, + 175, + 195, + 20, + 156, + 181, + 78, + 112, + 84, + 152, + 232, + 126, + 116, + 191, + 52, + 173, + 235, + 238, + 123, + 197, + 198, + 78, + 166, + 142, + 134, + 102, + 141, + 18, + 145, + 236, + 42, + 160, + 37, + 101, + 139, + 224, + 40, + 195, + 177, + 0, + 155, + 7, + 3, + 12, + 24, + 215, + 87, + 215, + 161, + 169, + 188, + 224, + 171, + 5, + 235, + 55, + 103, + 144, + 250, + 211, + 156, + 165, + 75, + 53, + 42, + 111, + 163, + 115, + 124, + 5, + 177, + 107, + 199, + 176, + 205, + 3, + 16, + 143, + 36, + 132, + 136, + 52, + 12, + 109, + 178, + 238, + 64, + 201, + 219, + 11, + 20, + 152, + 164, + 99, + 65, + 118, + 98, + 186, + 53, + 50, + 103, + 118, + 83, + 96, + 21, + 119, + 68, + 6, + 244, + 192, + 71, + 182, + 94, + 177, + 138, + 118, + 42, + 255, + 157, + 103, + 239, + 38, + 181, + 238, + 201, + 173, + 77, + 178, + 19, + 34, + 22, + 203, + 56, + 166, + 205, + 183, + 120, + 180, + 187, + 231, + 94, + 253, + 18, + 231, + 117, + 90, + 175, + 103, + 137, + 192, + 201, + 13, + 115, + 71, + 190, + 105, + 49, + 103, + 134, + 32, + 191, + 101, + 190, + 214, + 187, + 110, + 86, + 64, + 254, + 44, + 176, + 160, + 4, + 250, + 10, + 165, + 237, + 185, + 198, + 181, + 30, + 52, + 84, + 53, + 93, + 14, + 125, + 81, + 136, + 115, + 96, + 113, + 36, + 11, + 51, + 43, + 183, + 50, + 65, + 217, + 231, + 212, + 200, + 233, + 2, + 23, + 30, + 93, + 12, + 207, + 210, + 225, + 120, + 126, + 239, + 55, + 216, + 130, + 219, + 124, + 10, + 27, + 160, + 147, + 94, + 195, + 81, + 110, + 187, + 231, + 63, + 60, + 137, + 112, + 32, + 190, + 237, + 2, + 148, + 237, + 213, + 57, + 112, + 66, + 22, + 64, + 189, + 10, + 183, + 128, + 72, + 127, + 175, + 60, + 197, + 28, + 46, + 228, + 110, + 231, + 181, + 124, + 123, + 143, + 110, + 23, + 48, + 162, + 217, + 154, + 250, + 152, + 28, + 4, + 1, + 141, + 123, + 125, + 212, + 22, + 252, + 253, + 72, + 196, + 144, + 92, + 118, + 98, + 59, + 86, + 73, + 162, + 29, + 244, + 91, + 98, + 80, + 137, + 201, + 251, + 43, + 12, + 158, + 219, + 8, + 141, + 195, + 113, + 140, + 93, + 140, + 183, + 47, + 106, + 178, + 8, + 174, + 43, + 157, + 126, + 124, + 118, + 128, + 230, + 98, + 169, + 201, + 233, + 253, + 196, + 149, + 37, + 134, + 145, + 63, + 203, + 101, + 131, + 82, + 57, + 251, + 247, + 142, + 38, + 193, + 183, + 232, + 243, + 188, + 246, + 221, + 1, + 23, + 131, + 74, + 102, + 199, + 241, + 159, + 113, + 126, + 140, + 195, + 50, + 37, + 56, + 3, + 205, + 120, + 17, + 232, + 168, + 140, + 70, + 18, + 237, + 61, + 135, + 48, + 126, + 187, + 222, + 22, + 237, + 66, + 69, + 165, + 23, + 43, + 227, + 173, + 224, + 82, + 239, + 138, + 8, + 74, + 180, + 36, + 3, + 45, + 113, + 25, + 173, + 86, + 7, + 12, + 105, + 139, + 153, + 164, + 251, + 179, + 139, + 130, + 186, + 23, + 116, + 221, + 80, + 231, + 53, + 202, + 40, + 56, + 65, + 121, + 193, + 238, + 32, + 95, + 134, + 211, + 19, + 75, + 222, + 3, + 116, + 167, + 51, + 138, + 199, + 129, + 136, + 155, + 180, + 234, + 163, + 98, + 82, + 83, + 152, + 105, + 152, + 249, + 55, + 101, + 222, + 202, + 192, + 164, + 15, + 250, + 172, + 45, + 46, + 14, + 206, + 123, + 246, + 111, + 164, + 231, + 81, + 106, + 219, + 224, + 241, + 96, + 233, + 196, + 230, + 81, + 132, + 21, + 74, + 100, + 27, + 140, + 138, + 243, + 63, + 177, + 171, + 58, + 215, + 153, + 67, + 165, + 95, + 101, + 68, + 164, + 161, + 38, + 245, + 173, + 149, + 152, + 69, + 131, + 30, + 128, + 48, + 0, + 8, + 173, + 130, + 147, + 164, + 71, + 206, + 88, + 83, + 3, + 131, + 241, + 202, + 3, + 183, + 141, + 162, + 206, + 42, + 78, + 181, + 47, + 253, + 81, + 80, + 159, + 225, + 44, + 83, + 160, + 190, + 115, + 112, + 244, + 194, + 78, + 157, + 149, + 224, + 122, + 52, + 173, + 40, + 160, + 93, + 13, + 2, + 87, + 237, + 28, + 63, + 238, + 189, + 94, + 215, + 201, + 116, + 92, + 71, + 38, + 193, + 1, + 198, + 43, + 195, + 228, + 79, + 34, + 243, + 225, + 110, + 187, + 129, + 25, + 26, + 76, + 245, + 17, + 33, + 127, + 90, + 31, + 65, + 181, + 78, + 192, + 173, + 91, + 156, + 87, + 94, + 132, + 86, + 199, + 50, + 239, + 210, + 165, + 232, + 153, + 58, + 243, + 123, + 52, + 163, + 60, + 18, + 203, + 50, + 65, + 152, + 219, + 146, + 89, + 240, + 70, + 102, + 37, + 138, + 52, + 120, + 67, + 127, + 240, + 173, + 14, + 134, + 4, + 31, + 238, + 149, + 199, + 158, + 49, + 188, + 67, + 252, + 88, + 196, + 186, + 64, + 6, + 80, + 180, + 6, + 77, + 92, + 82, + 232, + 111, + 183, + 134, + 149, + 128, + 203, + 238, + 35, + 162, + 75, + 135, + 142, + 30, + 193, + 132, + 132, + 49, + 130, + 157, + 95, + 104, + 66, + 195, + 206, + 169, + 99, + 3, + 44, + 61, + 182, + 202, + 64, + 4, + 159, + 39, + 67, + 113, + 30, + 188, + 253, + 131, + 142, + 90, + 100, + 115, + 185, + 174, + 19, + 195, + 246, + 92, + 203, + 45, + 64, + 128, + 2, + 83, + 251, + 189, + 2, + 62, + 185, + 176, + 48, + 41, + 244, + 162, + 10, + 20, + 81, + 229, + 128, + 44, + 253, + 124, + 41, + 41, + 98, + 112, + 154, + 228, + 184, + 172, + 244, + 184, + 234, + 230, + 183, + 148, + 242, + 243, + 106, + 252, + 47, + 33, + 68, + 4, + 191, + 162, + 44, + 139, + 29, + 138, + 188, + 51, + 2, + 223, + 185, + 185, + 27, + 26, + 227, + 28, + 189, + 96, + 241, + 213, + 230, + 64, + 28, + 187, + 194, + 204, + 192, + 49, + 5, + 77, + 201, + 49, + 162, + 16, + 47, + 81, + 194, + 202, + 61, + 39, + 168, + 178, + 122, + 28, + 208, + 244, + 61, + 134, + 5, + 197, + 45, + 136, + 242, + 19, + 153, + 119, + 64, + 42, + 204, + 21, + 231, + 101, + 66, + 208, + 151, + 239, + 146, + 140, + 81, + 80, + 42, + 32, + 41, + 205, + 137, + 175, + 41, + 97, + 162, + 17, + 187, + 220, + 225, + 93, + 97, + 41, + 107, + 16, + 132, + 118, + 138, + 3, + 53, + 163, + 140, + 41, + 222, + 223, + 240, + 36, + 92, + 98, + 103, + 245, + 194, + 219, + 171, + 24, + 197, + 65, + 115, + 11, + 243, + 90, + 7, + 33, + 157, + 159, + 84, + 127, + 101, + 63, + 210, + 239, + 2, + 188, + 116, + 130, + 188, + 131, + 140, + 123, + 115, + 205, + 204, + 111, + 168, + 167, + 130, + 94, + 52, + 158, + 5, + 6, + 83, + 240, + 1, + 192, + 27, + 47, + 48, + 102, + 104, + 0, + 51, + 83, + 30, + 57, + 82, + 85, + 170, + 0, + 9, + 123, + 127, + 63, + 249, + 118, + 232, + 67, + 127, + 64, + 20, + 125, + 203, + 186, + 189, + 81, + 55, + 64, + 27, + 27, + 1, + 22, + 109, + 123, + 65, + 180, + 59, + 186, + 47, + 74, + 34, + 222, + 47, + 75, + 224, + 7, + 76, + 26, + 63, + 133, + 106, + 200, + 91, + 65, + 168, + 137, + 18, + 243, + 130, + 250, + 76, + 37, + 163, + 96, + 92, + 47, + 93, + 255, + 73, + 119, + 106, + 208, + 255, + 67, + 74, + 71, + 74, + 215, + 153, + 136, + 229, + 246, + 47, + 31, + 147, + 128, + 48, + 72, + 252, + 5, + 250, + 216, + 146, + 144, + 94, + 230, + 17, + 136, + 253, + 207, + 54, + 2, + 125, + 154, + 15, + 126, + 170, + 99, + 219, + 15, + 45, + 241, + 186, + 42, + 209, + 184, + 198, + 233, + 27, + 141, + 0, + 107, + 19, + 181, + 175, + 213, + 202, + 141, + 205, + 5, + 56, + 185, + 247, + 250, + 3, + 48, + 129, + 198, + 138, + 234, + 83, + 78, + 182, + 116, + 6, + 84, + 21, + 193, + 225, + 185, + 85, + 24, + 251, + 74, + 0, + 15, + 43, + 110, + 149, + 34, + 40, + 132, + 223, + 191, + 251, + 158, + 129, + 29, + 13, + 22, + 35, + 86, + 143, + 177, + 250, + 7, + 89, + 31, + 254, + 98, + 223, + 0, + 48, + 212, + 107, + 160, + 245, + 63, + 86, + 246, + 145, + 208, + 86, + 228, + 33, + 10, + 243, + 91, + 118, + 55, + 167, + 216, + 69, + 117, + 70, + 71, + 214, + 26, + 190, + 55, + 43, + 138, + 168, + 203, + 123, + 3, + 185, + 91, + 218, + 197, + 150, + 110, + 187, + 77, + 47, + 250, + 119, + 225, + 6, + 214, + 102, + 110, + 188, + 199, + 218, + 142, + 253, + 235, + 221, + 149, + 190, + 119, + 99, + 104, + 26, + 139, + 215, + 231, + 162, + 216, + 245, + 213, + 219, + 240, + 161, + 63, + 141, + 173, + 19, + 4, + 169, + 148, + 244, + 2, + 97, + 6, + 52, + 28, + 159, + 80, + 243, + 93, + 57, + 130, + 24, + 146, + 227, + 102, + 176, + 232, + 185, + 202, + 132, + 253, + 127, + 108, + 213, + 128, + 194, + 73, + 238, + 125, + 217, + 222, + 202, + 126, + 2, + 146, + 76, + 244, + 204, + 147, + 174, + 55, + 192, + 205, + 240, + 176, + 14, + 76, + 127, + 205, + 198, + 64, + 173, + 77, + 255, + 107, + 186, + 124, + 178, + 39, + 232, + 245, + 216, + 97, + 192, + 36, + 58, + 87, + 186, + 103, + 200, + 87, + 210, + 132, + 146, + 74, + 104, + 194, + 123, + 32, + 191, + 84, + 46, + 63, + 30, + 119, + 202, + 66, + 136, + 206, + 92, + 11, + 214, + 144, + 104, + 173, + 6, + 146, + 109, + 71, + 254, + 86, + 211, + 16, + 158, + 84, + 161, + 90, + 221, + 208, + 227, + 166, + 71, + 190, + 212, + 96, + 186, + 39, + 165, + 203, + 24, + 109, + 9, + 125, + 69, + 147, + 55, + 14, + 187, + 75, + 67, + 146, + 210, + 57, + 91, + 13, + 247, + 164, + 133, + 64, + 134, + 227, + 188, + 91, + 207, + 141, + 135, + 255, + 94, + 254, + 8, + 214, + 101, + 66, + 136, + 233, + 11, + 193, + 236, + 159, + 204, + 221, + 238, + 2, + 253, + 64, + 178, + 175, + 151, + 199, + 42, + 52, + 8, + 217, + 129, + 74, + 15, + 141, + 85, + 108, + 233, + 157, + 203, + 164, + 239, + 65, + 182, + 23, + 23, + 61, + 218, + 87, + 84, + 2, + 81, + 149, + 2, + 84, + 164, + 33, + 145, + 200, + 32, + 73, + 172, + 159, + 158, + 128, + 194, + 229, + 7, + 40, + 155, + 209, + 154, + 147, + 139, + 170, + 72, + 176, + 129, + 100, + 142, + 20, + 168, + 115, + 22, + 247, + 185, + 249, + 45, + 221, + 50, + 99, + 5, + 75, + 203, + 159, + 100, + 100, + 123, + 188, + 125, + 239, + 77, + 255, + 55, + 15, + 253, + 13, + 121, + 110, + 30, + 182, + 212, + 247, + 241, + 92, + 94, + 99, + 77, + 7, + 210, + 180, + 37, + 239, + 180, + 196, + 125, + 236, + 13, + 109, + 50, + 50, + 86, + 214, + 55, + 72, + 188, + 40, + 67, + 234, + 81, + 80, + 10, + 89, + 18, + 144, + 174, + 239, + 42, + 53, + 197, + 65, + 57, + 132, + 10, + 221, + 114, + 170, + 219, + 45, + 165, + 26, + 148, + 165, + 11, + 21, + 151, + 91, + 220, + 13, + 209, + 172, + 14, + 68, + 55, + 232, + 177, + 229, + 114, + 15, + 206, + 255, + 196, + 2, + 236, + 195, + 166, + 244, + 212, + 95, + 184, + 166, + 89, + 185, + 72, + 47, + 62, + 65, + 137, + 13, + 142, + 63, + 62, + 116, + 31, + 160, + 122, + 110, + 223, + 205, + 116, + 225, + 101, + 71, + 27, + 247, + 3, + 68, + 46, + 147, + 195, + 1, + 27, + 124, + 195, + 164, + 85, + 158, + 122, + 54, + 98, + 210, + 153, + 188, + 12, + 120, + 161, + 157, + 13, + 19, + 42, + 41, + 120, + 173, + 206, + 180, + 193, + 178, + 217, + 48, + 198, + 23, + 80, + 34, + 229, + 93, + 177, + 15, + 34, + 112, + 43, + 63, + 200, + 254, + 157, + 129, + 132, + 46, + 192, + 231, + 209, + 137, + 171, + 154, + 175, + 130, + 149, + 252, + 27, + 44, + 178, + 36, + 224, + 224, + 86, + 194, + 104, + 30, + 63, + 77, + 135, + 77, + 233, + 224, + 98, + 76, + 91, + 59, + 206, + 133, + 202, + 212, + 255, + 226, + 76, + 150, + 229, + 88, + 156, + 91, + 243, + 19, + 41, + 252, + 51, + 117, + 181, + 78, + 32, + 35, + 103, + 193, + 50, + 69, + 9, + 118, + 37, + 164, + 174, + 212, + 7, + 113, + 29, + 30, + 55, + 206, + 16, + 22, + 78, + 124, + 119, + 159, + 79, + 184, + 255, + 2, + 151, + 165, + 54, + 161, + 6, + 238, + 85, + 200, + 233, + 199, + 59, + 115, + 26, + 55, + 127, + 20, + 89, + 171, + 255, + 19, + 16, + 96, + 143, + 2, + 185, + 133, + 217, + 149, + 10, + 37, + 188, + 180, + 3, + 188, + 115, + 49, + 176, + 182, + 203, + 254, + 79, + 1, + 36, + 178, + 59, + 211, + 209, + 180, + 83, + 251, + 239, + 196, + 254, + 142, + 60, + 138, + 169, + 56, + 18, + 86, + 236, + 42, + 80, + 72, + 154, + 114, + 212, + 226, + 58, + 254, + 203, + 107, + 146, + 12, + 36, + 40, + 217, + 3, + 199, + 124, + 89, + 116, + 142, + 4, + 2, + 225, + 239, + 6, + 89, + 123, + 44, + 249, + 245, + 47, + 229, + 121, + 43, + 187, + 236, + 152, + 162, + 9, + 42, + 242, + 162, + 196, + 112, + 213, + 63, + 132, + 93, + 243, + 60, + 29, + 220, + 99, + 155, + 164, + 232, + 110, + 18, + 180, + 175, + 220, + 99, + 176, + 181, + 159, + 56, + 77, + 8, + 90, + 133, + 20, + 212, + 170, + 18, + 124, + 109, + 33, + 201, + 133, + 56, + 255, + 202, + 222, + 193, + 62, + 243, + 233, + 71, + 218, + 119, + 157, + 32, + 166, + 161, + 165, + 106, + 242, + 163, + 2, + 211, + 199, + 180, + 135, + 21, + 64, + 133, + 133, + 87, + 12, + 252, + 136, + 67, + 28, + 42, + 11, + 190, + 71, + 50, + 213, + 13, + 234, + 89, + 55, + 63, + 244, + 73, + 80, + 12, + 17, + 236, + 183, + 2, + 131, + 0, + 124, + 150, + 134, + 248, + 209, + 15, + 221, + 26, + 178, + 42, + 215, + 177, + 143, + 86, + 19, + 67, + 128, + 191, + 135, + 171, + 110, + 233, + 64, + 113, + 198, + 115, + 43, + 92, + 38, + 203, + 162, + 50, + 191, + 59, + 230, + 187, + 77, + 8, + 216, + 167, + 198, + 149, + 104, + 61, + 82, + 249, + 22, + 102, + 10, + 199, + 96, + 106, + 61, + 133, + 215, + 134, + 52, + 128, + 146, + 63, + 84, + 206, + 227, + 213, + 103, + 57, + 1, + 14, + 192, + 103, + 81, + 251, + 27, + 155, + 173, + 186, + 6, + 45, + 12, + 236, + 8, + 188, + 227, + 13, + 71, + 79, + 172, + 252, + 86, + 254, + 9, + 89, + 5, + 136, + 58, + 178, + 124, + 56, + 204, + 118, + 26, + 217, + 145, + 72, + 110, + 163, + 79, + 241, + 135, + 77, + 3, + 183, + 15, + 95, + 38, + 142, + 197, + 93, + 195, + 146, + 245, + 117, + 42, + 104, + 205, + 210, + 2, + 80, + 188, + 125, + 114, + 134, + 48, + 12, + 244, + 91, + 173, + 150, + 170, + 244, + 180, + 208, + 215, + 116, + 205, + 127, + 183, + 175, + 25, + 89, + 47, + 168, + 180, + 35, + 16, + 145, + 222, + 71, + 167, + 2, + 180, + 139, + 17, + 204, + 195, + 220, + 229, + 37, + 97, + 126, + 152, + 25, + 128, + 152, + 123, + 0, + 143, + 113, + 69, + 34, + 83, + 228, + 45, + 112, + 26, + 98, + 186, + 110, + 131, + 156, + 45, + 206, + 179, + 110, + 12, + 49, + 127, + 247, + 202, + 200, + 209, + 91, + 3, + 195, + 239, + 66, + 147, + 87, + 254, + 180, + 103, + 208, + 70, + 89, + 253, + 71, + 221, + 200, + 121, + 211, + 3, + 180, + 4, + 186, + 24, + 89, + 58, + 27, + 192, + 26, + 108, + 25, + 195, + 106, + 69, + 239, + 32, + 130, + 127, + 187, + 127, + 26, + 107, + 82, + 117, + 35, + 50, + 118, + 11, + 39, + 85, + 49, + 14, + 151, + 123, + 144, + 234, + 45, + 71, + 196, + 37, + 179, + 232, + 156, + 229, + 53, + 47, + 128, + 20, + 4, + 139, + 132, + 68, + 142, + 225, + 251, + 58, + 155, + 36, + 29, + 173, + 194, + 254, + 26, + 199, + 140, + 46, + 122, + 2, + 230, + 117, + 112, + 106, + 101, + 157, + 97, + 19, + 151, + 51, + 37, + 33, + 235, + 56, + 5, + 157, + 43, + 210, + 13, + 154, + 71, + 65, + 114, + 178, + 178, + 246, + 140, + 206, + 96, + 199, + 114, + 85, + 3, + 133, + 242, + 37, + 107, + 159, + 224, + 241, + 131, + 101, + 51, + 211, + 128, + 95, + 192, + 223, + 112, + 117, + 126, + 73, + 149, + 193, + 14, + 133, + 170, + 52, + 215, + 184, + 84, + 25, + 22, + 23, + 75, + 41, + 245, + 227, + 195, + 197, + 22, + 44, + 72, + 185, + 45, + 175, + 217, + 192, + 136, + 32, + 131, + 178, + 40, + 121, + 10, + 89, + 241, + 55, + 58, + 246, + 177, + 197, + 238, + 40, + 160, + 210, + 247, + 75, + 76, + 13, + 120, + 252, + 166, + 131, + 104, + 50, + 135, + 120, + 134, + 204, + 117, + 191, + 51, + 63, + 190, + 161, + 48, + 143, + 66, + 115, + 216, + 35, + 46, + 241, + 68, + 95, + 202, + 118, + 101, + 238, + 25, + 247, + 114, + 141, + 223, + 87, + 103, + 139, + 126, + 164, + 64, + 150, + 177, + 252, + 16, + 216, + 98, + 250, + 0, + 254, + 229, + 50, + 71, + 123, + 16, + 2, + 125, + 212, + 154, + 143, + 127, + 2, + 106, + 24, + 181, + 215, + 119, + 124, + 43, + 48, + 207, + 35, + 19, + 123, + 71, + 92, + 145, + 253, + 247, + 212, + 105, + 103, + 5, + 235, + 91, + 208, + 213, + 94, + 69, + 250, + 2, + 187, + 148, + 90, + 2, + 241, + 246, + 82, + 3, + 64, + 201, + 110, + 50, + 167, + 91, + 153, + 224, + 213, + 71, + 126, + 180, + 189, + 189, + 150, + 156, + 237, + 7, + 217, + 224, + 229, + 215, + 51, + 206, + 117, + 65, + 105, + 36, + 108, + 124, + 240, + 90, + 0, + 176, + 193, + 64, + 202, + 134, + 7, + 100, + 123, + 60, + 147, + 2, + 207, + 139, + 235, + 207, + 124, + 225, + 171, + 109, + 137, + 59, + 52, + 176, + 120, + 242, + 80, + 8, + 235, + 62, + 88, + 55, + 243, + 173, + 131, + 28, + 204, + 32, + 213, + 155, + 203, + 27, + 144, + 229, + 123, + 112, + 161, + 63, + 63, + 173, + 118, + 160, + 84, + 31, + 160, + 1, + 249, + 242, + 215, + 204, + 99, + 181, + 183, + 189, + 12, + 251, + 134, + 31, + 146, + 19, + 148, + 233, + 56, + 234, + 151, + 186, + 5, + 106, + 194, + 156, + 118, + 124, + 51, + 207, + 54, + 230, + 105, + 158, + 182, + 123, + 237, + 114, + 2, + 59, + 210, + 93, + 188, + 8, + 123, + 247, + 224, + 173, + 148, + 251, + 22, + 165, + 4, + 246, + 185, + 144, + 98, + 136, + 198, + 188, + 100, + 6, + 226, + 147, + 194, + 0, + 129, + 155, + 17, + 5, + 177, + 3, + 189, + 60, + 190, + 178, + 238, + 190, + 26, + 7, + 84, + 93, + 96, + 133, + 36, + 213, + 220, + 236, + 51, + 120, + 6, + 245, + 104, + 20, + 24, + 36, + 226, + 31, + 230, + 102, + 86, + 11, + 119, + 154, + 152, + 104, + 212, + 11, + 128, + 123, + 193, + 239, + 17, + 30, + 63, + 88, + 235, + 1, + 79, + 190, + 54, + 68, + 118, + 199, + 220, + 156, + 36, + 107, + 113, + 43, + 183, + 119, + 67, + 249, + 195, + 69, + 29, + 39, + 95, + 21, + 201, + 76, + 202, + 43, + 171, + 140, + 93, + 13, + 156, + 93, + 70, + 238, + 112, + 215, + 30, + 175, + 41, + 134, + 23, + 45, + 90, + 2, + 29, + 69, + 157, + 212, + 88, + 138, + 6, + 54, + 2, + 39, + 132, + 50, + 139, + 243, + 98, + 68, + 172, + 91, + 24, + 115, + 64, + 64, + 195, + 193, + 173, + 156, + 25, + 117, + 33, + 253, + 202, + 174, + 219, + 225, + 29, + 190, + 96, + 233, + 3, + 86, + 96, + 77, + 122, + 18, + 63, + 98, + 30, + 108, + 113, + 224, + 86, + 180, + 116, + 135, + 145, + 217, + 90, + 224, + 2, + 68, + 174, + 15, + 90, + 119, + 252, + 99, + 13, + 72, + 72, + 74, + 16, + 2, + 167, + 94, + 138, + 165, + 16, + 164, + 144, + 77, + 39, + 89, + 119, + 136, + 65, + 209, + 61, + 184, + 212, + 81, + 103, + 13, + 199, + 192, + 77, + 196, + 222, + 62, + 120, + 133, + 193, + 87, + 39, + 128, + 120, + 100, + 84, + 156, + 168, + 21, + 169, + 172, + 204, + 153, + 138, + 49, + 189, + 122, + 182, + 228, + 94, + 62, + 79, + 151, + 81, + 50, + 225, + 195, + 167, + 231, + 46, + 61, + 172, + 57, + 232, + 216, + 58, + 248, + 45, + 95, + 210, + 58, + 2, + 6, + 50, + 213, + 229, + 24, + 79, + 173, + 144, + 113, + 9, + 233, + 67, + 248, + 12, + 155, + 233, + 197, + 80, + 61, + 255, + 30, + 194, + 92, + 22, + 45, + 175, + 146, + 223, + 197, + 16, + 169, + 172, + 190, + 92, + 181, + 20, + 110, + 64, + 131, + 235, + 165, + 98, + 51, + 21, + 36, + 117, + 95, + 183, + 122, + 2, + 182, + 59, + 212, + 186, + 100, + 32, + 16, + 3, + 231, + 112, + 111, + 135, + 159, + 124, + 20, + 63, + 24, + 52, + 229, + 52, + 56, + 186, + 160, + 135, + 251, + 51, + 174, + 45, + 235, + 176, + 164, + 139, + 133, + 107, + 59, + 180, + 245, + 55, + 170, + 202, + 3, + 251, + 97, + 158, + 36, + 237, + 144, + 202, + 233, + 187, + 145, + 108, + 22, + 140, + 190, + 241, + 247, + 114, + 150, + 162, + 177, + 80, + 149, + 189, + 234, + 36, + 107, + 243, + 95, + 86, + 33, + 181, + 7, + 88, + 4, + 81, + 16, + 55, + 131, + 19, + 206, + 212, + 90, + 13, + 44, + 35, + 34, + 13, + 250, + 173, + 37, + 107, + 126, + 178, + 118, + 143, + 203, + 213, + 172, + 168, + 192, + 18, + 149, + 169, + 157, + 242, + 97, + 231, + 107, + 124, + 21, + 231, + 88, + 71, + 53, + 110, + 33, + 60, + 23, + 179, + 4, + 141, + 213, + 146, + 16, + 111, + 255, + 179, + 34, + 96, + 211, + 195, + 188, + 207, + 1, + 87, + 116, + 65, + 140, + 199, + 17, + 236, + 51, + 107, + 55, + 173, + 67, + 75, + 120, + 202, + 179, + 61, + 138, + 247, + 56, + 195, + 108, + 206, + 142, + 6, + 81, + 166, + 48, + 28, + 101, + 127, + 57, + 24, + 236, + 3, + 170, + 220, + 24, + 1, + 136, + 159, + 152, + 85, + 180, + 207, + 12, + 14, + 37, + 198, + 202, + 144, + 189, + 76, + 68, + 47, + 252, + 51, + 17, + 189, + 10, + 73, + 86, + 199, + 105, + 47, + 101, + 15, + 2, + 13, + 99, + 27, + 132, + 33, + 85, + 0, + 74, + 211, + 4, + 145, + 22, + 146, + 20, + 112, + 79, + 224, + 112, + 244, + 16, + 107, + 177, + 50, + 151, + 108, + 119, + 67, + 3, + 47, + 217, + 210, + 210, + 31, + 106, + 229, + 43, + 53, + 172, + 231, + 7, + 137, + 78, + 67, + 89, + 221, + 174, + 200, + 48, + 191, + 246, + 122, + 116, + 195, + 94, + 35, + 76, + 44, + 217, + 98, + 72, + 255, + 75, + 47, + 109, + 187, + 127, + 26, + 221, + 65, + 77, + 100, + 85, + 253, + 194, + 98, + 76, + 54, + 186, + 25, + 101, + 35, + 209, + 222, + 111, + 96, + 67, + 214, + 58, + 133, + 76, + 134, + 66, + 161, + 198, + 137, + 39, + 234, + 230, + 171, + 13, + 97, + 122, + 46, + 71, + 168, + 7, + 2, + 221, + 42, + 131, + 119, + 50, + 212, + 209, + 16, + 40, + 141, + 72, + 110, + 30, + 38, + 248, + 207, + 170, + 182, + 75, + 31, + 53, + 2, + 176, + 171, + 126, + 149, + 231, + 99, + 212, + 44, + 98, + 221, + 133, + 116, + 69, + 214, + 202, + 13, + 6, + 7, + 87, + 50, + 146, + 209, + 143, + 39, + 207, + 232, + 180, + 49, + 226, + 17, + 18, + 137, + 3, + 75, + 141, + 216, + 19, + 141, + 212, + 84, + 132, + 41, + 70, + 88, + 49, + 75, + 103, + 37, + 3, + 150, + 174, + 228, + 95, + 116, + 194, + 169, + 132, + 78, + 149, + 219, + 97, + 57, + 172, + 252, + 1, + 106, + 253, + 41, + 151, + 132, + 100, + 245, + 233, + 32, + 59, + 210, + 233, + 6, + 117, + 214, + 218, + 25, + 106, + 20, + 201, + 60, + 83, + 239, + 207, + 78, + 114, + 244, + 59, + 145, + 90, + 130, + 47, + 137, + 221, + 222, + 88, + 34, + 74, + 222, + 250, + 124, + 203, + 210, + 56, + 25, + 215, + 121, + 207, + 170, + 62, + 129, + 163, + 61, + 166, + 57, + 204, + 79, + 104, + 232, + 169, + 126, + 247, + 6, + 243, + 64, + 16, + 131, + 184, + 182, + 243, + 244, + 194, + 181, + 135, + 137, + 1, + 11, + 178, + 247, + 248, + 247, + 74, + 163, + 70, + 136, + 39, + 30, + 112, + 86, + 204, + 148, + 162, + 167, + 143, + 206, + 25, + 3, + 53, + 170, + 62, + 228, + 6, + 13, + 204, + 113, + 152, + 70, + 157, + 165, + 45, + 187, + 62, + 101, + 17, + 8, + 170, + 174, + 32, + 144, + 117, + 117, + 87, + 103, + 50, + 109, + 178, + 182, + 27, + 147, + 3, + 109, + 89, + 16, + 174, + 194, + 45, + 122, + 128, + 160, + 66, + 165, + 251, + 254, + 146, + 119, + 225, + 159, + 191, + 61, + 68, + 60, + 240, + 9, + 175, + 239, + 13, + 129, + 217, + 27, + 110, + 65, + 213, + 97, + 158, + 116, + 172, + 100, + 246, + 249, + 234, + 89, + 67, + 115, + 192, + 197, + 126, + 138, + 11, + 100, + 243, + 79, + 76, + 190, + 195, + 160, + 160, + 195, + 14, + 253, + 169, + 89, + 138, + 4, + 238, + 35, + 151, + 195, + 81, + 102, + 132, + 253, + 158, + 63, + 110, + 190, + 77, + 140, + 128, + 37, + 85, + 137, + 210, + 156, + 198, + 223, + 170, + 46, + 180, + 15, + 59, + 161, + 9, + 188, + 239, + 86, + 250, + 205, + 89, + 116, + 9, + 31, + 243, + 165, + 168, + 143, + 66, + 169, + 211, + 199, + 38, + 136, + 214, + 121, + 24, + 89, + 233, + 35, + 255, + 213, + 71, + 120, + 32, + 189, + 72, + 218, + 189, + 1, + 96, + 3, + 93, + 219, + 192, + 224, + 14, + 83, + 127, + 226, + 219, + 226, + 6, + 159, + 151, + 196, + 127, + 205, + 236, + 197, + 16, + 60, + 245, + 31, + 18, + 93, + 97, + 177, + 211, + 125, + 82, + 54, + 212, + 61, + 3, + 242, + 178, + 38, + 99, + 1, + 72, + 166, + 94, + 88, + 243, + 238, + 15, + 109, + 58, + 135, + 98, + 146, + 222, + 103, + 159, + 109, + 176, + 85, + 63, + 71, + 247, + 47, + 228, + 216, + 147, + 128, + 47, + 22, + 147, + 170, + 173, + 171, + 123, + 70, + 88, + 213, + 173, + 180, + 197, + 118, + 55, + 203, + 22, + 138, + 46, + 76, + 112, + 35, + 98, + 94, + 140, + 135, + 204, + 145, + 97, + 183, + 33, + 44, + 27, + 15, + 35, + 235, + 186, + 182, + 19, + 203, + 217, + 33, + 153, + 171, + 36, + 185, + 174, + 58, + 178, + 29, + 31, + 32, + 21, + 213, + 140, + 250, + 116, + 121, + 37, + 135, + 190, + 33, + 212, + 31, + 131, + 173, + 236, + 196, + 94, + 131, + 1, + 9, + 65, + 122, + 236, + 95, + 97, + 40, + 53, + 111, + 145, + 254, + 215, + 113, + 155, + 196, + 228, + 125, + 184, + 85, + 196, + 64, + 95, + 110, + 218, + 132, + 73, + 2, + 226, + 171, + 5, + 101, + 229, + 254, + 51, + 253, + 64, + 131, + 56, + 147, + 86, + 157, + 242, + 240, + 103, + 63, + 253, + 9, + 103, + 179, + 57, + 92, + 131, + 8, + 126, + 106, + 54, + 5, + 69, + 82, + 2, + 179, + 200, + 64, + 245, + 245, + 176, + 42, + 241, + 78, + 251, + 150, + 217, + 180, + 21, + 187, + 39, + 30, + 158, + 82, + 211, + 99, + 47, + 243, + 176, + 177, + 129, + 129, + 182, + 91, + 71, + 9, + 134, + 255, + 64, + 174, + 52, + 111, + 184, + 199, + 178, + 95, + 26, + 195, + 28, + 255, + 64, + 218, + 64, + 34, + 127, + 3, + 21, + 62, + 237, + 175, + 255, + 169, + 58, + 115, + 205, + 139, + 87, + 56, + 31, + 207, + 129, + 170, + 164, + 237, + 58, + 15, + 0, + 55, + 209, + 245, + 34, + 221, + 239, + 136, + 255, + 209, + 30, + 198, + 82, + 27, + 207, + 118, + 39, + 162, + 129, + 243, + 134, + 206, + 10, + 218, + 237, + 242, + 236, + 202, + 74, + 218, + 248, + 192, + 116, + 201, + 118, + 206, + 221, + 63, + 151, + 216, + 87, + 13, + 202, + 10, + 173, + 120, + 218, + 233, + 133, + 111, + 22, + 250, + 226, + 174, + 213, + 168, + 21, + 3, + 210, + 195, + 27, + 206, + 137, + 111, + 99, + 133, + 196, + 250, + 90, + 18, + 44, + 123, + 19, + 178, + 225, + 177, + 134, + 100, + 51, + 226, + 43, + 19, + 93, + 50, + 253, + 172, + 77, + 51, + 71, + 49, + 3, + 160, + 58, + 151, + 31, + 198, + 129, + 118, + 138, + 215, + 226, + 107, + 48, + 182, + 130, + 225, + 136, + 21, + 22, + 23, + 120, + 234, + 7, + 89, + 203, + 58, + 182, + 221, + 88, + 127, + 213, + 174, + 232, + 251, + 182, + 57, + 156, + 32, + 70, + 35, + 44, + 98, + 203, + 106, + 148, + 6, + 109, + 94, + 136, + 198, + 232, + 186, + 142, + 241, + 217, + 96, + 206, + 29, + 44, + 177, + 89, + 190, + 70, + 201, + 37, + 172, + 157, + 3, + 8, + 13, + 229, + 26, + 5, + 178, + 12, + 8, + 5, + 126, + 57, + 189, + 144, + 228, + 2, + 39, + 147, + 241, + 217, + 219, + 23, + 63, + 125, + 189, + 106, + 226, + 3, + 145, + 10, + 198, + 76, + 123, + 3, + 68, + 239, + 154, + 204, + 90, + 222, + 197, + 61, + 215, + 43, + 7, + 59, + 0, + 235, + 80, + 159, + 66, + 121, + 66, + 63, + 13, + 214, + 30, + 96, + 147, + 110, + 55, + 79, + 3, + 219, + 62, + 100, + 211, + 205, + 34, + 48, + 168, + 196, + 45, + 70, + 86, + 25, + 241, + 31, + 12, + 135, + 249, + 75, + 26, + 42, + 160, + 76, + 82, + 17, + 87, + 127, + 247, + 226, + 107, + 115, + 158, + 2, + 3, + 181, + 62, + 87, + 165, + 131, + 167, + 178, + 109, + 90, + 205, + 185, + 169, + 216, + 5, + 139, + 136, + 154, + 154, + 126, + 74, + 69, + 11, + 46, + 142, + 231, + 183, + 41, + 161, + 157, + 86, + 145, + 42, + 127, + 126, + 76, + 112, + 44, + 158, + 206, + 77, + 47, + 115, + 204, + 18, + 150, + 206, + 68, + 57, + 251, + 20, + 188, + 135, + 243, + 2, + 108, + 97, + 94, + 5, + 148, + 251, + 159, + 229, + 198, + 86, + 197, + 223, + 200, + 240, + 245, + 203, + 198, + 52, + 158, + 219, + 78, + 40, + 2, + 184, + 11, + 136, + 249, + 49, + 14, + 146, + 199, + 129, + 130, + 210, + 221, + 195, + 188, + 35, + 107, + 251, + 127, + 106, + 205, + 232, + 144, + 206, + 210, + 19, + 27, + 33, + 75, + 65, + 106, + 36, + 240, + 109, + 183, + 6, + 110, + 218, + 38, + 121, + 95, + 58, + 94, + 32, + 182, + 91, + 165, + 135, + 81, + 12, + 2, + 3, + 87, + 92, + 25, + 51, + 39, + 51, + 231, + 183, + 34, + 73, + 208, + 52, + 81, + 14, + 186, + 101, + 211, + 137, + 203, + 48, + 22, + 54, + 119, + 177, + 55, + 170, + 22, + 234, + 42, + 170, + 173, + 228, + 3, + 67, + 3, + 9, + 94, + 164, + 163, + 27, + 183, + 222, + 121, + 141, + 29, + 40, + 72, + 252, + 96, + 73, + 133, + 247, + 240, + 95, + 143, + 57, + 167, + 91, + 222, + 223, + 140, + 87, + 89, + 165, + 16, + 225, + 198, + 195, + 189, + 54, + 117, + 109, + 182, + 202, + 218, + 4, + 236, + 31, + 232, + 43, + 62, + 112, + 214, + 49, + 170, + 45, + 204, + 5, + 180, + 105, + 240, + 119, + 165, + 59, + 47, + 199, + 225, + 111, + 202, + 229, + 44, + 140, + 56, + 225, + 92, + 91, + 38, + 35, + 203, + 39, + 109, + 55, + 187, + 85, + 85, + 194, + 212, + 101, + 251, + 128, + 232, + 167, + 109, + 69, + 113, + 4, + 254, + 74, + 170, + 58, + 212, + 190, + 52, + 236, + 105, + 65, + 95, + 245, + 169, + 65, + 124, + 234, + 77, + 53, + 169, + 234, + 90, + 94, + 140, + 26, + 77, + 196, + 197, + 115, + 208, + 7, + 244, + 46, + 202, + 116, + 168, + 3, + 224, + 36, + 216, + 206, + 135, + 111, + 74, + 157, + 66, + 20, + 9, + 117, + 154, + 139, + 129, + 43, + 75, + 96, + 96, + 186, + 126, + 217, + 82, + 130, + 73, + 239, + 43, + 81, + 184, + 147, + 219, + 14, + 2, + 198, + 245, + 128, + 42, + 61, + 252, + 118, + 187, + 117, + 77, + 250, + 117, + 181, + 84, + 168, + 107, + 215, + 64, + 137, + 178, + 247, + 135, + 91, + 44, + 9, + 189, + 0, + 73, + 80, + 226, + 83, + 253, + 130, + 49, + 198, + 25, + 119, + 248, + 11, + 232, + 1, + 198, + 143, + 160, + 107, + 192, + 49, + 36, + 34, + 195, + 51, + 154, + 231, + 165, + 51, + 206, + 162, + 120, + 141, + 119, + 153, + 66, + 190, + 49, + 114, + 213, + 14, + 18, + 176, + 108, + 184, + 122, + 145, + 252, + 35, + 250, + 12, + 200, + 53, + 43, + 58, + 26, + 182, + 132, + 159, + 19, + 111, + 59, + 222, + 158, + 96, + 18, + 78, + 202, + 229, + 194, + 11, + 204, + 148, + 42, + 63, + 112, + 4, + 48, + 81, + 179, + 229, + 187, + 190, + 202, + 52, + 1, + 221, + 205, + 237, + 37, + 155, + 5, + 187, + 83, + 252, + 101, + 118, + 153, + 68, + 115, + 225, + 49, + 2, + 127, + 68, + 255, + 18, + 45, + 117, + 85, + 194, + 86, + 49, + 114, + 214, + 222, + 164, + 210, + 237, + 181, + 202, + 240, + 91, + 240, + 21, + 37, + 209, + 59, + 117, + 185, + 160, + 251, + 39, + 98, + 205, + 3, + 122, + 92, + 233, + 243, + 78, + 210, + 199, + 119, + 211, + 90, + 242, + 21, + 0, + 221, + 246, + 41, + 226, + 90, + 167, + 54, + 72, + 216, + 174, + 236, + 141, + 167, + 43, + 237, + 87, + 12, + 174, + 171, + 191, + 31, + 174, + 74, + 77, + 113, + 142, + 5, + 28, + 102, + 52, + 187, + 8, + 167, + 118, + 84, + 167, + 12, + 56, + 244, + 16, + 221, + 145, + 18, + 12, + 92, + 227, + 86, + 13, + 174, + 88, + 241, + 146, + 121, + 123, + 158, + 234, + 63, + 208, + 76, + 169, + 67, + 135, + 242, + 103, + 28, + 207, + 116, + 234, + 197, + 121, + 37, + 26, + 161, + 185, + 201, + 149, + 165, + 77, + 186, + 4, + 53, + 107, + 115, + 105, + 35, + 51, + 208, + 188, + 144, + 163, + 178, + 74, + 154, + 10, + 20, + 32, + 190, + 90, + 109, + 168, + 151, + 44, + 221, + 47, + 227, + 53, + 48, + 130, + 73, + 159, + 25, + 157, + 203, + 79, + 236, + 2, + 220, + 159, + 163, + 70, + 36, + 2, + 36, + 7, + 67, + 148, + 22, + 153, + 84, + 106, + 13, + 210, + 43, + 228, + 79, + 151, + 118, + 84, + 15, + 217, + 33, + 182, + 82, + 39, + 105, + 78, + 36, + 218, + 2, + 208, + 45, + 91, + 187, + 18, + 63, + 230, + 200, + 141, + 77, + 89, + 60, + 235, + 235, + 123, + 51, + 108, + 207, + 42, + 74, + 201, + 29, + 233, + 234, + 86, + 35, + 225, + 247, + 106, + 57, + 174, + 250, + 3, + 32, + 228, + 92, + 219, + 183, + 95, + 170, + 253, + 255, + 141, + 93, + 145, + 2, + 14, + 90, + 56, + 93, + 15, + 139, + 19, + 233, + 225, + 45, + 115, + 210, + 176, + 44, + 79, + 2, + 137, + 152, + 32, + 180, + 180, + 130, + 148, + 181, + 229, + 254, + 169, + 67, + 44, + 178, + 81, + 142, + 123, + 34, + 106, + 114, + 57, + 107, + 107, + 63, + 30, + 138, + 140, + 107, + 124, + 5, + 196, + 253, + 99, + 60, + 220, + 3, + 55, + 217, + 133, + 137, + 210, + 75, + 154, + 196, + 48, + 123, + 109, + 156, + 229, + 38, + 193, + 213, + 138, + 95, + 110, + 13, + 153, + 252, + 40, + 90, + 255, + 24, + 232, + 249, + 60, + 19, + 2, + 42, + 114, + 90, + 4, + 224, + 224, + 52, + 146, + 44, + 223, + 79, + 214, + 255, + 118, + 180, + 119, + 252, + 116, + 84, + 100, + 236, + 196, + 151, + 141, + 243, + 4, + 222, + 54, + 132, + 90, + 45, + 159, + 3, + 164, + 170, + 41, + 37, + 99, + 29, + 111, + 92, + 110, + 247, + 18, + 239, + 207, + 245, + 220, + 52, + 236, + 101, + 70, + 58, + 251, + 73, + 140, + 66, + 7, + 84, + 184, + 75, + 63, + 245, + 19, + 193, + 159, + 102, + 26, + 121, + 152, + 200, + 78, + 203, + 234, + 22, + 0, + 84, + 220, + 118, + 241, + 186, + 21, + 19, + 193, + 108, + 41, + 194, + 93, + 76, + 220, + 13, + 57, + 66, + 199, + 156, + 189, + 149, + 59, + 106, + 209, + 242, + 53, + 115, + 55, + 62, + 211, + 117, + 138, + 130, + 243, + 47, + 154, + 33, + 92, + 219, + 185, + 7, + 58, + 116, + 207, + 73, + 163, + 105, + 87, + 5, + 61, + 77, + 95, + 61, + 158, + 205, + 144, + 57, + 190, + 210, + 13, + 134, + 234, + 144, + 203, + 77, + 87, + 6, + 175, + 230, + 146, + 9, + 114, + 207, + 77, + 141, + 98, + 224, + 116, + 241, + 166, + 72, + 71, + 227, + 13, + 140, + 2, + 62, + 207, + 252, + 15, + 181, + 153, + 142, + 244, + 251, + 41, + 90, + 76, + 31, + 33, + 101, + 156, + 61, + 85, + 115, + 66, + 77, + 140, + 89, + 242, + 84, + 57, + 26, + 219, + 246, + 27, + 219, + 174, + 3, + 49, + 47, + 233, + 188, + 22, + 51, + 95, + 56, + 253, + 55, + 107, + 151, + 209, + 94, + 104, + 217, + 65, + 163, + 26, + 232, + 246, + 99, + 70, + 105, + 84, + 16, + 252, + 217, + 65, + 79, + 120, + 185, + 24, + 49, + 166, + 26, + 174, + 26, + 5, + 112, + 19, + 48, + 208, + 28, + 97, + 223, + 181, + 38, + 187, + 94, + 10, + 252, + 97, + 83, + 20, + 218, + 239, + 178, + 164, + 20, + 216, + 154, + 70, + 132, + 91, + 163, + 133, + 173, + 60, + 65, + 12, + 134, + 166, + 246, + 145, + 158, + 17, + 55, + 38, + 156, + 69, + 253, + 111, + 162, + 145, + 249, + 204, + 162, + 157, + 56, + 240, + 67, + 23, + 54, + 78, + 77, + 174, + 29, + 192, + 184, + 224, + 97, + 18, + 35, + 143, + 80, + 216, + 151, + 135, + 28, + 47, + 220, + 87, + 70, + 241, + 50, + 151, + 79, + 35, + 213, + 165, + 51, + 206, + 255, + 250, + 154, + 98, + 161, + 3, + 38, + 165, + 32, + 90, + 168, + 252, + 99, + 165, + 218, + 5, + 66, + 119, + 39, + 213, + 252, + 161, + 237, + 94, + 36, + 227, + 150, + 46, + 178, + 78, + 55, + 230, + 180, + 127, + 25, + 70, + 150, + 113, + 3, + 225, + 200, + 130, + 142, + 221, + 185, + 75, + 234, + 85, + 37, + 239, + 118, + 207, + 99, + 0, + 180, + 120, + 82, + 110, + 179, + 20, + 202, + 179, + 189, + 236, + 89, + 212, + 239, + 236, + 33, + 35, + 195, + 83, + 117, + 113, + 141, + 170, + 67, + 129, + 150, + 94, + 32, + 169, + 66, + 149, + 7, + 220, + 37, + 4, + 3, + 85, + 27, + 13, + 30, + 24, + 234, + 24, + 104, + 164, + 185, + 54, + 34, + 48, + 126, + 255, + 134, + 183, + 202, + 149, + 3, + 247, + 28, + 252, + 145, + 36, + 102, + 182, + 232, + 37, + 129, + 125, + 132, + 46, + 158, + 124, + 131, + 31, + 166, + 86, + 28, + 154, + 210, + 127, + 193, + 58, + 196, + 38, + 98, + 165, + 83, + 73, + 200, + 111, + 234, + 255, + 172, + 134, + 161, + 215, + 127, + 27, + 78, + 200, + 217, + 188, + 143, + 152, + 196, + 186, + 118, + 88, + 204, + 179, + 16, + 162, + 197, + 17, + 213, + 2, + 128, + 177, + 203, + 53, + 249, + 119, + 216, + 146, + 102, + 56, + 106, + 95, + 249, + 207, + 128, + 36, + 196, + 129, + 159, + 13, + 13, + 64, + 33, + 97, + 133, + 102, + 35, + 101, + 1, + 36, + 192, + 207, + 2, + 168, + 39, + 27, + 118, + 218, + 211, + 3, + 209, + 199, + 45, + 165, + 160, + 219, + 98, + 86, + 112, + 99, + 236, + 220, + 17, + 81, + 210, + 31, + 51, + 245, + 34, + 65, + 207, + 32, + 153, + 64, + 142, + 202, + 109, + 103, + 20, + 245, + 39, + 37, + 191, + 94, + 57, + 45, + 18, + 194, + 34, + 83, + 19, + 124, + 166, + 30, + 238, + 184, + 170, + 221, + 149, + 11, + 130, + 174, + 225, + 78, + 239, + 186, + 17, + 32, + 25, + 244, + 19, + 135, + 125, + 83, + 98, + 75, + 166, + 172, + 60, + 1, + 244, + 102, + 163, + 133, + 176, + 208, + 171, + 52, + 231, + 173, + 0, + 173, + 185, + 190, + 251, + 6, + 54, + 21, + 118, + 65, + 63, + 201, + 55, + 68, + 91, + 203, + 176, + 18, + 70, + 119, + 90, + 229, + 220, + 195, + 49, + 45, + 197, + 49, + 172, + 179, + 196, + 186, + 41, + 38, + 234, + 118, + 214, + 35, + 9, + 111, + 232, + 2, + 180, + 86, + 117, + 22, + 87, + 167, + 53, + 40, + 249, + 97, + 103, + 127, + 182, + 131, + 203, + 54, + 2, + 214, + 88, + 217, + 208, + 67, + 80, + 253, + 182, + 193, + 6, + 61, + 186, + 66, + 123, + 109, + 3, + 31, + 146, + 156, + 170, + 252, + 113, + 44, + 16, + 5, + 54, + 172, + 10, + 255, + 47, + 197, + 159, + 197, + 129, + 199, + 159, + 2, + 103, + 40, + 31, + 76, + 99, + 115, + 163, + 190, + 19, + 90, + 176, + 80, + 183, + 210, + 85, + 54, + 78, + 46, + 85, + 26, + 18, + 78, + 247, + 98, + 211, + 118, + 22, + 162, + 201, + 197, + 70, + 6, + 217, + 106, + 111, + 20, + 28, + 124, + 130, + 221, + 107, + 251, + 210, + 64, + 205, + 196, + 66, + 195, + 122, + 145, + 121, + 175, + 91, + 212, + 93, + 123, + 31, + 38, + 84, + 248, + 159, + 119, + 68, + 186, + 183, + 184, + 239, + 78, + 105, + 83, + 33, + 103, + 163, + 49, + 140, + 163, + 133, + 158, + 207, + 177, + 116, + 152, + 132, + 211, + 202, + 23, + 221, + 62, + 136, + 188, + 165, + 192, + 251, + 30, + 0, + 190, + 56, + 214, + 35, + 127, + 110, + 206, + 1, + 30, + 122, + 11, + 186, + 2, + 107, + 160, + 53, + 211, + 239, + 58, + 95, + 99, + 129, + 163, + 200, + 15, + 68, + 199, + 212, + 97, + 0, + 230, + 87, + 84, + 180, + 22, + 136, + 218, + 159, + 131, + 73, + 201, + 70, + 133, + 21, + 61, + 3, + 239, + 65, + 72, + 158, + 123, + 4, + 222, + 223, + 23, + 15, + 54, + 68, + 128, + 116, + 187, + 173, + 189, + 19, + 35, + 88, + 98, + 230, + 52, + 253, + 110, + 62, + 144, + 211, + 13, + 204, + 167, + 34, + 135, + 253, + 234, + 127, + 105, + 236, + 115, + 111, + 97, + 199, + 166, + 119, + 161, + 179, + 174, + 217, + 229, + 184, + 176, + 108, + 199, + 134, + 137, + 138, + 18, + 80, + 97, + 243, + 227, + 166, + 72, + 116, + 149, + 212, + 255, + 140, + 23, + 178, + 118, + 240, + 162, + 176, + 190, + 177, + 185, + 32, + 195, + 166, + 99, + 246, + 45, + 81, + 36, + 133, + 56, + 38, + 55, + 219, + 217, + 38, + 144, + 107, + 82, + 40, + 90, + 103, + 91, + 171, + 87, + 75, + 244, + 238, + 60, + 64, + 205, + 42, + 251, + 247, + 6, + 155, + 115, + 149, + 137, + 236, + 137, + 179, + 119, + 118, + 47, + 139, + 175, + 23, + 9, + 91, + 12, + 236, + 2, + 203, + 129, + 186, + 96, + 102, + 2, + 218, + 15, + 122, + 101, + 36, + 219, + 137, + 217, + 133, + 123, + 210, + 151, + 172, + 205, + 141, + 164, + 119, + 21, + 29, + 128, + 123, + 227, + 172, + 145, + 166, + 251, + 3, + 52, + 139, + 107, + 102, + 238, + 147, + 95, + 169, + 60, + 52, + 162, + 76, + 185, + 61, + 192, + 213, + 35, + 151, + 205, + 50, + 238, + 24, + 244, + 55, + 98, + 147, + 58, + 116, + 45, + 219, + 129, + 46, + 95, + 67, + 75, + 190, + 243, + 200, + 103, + 195, + 246, + 75, + 87, + 222, + 220, + 132, + 76, + 112, + 30, + 74, + 214, + 80, + 17, + 11, + 85, + 138, + 22, + 125, + 38, + 137, + 33, + 183, + 91, + 29, + 103, + 213, + 246, + 244, + 215, + 92, + 234, + 208, + 204, + 242, + 214, + 241, + 193, + 253, + 158, + 9, + 30, + 115, + 129, + 12, + 37, + 83, + 217, + 230, + 141, + 234, + 161, + 147, + 233, + 181, + 87, + 209, + 236, + 243, + 42, + 55, + 158, + 117, + 234, + 85, + 95, + 104, + 242, + 69, + 240, + 190, + 110, + 73, + 32, + 207, + 82, + 173, + 49, + 26, + 28, + 240, + 40, + 147, + 81, + 170, + 203, + 43, + 242, + 92, + 2, + 227, + 144, + 235, + 119, + 166, + 73, + 103, + 152, + 44, + 164, + 172, + 255, + 111, + 99, + 39, + 66, + 202, + 245, + 3, + 6, + 137, + 235, + 128, + 87, + 173, + 82, + 10, + 77, + 105, + 157, + 156, + 110, + 2, + 43, + 75, + 114, + 0, + 163, + 33, + 199, + 98, + 197, + 1, + 104, + 69, + 207, + 200, + 170, + 226, + 52, + 80, + 67, + 48, + 67, + 253, + 91, + 185, + 118, + 167, + 169, + 219, + 62, + 177, + 163, + 98, + 220, + 26, + 94, + 205, + 195, + 178, + 219, + 175, + 89, + 125, + 175, + 11, + 246, + 158, + 118, + 18, + 45, + 231, + 213, + 240, + 216, + 46, + 47, + 136, + 42, + 201, + 27, + 240, + 168, + 79, + 60, + 109, + 231, + 220, + 167, + 82, + 194, + 195, + 159, + 48, + 45, + 63, + 202, + 192, + 34, + 124, + 64, + 83, + 41, + 141, + 61, + 150, + 191, + 23, + 54, + 192, + 237, + 64, + 105, + 33, + 93, + 157, + 244, + 155, + 136, + 195, + 77, + 182, + 250, + 79, + 26, + 52, + 3, + 180, + 55, + 177, + 206, + 72, + 157, + 138, + 72, + 171, + 137, + 174, + 222, + 187, + 188, + 126, + 30, + 6, + 71, + 215, + 189, + 218, + 59, + 180, + 2, + 221, + 208, + 190, + 34, + 172, + 210, + 43, + 89, + 207, + 233, + 62, + 123, + 18, + 44, + 115, + 169, + 63, + 30, + 2, + 244, + 44, + 28, + 107, + 195, + 179, + 36, + 111, + 27, + 177, + 143, + 43, + 179, + 2, + 2, + 43, + 167, + 75, + 86, + 250, + 162, + 20, + 118, + 198, + 211, + 38, + 87, + 101, + 235, + 171, + 143, + 104, + 244, + 79, + 23, + 73, + 34, + 68, + 141, + 251, + 31, + 30, + 224, + 203, + 165, + 181, + 21, + 165, + 18, + 9, + 94, + 9, + 146, + 104, + 20, + 81, + 196, + 79, + 26, + 144, + 21, + 134, + 0, + 48, + 93, + 131, + 101, + 51, + 163, + 174, + 34, + 167, + 161, + 171, + 135, + 55, + 241, + 161, + 141, + 232, + 244, + 108, + 242, + 111, + 227, + 105, + 246, + 49, + 223, + 70, + 213, + 173, + 255, + 246, + 132, + 252, + 209, + 37, + 13, + 202, + 32, + 141, + 16, + 250, + 57, + 146, + 237, + 166, + 112, + 78, + 166, + 199, + 237, + 145, + 218, + 175, + 219, + 168, + 4, + 209, + 217, + 7, + 211, + 12, + 102, + 253, + 18, + 125, + 144, + 13, + 108, + 78, + 41, + 133, + 82, + 161, + 254, + 237, + 216, + 90, + 222, + 34, + 2, + 46, + 161, + 122, + 252, + 159, + 231, + 155, + 94, + 52, + 171, + 84, + 217, + 215, + 72, + 18, + 49, + 252, + 168, + 217, + 45, + 213, + 86, + 41, + 81, + 227, + 165, + 174, + 141, + 38, + 176, + 83, + 44, + 2, + 54, + 204, + 22, + 162, + 39, + 179, + 62, + 76, + 230, + 61, + 24, + 236, + 135, + 91, + 193, + 222, + 65, + 64, + 123, + 162, + 166, + 225, + 49, + 228, + 88, + 236, + 141, + 96, + 138, + 91, + 5, + 84, + 54, + 118, + 130, + 70, + 42, + 208, + 149, + 250, + 193, + 212, + 119, + 199, + 226, + 77, + 91, + 211, + 194, + 0, + 55, + 15, + 23, + 183, + 218, + 181, + 71, + 31, + 100, + 70, + 35, + 50, + 141, + 150, + 11, + 147, + 250, + 174, + 244, + 51, + 58, + 189, + 233, + 246, + 22, + 149, + 239, + 72, + 104, + 121, + 5, + 79, + 87, + 2, + 200, + 164, + 90, + 237, + 157, + 251, + 248, + 85, + 229, + 103, + 217, + 59, + 100, + 189, + 223, + 240, + 125, + 30, + 25, + 193, + 57, + 206, + 191, + 170, + 148, + 73, + 177, + 188, + 13, + 245, + 211, + 75, + 2, + 10, + 204, + 243, + 79, + 162, + 152, + 116, + 3, + 240, + 151, + 9, + 2, + 38, + 96, + 98, + 225, + 2, + 242, + 50, + 65, + 161, + 113, + 76, + 116, + 36, + 162, + 235, + 224, + 230, + 154, + 37, + 103, + 205, + 187, + 207, + 176, + 231, + 87, + 57, + 206, + 26, + 51, + 39, + 230, + 3, + 151, + 205, + 62, + 166, + 250, + 67, + 74, + 254, + 37, + 157, + 107, + 246, + 13, + 114, + 147, + 49, + 214, + 35, + 107, + 41, + 145, + 37, + 44, + 114, + 4, + 143, + 171, + 105, + 246, + 212, + 166, + 223, + 153, + 177, + 245, + 158, + 67, + 244, + 63, + 60, + 43, + 7, + 64, + 154, + 88, + 32, + 124, + 101, + 232, + 242, + 68, + 192, + 57, + 230, + 193, + 181, + 57, + 235, + 142, + 76, + 134, + 233, + 124, + 122, + 72, + 79, + 116, + 238, + 12, + 122, + 234, + 228, + 85, + 66, + 64, + 170, + 57, + 78, + 109, + 232, + 230, + 49, + 218, + 165, + 58, + 137, + 102, + 115, + 105, + 18, + 73, + 203, + 99, + 137, + 172, + 180, + 169, + 206, + 3, + 169, + 78, + 94, + 74, + 160, + 41, + 33, + 131, + 60, + 192, + 134, + 134, + 88, + 149, + 55, + 32, + 112, + 113, + 106, + 28, + 40, + 115, + 197, + 227, + 140, + 160, + 63, + 38, + 84, + 3, + 11, + 73, + 8, + 230, + 174, + 47, + 12, + 144, + 183, + 97, + 34, + 118, + 179, + 105, + 37, + 42, + 93, + 26, + 1, + 233, + 197, + 166, + 193, + 219, + 50, + 215, + 222, + 10, + 218, + 78, + 222, + 156, + 3, + 87, + 236, + 202, + 134, + 117, + 216, + 156, + 27, + 205, + 88, + 43, + 53, + 135, + 200, + 142, + 21, + 135, + 205, + 150, + 87, + 191, + 32, + 221, + 41, + 84, + 221, + 156, + 253, + 239, + 205, + 123, + 223, + 249, + 38, + 201, + 55, + 84, + 128, + 143, + 99, + 7, + 35, + 242, + 172, + 216, + 28, + 63, + 231, + 145, + 252, + 112, + 225, + 14, + 175, + 37, + 196, + 124, + 214, + 17, + 52, + 116, + 81, + 86, + 209, + 69, + 223, + 5, + 159, + 150, + 111, + 201, + 77, + 219, + 60, + 160, + 30, + 51, + 109, + 120, + 96, + 157, + 232, + 161, + 141, + 105, + 73, + 4, + 86, + 54, + 121, + 236, + 245, + 133, + 126, + 21, + 174, + 172, + 34, + 165, + 222, + 181, + 234, + 42, + 133, + 206, + 170, + 202, + 196, + 249, + 100, + 146, + 208, + 60, + 128, + 205, + 12, + 216, + 187, + 112, + 50, + 100, + 245, + 247, + 189, + 155, + 252, + 248, + 3, + 3, + 101, + 25, + 33, + 106, + 42, + 215, + 190, + 191, + 30, + 112, + 177, + 45, + 152, + 227, + 193, + 107, + 243, + 38, + 244, + 78, + 27, + 28, + 105, + 210, + 49, + 233, + 165, + 209, + 160, + 182, + 211, + 142, + 2, + 123, + 160, + 233, + 134, + 79, + 57, + 71, + 111, + 7, + 110, + 244, + 236, + 17, + 170, + 27, + 33, + 177, + 239, + 83, + 145, + 239, + 76, + 140, + 99, + 238, + 211, + 23, + 83, + 85, + 26, + 8, + 22, + 253, + 131, + 154, + 128, + 100, + 143, + 242, + 243, + 165, + 9, + 48, + 239, + 132, + 23, + 91, + 22, + 59, + 214, + 145, + 37, + 255, + 218, + 154, + 219, + 227, + 89, + 12, + 110, + 169, + 178, + 108, + 31, + 116, + 241, + 42, + 49, + 178, + 247, + 209, + 85, + 67, + 110, + 149, + 184, + 109, + 210, + 177, + 251, + 234, + 98, + 238, + 38, + 130, + 241, + 66, + 143, + 28, + 141, + 95, + 83, + 12, + 213, + 195, + 75, + 50, + 92, + 164, + 248, + 89, + 108, + 12, + 248, + 119, + 153, + 155, + 234, + 224, + 29, + 90, + 158, + 153, + 16, + 242, + 20, + 66, + 99, + 195, + 58, + 37, + 11, + 187, + 65, + 81, + 249, + 27, + 236, + 2, + 36, + 120, + 39, + 191, + 248, + 252, + 240, + 104, + 232, + 136, + 115, + 141, + 9, + 190, + 51, + 15, + 189, + 10, + 194, + 118, + 7, + 183, + 71, + 110, + 106, + 68, + 7, + 52, + 6, + 157, + 214, + 105, + 3, + 100, + 160, + 238, + 83, + 207, + 160, + 223, + 84, + 204, + 166, + 143, + 30, + 18, + 203, + 146, + 144, + 15, + 109, + 232, + 31, + 126, + 12, + 245, + 25, + 141, + 244, + 47, + 55, + 74, + 239, + 136, + 177, + 188, + 165, + 132, + 30, + 97, + 209, + 159, + 221, + 9, + 68, + 240, + 28, + 243, + 140, + 8, + 51, + 124, + 242, + 158, + 198, + 3, + 66, + 21, + 68, + 220, + 130, + 251, + 128, + 88, + 1, + 76, + 206, + 240, + 165, + 254, + 6, + 12, + 186, + 30, + 66, + 73, + 71, + 87, + 30, + 29, + 236, + 229, + 15, + 18, + 83, + 138, + 117, + 118, + 149, + 17, + 78, + 188, + 215, + 173, + 34, + 60, + 101, + 4, + 71, + 222, + 252, + 67, + 175, + 119, + 7, + 161, + 220, + 117, + 8, + 37, + 170, + 220, + 249, + 37, + 219, + 174, + 93, + 189, + 31, + 41, + 229, + 22, + 202, + 159, + 100, + 1, + 3, + 100, + 196, + 110, + 239, + 3, + 223, + 1, + 199, + 135, + 54, + 48, + 193, + 117, + 136, + 98, + 121, + 104, + 215, + 252, + 184, + 194, + 128, + 247, + 160, + 135, + 79, + 185, + 4, + 4, + 155, + 165, + 250, + 117, + 94, + 152, + 104, + 30, + 3, + 126, + 243, + 107, + 47, + 216, + 59, + 152, + 186, + 198, + 153, + 14, + 109, + 82, + 239, + 85, + 95, + 59, + 139, + 172, + 237, + 31, + 75, + 34, + 146, + 5, + 77, + 118, + 118, + 142, + 3, + 93, + 64, + 126, + 88, + 138, + 237, + 145, + 228, + 245, + 155, + 178, + 12, + 30, + 42, + 209, + 78, + 236, + 26, + 218, + 143, + 160, + 62, + 235, + 18, + 205, + 144, + 136, + 132, + 42, + 179, + 149, + 132, + 93, + 49, + 249, + 152, + 180, + 131, + 115, + 163, + 139, + 50, + 60, + 68, + 202, + 26, + 87, + 217, + 185, + 1, + 64, + 57, + 222, + 136, + 178, + 21, + 245, + 181, + 78, + 232, + 23, + 15, + 174, + 39, + 153, + 22, + 117, + 242, + 219, + 54, + 115, + 55, + 27, + 236, + 133, + 52, + 235, + 99, + 13, + 119, + 77, + 19, + 5, + 7, + 41, + 22, + 3, + 140, + 202, + 138, + 160, + 161, + 116, + 5, + 65, + 254, + 148, + 58, + 3, + 91, + 143, + 120, + 167, + 106, + 231, + 176, + 62, + 143, + 70, + 111, + 25, + 153, + 152, + 36, + 146, + 96, + 152, + 50, + 128, + 62, + 38, + 219, + 243, + 217, + 125, + 182, + 182, + 46, + 184, + 71, + 7, + 3, + 117, + 128, + 110, + 101, + 98, + 68, + 123, + 192, + 34, + 18, + 35, + 137, + 105, + 108, + 131, + 125, + 137, + 8, + 147, + 61, + 61, + 133, + 113, + 111, + 81, + 148, + 14, + 117, + 79, + 54, + 108, + 202, + 116, + 144, + 66, + 25, + 226, + 231, + 7, + 233, + 114, + 3, + 4, + 186, + 209, + 157, + 66, + 64, + 29, + 110, + 227, + 193, + 214, + 215, + 74, + 102, + 101, + 109, + 141, + 240, + 91, + 196, + 5, + 118, + 202, + 108, + 23, + 72, + 66, + 121, + 210, + 145, + 160, + 248, + 225, + 143, + 152, + 49, + 75, + 151, + 196, + 174, + 225, + 204, + 33, + 255, + 91, + 182, + 8, + 75, + 186, + 9, + 119, + 36, + 203, + 173, + 149, + 9, + 30, + 119, + 57, + 42, + 80, + 112, + 156, + 160, + 186, + 57, + 134, + 113, + 73, + 127, + 132, + 245, + 12, + 248, + 15, + 106, + 90, + 61, + 118, + 63, + 18, + 154, + 79, + 35, + 122, + 148, + 3, + 77, + 55, + 85, + 27, + 190, + 211, + 198, + 66, + 203, + 31, + 19, + 206, + 21, + 27, + 7, + 243, + 197, + 98, + 122, + 187, + 215, + 234, + 130, + 53, + 23, + 166, + 117, + 50, + 213, + 241, + 177, + 37, + 3, + 64, + 96, + 44, + 60, + 99, + 28, + 13, + 2, + 153, + 119, + 119, + 18, + 238, + 3, + 187, + 2, + 70, + 229, + 131, + 159, + 10, + 79, + 196, + 196, + 26, + 199, + 80, + 40, + 63, + 29, + 21, + 127, + 183, + 80, + 12, + 20, + 62, + 57, + 14, + 205, + 239, + 234, + 146, + 136, + 142, + 32, + 164, + 135, + 194, + 34, + 58, + 152, + 29, + 210, + 62, + 115, + 255, + 237, + 235, + 157, + 153, + 244, + 126, + 92, + 231, + 95, + 43, + 73, + 45, + 143, + 19, + 147, + 16, + 76, + 102, + 85, + 233, + 231, + 58, + 166, + 33, + 241, + 42, + 56, + 217, + 246, + 94, + 34, + 210, + 83, + 155, + 241, + 197, + 87, + 17, + 33, + 62, + 59, + 173, + 119, + 102, + 141, + 46, + 130, + 234, + 42, + 7, + 16, + 188, + 128, + 94, + 185, + 35, + 184, + 179, + 153, + 89, + 243, + 240, + 50, + 227, + 243, + 111, + 64, + 121, + 39, + 139, + 200, + 3, + 37, + 40, + 197, + 126, + 227, + 58, + 76, + 111, + 141, + 176, + 50, + 126, + 146, + 247, + 210, + 117, + 249, + 108, + 251, + 211, + 184, + 99, + 52, + 81, + 183, + 163, + 196, + 25, + 214, + 119, + 75, + 71, + 3, + 34, + 111, + 241, + 99, + 183, + 134, + 212, + 75, + 163, + 95, + 173, + 128, + 38, + 240, + 179, + 96, + 64, + 204, + 147, + 124, + 181, + 8, + 85, + 107, + 227, + 148, + 59, + 246, + 155, + 23, + 11, + 149, + 142, + 91, + 240, + 52, + 180, + 209, + 78, + 217, + 19, + 85, + 56, + 93, + 17, + 109, + 119, + 107, + 117, + 188, + 96, + 180, + 41, + 178, + 127, + 210, + 252, + 237, + 188, + 101, + 158, + 248, + 210, + 206, + 55, + 88, + 153, + 241, + 189, + 198, + 60, + 98, + 26, + 151, + 150, + 192, + 51, + 191, + 21, + 99, + 2, + 178, + 45, + 10, + 235, + 222, + 190, + 44, + 241, + 100, + 215, + 158, + 133, + 57, + 162, + 105, + 131, + 7, + 27, + 132, + 122, + 228, + 197, + 104, + 50, + 246, + 192, + 47, + 63, + 168, + 56, + 58, + 239, + 69, + 152, + 95, + 61, + 50, + 77, + 22, + 174, + 128, + 169, + 85, + 139, + 169, + 120, + 6, + 3, + 176, + 99, + 215, + 140, + 5, + 144, + 103, + 214, + 80, + 77, + 90, + 116, + 26, + 254, + 66, + 137, + 234, + 35, + 10, + 8, + 166, + 200, + 144, + 0, + 89, + 212, + 212, + 30, + 34, + 27, + 43, + 192, + 3, + 136, + 170, + 251, + 184, + 203, + 74, + 221, + 54, + 30, + 152, + 0, + 26, + 189, + 147, + 128, + 64, + 71, + 17, + 84, + 205, + 248, + 171, + 215, + 156, + 214, + 16, + 97, + 17, + 12, + 199, + 230, + 237, + 47, + 129, + 76, + 127, + 189, + 94, + 187, + 146, + 58, + 5, + 70, + 26, + 118, + 180, + 80, + 136, + 1, + 240, + 34, + 191, + 84, + 141, + 11, + 54, + 152, + 209, + 20, + 17, + 60, + 228, + 74, + 59, + 13, + 24, + 175, + 7, + 35, + 151, + 93, + 242, + 9, + 80, + 152, + 107, + 32, + 192, + 184, + 51, + 41, + 42, + 40, + 73, + 14, + 110, + 147, + 47, + 241, + 190, + 169, + 177, + 207, + 207, + 169, + 97, + 171, + 22, + 186, + 105, + 125, + 134, + 34, + 237, + 156, + 54, + 126, + 50, + 195, + 174, + 138, + 0, + 191, + 71, + 95, + 31, + 112, + 69, + 204, + 154, + 177, + 22, + 176, + 19, + 126, + 105, + 181, + 228, + 2, + 65, + 92, + 229, + 92, + 37, + 133, + 150, + 72, + 76, + 255, + 251, + 240, + 207, + 219, + 148, + 134, + 94, + 40, + 14, + 182, + 25, + 18, + 129, + 16, + 109, + 61, + 35, + 247, + 92, + 35, + 124, + 252, + 3, + 176, + 195, + 143, + 171, + 181, + 38, + 115, + 205, + 146, + 141, + 6, + 231, + 173, + 89, + 199, + 101, + 9, + 190, + 231, + 3, + 221, + 229, + 7, + 209, + 195, + 233, + 120, + 132, + 158, + 188, + 20, + 251, + 191, + 16, + 64, + 141, + 74, + 228, + 144, + 128, + 154, + 24, + 223, + 12, + 94, + 46, + 119, + 189, + 233, + 25, + 77, + 224, + 122, + 86, + 95, + 186, + 95, + 158, + 57, + 51, + 192, + 155, + 2, + 178, + 91, + 173, + 97, + 97, + 23, + 124, + 134, + 210, + 40, + 11, + 213, + 57, + 186, + 75, + 46, + 0, + 48, + 98, + 161, + 185, + 221, + 74, + 184, + 107, + 176, + 153, + 119, + 106, + 191, + 166, + 239, + 123, + 184, + 128, + 124, + 106, + 161, + 182, + 245, + 72, + 61, + 13, + 157, + 151, + 240, + 217, + 112, + 35, + 166, + 79, + 206, + 113, + 137, + 46, + 209, + 209, + 219, + 143, + 92, + 15, + 54, + 247, + 182, + 242, + 2, + 4, + 188, + 230, + 11, + 170, + 51, + 28, + 95, + 241, + 230, + 251, + 125, + 12, + 215, + 51, + 201, + 167, + 91, + 160, + 178, + 162, + 119, + 178, + 186, + 93, + 228, + 218, + 219, + 205, + 22, + 210, + 233, + 3, + 91, + 77, + 199, + 239, + 143, + 154, + 63, + 131, + 135, + 141, + 138, + 30, + 66, + 3, + 240, + 207, + 248, + 134, + 68, + 200, + 80, + 69, + 183, + 81, + 182, + 20, + 13, + 247, + 10, + 17, + 99, + 60, + 157, + 145, + 66, + 187, + 225, + 225, + 141, + 228, + 54, + 212, + 108, + 220, + 85, + 102, + 90, + 216, + 199, + 62, + 191, + 73, + 130, + 222, + 153, + 124, + 216, + 242, + 2, + 13, + 47, + 89, + 217, + 119, + 52, + 143, + 220, + 178, + 254, + 186, + 130, + 248, + 45, + 155, + 213, + 10, + 6, + 174, + 146, + 77, + 65, + 219, + 232, + 93, + 162, + 171, + 37, + 154, + 172, + 198, + 51, + 241, + 172, + 120, + 16, + 153, + 205, + 168, + 157, + 226, + 82, + 222, + 121, + 131, + 76, + 43, + 216, + 228, + 165, + 250, + 177, + 193, + 62, + 37, + 142, + 150, + 176, + 219, + 10, + 221, + 53, + 171, + 30, + 46, + 250, + 208, + 146, + 90, + 3, + 185, + 199, + 156, + 161, + 216, + 26, + 58, + 120, + 71, + 38, + 23, + 159, + 78, + 44, + 88, + 174, + 255, + 198, + 116, + 86, + 142, + 195, + 218, + 93, + 116, + 225, + 227, + 159, + 148, + 66, + 220, + 18, + 2, + 222, + 169, + 83, + 234, + 253, + 91, + 165, + 204, + 138, + 39, + 217, + 16, + 210, + 101, + 224, + 114, + 217, + 80, + 166, + 16, + 66, + 44, + 247, + 188, + 185, + 62, + 65, + 122, + 182, + 142, + 115, + 79, + 167, + 186, + 99, + 175, + 34, + 70, + 20, + 14, + 177, + 77, + 151, + 105, + 151, + 216, + 140, + 64, + 152, + 20, + 78, + 190, + 230, + 180, + 183, + 185, + 165, + 137, + 78, + 132, + 32, + 186, + 221, + 171, + 138, + 38, + 98, + 61, + 118, + 196, + 28, + 152, + 236, + 157, + 110, + 73, + 189, + 196, + 45, + 137, + 74, + 100, + 95, + 237, + 164, + 84, + 219, + 229, + 10, + 79, + 90, + 101, + 24, + 194, + 64, + 222, + 167, + 19, + 205, + 61, + 88, + 49, + 144, + 157, + 30, + 196, + 205, + 95, + 84, + 68, + 247, + 229, + 191, + 104, + 140, + 210, + 108, + 115, + 206, + 114, + 195, + 49, + 44, + 4, + 202, + 52, + 233, + 114, + 2, + 189, + 174, + 75, + 47, + 108, + 122, + 87, + 40, + 217, + 86, + 111, + 240, + 62, + 129, + 190, + 206, + 251, + 107, + 12, + 150, + 242, + 126, + 238, + 35, + 167, + 72, + 136, + 39, + 255, + 9, + 108, + 169, + 3, + 5, + 219, + 220, + 213, + 69, + 80, + 63, + 70, + 149, + 30, + 28, + 155, + 81, + 118, + 82, + 155, + 40, + 49, + 228, + 99, + 54, + 72, + 229, + 36, + 36, + 243, + 36, + 26, + 206, + 245, + 56, + 76, + 210, + 18, + 184, + 242, + 174, + 151, + 124, + 36, + 25, + 151, + 185, + 64, + 230, + 45, + 55, + 47, + 26, + 20, + 226, + 86, + 134, + 225, + 125, + 251, + 83, + 162, + 167, + 77, + 138, + 41, + 88, + 18, + 225, + 121, + 226, + 250, + 61, + 6, + 221, + 121, + 80, + 135, + 191, + 146, + 186, + 170, + 55, + 158, + 46, + 120, + 136, + 160, + 202, + 234, + 252, + 207, + 192, + 192, + 70, + 46, + 9, + 85, + 94, + 14, + 62, + 142, + 112, + 97, + 154, + 190, + 76, + 36, + 47, + 231, + 86, + 246, + 175, + 216, + 3, + 18, + 58, + 76, + 150, + 196, + 4, + 105, + 95, + 195, + 39, + 128, + 37, + 152, + 128, + 22, + 1, + 35, + 3, + 69, + 251, + 3, + 198, + 249, + 241, + 148, + 72, + 89, + 211, + 225, + 73, + 124, + 106, + 150, + 52, + 173, + 199, + 115, + 221, + 18, + 22, + 207, + 248, + 129, + 70, + 19, + 115, + 89, + 66, + 99, + 123, + 3, + 150, + 106, + 157, + 45, + 111, + 123, + 252, + 217, + 81, + 60, + 0, + 184, + 227, + 242, + 218, + 138, + 240, + 195, + 113, + 255, + 58, + 78, + 118, + 156, + 172, + 207, + 154, + 188, + 16, + 72, + 204, + 254, + 231, + 226, + 180, + 97, + 242, + 228, + 42, + 155, + 79, + 200, + 159, + 131, + 164, + 207, + 240, + 177, + 28, + 244, + 226, + 62, + 157, + 27, + 8, + 8, + 209, + 132, + 212, + 21, + 130, + 128, + 192, + 63, + 167, + 255, + 106, + 66, + 71, + 211, + 194, + 126, + 114, + 207, + 236, + 85, + 165, + 108, + 139, + 161, + 20, + 154, + 21, + 186, + 212, + 74, + 182, + 205, + 121, + 53, + 179, + 228, + 108, + 152, + 163, + 204, + 40, + 28, + 105, + 45, + 134, + 124, + 21, + 252, + 82, + 234, + 112, + 98, + 167, + 119, + 155, + 247, + 110, + 13, + 99, + 200, + 232, + 25, + 224, + 179, + 138, + 114, + 238, + 89, + 247, + 41, + 8, + 156, + 3, + 132, + 69, + 230, + 128, + 1, + 162, + 155, + 34, + 109, + 129, + 37, + 175, + 4, + 118, + 41, + 143, + 31, + 5, + 183, + 35, + 198, + 58, + 117, + 205, + 27, + 165, + 87, + 33, + 184, + 106, + 237, + 26, + 3, + 26, + 203, + 24, + 24, + 157, + 198, + 40, + 78, + 56, + 130, + 0, + 53, + 234, + 118, + 48, + 246, + 56, + 3, + 52, + 124, + 199, + 181, + 207, + 244, + 116, + 234, + 98, + 133, + 9, + 102, + 215, + 163, + 218, + 135, + 75, + 43, + 74, + 5, + 188, + 159, + 67, + 214, + 159, + 160, + 126, + 233, + 247, + 230, + 108, + 22, + 163, + 197, + 4, + 241, + 156, + 33, + 114, + 46, + 197, + 95, + 125, + 138, + 109, + 196, + 108, + 192, + 157, + 51, + 57, + 193, + 169, + 188, + 170, + 208, + 69, + 254, + 246, + 178, + 249, + 108, + 113, + 223, + 57, + 35, + 167, + 57, + 95, + 128, + 150, + 212, + 41, + 35, + 187, + 118, + 51, + 86, + 53, + 238, + 203, + 173, + 224, + 120, + 212, + 112, + 219, + 137, + 174, + 8, + 177, + 206, + 101, + 178, + 78, + 117, + 241, + 238, + 218, + 190, + 75, + 153, + 29, + 137, + 162, + 140, + 59, + 181, + 173, + 150, + 2, + 126, + 165, + 2, + 208, + 98, + 41, + 248, + 136, + 242, + 145, + 167, + 16, + 233, + 179, + 191, + 222, + 83, + 253, + 183, + 89, + 216, + 94, + 222, + 24, + 72, + 29, + 55, + 4, + 222, + 120, + 219, + 55, + 2, + 221, + 127, + 182, + 93, + 101, + 220, + 112, + 224, + 164, + 2, + 159, + 43, + 57, + 198, + 48, + 115, + 130, + 126, + 169, + 11, + 75, + 185, + 75, + 210, + 185, + 26, + 160, + 15, + 217, + 194, + 131, + 211, + 233, + 196, + 68, + 76, + 169, + 115, + 127, + 205, + 131, + 222, + 169, + 60, + 150, + 127, + 242, + 210, + 255, + 35, + 71, + 228, + 159, + 167, + 208, + 207, + 97, + 241, + 56, + 165, + 236, + 146, + 12, + 138, + 19, + 216, + 235, + 120, + 48, + 231, + 55, + 244, + 166, + 144, + 79, + 186, + 103, + 193, + 37, + 212, + 216, + 81, + 238, + 230, + 94, + 63, + 116, + 0, + 112, + 5, + 129, + 68, + 191, + 156, + 140, + 160, + 80, + 46, + 33, + 80, + 1, + 96, + 253, + 222, + 63, + 142, + 27, + 74, + 140, + 112, + 64, + 0, + 24, + 121, + 158, + 100, + 192, + 80, + 182, + 62, + 233, + 89, + 59, + 121, + 35, + 45, + 41, + 94, + 2, + 177, + 101, + 72, + 9, + 103, + 33, + 218, + 24, + 114, + 86, + 198, + 222, + 89, + 181, + 6, + 237, + 46, + 6, + 192, + 175, + 171, + 205, + 251, + 81, + 34, + 45, + 150, + 185, + 215, + 85, + 250, + 188, + 3, + 45, + 174, + 19, + 47, + 46, + 142, + 164, + 146, + 87, + 253, + 174, + 150, + 166, + 90, + 28, + 144, + 183, + 168, + 217, + 65, + 7, + 181, + 207, + 243, + 96, + 84, + 26, + 118, + 96, + 101, + 134, + 183, + 93, + 15, + 212, + 245, + 218, + 121, + 102, + 135, + 216, + 18, + 167, + 177, + 183, + 188, + 208, + 77, + 86, + 80, + 172, + 235, + 101, + 239, + 166, + 66, + 162, + 16, + 208, + 170, + 248, + 2, + 242, + 171, + 169, + 245, + 192, + 29, + 149, + 13, + 172, + 171, + 117, + 237, + 22, + 224, + 103, + 158, + 201, + 107, + 65, + 14, + 170, + 230, + 195, + 181, + 198, + 17, + 69, + 6, + 127, + 136, + 56, + 196, + 176, + 232, + 236, + 210, + 111, + 164, + 150, + 136, + 232, + 152, + 99, + 51, + 235, + 29, + 125, + 76, + 181, + 71, + 201, + 216, + 1, + 85, + 135, + 195, + 71, + 49, + 193, + 36, + 200, + 34, + 249, + 23, + 77, + 170, + 3, + 87, + 89, + 78, + 24, + 149, + 235, + 249, + 80, + 88, + 139, + 87, + 91, + 152, + 191, + 245, + 115, + 22, + 228, + 153, + 99, + 125, + 5, + 100, + 147, + 249, + 23, + 241, + 217, + 129, + 124, + 151, + 145, + 2, + 57, + 153, + 76, + 147, + 152, + 100, + 99, + 158, + 173, + 20, + 0, + 205, + 75, + 83, + 6, + 24, + 52, + 224, + 55, + 189, + 160, + 15, + 237, + 187, + 25, + 53, + 89, + 2, + 35, + 196, + 173, + 77, + 97, + 132, + 27, + 239, + 84, + 199, + 189, + 37, + 90, + 153, + 188, + 181, + 93, + 122, + 180, + 123, + 113, + 210, + 223, + 253, + 214, + 210, + 41, + 221, + 56, + 79, + 36, + 84, + 26, + 238, + 203, + 72, + 196, + 171, + 0, + 20, + 34, + 20, + 111, + 106, + 7, + 34, + 155, + 10, + 171, + 135, + 100, + 235, + 245, + 10, + 134, + 91, + 39, + 187, + 204, + 109, + 99, + 213, + 210, + 19, + 54, + 67, + 47, + 243, + 118, + 165, + 124, + 237, + 63, + 94, + 181, + 37, + 141, + 193, + 237, + 133, + 254, + 142, + 238, + 65, + 115, + 104, + 176, + 172, + 128, + 232, + 36, + 239, + 51, + 50, + 54, + 55, + 77, + 37, + 3, + 105, + 2, + 176, + 118, + 91, + 176, + 152, + 195, + 104, + 22, + 42, + 118, + 192, + 246, + 201, + 115, + 73, + 196, + 132, + 157, + 132, + 108, + 60, + 105, + 186, + 23, + 190, + 109, + 1, + 40, + 143, + 60, + 54, + 91, + 2, + 60, + 234, + 180, + 209, + 30, + 184, + 41, + 207, + 241, + 67, + 80, + 209, + 191, + 112, + 156, + 143, + 244, + 158, + 24, + 51, + 173, + 253, + 38, + 229, + 252, + 80, + 100, + 51, + 48, + 57, + 139, + 61, + 142, + 3, + 76, + 148, + 253, + 220, + 147, + 169, + 127, + 230, + 253, + 172, + 178, + 99, + 94, + 203, + 210, + 126, + 192, + 17, + 74, + 195, + 87, + 199, + 161, + 33, + 237, + 146, + 95, + 126, + 6, + 241, + 94, + 55, + 96, + 45, + 80, + 26, + 254, + 238, + 61, + 171, + 120, + 155, + 244, + 81, + 34, + 45, + 50, + 111, + 95, + 151, + 152, + 172, + 242, + 75, + 151, + 252, + 251, + 206, + 248, + 78, + 36, + 101, + 77, + 149, + 249, + 30, + 175, + 225, + 155, + 192, + 240, + 123, + 138, + 119, + 254, + 34, + 222, + 129, + 201, + 49, + 101, + 210, + 209, + 103, + 24, + 31, + 189, + 31, + 214, + 193, + 253, + 75, + 45, + 63, + 2, + 31, + 35, + 86, + 67, + 203, + 217, + 57, + 101, + 202, + 105, + 54, + 35, + 95, + 107, + 89, + 113, + 216, + 198, + 224, + 95, + 31, + 9, + 195, + 157, + 10, + 140, + 103, + 40, + 75, + 141, + 21, + 86, + 2, + 138, + 114, + 9, + 51, + 127, + 210, + 226, + 178, + 15, + 15, + 174, + 125, + 23, + 77, + 190, + 245, + 190, + 208, + 34, + 160, + 199, + 99, + 72, + 247, + 75, + 92, + 201, + 227, + 253, + 9, + 130, + 109, + 159, + 65, + 47, + 67, + 253, + 56, + 118, + 47, + 185, + 181, + 2, + 20, + 146, + 212, + 19, + 221, + 51, + 35, + 117, + 22, + 193, + 29, + 103, + 140, + 248, + 101, + 194, + 223, + 107, + 180, + 248, + 127, + 222, + 192, + 112, + 106, + 4, + 250, + 167, + 32, + 128, + 19, + 250, + 123, + 148, + 208, + 243, + 86, + 159, + 11, + 164, + 5, + 214, + 246, + 8, + 83, + 126, + 11, + 126, + 251, + 205, + 122, + 184, + 184, + 247, + 46, + 3, + 224, + 149, + 209, + 231, + 142, + 135, + 61, + 68, + 1, + 98, + 139, + 121, + 9, + 27, + 19, + 14, + 83, + 194, + 83, + 27, + 23, + 111, + 105, + 217, + 11, + 11, + 147, + 140, + 36, + 3, + 190, + 148, + 22, + 115, + 42, + 134, + 88, + 58, + 203, + 242, + 119, + 212, + 233, + 106, + 115, + 69, + 7, + 92, + 85, + 107, + 30, + 10, + 203, + 16, + 150, + 191, + 188, + 61, + 150, + 169, + 131, + 16, + 3, + 173, + 89, + 28, + 38, + 238, + 14, + 161, + 230, + 85, + 54, + 232, + 236, + 40, + 248, + 50, + 237, + 60, + 166, + 156, + 215, + 27, + 4, + 135, + 15, + 173, + 101, + 18, + 212, + 24, + 246, + 25, + 203, + 194, + 249, + 223, + 230, + 28, + 154, + 219, + 199, + 202, + 197, + 163, + 81, + 192, + 112, + 82, + 138, + 36, + 214, + 140, + 7, + 49, + 2, + 166, + 254, + 199, + 12, + 135, + 102, + 125, + 17, + 37, + 3, + 164, + 86, + 25, + 43, + 97, + 231, + 36, + 119, + 191, + 21, + 186, + 129, + 196, + 228, + 96, + 75, + 187, + 190, + 252, + 250, + 73, + 25, + 58, + 17, + 10, + 104, + 116, + 100, + 75, + 215, + 162, + 21, + 11, + 201, + 181, + 15, + 106, + 135, + 96, + 21, + 152, + 160, + 218, + 53, + 123, + 254, + 91, + 190, + 239, + 156, + 143, + 125, + 186, + 177, + 165, + 181, + 34, + 163, + 62, + 138, + 204, + 57, + 102, + 76, + 2, + 210, + 64, + 211, + 20, + 101, + 233, + 113, + 18, + 36, + 132, + 201, + 33, + 173, + 229, + 240, + 163, + 206, + 43, + 234, + 87, + 151, + 23, + 17, + 85, + 0, + 189, + 1, + 255, + 103, + 160, + 138, + 160, + 2, + 218, + 234, + 184, + 205, + 152, + 192, + 81, + 196, + 29, + 52, + 94, + 53, + 180, + 110, + 139, + 222, + 21, + 27, + 54, + 114, + 81, + 40, + 39, + 225, + 28, + 169, + 211, + 193, + 118, + 44, + 38, + 62, + 201, + 25, + 215, + 110, + 88, + 5, + 142, + 116, + 224, + 54, + 130, + 45, + 230, + 246, + 104, + 251, + 172, + 159, + 50, + 212, + 46, + 171, + 21, + 213, + 200, + 189, + 6, + 226, + 234, + 238, + 226, + 241, + 219, + 85, + 8, + 47, + 152, + 11, + 238, + 0, + 132, + 194, + 254, + 135, + 15, + 85, + 110, + 31, + 243, + 54, + 235, + 240, + 5, + 19, + 85, + 176, + 130, + 224, + 127, + 183, + 83, + 93, + 179, + 217, + 185, + 126, + 52, + 10, + 14, + 113, + 19, + 5, + 201, + 201, + 161, + 30, + 176, + 132, + 72, + 179, + 9, + 110, + 68, + 87, + 203, + 201, + 160, + 111, + 163, + 35, + 247, + 13, + 132, + 176, + 214, + 63, + 3, + 193, + 251, + 139, + 79, + 215, + 178, + 218, + 56, + 222, + 162, + 33, + 46, + 57, + 4, + 129, + 65, + 166, + 110, + 237, + 23, + 186, + 226, + 100, + 133, + 187, + 151, + 155, + 217, + 238, + 252, + 2, + 147, + 3, + 213, + 55, + 166, + 184, + 148, + 152, + 194, + 230, + 97, + 203, + 161, + 191, + 127, + 213, + 240, + 121, + 99, + 70, + 171, + 83, + 155, + 88, + 91, + 200, + 26, + 92, + 3, + 218, + 233, + 23, + 215, + 63, + 47, + 55, + 133, + 185, + 189, + 223, + 135, + 202, + 182, + 237, + 107, + 248, + 219, + 138, + 158, + 2, + 153, + 236, + 98, + 18, + 135, + 141, + 243, + 120, + 195, + 213, + 169, + 176, + 218, + 241, + 58, + 175, + 238, + 121, + 218, + 175, + 8, + 246, + 18, + 217, + 58, + 154, + 67, + 164, + 25, + 76, + 222, + 47, + 227, + 62, + 136, + 20, + 215, + 46, + 163, + 42, + 188, + 109, + 9, + 122, + 76, + 221, + 165, + 150, + 201, + 9, + 246, + 100, + 88, + 184, + 219, + 129, + 43, + 143, + 45, + 91, + 21, + 89, + 118, + 27, + 131, + 253, + 41, + 20, + 67, + 55, + 252, + 90, + 98, + 197, + 123, + 169, + 120, + 202, + 168, + 239, + 3, + 23, + 28, + 110, + 164, + 201, + 219, + 123, + 239, + 64, + 146, + 50, + 185, + 241, + 47, + 17, + 27, + 201, + 87, + 156, + 104, + 89, + 114, + 165, + 71, + 26, + 121, + 88, + 231, + 5, + 215, + 72, + 204, + 3, + 121, + 57, + 23, + 165, + 63, + 43, + 115, + 232, + 182, + 37, + 41, + 67, + 229, + 131, + 139, + 249, + 101, + 17, + 147, + 225, + 125, + 170, + 4, + 19, + 174, + 188, + 237, + 110, + 18, + 155, + 113, + 45, + 107, + 8, + 108, + 20, + 189, + 239, + 248, + 4, + 31, + 97, + 215, + 190, + 113, + 34, + 137, + 110, + 183, + 119, + 239, + 221, + 165, + 99, + 199, + 107, + 124, + 127, + 48, + 46, + 68, + 70, + 249, + 191, + 218, + 185, + 114, + 253, + 16, + 28, + 131, + 3, + 201, + 215, + 247, + 208, + 199, + 219, + 146, + 127, + 62, + 64, + 40, + 98, + 136, + 4, + 135, + 2, + 192, + 164, + 107, + 116, + 8, + 189, + 84, + 190, + 104, + 113, + 230, + 191, + 200, + 18, + 186, + 215, + 32, + 2, + 98, + 211, + 11, + 145, + 22, + 217, + 12, + 14, + 94, + 173, + 5, + 91, + 74, + 189, + 173, + 250, + 181, + 61, + 153, + 68, + 226, + 241, + 2, + 238, + 229, + 24, + 145, + 62, + 83, + 178, + 113, + 172, + 86, + 43, + 105, + 153, + 25, + 117, + 254, + 244, + 155, + 111, + 212, + 187, + 23, + 109, + 232, + 188, + 177, + 180, + 83, + 65, + 94, + 80, + 130, + 2, + 185, + 146, + 202, + 44, + 71, + 205, + 252, + 25, + 52, + 109, + 182, + 234, + 207, + 167, + 79, + 52, + 127, + 204, + 91, + 185, + 166, + 61, + 134, + 55, + 25, + 139, + 177, + 92, + 131, + 213, + 118, + 61, + 123, + 237, + 80, + 107, + 153, + 77, + 218, + 197, + 212, + 95, + 165, + 161, + 36, + 152, + 25, + 170, + 227, + 17, + 202, + 79, + 243, + 34, + 50, + 190, + 75, + 7, + 154, + 159, + 140, + 217, + 84, + 125, + 190, + 168, + 123, + 74, + 115, + 72, + 4, + 164, + 169, + 132, + 85, + 169, + 20, + 212, + 183, + 164, + 115, + 9, + 91, + 33, + 95, + 184, + 26, + 61, + 155, + 243, + 158, + 19, + 126, + 46, + 126, + 63, + 214, + 227, + 191, + 12, + 62, + 231, + 87, + 110, + 229, + 47, + 156, + 47, + 47, + 241, + 208, + 49, + 213, + 49, + 67, + 230, + 44, + 210, + 250, + 251, + 219, + 246, + 39, + 153, + 249, + 226, + 166, + 228, + 3, + 41, + 36, + 114, + 82, + 242, + 73, + 40, + 54, + 12, + 1, + 221, + 99, + 116, + 50, + 220, + 171, + 220, + 47, + 134, + 160, + 142, + 35, + 255, + 123, + 13, + 31, + 32, + 240, + 27, + 188, + 203, + 236, + 2, + 11, + 71, + 190, + 206, + 92, + 140, + 151, + 224, + 223, + 140, + 97, + 98, + 172, + 180, + 170, + 56, + 168, + 32, + 170, + 5, + 142, + 36, + 75, + 6, + 164, + 73, + 23, + 204, + 167, + 54, + 241, + 66, + 255, + 33, + 175, + 61, + 188, + 220, + 49, + 234, + 15, + 136, + 19, + 197, + 232, + 64, + 38, + 145, + 249, + 23, + 233, + 172, + 15, + 78, + 48, + 238, + 210, + 90, + 44, + 69, + 110, + 221, + 36, + 239, + 28, + 162, + 203, + 103, + 213, + 44, + 255, + 88, + 168, + 254, + 236, + 86, + 60, + 176, + 148, + 17, + 213, + 1, + 149, + 135, + 127, + 76, + 211, + 176, + 162, + 121, + 253, + 188, + 149, + 1, + 177, + 137, + 22, + 183, + 225, + 29, + 122, + 191, + 112, + 157, + 102, + 19, + 108, + 188, + 227, + 38, + 48, + 101, + 213, + 88, + 12, + 227, + 6, + 73, + 185, + 13, + 194, + 206, + 75, + 181, + 243, + 56, + 194, + 134, + 2, + 62, + 236, + 102, + 164, + 241, + 236, + 180, + 222, + 124, + 34, + 195, + 118, + 72, + 115, + 19, + 120, + 237, + 231, + 36, + 245, + 26, + 77, + 237, + 8, + 72, + 11, + 241, + 248, + 214, + 248, + 153, + 80, + 2, + 13, + 49, + 125, + 116, + 159, + 11, + 95, + 23, + 248, + 66, + 197, + 122, + 47, + 16, + 92, + 67, + 189, + 172, + 29, + 70, + 230, + 120, + 227, + 147, + 190, + 165, + 246, + 26, + 219, + 17, + 191, + 239, + 46, + 4, + 79, + 198, + 75, + 155, + 161, + 4, + 110, + 102, + 128, + 24, + 241, + 59, + 249, + 124, + 148, + 75, + 136, + 144, + 88, + 59, + 235, + 103, + 46, + 222, + 255, + 198, + 233, + 229, + 22, + 16, + 152, + 15, + 5, + 191, + 138, + 38, + 93, + 231, + 239, + 234, + 62, + 25, + 60, + 121, + 82, + 212, + 187, + 249, + 193, + 139, + 7, + 33, + 87, + 32, + 140, + 25, + 98, + 232, + 18, + 248, + 109, + 80, + 193, + 8, + 94, + 26, + 178, + 198, + 50, + 106, + 153, + 198, + 252, + 165, + 231, + 196, + 224, + 160, + 249, + 191, + 211, + 124, + 48, + 143, + 78, + 118, + 138, + 38, + 152, + 252, + 174, + 48, + 103, + 51, + 79, + 191, + 198, + 210, + 157, + 236, + 254, + 156, + 255, + 101, + 238, + 35, + 19, + 201, + 36, + 153, + 219, + 115, + 28, + 247, + 11, + 30, + 197, + 172, + 8, + 112, + 233, + 18, + 159, + 94, + 55, + 218, + 64, + 198, + 146, + 130, + 198, + 107, + 170, + 159, + 41, + 74, + 64, + 154, + 14, + 42, + 84, + 71, + 93, + 62, + 193, + 82, + 249, + 142, + 26, + 126, + 100, + 228, + 7, + 209, + 172, + 13, + 44, + 111, + 0 + ] +} \ No newline at end of file diff --git a/dlc-messages/src/test_inputs/segment_start_msg.json b/dlc-messages/src/test_inputs/segment_start_msg.json new file mode 100644 index 00000000..08455610 --- /dev/null +++ b/dlc-messages/src/test_inputs/segment_start_msg.json @@ -0,0 +1,4022 @@ +{ + "nbSegments": 2, + "data": [ + 167, 28, 0, 0, 0, 1, 201, 7, 58, 80, 180, 168, 197, 89, 192, 45, 72, 178, + 141, 7, 111, 239, 61, 183, 53, 186, 178, 12, 152, 202, 125, 126, 15, 100, + 9, 64, 83, 132, 0, 0, 0, 0, 5, 245, 225, 0, 3, 14, 185, 133, 89, 174, 193, + 83, 27, 3, 57, 123, 141, 4, 92, 11, 81, 7, 224, 197, 20, 34, 91, 174, 95, + 5, 242, 184, 109, 28, 224, 59, 93, 0, 22, 0, 20, 34, 235, 28, 235, 176, + 174, 239, 56, 60, 57, 76, 217, 102, 159, 128, 236, 149, 55, 138, 91, 2, 29, + 56, 47, 105, 29, 250, 227, 1, 103, 207, 188, 153, 113, 221, 236, 21, 168, + 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 3, 81, 1, 1, + 255, 255, 255, 255, 2, 0, 242, 5, 42, 1, 0, 0, 0, 22, 0, 20, 250, 98, 146, + 81, 241, 226, 129, 152, 145, 80, 90, 155, 176, 195, 121, 151, 205, 33, 170, + 158, 0, 0, 0, 0, 0, 0, 0, 0, 38, 106, 36, 170, 33, 169, 237, 226, 246, 28, + 63, 113, 209, 222, 253, 63, 169, 153, 223, 163, 105, 83, 117, 92, 105, 6, + 137, 121, 153, 98, 180, 139, 235, 216, 54, 151, 78, 140, 249, 1, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 107, 0, 0, 0, + 22, 0, 20, 54, 245, 77, 31, 167, 185, 101, 197, 153, 143, 65, 164, 228, 29, + 227, 209, 97, 140, 56, 109, 171, 189, 72, 221, 41, 134, 196, 72, 253, 1, + 224, 3, 3, 197, 20, 145, 48, 31, 65, 112, 72, 92, 84, 188, 238, 227, 229, + 26, 57, 97, 90, 254, 53, 44, 79, 217, 252, 73, 173, 32, 237, 70, 140, 212, + 3, 49, 139, 22, 59, 90, 33, 27, 255, 179, 84, 8, 47, 4, 154, 84, 233, 152, + 148, 68, 135, 163, 238, 165, 63, 208, 179, 250, 233, 8, 149, 126, 156, 43, + 82, 179, 60, 121, 230, 109, 173, 14, 166, 81, 212, 101, 58, 152, 229, 62, + 247, 130, 38, 212, 126, 111, 5, 135, 252, 9, 54, 235, 53, 100, 97, 107, + 127, 69, 150, 134, 73, 20, 20, 205, 91, 142, 73, 236, 2, 160, 222, 1, 33, + 39, 72, 144, 230, 218, 217, 1, 58, 223, 70, 123, 123, 214, 248, 207, 213, + 46, 3, 213, 175, 97, 251, 107, 238, 138, 221, 37, 206, 214, 38, 252, 116, + 101, 29, 173, 139, 251, 177, 101, 28, 178, 8, 200, 64, 138, 239, 3, 235, + 160, 228, 94, 235, 54, 164, 147, 178, 107, 64, 249, 165, 228, 18, 225, 94, + 225, 122, 21, 146, 42, 216, 73, 129, 133, 131, 120, 1, 252, 92, 160, 3, + 245, 199, 59, 252, 44, 74, 253, 226, 74, 15, 16, 250, 82, 208, 87, 177, + 131, 232, 142, 230, 99, 97, 138, 14, 72, 249, 82, 248, 85, 60, 63, 238, + 225, 98, 225, 98, 235, 24, 63, 227, 54, 138, 240, 70, 100, 99, 24, 254, + 201, 43, 242, 228, 4, 233, 183, 233, 217, 218, 31, 142, 80, 125, 91, 116, + 165, 173, 222, 241, 132, 3, 1, 121, 180, 82, 106, 242, 48, 21, 82, 156, + 175, 72, 82, 17, 217, 174, 113, 68, 40, 138, 110, 28, 224, 240, 29, 49, + 244, 243, 13, 145, 65, 254, 195, 102, 50, 137, 71, 105, 30, 65, 254, 219, + 22, 70, 61, 65, 92, 200, 149, 218, 198, 2, 84, 143, 33, 35, 175, 25, 2, 98, + 239, 199, 226, 31, 141, 219, 151, 119, 44, 197, 18, 49, 106, 76, 162, 33, + 57, 243, 101, 17, 171, 246, 158, 234, 75, 45, 248, 154, 37, 82, 85, 3, 196, + 158, 115, 164, 194, 75, 242, 246, 54, 129, 109, 89, 59, 120, 37, 249, 127, + 162, 249, 176, 251, 115, 155, 35, 20, 64, 247, 85, 185, 253, 165, 130, 90, + 198, 147, 200, 21, 19, 14, 209, 197, 254, 140, 180, 56, 49, 14, 172, 150, + 19, 78, 255, 199, 21, 145, 123, 138, 232, 188, 95, 65, 78, 167, 116, 67, + 110, 205, 223, 120, 154, 115, 73, 34, 147, 93, 235, 51, 223, 47, 14, 97, + 240, 17, 7, 73, 31, 38, 18, 251, 111, 67, 84, 220, 68, 112, 241, 197, 93, + 28, 234, 198, 206, 226, 59, 23, 227, 195, 70, 242, 161, 157, 232, 149, 2, + 226, 112, 60, 70, 210, 18, 147, 28, 148, 24, 242, 11, 184, 216, 3, 243, + 119, 117, 101, 69, 199, 177, 142, 223, 141, 86, 255, 219, 245, 100, 209, + 76, 30, 157, 70, 209, 146, 169, 137, 9, 87, 128, 162, 241, 182, 113, 65, 2, + 64, 13, 107, 40, 97, 191, 242, 18, 207, 246, 164, 24, 61, 180, 86, 67, 104, + 69, 27, 125, 249, 123, 106, 223, 116, 174, 230, 113, 239, 147, 89, 225, + 143, 7, 6, 126, 174, 164, 32, 149, 3, 124, 198, 75, 75, 21, 8, 95, 107, 83, + 253, 216, 201, 240, 7, 212, 67, 46, 137, 27, 32, 27, 46, 15, 228, 62, 146, + 219, 147, 200, 211, 143, 95, 14, 6, 245, 177, 242, 139, 246, 150, 39, 201, + 1, 58, 23, 188, 104, 232, 227, 252, 21, 96, 100, 118, 216, 227, 49, 99, + 199, 198, 88, 130, 207, 123, 173, 226, 105, 187, 206, 236, 7, 194, 41, 99, + 160, 74, 41, 205, 142, 34, 225, 145, 238, 98, 217, 160, 155, 3, 66, 84, + 146, 173, 203, 14, 252, 236, 17, 103, 239, 44, 241, 80, 24, 176, 176, 197, + 230, 208, 227, 134, 196, 9, 222, 109, 172, 189, 215, 173, 142, 175, 3, 72, + 90, 155, 219, 29, 54, 57, 202, 217, 247, 12, 89, 162, 14, 79, 229, 24, 185, + 238, 80, 139, 45, 150, 48, 136, 192, 49, 82, 241, 0, 23, 114, 122, 107, + 165, 196, 17, 87, 229, 236, 174, 142, 34, 32, 11, 78, 222, 217, 121, 163, + 193, 254, 62, 192, 43, 0, 60, 27, 169, 96, 238, 171, 93, 21, 60, 5, 168, + 23, 27, 130, 142, 19, 102, 245, 16, 21, 85, 131, 212, 96, 179, 215, 173, + 68, 116, 51, 40, 47, 181, 45, 32, 93, 225, 105, 173, 69, 49, 134, 7, 46, + 162, 203, 181, 176, 84, 92, 11, 42, 193, 211, 77, 227, 85, 15, 49, 119, 34, + 64, 148, 51, 117, 37, 205, 70, 40, 39, 85, 239, 3, 139, 100, 67, 163, 137, + 101, 9, 215, 71, 32, 49, 224, 12, 174, 8, 177, 12, 65, 81, 191, 66, 146, + 111, 22, 235, 78, 46, 55, 211, 144, 84, 210, 3, 38, 89, 164, 43, 133, 39, + 109, 147, 152, 162, 133, 50, 56, 88, 229, 35, 90, 77, 171, 99, 158, 132, + 144, 11, 121, 16, 172, 119, 83, 24, 220, 97, 70, 247, 215, 36, 115, 70, 77, + 131, 119, 197, 147, 17, 227, 12, 249, 8, 164, 40, 36, 91, 130, 224, 18, 1, + 169, 248, 118, 100, 211, 1, 135, 81, 163, 216, 71, 73, 57, 85, 72, 116, + 125, 111, 189, 78, 66, 62, 36, 100, 110, 178, 207, 122, 114, 184, 158, 200, + 187, 18, 156, 178, 8, 58, 116, 51, 173, 17, 164, 66, 104, 201, 205, 220, + 20, 59, 211, 118, 167, 217, 13, 246, 228, 105, 74, 93, 211, 243, 65, 54, + 17, 114, 247, 24, 29, 221, 138, 141, 2, 183, 117, 66, 42, 50, 28, 167, 5, + 177, 30, 113, 253, 105, 2, 213, 101, 198, 55, 174, 237, 250, 186, 76, 200, + 11, 42, 142, 163, 69, 107, 82, 74, 3, 11, 94, 150, 3, 252, 176, 128, 53, + 14, 247, 97, 165, 63, 165, 61, 94, 101, 119, 124, 68, 231, 35, 231, 145, 2, + 151, 188, 56, 133, 135, 44, 38, 108, 46, 66, 212, 9, 40, 207, 250, 68, 88, + 212, 141, 195, 240, 204, 114, 49, 175, 98, 32, 19, 153, 75, 104, 170, 204, + 11, 242, 95, 204, 203, 96, 168, 47, 52, 165, 56, 136, 18, 241, 47, 227, + 172, 152, 101, 195, 94, 45, 209, 44, 97, 38, 58, 99, 10, 185, 133, 139, + 117, 12, 30, 23, 229, 155, 203, 77, 143, 248, 50, 113, 18, 56, 166, 214, + 224, 208, 82, 173, 135, 168, 58, 176, 231, 216, 52, 20, 169, 43, 203, 26, + 5, 52, 137, 103, 164, 212, 2, 134, 195, 113, 108, 156, 215, 175, 183, 91, + 144, 145, 235, 172, 118, 252, 59, 248, 135, 173, 164, 27, 32, 220, 234, + 108, 171, 248, 244, 1, 3, 47, 150, 2, 182, 100, 74, 69, 250, 93, 106, 189, + 196, 13, 111, 226, 111, 34, 12, 122, 224, 44, 181, 250, 77, 130, 27, 117, + 50, 44, 89, 239, 128, 224, 151, 31, 135, 61, 106, 197, 85, 179, 159, 18, + 218, 138, 217, 143, 104, 21, 46, 49, 214, 25, 88, 198, 44, 61, 51, 39, 210, + 254, 197, 84, 110, 139, 127, 241, 192, 70, 189, 6, 198, 85, 126, 112, 113, + 125, 70, 16, 246, 214, 222, 83, 46, 26, 221, 236, 207, 1, 251, 232, 147, + 234, 157, 238, 240, 38, 238, 221, 114, 218, 67, 66, 138, 90, 104, 220, 132, + 129, 101, 145, 120, 80, 14, 155, 238, 107, 61, 71, 207, 97, 153, 163, 22, + 111, 117, 137, 9, 226, 124, 183, 2, 170, 68, 187, 8, 4, 86, 191, 230, 90, + 168, 235, 152, 60, 147, 15, 52, 132, 192, 178, 204, 4, 37, 178, 228, 217, + 165, 208, 58, 57, 34, 111, 47, 2, 151, 28, 77, 0, 66, 133, 109, 255, 122, + 243, 25, 174, 204, 220, 52, 171, 207, 48, 239, 127, 243, 74, 173, 155, 89, + 68, 132, 70, 60, 32, 173, 167, 225, 250, 232, 156, 238, 254, 244, 242, 200, + 39, 201, 243, 149, 117, 171, 87, 185, 29, 202, 46, 36, 246, 174, 18, 192, + 87, 243, 219, 124, 70, 165, 208, 20, 186, 42, 238, 62, 200, 171, 191, 94, + 102, 247, 184, 40, 130, 207, 44, 161, 249, 25, 193, 221, 45, 122, 33, 231, + 232, 167, 21, 145, 170, 45, 146, 45, 247, 101, 127, 113, 52, 121, 187, 184, + 136, 206, 238, 133, 10, 137, 103, 79, 84, 179, 239, 140, 123, 100, 7, 108, + 45, 140, 147, 153, 213, 121, 140, 2, 32, 88, 230, 156, 33, 156, 163, 80, + 175, 50, 62, 105, 97, 34, 18, 116, 16, 38, 47, 7, 126, 74, 53, 245, 126, + 37, 221, 70, 185, 90, 204, 156, 2, 226, 39, 53, 68, 47, 39, 21, 108, 228, + 225, 6, 2, 152, 174, 174, 236, 132, 25, 63, 197, 245, 178, 134, 245, 234, + 72, 165, 96, 74, 178, 208, 232, 234, 159, 225, 96, 73, 18, 49, 79, 140, + 199, 126, 70, 159, 146, 72, 255, 152, 154, 149, 77, 161, 73, 64, 248, 201, + 26, 234, 120, 22, 12, 91, 71, 30, 6, 239, 103, 209, 235, 121, 49, 154, 147, + 175, 35, 30, 71, 38, 252, 142, 52, 109, 213, 79, 142, 87, 239, 10, 131, + 201, 193, 28, 106, 221, 206, 221, 33, 188, 167, 254, 14, 145, 151, 210, 4, + 56, 63, 206, 180, 233, 79, 70, 110, 139, 227, 241, 134, 56, 58, 43, 95, + 222, 148, 30, 142, 68, 194, 3, 119, 61, 16, 254, 157, 152, 182, 137, 113, + 177, 225, 2, 223, 217, 201, 186, 156, 103, 184, 99, 226, 121, 197, 236, + 201, 115, 4, 245, 101, 93, 93, 79, 3, 56, 24, 154, 230, 155, 111, 238, 218, + 10, 119, 102, 66, 29, 79, 10, 221, 189, 178, 121, 104, 167, 10, 11, 110, + 203, 186, 94, 224, 233, 175, 1, 180, 206, 23, 70, 195, 79, 152, 205, 178, + 101, 203, 57, 175, 207, 37, 100, 122, 39, 127, 190, 172, 139, 49, 7, 166, + 123, 247, 118, 64, 66, 10, 37, 176, 24, 62, 11, 227, 142, 215, 87, 129, + 154, 203, 245, 205, 54, 219, 89, 169, 8, 103, 248, 1, 170, 215, 80, 243, + 226, 242, 26, 12, 34, 156, 151, 119, 104, 230, 27, 77, 245, 174, 137, 49, + 100, 62, 186, 245, 138, 89, 2, 111, 222, 6, 57, 240, 186, 107, 163, 117, + 204, 200, 70, 111, 80, 205, 94, 193, 3, 166, 14, 57, 212, 55, 190, 119, + 142, 158, 141, 146, 138, 238, 241, 237, 139, 20, 80, 63, 126, 102, 41, 187, + 78, 5, 186, 238, 220, 241, 15, 156, 189, 3, 133, 136, 129, 135, 193, 147, + 187, 100, 217, 172, 175, 58, 73, 87, 126, 148, 108, 130, 37, 201, 254, 95, + 158, 18, 192, 39, 188, 143, 28, 20, 248, 143, 188, 10, 228, 194, 174, 148, + 251, 49, 132, 123, 23, 210, 171, 230, 226, 17, 16, 15, 76, 23, 33, 199, + 207, 181, 224, 171, 3, 71, 7, 90, 180, 164, 60, 21, 117, 69, 120, 199, 143, + 152, 212, 194, 16, 47, 10, 30, 137, 15, 99, 205, 238, 115, 245, 135, 228, + 62, 192, 112, 153, 93, 164, 92, 146, 250, 244, 140, 69, 185, 4, 53, 50, + 221, 29, 1, 195, 198, 246, 189, 230, 82, 60, 164, 21, 86, 111, 157, 211, + 241, 81, 36, 206, 3, 16, 180, 219, 106, 3, 137, 135, 206, 172, 41, 24, 191, + 34, 180, 20, 119, 56, 89, 100, 204, 154, 124, 221, 114, 183, 138, 244, 56, + 94, 8, 174, 114, 251, 97, 82, 191, 16, 3, 108, 181, 118, 79, 173, 119, 142, + 75, 214, 11, 204, 228, 213, 218, 68, 18, 86, 238, 169, 110, 54, 34, 115, + 31, 48, 114, 0, 127, 5, 233, 204, 125, 183, 32, 244, 55, 44, 181, 139, 62, + 212, 116, 117, 142, 58, 168, 18, 189, 78, 131, 128, 93, 68, 125, 52, 245, + 59, 13, 213, 215, 1, 47, 159, 136, 183, 48, 128, 65, 199, 220, 17, 179, + 224, 163, 103, 190, 11, 144, 224, 63, 154, 90, 152, 185, 24, 45, 34, 220, + 72, 252, 62, 154, 250, 55, 218, 29, 221, 51, 78, 104, 228, 161, 34, 33, 15, + 167, 233, 138, 128, 35, 106, 132, 160, 67, 40, 11, 201, 197, 250, 143, 165, + 204, 206, 88, 81, 76, 149, 73, 2, 41, 52, 90, 235, 93, 111, 16, 226, 16, + 245, 231, 250, 18, 205, 174, 171, 113, 229, 92, 146, 107, 186, 148, 195, + 19, 145, 182, 91, 7, 84, 199, 17, 3, 136, 41, 251, 89, 176, 20, 163, 214, + 139, 92, 58, 239, 150, 142, 148, 202, 196, 17, 226, 215, 174, 107, 54, 0, + 205, 104, 140, 150, 177, 34, 132, 216, 101, 159, 85, 255, 135, 85, 45, 220, + 225, 121, 91, 201, 211, 110, 59, 188, 5, 180, 40, 110, 93, 75, 189, 45, + 105, 102, 194, 168, 65, 243, 172, 195, 202, 87, 188, 254, 165, 119, 71, + 102, 115, 33, 15, 219, 209, 207, 172, 148, 56, 141, 248, 137, 83, 88, 29, + 93, 22, 65, 27, 219, 178, 97, 94, 10, 59, 14, 4, 86, 176, 88, 69, 39, 31, + 255, 182, 246, 165, 95, 145, 98, 1, 58, 59, 38, 40, 246, 29, 148, 9, 224, + 10, 210, 31, 91, 229, 116, 3, 172, 73, 107, 120, 189, 191, 17, 71, 160, + 113, 144, 215, 63, 65, 153, 26, 214, 66, 139, 92, 255, 169, 13, 183, 164, + 114, 65, 71, 54, 255, 212, 44, 3, 63, 152, 205, 25, 109, 134, 92, 65, 119, + 194, 97, 177, 51, 201, 113, 123, 33, 18, 231, 154, 235, 171, 205, 70, 164, + 82, 195, 163, 103, 95, 228, 149, 64, 7, 250, 222, 91, 156, 119, 50, 28, + 119, 237, 144, 117, 245, 117, 189, 220, 111, 164, 203, 125, 2, 84, 173, 82, + 176, 170, 167, 138, 42, 159, 51, 74, 178, 61, 30, 61, 85, 220, 197, 12, 11, + 86, 155, 51, 195, 76, 71, 208, 87, 64, 112, 80, 243, 50, 79, 159, 255, 170, + 242, 229, 50, 158, 138, 153, 130, 110, 64, 65, 220, 88, 225, 98, 70, 110, + 206, 141, 25, 211, 186, 225, 226, 186, 148, 7, 88, 57, 136, 171, 50, 40, + 170, 181, 184, 193, 23, 2, 96, 165, 111, 173, 204, 11, 19, 154, 225, 153, + 226, 83, 142, 165, 239, 244, 124, 127, 236, 75, 211, 204, 185, 206, 18, + 238, 213, 193, 28, 5, 250, 99, 3, 98, 177, 180, 173, 234, 91, 28, 192, 226, + 83, 94, 98, 209, 110, 209, 168, 182, 41, 247, 93, 221, 174, 220, 113, 101, + 30, 203, 212, 237, 56, 82, 92, 146, 41, 32, 93, 114, 215, 29, 170, 24, 25, + 136, 253, 247, 132, 234, 242, 44, 219, 11, 192, 105, 37, 95, 87, 68, 206, + 110, 115, 33, 21, 188, 105, 249, 217, 219, 94, 169, 51, 89, 112, 208, 139, + 117, 120, 78, 221, 81, 93, 97, 63, 28, 128, 2, 187, 90, 180, 233, 76, 43, + 226, 70, 40, 75, 214, 153, 149, 18, 197, 35, 209, 36, 69, 45, 134, 74, 143, + 217, 35, 254, 235, 28, 144, 199, 38, 142, 23, 90, 230, 186, 55, 96, 123, + 36, 41, 111, 116, 2, 240, 14, 108, 128, 93, 164, 203, 56, 91, 207, 52, 38, + 116, 87, 95, 217, 166, 50, 184, 138, 61, 68, 154, 158, 255, 50, 235, 243, + 45, 224, 73, 8, 2, 3, 0, 101, 215, 8, 145, 42, 179, 120, 232, 81, 227, 215, + 18, 36, 165, 23, 186, 162, 247, 117, 43, 66, 44, 184, 186, 96, 200, 226, 8, + 113, 124, 163, 12, 76, 220, 50, 215, 243, 209, 40, 139, 201, 129, 68, 226, + 0, 56, 32, 155, 27, 219, 64, 78, 235, 251, 111, 192, 114, 241, 32, 109, + 154, 173, 212, 151, 158, 149, 221, 117, 23, 55, 70, 87, 56, 108, 61, 201, + 232, 25, 51, 189, 71, 189, 101, 115, 25, 240, 125, 210, 155, 99, 253, 242, + 252, 149, 119, 25, 168, 30, 86, 100, 249, 96, 149, 74, 174, 213, 209, 252, + 192, 96, 2, 252, 189, 114, 247, 18, 245, 88, 102, 18, 78, 98, 134, 251, + 213, 249, 3, 195, 109, 118, 163, 224, 75, 149, 66, 242, 231, 160, 19, 250, + 213, 12, 163, 23, 17, 79, 26, 115, 254, 51, 241, 171, 74, 231, 189, 217, + 99, 149, 187, 2, 38, 25, 83, 109, 176, 213, 204, 153, 119, 162, 102, 147, + 245, 77, 92, 83, 11, 216, 100, 175, 122, 73, 151, 108, 106, 18, 74, 105, + 219, 21, 193, 185, 29, 14, 145, 81, 122, 218, 157, 47, 56, 100, 116, 38, + 123, 253, 155, 70, 232, 118, 137, 34, 208, 218, 179, 110, 102, 33, 46, 165, + 120, 173, 212, 123, 90, 34, 167, 206, 94, 12, 233, 25, 102, 64, 148, 145, + 223, 65, 183, 36, 173, 42, 107, 25, 41, 8, 29, 168, 43, 49, 252, 193, 230, + 26, 51, 206, 203, 116, 229, 19, 197, 237, 227, 65, 242, 171, 181, 121, 81, + 123, 244, 188, 201, 138, 77, 137, 190, 206, 5, 97, 69, 181, 171, 65, 1, + 141, 117, 226, 2, 155, 46, 192, 58, 208, 93, 12, 50, 254, 144, 150, 81, + 131, 37, 142, 139, 10, 83, 68, 121, 241, 85, 160, 82, 78, 84, 42, 25, 209, + 82, 59, 249, 2, 15, 3, 143, 35, 91, 114, 100, 116, 227, 180, 80, 23, 2, + 195, 229, 42, 5, 92, 57, 162, 16, 93, 12, 193, 42, 41, 101, 246, 63, 148, + 73, 217, 232, 51, 174, 72, 144, 26, 252, 210, 104, 57, 82, 216, 202, 104, + 187, 97, 23, 95, 25, 155, 244, 61, 60, 29, 3, 19, 76, 226, 62, 48, 34, 62, + 254, 61, 238, 11, 244, 76, 169, 250, 73, 205, 100, 15, 47, 90, 84, 139, + 125, 153, 91, 107, 234, 83, 5, 154, 31, 100, 111, 158, 49, 176, 122, 232, + 204, 86, 154, 5, 187, 171, 59, 112, 242, 9, 52, 78, 166, 224, 91, 51, 164, + 191, 80, 139, 153, 207, 44, 51, 201, 128, 120, 147, 21, 6, 57, 252, 2, 75, + 202, 81, 220, 81, 5, 19, 124, 72, 249, 115, 219, 27, 223, 138, 18, 33, 214, + 173, 44, 67, 25, 223, 104, 143, 197, 252, 155, 95, 168, 74, 49, 3, 23, 48, + 58, 80, 78, 2, 140, 248, 155, 129, 94, 216, 169, 60, 175, 215, 7, 10, 81, + 81, 25, 88, 182, 131, 75, 54, 176, 70, 228, 37, 49, 48, 203, 7, 148, 83, + 243, 125, 122, 107, 35, 23, 228, 45, 61, 108, 169, 241, 129, 163, 57, 247, + 56, 159, 78, 133, 7, 143, 67, 103, 157, 212, 41, 160, 130, 111, 1, 230, 77, + 121, 72, 101, 222, 112, 63, 206, 191, 89, 189, 175, 166, 100, 90, 106, 145, + 186, 0, 179, 155, 136, 204, 141, 130, 57, 91, 30, 196, 233, 201, 168, 7, + 197, 129, 70, 202, 93, 161, 102, 11, 118, 133, 157, 192, 103, 46, 190, 255, + 102, 23, 46, 177, 177, 245, 169, 52, 88, 35, 250, 3, 221, 198, 124, 178, + 160, 234, 147, 15, 21, 56, 47, 56, 220, 186, 139, 49, 181, 4, 15, 100, 126, + 136, 185, 115, 135, 46, 194, 252, 209, 253, 221, 179, 2, 105, 239, 60, 43, + 173, 4, 167, 92, 176, 199, 88, 132, 14, 190, 34, 121, 133, 195, 98, 63, 64, + 194, 192, 37, 129, 138, 223, 33, 128, 72, 21, 77, 169, 100, 106, 25, 96, + 251, 175, 185, 16, 179, 223, 105, 60, 108, 192, 22, 0, 52, 20, 160, 140, + 238, 195, 114, 228, 20, 188, 202, 255, 206, 163, 72, 85, 16, 112, 159, 198, + 85, 7, 44, 106, 77, 144, 105, 131, 188, 218, 111, 65, 56, 35, 67, 224, 203, + 254, 147, 249, 189, 52, 154, 157, 227, 235, 40, 230, 196, 247, 185, 20, + 155, 34, 216, 237, 47, 126, 75, 196, 212, 67, 155, 123, 133, 195, 141, 136, + 78, 202, 175, 203, 175, 215, 50, 92, 157, 18, 115, 3, 29, 171, 180, 93, 0, + 20, 15, 53, 51, 115, 103, 197, 81, 57, 54, 8, 136, 51, 157, 33, 158, 4, + 121, 72, 56, 126, 48, 188, 251, 103, 142, 168, 2, 203, 161, 5, 215, 56, + 191, 166, 251, 223, 204, 76, 224, 59, 50, 68, 113, 210, 52, 60, 242, 238, + 105, 88, 160, 52, 106, 221, 231, 167, 127, 183, 109, 147, 38, 170, 22, 195, + 180, 142, 160, 76, 223, 142, 109, 212, 132, 205, 56, 230, 51, 12, 221, 86, + 129, 244, 116, 2, 98, 68, 36, 40, 196, 109, 1, 39, 20, 84, 202, 242, 32, + 169, 139, 223, 122, 182, 45, 214, 64, 139, 93, 127, 171, 248, 173, 67, 211, + 168, 193, 70, 58, 230, 85, 172, 127, 192, 230, 177, 166, 237, 173, 243, 86, + 53, 43, 182, 119, 229, 174, 2, 133, 199, 214, 151, 130, 190, 110, 176, 35, + 63, 56, 23, 246, 106, 23, 202, 102, 90, 143, 3, 120, 0, 137, 147, 77, 51, + 109, 89, 123, 87, 242, 85, 248, 9, 45, 124, 144, 176, 185, 246, 94, 124, + 241, 183, 218, 250, 54, 216, 97, 224, 37, 111, 3, 174, 59, 122, 158, 226, + 103, 57, 217, 168, 208, 151, 208, 183, 187, 106, 18, 235, 118, 234, 248, + 152, 232, 115, 176, 221, 31, 129, 169, 36, 149, 205, 35, 101, 70, 145, 2, + 149, 171, 84, 41, 229, 26, 73, 52, 233, 43, 10, 101, 82, 222, 214, 88, 239, + 49, 81, 25, 248, 250, 244, 49, 72, 81, 237, 104, 98, 51, 37, 186, 158, 26, + 94, 143, 124, 9, 62, 38, 3, 50, 138, 52, 125, 9, 63, 232, 101, 31, 167, 74, + 189, 102, 190, 129, 115, 167, 25, 192, 223, 217, 117, 182, 51, 182, 151, + 191, 173, 79, 16, 204, 155, 233, 218, 144, 73, 36, 187, 1, 96, 252, 18, 95, + 42, 245, 78, 10, 11, 18, 42, 184, 3, 31, 191, 83, 215, 180, 170, 23, 15, + 64, 169, 203, 190, 151, 254, 199, 97, 23, 158, 207, 11, 131, 112, 49, 45, + 203, 156, 103, 44, 252, 47, 169, 168, 2, 64, 108, 40, 229, 52, 173, 69, 81, + 13, 123, 99, 121, 184, 92, 123, 18, 119, 128, 176, 22, 150, 45, 109, 30, + 141, 85, 229, 183, 226, 193, 149, 26, 228, 153, 104, 230, 41, 81, 177, 52, + 41, 235, 215, 152, 155, 172, 145, 241, 91, 75, 72, 160, 103, 95, 25, 88, + 187, 40, 51, 27, 47, 154, 13, 57, 4, 104, 167, 191, 164, 73, 228, 2, 219, + 224, 122, 93, 201, 133, 221, 201, 213, 178, 50, 123, 203, 178, 173, 205, + 107, 148, 6, 167, 244, 91, 11, 115, 250, 209, 28, 11, 146, 82, 74, 116, + 102, 109, 8, 23, 176, 12, 74, 206, 237, 100, 186, 178, 76, 166, 198, 52, + 225, 18, 9, 254, 184, 245, 224, 155, 2, 10, 75, 56, 236, 73, 233, 240, 19, + 147, 167, 184, 17, 160, 196, 135, 19, 35, 3, 70, 91, 147, 64, 138, 218, + 252, 87, 33, 199, 68, 116, 243, 117, 2, 20, 220, 245, 28, 125, 54, 146, + 163, 183, 115, 120, 67, 155, 244, 51, 198, 220, 116, 48, 120, 186, 90, 168, + 210, 83, 97, 161, 69, 241, 53, 92, 135, 74, 133, 134, 30, 134, 245, 246, + 22, 246, 99, 102, 159, 92, 208, 126, 210, 81, 17, 119, 55, 12, 70, 238, + 226, 69, 176, 22, 23, 5, 204, 140, 217, 33, 220, 223, 218, 201, 23, 68, + 174, 181, 12, 161, 97, 146, 221, 122, 107, 19, 14, 163, 228, 161, 204, 230, + 114, 202, 102, 249, 101, 24, 123, 177, 86, 132, 182, 61, 16, 4, 141, 38, + 96, 222, 151, 181, 40, 252, 3, 195, 46, 194, 251, 185, 122, 238, 78, 196, + 213, 252, 191, 127, 232, 171, 6, 63, 74, 3, 71, 133, 140, 132, 219, 170, + 107, 213, 141, 59, 37, 81, 120, 193, 157, 108, 2, 0, 153, 100, 177, 252, + 152, 6, 213, 194, 175, 135, 73, 145, 34, 94, 3, 164, 94, 46, 14, 108, 180, + 112, 59, 73, 36, 210, 240, 194, 69, 35, 84, 115, 32, 26, 11, 76, 44, 115, + 156, 141, 108, 153, 180, 161, 195, 103, 109, 210, 88, 100, 40, 34, 20, 44, + 94, 51, 107, 104, 51, 190, 207, 128, 254, 221, 16, 76, 211, 182, 183, 181, + 252, 13, 95, 186, 119, 66, 134, 64, 41, 255, 97, 249, 179, 158, 158, 127, + 88, 144, 201, 53, 120, 109, 158, 240, 84, 211, 187, 121, 0, 138, 233, 150, + 200, 11, 181, 220, 15, 43, 111, 139, 241, 187, 143, 36, 120, 193, 228, 238, + 152, 7, 173, 159, 2, 105, 118, 64, 36, 55, 183, 246, 114, 123, 42, 161, 56, + 175, 9, 244, 205, 17, 89, 200, 241, 3, 40, 124, 134, 23, 201, 207, 110, 41, + 97, 152, 89, 32, 113, 74, 107, 172, 96, 244, 131, 213, 91, 206, 61, 107, 7, + 113, 85, 213, 21, 188, 171, 110, 3, 180, 172, 151, 174, 223, 108, 135, 32, + 109, 159, 140, 247, 78, 104, 143, 10, 93, 135, 220, 86, 80, 227, 238, 46, + 142, 28, 174, 90, 180, 120, 55, 196, 113, 54, 129, 48, 112, 92, 72, 187, + 225, 189, 148, 71, 79, 247, 255, 126, 179, 45, 173, 120, 42, 236, 63, 6, + 227, 251, 76, 228, 126, 42, 11, 251, 211, 172, 16, 63, 223, 246, 92, 112, + 123, 184, 114, 62, 203, 150, 112, 17, 128, 114, 156, 207, 224, 235, 199, + 166, 11, 128, 56, 185, 221, 7, 121, 116, 100, 36, 113, 10, 246, 188, 200, + 39, 119, 162, 208, 130, 141, 144, 220, 90, 120, 123, 10, 215, 237, 16, 24, + 18, 219, 252, 115, 11, 2, 244, 166, 142, 3, 10, 190, 25, 117, 3, 60, 91, + 112, 4, 65, 157, 219, 142, 116, 171, 5, 65, 47, 113, 60, 118, 17, 168, 248, + 94, 10, 40, 123, 144, 91, 83, 251, 2, 125, 26, 19, 133, 150, 96, 18, 80, + 135, 194, 169, 210, 174, 140, 225, 173, 47, 52, 230, 75, 219, 37, 122, 38, + 179, 173, 177, 65, 149, 73, 55, 130, 78, 229, 22, 203, 145, 85, 69, 246, + 244, 13, 197, 85, 162, 73, 138, 69, 225, 241, 136, 235, 59, 138, 28, 34, + 171, 34, 77, 88, 52, 141, 98, 70, 50, 137, 73, 31, 214, 43, 58, 219, 156, + 244, 81, 97, 129, 237, 213, 61, 116, 66, 108, 149, 204, 220, 139, 81, 164, + 34, 182, 111, 63, 217, 161, 221, 103, 76, 215, 127, 179, 205, 35, 162, 44, + 76, 66, 216, 85, 97, 108, 193, 12, 140, 68, 21, 210, 236, 129, 236, 91, + 253, 203, 200, 209, 164, 107, 22, 3, 150, 5, 105, 153, 145, 5, 28, 159, + 165, 75, 16, 21, 119, 46, 108, 190, 120, 211, 41, 113, 45, 149, 125, 211, + 22, 39, 197, 61, 220, 39, 225, 111, 2, 236, 83, 224, 157, 212, 158, 87, + 152, 128, 147, 7, 155, 127, 33, 102, 156, 239, 154, 149, 215, 144, 193, + 222, 169, 94, 46, 128, 22, 186, 97, 26, 144, 151, 221, 206, 165, 120, 249, + 235, 145, 2, 144, 86, 77, 23, 163, 108, 225, 244, 198, 209, 119, 101, 147, + 252, 165, 93, 152, 198, 51, 70, 136, 138, 120, 60, 123, 5, 13, 253, 209, + 109, 40, 224, 244, 34, 230, 54, 3, 178, 218, 114, 157, 119, 76, 143, 200, + 58, 96, 35, 220, 113, 171, 175, 118, 172, 21, 159, 252, 64, 32, 2, 189, + 198, 204, 177, 250, 168, 213, 9, 144, 73, 245, 61, 45, 124, 201, 122, 53, + 208, 58, 156, 201, 115, 10, 250, 83, 89, 25, 2, 219, 57, 239, 215, 2, 213, + 220, 92, 248, 192, 67, 54, 241, 155, 181, 85, 58, 113, 125, 200, 151, 54, + 8, 176, 105, 60, 220, 63, 94, 230, 45, 238, 3, 112, 224, 42, 62, 199, 90, + 131, 216, 214, 115, 48, 107, 142, 55, 24, 64, 92, 12, 202, 7, 224, 4, 151, + 175, 167, 184, 109, 11, 185, 30, 165, 4, 202, 124, 233, 119, 48, 63, 50, + 116, 247, 147, 228, 52, 254, 5, 1, 90, 67, 135, 118, 95, 234, 188, 36, 199, + 2, 224, 238, 167, 246, 35, 253, 255, 71, 33, 183, 229, 138, 196, 176, 193, + 2, 54, 141, 47, 72, 22, 49, 160, 86, 246, 101, 186, 180, 52, 45, 41, 218, + 107, 217, 233, 13, 244, 90, 127, 96, 140, 5, 117, 111, 22, 10, 47, 218, 21, + 243, 214, 216, 221, 54, 218, 173, 133, 219, 106, 193, 208, 100, 164, 189, + 140, 209, 21, 186, 90, 214, 67, 2, 135, 201, 111, 252, 43, 141, 171, 22, + 74, 250, 215, 3, 39, 218, 100, 236, 160, 140, 95, 19, 191, 121, 202, 3, + 255, 171, 42, 192, 145, 254, 63, 78, 3, 72, 86, 36, 253, 152, 128, 51, 12, + 223, 60, 253, 221, 229, 117, 100, 123, 116, 236, 111, 95, 70, 102, 21, 197, + 96, 92, 172, 246, 125, 165, 233, 47, 46, 109, 71, 148, 168, 69, 232, 231, + 182, 78, 51, 181, 90, 215, 66, 213, 182, 4, 190, 230, 166, 140, 156, 98, + 50, 72, 167, 187, 149, 109, 85, 38, 204, 82, 125, 224, 14, 122, 91, 10, 35, + 168, 208, 156, 133, 13, 97, 228, 115, 135, 141, 85, 29, 220, 32, 27, 75, + 202, 167, 184, 38, 100, 242, 77, 158, 210, 130, 55, 61, 251, 159, 61, 253, + 162, 7, 222, 83, 188, 200, 216, 106, 207, 44, 142, 60, 178, 82, 8, 106, + 211, 196, 226, 145, 114, 163, 159, 3, 194, 157, 97, 93, 9, 33, 220, 197, + 101, 36, 69, 241, 159, 249, 76, 143, 78, 8, 112, 233, 182, 81, 149, 246, + 32, 114, 20, 161, 150, 86, 10, 77, 3, 20, 87, 56, 63, 21, 115, 40, 103, 33, + 178, 129, 133, 242, 254, 22, 220, 8, 97, 235, 67, 125, 151, 152, 81, 211, + 175, 144, 231, 68, 170, 210, 202, 223, 138, 152, 226, 140, 38, 32, 57, 26, + 178, 97, 14, 96, 69, 134, 60, 111, 243, 118, 254, 31, 84, 139, 42, 2, 183, + 115, 216, 95, 27, 151, 132, 210, 137, 195, 135, 247, 16, 1, 227, 69, 72, + 191, 227, 133, 170, 96, 207, 141, 144, 92, 184, 192, 146, 75, 219, 237, + 155, 122, 190, 225, 116, 67, 255, 96, 166, 171, 149, 64, 140, 30, 38, 154, + 5, 97, 22, 198, 30, 5, 110, 185, 174, 164, 122, 109, 28, 250, 132, 190, 10, + 143, 64, 155, 219, 122, 254, 3, 231, 160, 139, 195, 18, 235, 74, 170, 92, + 199, 143, 113, 182, 180, 106, 215, 210, 121, 214, 149, 118, 253, 224, 140, + 245, 98, 96, 147, 226, 18, 151, 242, 3, 216, 150, 33, 84, 24, 53, 46, 183, + 252, 249, 252, 61, 133, 84, 107, 121, 163, 41, 195, 194, 93, 135, 3, 155, + 36, 173, 0, 56, 118, 210, 60, 22, 250, 215, 156, 79, 233, 159, 176, 191, 2, + 79, 156, 161, 142, 72, 238, 74, 225, 201, 158, 145, 167, 42, 147, 178, 147, + 33, 232, 52, 199, 93, 213, 181, 171, 94, 9, 232, 250, 129, 104, 95, 100, + 212, 29, 210, 197, 147, 119, 168, 217, 20, 112, 126, 244, 150, 91, 76, 54, + 77, 25, 130, 169, 104, 26, 66, 250, 213, 102, 208, 29, 68, 90, 116, 114, + 156, 179, 49, 198, 101, 163, 201, 205, 127, 185, 78, 254, 252, 207, 97, 7, + 79, 92, 153, 124, 47, 174, 85, 2, 73, 8, 68, 163, 224, 117, 215, 32, 163, + 251, 182, 255, 213, 35, 167, 247, 6, 87, 19, 125, 199, 1, 152, 112, 59, 2, + 151, 14, 138, 12, 126, 219, 3, 140, 58, 0, 237, 219, 177, 143, 83, 159, 15, + 245, 209, 125, 208, 112, 80, 74, 205, 230, 112, 1, 129, 37, 31, 87, 108, + 17, 98, 63, 46, 197, 29, 34, 155, 89, 77, 120, 47, 59, 163, 187, 207, 46, + 155, 84, 236, 165, 199, 161, 78, 218, 192, 84, 13, 46, 32, 146, 144, 237, + 182, 217, 151, 255, 11, 51, 51, 172, 44, 203, 166, 232, 228, 50, 174, 113, + 92, 110, 49, 229, 62, 6, 203, 72, 172, 163, 85, 3, 169, 235, 223, 202, 3, + 78, 230, 46, 21, 136, 120, 245, 210, 212, 64, 96, 113, 135, 209, 28, 160, + 174, 109, 222, 87, 72, 7, 10, 27, 23, 46, 143, 75, 74, 211, 135, 37, 38, 8, + 104, 251, 2, 165, 16, 46, 178, 242, 76, 94, 13, 24, 117, 183, 161, 99, 132, + 197, 44, 201, 212, 181, 18, 40, 39, 233, 71, 50, 11, 54, 96, 25, 48, 217, + 208, 3, 106, 171, 156, 174, 81, 143, 144, 58, 193, 96, 124, 254, 76, 250, + 78, 183, 154, 255, 170, 52, 36, 224, 116, 239, 67, 51, 41, 136, 190, 179, + 77, 131, 231, 143, 110, 186, 93, 121, 35, 89, 115, 62, 224, 220, 52, 70, + 26, 13, 208, 206, 162, 106, 160, 111, 162, 40, 11, 96, 85, 124, 44, 246, + 191, 212, 215, 10, 3, 34, 97, 217, 92, 185, 210, 245, 131, 191, 128, 32, + 86, 240, 63, 177, 122, 2, 137, 63, 108, 230, 191, 69, 110, 208, 142, 235, + 110, 71, 131, 184, 234, 19, 19, 63, 183, 166, 170, 6, 70, 213, 227, 233, + 112, 231, 49, 98, 212, 162, 50, 150, 182, 66, 208, 10, 238, 167, 118, 214, + 87, 225, 3, 237, 167, 238, 23, 11, 219, 51, 99, 76, 201, 205, 112, 151, + 248, 43, 218, 66, 117, 143, 176, 74, 227, 184, 194, 103, 137, 208, 80, 222, + 82, 247, 198, 2, 219, 136, 12, 110, 49, 2, 106, 190, 183, 104, 65, 164, + 207, 191, 12, 17, 238, 21, 49, 102, 86, 219, 50, 46, 155, 126, 174, 15, + 200, 144, 248, 148, 61, 33, 206, 170, 6, 100, 228, 22, 244, 79, 140, 153, + 3, 155, 41, 217, 144, 240, 140, 61, 97, 126, 236, 45, 153, 212, 78, 173, + 238, 234, 21, 38, 4, 13, 49, 101, 118, 199, 185, 86, 123, 231, 230, 186, + 175, 151, 140, 123, 3, 210, 14, 105, 79, 228, 67, 187, 173, 6, 70, 186, 43, + 136, 110, 63, 194, 43, 28, 222, 117, 9, 75, 133, 107, 81, 235, 105, 139, + 136, 194, 20, 63, 148, 221, 65, 213, 131, 216, 203, 11, 29, 211, 8, 41, 53, + 184, 225, 2, 253, 171, 247, 242, 164, 21, 132, 222, 106, 215, 58, 116, 234, + 80, 89, 252, 252, 52, 206, 159, 246, 87, 145, 102, 88, 224, 30, 107, 227, + 2, 104, 110, 2, 163, 82, 171, 85, 8, 135, 240, 171, 53, 245, 8, 134, 108, + 4, 176, 99, 236, 88, 130, 194, 201, 166, 231, 251, 142, 19, 152, 77, 111, + 61, 67, 212, 44, 68, 30, 33, 239, 246, 82, 95, 88, 183, 175, 78, 141, 45, + 179, 95, 173, 191, 136, 246, 25, 114, 29, 175, 244, 74, 212, 125, 228, 9, + 166, 37, 89, 224, 170, 100, 118, 203, 33, 186, 221, 91, 223, 87, 228, 237, + 178, 167, 238, 177, 172, 66, 240, 71, 188, 46, 95, 255, 125, 251, 161, 78, + 168, 193, 174, 225, 18, 220, 75, 147, 156, 102, 133, 204, 205, 130, 18, + 242, 113, 172, 26, 108, 106, 17, 162, 241, 187, 178, 211, 218, 174, 136, + 194, 202, 62, 124, 3, 35, 141, 252, 96, 127, 240, 244, 225, 253, 222, 88, + 46, 45, 234, 232, 155, 18, 226, 171, 200, 203, 163, 56, 3, 77, 135, 50, 28, + 229, 175, 124, 182, 2, 91, 28, 238, 131, 167, 82, 51, 76, 132, 243, 122, + 243, 153, 88, 110, 41, 45, 24, 243, 144, 71, 125, 234, 115, 189, 236, 90, + 106, 19, 93, 156, 103, 37, 148, 111, 184, 17, 91, 226, 39, 156, 2, 179, + 205, 185, 161, 58, 113, 119, 86, 108, 74, 149, 17, 116, 201, 255, 6, 223, + 137, 196, 183, 88, 171, 139, 156, 97, 35, 94, 254, 182, 242, 180, 18, 84, + 4, 127, 11, 53, 215, 91, 35, 150, 8, 170, 250, 248, 189, 135, 129, 155, + 184, 236, 203, 162, 161, 94, 231, 19, 8, 12, 83, 168, 120, 79, 28, 159, + 204, 82, 41, 231, 16, 231, 8, 150, 24, 17, 84, 105, 61, 41, 96, 33, 38, + 236, 99, 130, 55, 2, 14, 18, 137, 145, 64, 141, 30, 8, 65, 99, 234, 197, + 231, 156, 145, 192, 215, 58, 189, 234, 101, 77, 111, 174, 151, 198, 179, + 178, 112, 14, 122, 74, 2, 255, 118, 129, 151, 26, 140, 141, 67, 203, 207, + 207, 31, 105, 48, 14, 230, 130, 93, 111, 76, 158, 224, 36, 151, 215, 219, + 220, 248, 13, 147, 196, 9, 218, 203, 102, 66, 125, 252, 116, 48, 197, 70, + 60, 187, 46, 54, 26, 189, 208, 237, 44, 179, 95, 55, 4, 167, 228, 175, 183, + 85, 254, 64, 53, 47, 4, 134, 176, 182, 71, 216, 249, 183, 171, 188, 0, 158, + 1, 20, 199, 10, 75, 180, 225, 48, 73, 207, 104, 219, 146, 193, 74, 252, + 248, 56, 153, 247, 56, 180, 220, 55, 213, 210, 73, 86, 193, 60, 89, 139, + 238, 5, 60, 61, 55, 26, 63, 118, 168, 226, 94, 128, 245, 54, 150, 66, 116, + 134, 177, 174, 3, 175, 84, 216, 8, 42, 65, 162, 196, 119, 113, 66, 52, 219, + 175, 230, 107, 173, 174, 96, 237, 139, 9, 39, 202, 147, 188, 84, 209, 194, + 5, 141, 243, 2, 105, 136, 43, 97, 68, 140, 9, 103, 86, 97, 181, 146, 93, + 203, 82, 225, 173, 213, 118, 152, 121, 194, 255, 61, 235, 46, 163, 221, + 138, 98, 120, 224, 67, 205, 193, 214, 183, 230, 83, 199, 142, 55, 89, 82, + 95, 245, 17, 3, 149, 227, 165, 12, 148, 50, 88, 37, 144, 202, 205, 141, 94, + 85, 227, 100, 9, 18, 78, 20, 189, 95, 244, 92, 205, 165, 11, 6, 252, 93, + 146, 88, 22, 166, 34, 133, 101, 171, 208, 6, 143, 106, 18, 171, 117, 14, + 87, 35, 47, 239, 133, 109, 142, 3, 108, 1, 127, 208, 90, 160, 56, 138, 81, + 126, 62, 229, 149, 213, 10, 103, 94, 24, 167, 216, 239, 85, 91, 19, 200, + 69, 3, 170, 233, 43, 133, 180, 164, 37, 218, 86, 177, 139, 54, 120, 103, + 247, 207, 141, 84, 136, 239, 25, 189, 138, 102, 35, 0, 186, 226, 91, 137, + 220, 253, 2, 80, 70, 174, 240, 67, 32, 5, 3, 219, 139, 216, 221, 246, 145, + 64, 39, 235, 113, 181, 98, 53, 84, 219, 122, 164, 209, 67, 184, 93, 32, 53, + 6, 2, 96, 36, 189, 113, 154, 82, 130, 201, 33, 126, 126, 118, 60, 63, 248, + 240, 35, 123, 37, 31, 187, 41, 8, 96, 193, 127, 167, 85, 253, 111, 135, 62, + 130, 17, 197, 220, 171, 254, 54, 255, 253, 195, 31, 144, 39, 231, 113, 232, + 0, 213, 221, 156, 7, 27, 219, 85, 191, 104, 221, 1, 103, 104, 207, 52, 130, + 100, 69, 177, 0, 57, 92, 226, 82, 249, 155, 129, 47, 79, 21, 115, 177, 142, + 7, 60, 224, 100, 106, 36, 96, 173, 24, 115, 45, 243, 140, 2, 240, 52, 226, + 73, 193, 182, 10, 152, 183, 167, 239, 18, 143, 187, 12, 201, 174, 243, 49, + 185, 208, 63, 132, 112, 128, 189, 156, 15, 179, 132, 122, 60, 2, 159, 39, + 3, 255, 17, 151, 247, 19, 76, 38, 220, 115, 132, 245, 169, 176, 249, 238, + 235, 219, 161, 27, 169, 85, 155, 243, 117, 218, 75, 10, 146, 247, 100, 254, + 215, 193, 155, 225, 29, 119, 115, 38, 95, 241, 148, 224, 151, 21, 208, 2, + 187, 11, 135, 17, 16, 90, 183, 93, 249, 195, 78, 154, 42, 151, 52, 57, 6, + 13, 233, 216, 137, 99, 225, 196, 53, 144, 28, 209, 228, 170, 99, 122, 22, + 4, 206, 100, 87, 108, 16, 192, 64, 179, 159, 229, 231, 59, 79, 252, 109, + 125, 48, 62, 62, 157, 108, 184, 76, 228, 137, 179, 183, 47, 202, 174, 96, + 131, 215, 125, 17, 195, 25, 222, 222, 207, 217, 208, 60, 175, 2, 27, 138, + 0, 8, 207, 249, 186, 139, 17, 183, 176, 61, 248, 22, 251, 170, 131, 172, + 71, 18, 134, 133, 250, 119, 237, 57, 164, 121, 175, 76, 48, 225, 3, 59, + 150, 22, 50, 126, 101, 20, 244, 156, 58, 229, 38, 226, 10, 181, 238, 155, + 67, 141, 131, 56, 134, 89, 33, 248, 37, 210, 110, 235, 14, 169, 241, 136, + 25, 156, 224, 123, 15, 1, 47, 29, 228, 213, 25, 208, 188, 168, 64, 59, 166, + 96, 179, 199, 24, 144, 140, 14, 11, 10, 124, 133, 136, 136, 176, 47, 162, + 204, 189, 118, 31, 72, 22, 193, 237, 221, 39, 95, 15, 159, 160, 30, 55, 27, + 198, 31, 78, 195, 58, 202, 217, 197, 43, 154, 96, 138, 195, 122, 110, 189, + 223, 168, 235, 78, 185, 23, 189, 11, 16, 156, 103, 96, 119, 232, 42, 166, + 165, 72, 209, 72, 77, 227, 181, 196, 49, 188, 77, 73, 25, 2, 4, 4, 154, + 224, 146, 12, 92, 39, 133, 185, 111, 15, 94, 11, 100, 32, 228, 146, 66, 19, + 7, 231, 128, 91, 14, 28, 11, 211, 171, 252, 175, 146, 2, 185, 6, 156, 220, + 158, 103, 111, 111, 94, 103, 203, 251, 118, 109, 239, 68, 39, 246, 214, 74, + 249, 17, 202, 189, 255, 14, 186, 41, 141, 10, 70, 236, 232, 50, 38, 93, 78, + 23, 39, 186, 175, 122, 73, 22, 62, 91, 90, 50, 113, 113, 220, 209, 54, 249, + 196, 18, 74, 117, 220, 78, 121, 230, 217, 35, 164, 101, 213, 43, 133, 170, + 91, 43, 116, 45, 212, 251, 48, 217, 215, 45, 139, 163, 203, 199, 112, 199, + 166, 146, 164, 74, 102, 53, 130, 140, 83, 214, 66, 28, 153, 142, 187, 62, + 234, 235, 31, 242, 28, 159, 172, 115, 98, 155, 21, 197, 81, 230, 231, 57, + 130, 167, 20, 128, 168, 61, 83, 152, 195, 88, 3, 138, 102, 248, 167, 60, + 147, 221, 166, 129, 90, 132, 132, 41, 120, 241, 156, 252, 182, 7, 229, 77, + 193, 137, 45, 253, 20, 239, 210, 172, 115, 1, 149, 2, 96, 255, 140, 199, + 202, 14, 113, 83, 122, 97, 68, 205, 32, 199, 123, 136, 186, 228, 184, 126, + 169, 73, 67, 61, 96, 21, 241, 248, 236, 27, 52, 4, 7, 88, 76, 49, 72, 36, + 251, 251, 113, 165, 99, 167, 237, 238, 34, 30, 214, 55, 160, 181, 197, 56, + 59, 34, 103, 102, 186, 77, 10, 179, 170, 148, 194, 179, 241, 164, 245, 26, + 146, 97, 228, 98, 41, 62, 74, 243, 121, 241, 152, 33, 82, 102, 149, 139, + 49, 19, 122, 193, 246, 163, 229, 189, 162, 32, 184, 251, 205, 170, 23, 250, + 16, 160, 42, 25, 167, 97, 65, 28, 149, 4, 41, 55, 229, 143, 247, 124, 112, + 48, 120, 184, 97, 221, 141, 189, 165, 128, 3, 243, 207, 127, 243, 28, 113, + 18, 45, 249, 161, 44, 54, 172, 57, 223, 211, 10, 96, 3, 47, 22, 11, 28, + 217, 90, 61, 132, 190, 212, 21, 28, 137, 2, 108, 33, 92, 8, 87, 188, 36, 3, + 243, 90, 92, 59, 172, 168, 86, 213, 6, 80, 220, 194, 176, 34, 110, 167, + 189, 192, 205, 147, 82, 222, 210, 241, 252, 176, 41, 182, 136, 143, 64, + 236, 99, 255, 239, 135, 17, 183, 3, 20, 145, 170, 50, 134, 219, 87, 26, + 224, 136, 43, 236, 127, 39, 205, 171, 57, 180, 102, 153, 71, 81, 19, 38, + 86, 241, 222, 150, 252, 91, 22, 108, 77, 140, 90, 212, 87, 241, 186, 212, + 182, 54, 210, 223, 84, 182, 182, 148, 74, 198, 174, 141, 119, 72, 111, 152, + 223, 193, 96, 242, 159, 64, 141, 207, 215, 221, 181, 60, 182, 69, 108, 136, + 200, 167, 69, 40, 184, 150, 19, 40, 212, 3, 184, 59, 234, 214, 68, 66, 11, + 223, 136, 61, 174, 129, 28, 48, 221, 47, 125, 207, 7, 99, 191, 116, 143, + 235, 105, 92, 245, 27, 95, 146, 242, 181, 2, 177, 48, 195, 29, 237, 14, 99, + 40, 222, 90, 223, 62, 28, 22, 149, 69, 210, 6, 32, 45, 224, 15, 29, 134, + 102, 30, 157, 60, 182, 88, 39, 82, 69, 236, 4, 120, 191, 195, 66, 26, 158, + 12, 139, 187, 83, 114, 218, 13, 65, 12, 108, 132, 32, 162, 221, 70, 0, 35, + 69, 164, 210, 108, 127, 255, 79, 156, 179, 157, 32, 142, 235, 92, 37, 51, + 133, 217, 236, 216, 173, 108, 59, 136, 67, 8, 50, 2, 142, 61, 3, 182, 47, + 81, 212, 162, 32, 149, 212, 33, 76, 118, 129, 80, 193, 155, 137, 208, 253, + 28, 87, 134, 226, 59, 82, 207, 200, 213, 34, 143, 22, 255, 126, 217, 241, + 38, 193, 46, 29, 104, 3, 88, 100, 208, 7, 114, 155, 43, 160, 180, 254, 201, + 36, 83, 254, 106, 206, 234, 127, 154, 240, 200, 36, 98, 195, 88, 193, 167, + 181, 169, 35, 84, 48, 3, 127, 144, 78, 165, 1, 218, 18, 52, 139, 157, 138, + 19, 10, 197, 241, 111, 134, 61, 196, 2, 214, 130, 120, 246, 119, 129, 45, + 11, 100, 0, 239, 227, 46, 156, 20, 135, 201, 159, 48, 48, 198, 15, 44, 59, + 237, 5, 49, 85, 238, 206, 179, 208, 233, 193, 151, 92, 22, 99, 209, 20, + 161, 210, 28, 73, 247, 154, 121, 78, 114, 12, 233, 88, 128, 236, 244, 230, + 153, 129, 218, 15, 106, 247, 43, 5, 245, 126, 113, 235, 196, 114, 4, 59, + 70, 47, 203, 92, 229, 238, 132, 207, 250, 14, 28, 211, 232, 64, 218, 206, + 158, 44, 186, 210, 38, 147, 1, 71, 130, 188, 0, 179, 129, 97, 208, 127, + 147, 181, 121, 39, 3, 131, 101, 131, 55, 87, 237, 91, 22, 12, 69, 150, 243, + 43, 179, 220, 133, 209, 223, 58, 200, 220, 43, 59, 19, 255, 200, 235, 192, + 169, 112, 87, 0, 2, 169, 50, 86, 16, 107, 13, 254, 105, 160, 141, 104, 220, + 75, 141, 159, 73, 148, 175, 222, 228, 50, 64, 155, 47, 111, 226, 36, 61, + 47, 246, 80, 108, 221, 68, 191, 82, 141, 161, 177, 69, 112, 40, 11, 55, + 196, 56, 83, 6, 42, 48, 241, 65, 155, 151, 107, 54, 71, 229, 49, 186, 93, + 241, 63, 59, 114, 96, 235, 99, 193, 166, 13, 101, 150, 21, 131, 59, 142, + 22, 150, 97, 112, 251, 193, 147, 115, 82, 212, 254, 232, 106, 25, 128, 213, + 122, 84, 203, 253, 164, 5, 246, 246, 19, 152, 57, 168, 236, 132, 19, 71, + 168, 240, 201, 188, 30, 250, 123, 0, 238, 98, 214, 189, 56, 248, 38, 229, + 87, 105, 74, 2, 162, 178, 216, 92, 72, 17, 249, 95, 121, 244, 52, 87, 133, + 198, 30, 41, 16, 191, 84, 137, 160, 83, 179, 47, 31, 157, 195, 76, 121, + 155, 118, 203, 3, 156, 214, 171, 235, 184, 45, 229, 97, 26, 190, 238, 3, + 61, 169, 164, 47, 14, 147, 90, 175, 74, 96, 73, 77, 29, 31, 155, 42, 145, + 70, 58, 147, 43, 13, 126, 111, 41, 38, 221, 233, 84, 170, 170, 230, 245, + 12, 237, 151, 75, 191, 197, 224, 222, 123, 94, 141, 170, 119, 214, 24, 73, + 169, 151, 81, 171, 42, 187, 216, 233, 170, 67, 5, 4, 76, 119, 195, 180, + 184, 175, 30, 34, 21, 34, 160, 143, 139, 1, 58, 193, 70, 150, 179, 11, 54, + 103, 230, 205, 164, 2, 211, 38, 53, 235, 117, 253, 55, 57, 118, 91, 25, + 161, 146, 164, 236, 179, 32, 66, 36, 86, 161, 228, 210, 89, 202, 1, 85, 91, + 41, 2, 55, 230, 49, 73, 183, 248, 124, 58, 175, 131, 69, 253, 170, 146, + 210, 57, 251, 211, 196, 174, 35, 157, 96, 75, 26, 89, 169, 14, 72, 235, 25, + 55, 2, 149, 251, 180, 183, 200, 56, 233, 218, 117, 9, 68, 199, 54, 183, 5, + 197, 73, 134, 66, 181, 92, 95, 145, 144, 199, 234, 182, 133, 226, 46, 219, + 84, 172, 153, 77, 217, 138, 178, 157, 235, 156, 190, 140, 189, 207, 37, + 152, 117, 63, 175, 140, 201, 70, 35, 196, 75, 30, 119, 160, 149, 77, 195, + 118, 148, 235, 238, 83, 44, 63, 34, 12, 164, 125, 34, 213, 16, 102, 175, + 231, 253, 167, 33, 177, 70, 149, 223, 118, 235, 189, 175, 88, 27, 213, 42, + 37, 27, 139, 71, 6, 160, 214, 34, 194, 40, 53, 188, 44, 14, 68, 107, 80, + 216, 181, 117, 126, 109, 147, 92, 28, 207, 84, 124, 196, 180, 131, 78, 125, + 224, 3, 99, 149, 79, 245, 237, 15, 157, 199, 231, 71, 212, 237, 203, 137, + 153, 71, 161, 241, 154, 47, 46, 63, 202, 90, 202, 246, 87, 197, 13, 218, + 213, 127, 2, 127, 57, 191, 106, 22, 32, 84, 93, 233, 39, 231, 172, 117, + 191, 221, 55, 134, 93, 118, 82, 95, 117, 27, 180, 241, 43, 172, 15, 146, + 35, 96, 224, 175, 160, 56, 10, 3, 134, 55, 254, 201, 159, 49, 65, 237, 160, + 121, 118, 105, 46, 32, 27, 6, 228, 110, 63, 254, 133, 25, 24, 209, 162, + 166, 46, 90, 22, 28, 214, 63, 111, 25, 54, 54, 127, 94, 250, 196, 14, 136, + 102, 3, 225, 184, 197, 226, 53, 113, 43, 83, 94, 3, 111, 188, 170, 248, 16, + 186, 9, 152, 130, 51, 34, 60, 160, 55, 230, 2, 188, 118, 66, 147, 220, 138, + 31, 224, 251, 52, 224, 219, 193, 187, 150, 84, 108, 129, 224, 6, 206, 3, + 163, 15, 107, 44, 149, 151, 255, 215, 42, 30, 80, 34, 64, 135, 220, 172, + 58, 73, 255, 183, 194, 146, 91, 182, 154, 0, 123, 152, 115, 98, 39, 24, 2, + 219, 167, 33, 215, 119, 226, 113, 13, 175, 243, 75, 35, 186, 219, 81, 193, + 157, 77, 144, 137, 93, 19, 197, 192, 141, 166, 6, 148, 131, 237, 181, 66, + 173, 55, 86, 158, 44, 253, 176, 20, 109, 164, 170, 16, 247, 20, 121, 245, + 105, 56, 182, 65, 228, 43, 96, 28, 42, 219, 73, 158, 69, 254, 178, 190, + 129, 245, 144, 111, 34, 114, 5, 24, 120, 148, 123, 149, 131, 138, 246, 29, + 111, 146, 225, 185, 242, 212, 246, 90, 143, 59, 65, 152, 72, 59, 146, 70, + 221, 239, 92, 254, 167, 19, 164, 122, 200, 195, 166, 207, 251, 108, 243, + 181, 200, 235, 71, 86, 226, 117, 121, 92, 201, 74, 156, 225, 140, 113, 17, + 163, 2, 232, 116, 10, 51, 230, 92, 2, 18, 146, 224, 197, 54, 179, 162, 133, + 0, 197, 7, 218, 189, 191, 170, 49, 206, 12, 247, 240, 6, 253, 177, 66, 67, + 3, 212, 143, 104, 25, 164, 91, 34, 50, 20, 13, 165, 240, 214, 0, 64, 252, + 183, 240, 74, 118, 185, 113, 113, 103, 169, 36, 34, 84, 192, 234, 7, 91, + 202, 254, 121, 99, 231, 13, 204, 131, 53, 17, 201, 131, 83, 205, 74, 43, + 129, 16, 82, 200, 0, 108, 107, 30, 150, 105, 224, 245, 221, 222, 209, 122, + 20, 214, 192, 17, 191, 120, 189, 114, 202, 121, 74, 238, 24, 28, 188, 8, + 199, 75, 130, 153, 215, 243, 83, 175, 195, 20, 156, 181, 78, 112, 84, 152, + 232, 126, 116, 191, 52, 173, 235, 238, 123, 197, 198, 78, 166, 142, 134, + 102, 141, 18, 145, 236, 42, 160, 37, 101, 139, 224, 40, 195, 177, 0, 155, + 7, 3, 12, 24, 215, 87, 215, 161, 169, 188, 224, 171, 5, 235, 55, 103, 144, + 250, 211, 156, 165, 75, 53, 42, 111, 163, 115, 124, 5, 177, 107, 199, 176, + 205, 3, 16, 143, 36, 132, 136, 52, 12, 109, 178, 238, 64, 201, 219, 11, 20, + 152, 164, 99, 65, 118, 98, 186, 53, 50, 103, 118, 83, 96, 21, 119, 68, 6, + 244, 192, 71, 182, 94, 177, 138, 118, 42, 255, 157, 103, 239, 38, 181, 238, + 201, 173, 77, 178, 19, 34, 22, 203, 56, 166, 205, 183, 120, 180, 187, 231, + 94, 253, 18, 231, 117, 90, 175, 103, 137, 192, 201, 13, 115, 71, 190, 105, + 49, 103, 134, 32, 191, 101, 190, 214, 187, 110, 86, 64, 254, 44, 176, 160, + 4, 250, 10, 165, 237, 185, 198, 181, 30, 52, 84, 53, 93, 14, 125, 81, 136, + 115, 96, 113, 36, 11, 51, 43, 183, 50, 65, 217, 231, 212, 200, 233, 2, 23, + 30, 93, 12, 207, 210, 225, 120, 126, 239, 55, 216, 130, 219, 124, 10, 27, + 160, 147, 94, 195, 81, 110, 187, 231, 63, 60, 137, 112, 32, 190, 237, 2, + 148, 237, 213, 57, 112, 66, 22, 64, 189, 10, 183, 128, 72, 127, 175, 60, + 197, 28, 46, 228, 110, 231, 181, 124, 123, 143, 110, 23, 48, 162, 217, 154, + 250, 152, 28, 4, 1, 141, 123, 125, 212, 22, 252, 253, 72, 196, 144, 92, + 118, 98, 59, 86, 73, 162, 29, 244, 91, 98, 80, 137, 201, 251, 43, 12, 158, + 219, 8, 141, 195, 113, 140, 93, 140, 183, 47, 106, 178, 8, 174, 43, 157, + 126, 124, 118, 128, 230, 98, 169, 201, 233, 253, 196, 149, 37, 134, 145, + 63, 203, 101, 131, 82, 57, 251, 247, 142, 38, 193, 183, 232, 243, 188, 246, + 221, 1, 23, 131, 74, 102, 199, 241, 159, 113, 126, 140, 195, 50, 37, 56, 3, + 205, 120, 17, 232, 168, 140, 70, 18, 237, 61, 135, 48, 126, 187, 222, 22, + 237, 66, 69, 165, 23, 43, 227, 173, 224, 82, 239, 138, 8, 74, 180, 36, 3, + 45, 113, 25, 173, 86, 7, 12, 105, 139, 153, 164, 251, 179, 139, 130, 186, + 23, 116, 221, 80, 231, 53, 202, 40, 56, 65, 121, 193, 238, 32, 95, 134, + 211, 19, 75, 222, 3, 116, 167, 51, 138, 199, 129, 136, 155, 180, 234, 163, + 98, 82, 83, 152, 105, 152, 249, 55, 101, 222, 202, 192, 164, 15, 250, 172, + 45, 46, 14, 206, 123, 246, 111, 164, 231, 81, 106, 219, 224, 241, 96, 233, + 196, 230, 81, 132, 21, 74, 100, 27, 140, 138, 243, 63, 177, 171, 58, 215, + 153, 67, 165, 95, 101, 68, 164, 161, 38, 245, 173, 149, 152, 69, 131, 30, + 128, 48, 0, 8, 173, 130, 147, 164, 71, 206, 88, 83, 3, 131, 241, 202, 3, + 183, 141, 162, 206, 42, 78, 181, 47, 253, 81, 80, 159, 225, 44, 83, 160, + 190, 115, 112, 244, 194, 78, 157, 149, 224, 122, 52, 173, 40, 160, 93, 13, + 2, 87, 237, 28, 63, 238, 189, 94, 215, 201, 116, 92, 71, 38, 193, 1, 198, + 43, 195, 228, 79, 34, 243, 225, 110, 187, 129, 25, 26, 76, 245, 17, 33, + 127, 90, 31, 65, 181, 78, 192, 173, 91, 156, 87, 94, 132, 86, 199, 50, 239, + 210, 165, 232, 153, 58, 243, 123, 52, 163, 60, 18, 203, 50, 65, 152, 219, + 146, 89, 240, 70, 102, 37, 138, 52, 120, 67, 127, 240, 173, 14, 134, 4, 31, + 238, 149, 199, 158, 49, 188, 67, 252, 88, 196, 186, 64, 6, 80, 180, 6, 77, + 92, 82, 232, 111, 183, 134, 149, 128, 203, 238, 35, 162, 75, 135, 142, 30, + 193, 132, 132, 49, 130, 157, 95, 104, 66, 195, 206, 169, 99, 3, 44, 61, + 182, 202, 64, 4, 159, 39, 67, 113, 30, 188, 253, 131, 142, 90, 100, 115, + 185, 174, 19, 195, 246, 92, 203, 45, 64, 128, 2, 83, 251, 189, 2, 62, 185, + 176, 48, 41, 244, 162, 10, 20, 81, 229, 128, 44, 253, 124, 41, 41, 98, 112, + 154, 228, 184, 172, 244, 184, 234, 230, 183, 148, 242, 243, 106, 252, 47, + 33, 68, 4, 191, 162, 44, 139, 29, 138, 188, 51, 2, 223, 185, 185, 27, 26, + 227, 28, 189, 96, 241, 213, 230, 64, 28, 187, 194, 204, 192, 49, 5, 77, + 201, 49, 162, 16, 47, 81, 194, 202, 61, 39, 168, 178, 122, 28, 208, 244, + 61, 134, 5, 197, 45, 136, 242, 19, 153, 119, 64, 42, 204, 21, 231, 101, 66, + 208, 151, 239, 146, 140, 81, 80, 42, 32, 41, 205, 137, 175, 41, 97, 162, + 17, 187, 220, 225, 93, 97, 41, 107, 16, 132, 118, 138, 3, 53, 163, 140, 41, + 222, 223, 240, 36, 92, 98, 103, 245, 194, 219, 171, 24, 197, 65, 115, 11, + 243, 90, 7, 33, 157, 159, 84, 127, 101, 63, 210, 239, 2, 188, 116, 130, + 188, 131, 140, 123, 115, 205, 204, 111, 168, 167, 130, 94, 52, 158, 5, 6, + 83, 240, 1, 192, 27, 47, 48, 102, 104, 0, 51, 83, 30, 57, 82, 85, 170, 0, + 9, 123, 127, 63, 249, 118, 232, 67, 127, 64, 20, 125, 203, 186, 189, 81, + 55, 64, 27, 27, 1, 22, 109, 123, 65, 180, 59, 186, 47, 74, 34, 222, 47, 75, + 224, 7, 76, 26, 63, 133, 106, 200, 91, 65, 168, 137, 18, 243, 130, 250, 76, + 37, 163, 96, 92, 47, 93, 255, 73, 119, 106, 208, 255, 67, 74, 71, 74, 215, + 153, 136, 229, 246, 47, 31, 147, 128, 48, 72, 252, 5, 250, 216, 146, 144, + 94, 230, 17, 136, 253, 207, 54, 2, 125, 154, 15, 126, 170, 99, 219, 15, 45, + 241, 186, 42, 209, 184, 198, 233, 27, 141, 0, 107, 19, 181, 175, 213, 202, + 141, 205, 5, 56, 185, 247, 250, 3, 48, 129, 198, 138, 234, 83, 78, 182, + 116, 6, 84, 21, 193, 225, 185, 85, 24, 251, 74, 0, 15, 43, 110, 149, 34, + 40, 132, 223, 191, 251, 158, 129, 29, 13, 22, 35, 86, 143, 177, 250, 7, 89, + 31, 254, 98, 223, 0, 48, 212, 107, 160, 245, 63, 86, 246, 145, 208, 86, + 228, 33, 10, 243, 91, 118, 55, 167, 216, 69, 117, 70, 71, 214, 26, 190, 55, + 43, 138, 168, 203, 123, 3, 185, 91, 218, 197, 150, 110, 187, 77, 47, 250, + 119, 225, 6, 214, 102, 110, 188, 199, 218, 142, 253, 235, 221, 149, 190, + 119, 99, 104, 26, 139, 215, 231, 162, 216, 245, 213, 219, 240, 161, 63, + 141, 173, 19, 4, 169, 148, 244, 2, 97, 6, 52, 28, 159, 80, 243, 93, 57, + 130, 24, 146, 227, 102, 176, 232, 185, 202, 132, 253, 127, 108, 213, 128, + 194, 73, 238, 125, 217, 222, 202, 126, 2, 146, 76, 244, 204, 147, 174, 55, + 192, 205, 240, 176, 14, 76, 127, 205, 198, 64, 173, 77, 255, 107, 186, 124, + 178, 39, 232, 245, 216, 97, 192, 36, 58, 87, 186, 103, 200, 87, 210, 132, + 146, 74, 104, 194, 123, 32, 191, 84, 46, 63, 30, 119, 202, 66, 136, 206, + 92, 11, 214, 144, 104, 173, 6, 146, 109, 71, 254, 86, 211, 16, 158, 84, + 161, 90, 221, 208, 227, 166, 71, 190, 212, 96, 186, 39, 165, 203, 24, 109, + 9, 125, 69, 147, 55, 14, 187, 75, 67, 146, 210, 57, 91, 13, 247, 164, 133, + 64, 134, 227, 188, 91, 207, 141, 135, 255, 94, 254, 8, 214, 101, 66, 136, + 233, 11, 193, 236, 159, 204, 221, 238, 2, 253, 64, 178, 175, 151, 199, 42, + 52, 8, 217, 129, 74, 15, 141, 85, 108, 233, 157, 203, 164, 239, 65, 182, + 23, 23, 61, 218, 87, 84, 2, 81, 149, 2, 84, 164, 33, 145, 200, 32, 73, 172, + 159, 158, 128, 194, 229, 7, 40, 155, 209, 154, 147, 139, 170, 72, 176, 129, + 100, 142, 20, 168, 115, 22, 247, 185, 249, 45, 221, 50, 99, 5, 75, 203, + 159, 100, 100, 123, 188, 125, 239, 77, 255, 55, 15, 253, 13, 121, 110, 30, + 182, 212, 247, 241, 92, 94, 99, 77, 7, 210, 180, 37, 239, 180, 196, 125, + 236, 13, 109, 50, 50, 86, 214, 55, 72, 188, 40, 67, 234, 81, 80, 10, 89, + 18, 144, 174, 239, 42, 53, 197, 65, 57, 132, 10, 221, 114, 170, 219, 45, + 165, 26, 148, 165, 11, 21, 151, 91, 220, 13, 209, 172, 14, 68, 55, 232, + 177, 229, 114, 15, 206, 255, 196, 2, 236, 195, 166, 244, 212, 95, 184, 166, + 89, 185, 72, 47, 62, 65, 137, 13, 142, 63, 62, 116, 31, 160, 122, 110, 223, + 205, 116, 225, 101, 71, 27, 247, 3, 68, 46, 147, 195, 1, 27, 124, 195, 164, + 85, 158, 122, 54, 98, 210, 153, 188, 12, 120, 161, 157, 13, 19, 42, 41, + 120, 173, 206, 180, 193, 178, 217, 48, 198, 23, 80, 34, 229, 93, 177, 15, + 34, 112, 43, 63, 200, 254, 157, 129, 132, 46, 192, 231, 209, 137, 171, 154, + 175, 130, 149, 252, 27, 44, 178, 36, 224, 224, 86, 194, 104, 30, 63, 77, + 135, 77, 233, 224, 98, 76, 91, 59, 206, 133, 202, 212, 255, 226, 76, 150, + 229, 88, 156, 91, 243, 19, 41, 252, 51, 117, 181, 78, 32, 35, 103, 193, 50, + 69, 9, 118, 37, 164, 174, 212, 7, 113, 29, 30, 55, 206, 16, 22, 78, 124, + 119, 159, 79, 184, 255, 2, 151, 165, 54, 161, 6, 238, 85, 200, 233, 199, + 59, 115, 26, 55, 127, 20, 89, 171, 255, 19, 16, 96, 143, 2, 185, 133, 217, + 149, 10, 37, 188, 180, 3, 188, 115, 49, 176, 182, 203, 254, 79, 1, 36, 178, + 59, 211, 209, 180, 83, 251, 239, 196, 254, 142, 60, 138, 169, 56, 18, 86, + 236, 42, 80, 72, 154, 114, 212, 226, 58, 254, 203, 107, 146, 12, 36, 40, + 217, 3, 199, 124, 89, 116, 142, 4, 2, 225, 239, 6, 89, 123, 44, 249, 245, + 47, 229, 121, 43, 187, 236, 152, 162, 9, 42, 242, 162, 196, 112, 213, 63, + 132, 93, 243, 60, 29, 220, 99, 155, 164, 232, 110, 18, 180, 175, 220, 99, + 176, 181, 159, 56, 77, 8, 90, 133, 20, 212, 170, 18, 124, 109, 33, 201, + 133, 56, 255, 202, 222, 193, 62, 243, 233, 71, 218, 119, 157, 32, 166, 161, + 165, 106, 242, 163, 2, 211, 199, 180, 135, 21, 64, 133, 133, 87, 12, 252, + 136, 67, 28, 42, 11, 190, 71, 50, 213, 13, 234, 89, 55, 63, 244, 73, 80, + 12, 17, 236, 183, 2, 131, 0, 124, 150, 134, 248, 209, 15, 221, 26, 178, 42, + 215, 177, 143, 86, 19, 67, 128, 191, 135, 171, 110, 233, 64, 113, 198, 115, + 43, 92, 38, 203, 162, 50, 191, 59, 230, 187, 77, 8, 216, 167, 198, 149, + 104, 61, 82, 249, 22, 102, 10, 199, 96, 106, 61, 133, 215, 134, 52, 128, + 146, 63, 84, 206, 227, 213, 103, 57, 1, 14, 192, 103, 81, 251, 27, 155, + 173, 186, 6, 45, 12, 236, 8, 188, 227, 13, 71, 79, 172, 252, 86, 254, 9, + 89, 5, 136, 58, 178, 124, 56, 204, 118, 26, 217, 145, 72, 110, 163, 79, + 241, 135, 77, 3, 183, 15, 95, 38, 142, 197, 93, 195, 146, 245, 117, 42, + 104, 205, 210, 2, 80, 188, 125, 114, 134, 48, 12, 244, 91, 173, 150, 170, + 244, 180, 208, 215, 116, 205, 127, 183, 175, 25, 89, 47, 168, 180, 35, 16, + 145, 222, 71, 167, 2, 180, 139, 17, 204, 195, 220, 229, 37, 97, 126, 152, + 25, 128, 152, 123, 0, 143, 113, 69, 34, 83, 228, 45, 112, 26, 98, 186, 110, + 131, 156, 45, 206, 179, 110, 12, 49, 127, 247, 202, 200, 209, 91, 3, 195, + 239, 66, 147, 87, 254, 180, 103, 208, 70, 89, 253, 71, 221, 200, 121, 211, + 3, 180, 4, 186, 24, 89, 58, 27, 192, 26, 108, 25, 195, 106, 69, 239, 32, + 130, 127, 187, 127, 26, 107, 82, 117, 35, 50, 118, 11, 39, 85, 49, 14, 151, + 123, 144, 234, 45, 71, 196, 37, 179, 232, 156, 229, 53, 47, 128, 20, 4, + 139, 132, 68, 142, 225, 251, 58, 155, 36, 29, 173, 194, 254, 26, 199, 140, + 46, 122, 2, 230, 117, 112, 106, 101, 157, 97, 19, 151, 51, 37, 33, 235, 56, + 5, 157, 43, 210, 13, 154, 71, 65, 114, 178, 178, 246, 140, 206, 96, 199, + 114, 85, 3, 133, 242, 37, 107, 159, 224, 241, 131, 101, 51, 211, 128, 95, + 192, 223, 112, 117, 126, 73, 149, 193, 14, 133, 170, 52, 215, 184, 84, 25, + 22, 23, 75, 41, 245, 227, 195, 197, 22, 44, 72, 185, 45, 175, 217, 192, + 136, 32, 131, 178, 40, 121, 10, 89, 241, 55, 58, 246, 177, 197, 238, 40, + 160, 210, 247, 75, 76, 13, 120, 252, 166, 131, 104, 50, 135, 120, 134, 204, + 117, 191, 51, 63, 190, 161, 48, 143, 66, 115, 216, 35, 46, 241, 68, 95, + 202, 118, 101, 238, 25, 247, 114, 141, 223, 87, 103, 139, 126, 164, 64, + 150, 177, 252, 16, 216, 98, 250, 0, 254, 229, 50, 71, 123, 16, 2, 125, 212, + 154, 143, 127, 2, 106, 24, 181, 215, 119, 124, 43, 48, 207, 35, 19, 123, + 71, 92, 145, 253, 247, 212, 105, 103, 5, 235, 91, 208, 213, 94, 69, 250, 2, + 187, 148, 90, 2, 241, 246, 82, 3, 64, 201, 110, 50, 167, 91, 153, 224, 213, + 71, 126, 180, 189, 189, 150, 156, 237, 7, 217, 224, 229, 215, 51, 206, 117, + 65, 105, 36, 108, 124, 240, 90, 0, 176, 193, 64, 202, 134, 7, 100, 123, 60, + 147, 2, 207, 139, 235, 207, 124, 225, 171, 109, 137, 59, 52, 176, 120, 242, + 80, 8, 235, 62, 88, 55, 243, 173, 131, 28, 204, 32, 213, 155, 203, 27, 144, + 229, 123, 112, 161, 63, 63, 173, 118, 160, 84, 31, 160, 1, 249, 242, 215, + 204, 99, 181, 183, 189, 12, 251, 134, 31, 146, 19, 148, 233, 56, 234, 151, + 186, 5, 106, 194, 156, 118, 124, 51, 207, 54, 230, 105, 158, 182, 123, 237, + 114, 2, 59, 210, 93, 188, 8, 123, 247, 224, 173, 148, 251, 22, 165, 4, 246, + 185, 144, 98, 136, 198, 188, 100, 6, 226, 147, 194, 0, 129, 155, 17, 5, + 177, 3, 189, 60, 190, 178, 238, 190, 26, 7, 84, 93, 96, 133, 36, 213, 220, + 236, 51, 120, 6, 245, 104, 20, 24, 36, 226, 31, 230, 102, 86, 11, 119, 154, + 152, 104, 212, 11, 128, 123, 193, 239, 17, 30, 63, 88, 235, 1, 79, 190, 54, + 68, 118, 199, 220, 156, 36, 107, 113, 43, 183, 119, 67, 249, 195, 69, 29, + 39, 95, 21, 201, 76, 202, 43, 171, 140, 93, 13, 156, 93, 70, 238, 112, 215, + 30, 175, 41, 134, 23, 45, 90, 2, 29, 69, 157, 212, 88, 138, 6, 54, 2, 39, + 132, 50, 139, 243, 98, 68, 172, 91, 24, 115, 64, 64, 195, 193, 173, 156, + 25, 117, 33, 253, 202, 174, 219, 225, 29, 190, 96, 233, 3, 86, 96, 77, 122, + 18, 63, 98, 30, 108, 113, 224, 86, 180, 116, 135, 145, 217, 90, 224, 2, 68, + 174, 15, 90, 119, 252, 99, 13, 72, 72, 74, 16, 2, 167, 94, 138, 165, 16, + 164, 144, 77, 39, 89, 119, 136, 65, 209, 61, 184, 212, 81, 103, 13, 199, + 192, 77, 196, 222, 62, 120, 133, 193, 87, 39, 128, 120, 100, 84, 156, 168, + 21, 169, 172, 204, 153, 138, 49, 189, 122, 182, 228, 94, 62, 79, 151, 81, + 50, 225, 195, 167, 231, 46, 61, 172, 57, 232, 216, 58, 248, 45, 95, 210, + 58, 2, 6, 50, 213, 229, 24, 79, 173, 144, 113, 9, 233, 67, 248, 12, 155, + 233, 197, 80, 61, 255, 30, 194, 92, 22, 45, 175, 146, 223, 197, 16, 169, + 172, 190, 92, 181, 20, 110, 64, 131, 235, 165, 98, 51, 21, 36, 117, 95, + 183, 122, 2, 182, 59, 212, 186, 100, 32, 16, 3, 231, 112, 111, 135, 159, + 124, 20, 63, 24, 52, 229, 52, 56, 186, 160, 135, 251, 51, 174, 45, 235, + 176, 164, 139, 133, 107, 59, 180, 245, 55, 170, 202, 3, 251, 97, 158, 36, + 237, 144, 202, 233, 187, 145, 108, 22, 140, 190, 241, 247, 114, 150, 162, + 177, 80, 149, 189, 234, 36, 107, 243, 95, 86, 33, 181, 7, 88, 4, 81, 16, + 55, 131, 19, 206, 212, 90, 13, 44, 35, 34, 13, 250, 173, 37, 107, 126, 178, + 118, 143, 203, 213, 172, 168, 192, 18, 149, 169, 157, 242, 97, 231, 107, + 124, 21, 231, 88, 71, 53, 110, 33, 60, 23, 179, 4, 141, 213, 146, 16, 111, + 255, 179, 34, 96, 211, 195, 188, 207, 1, 87, 116, 65, 140, 199, 17, 236, + 51, 107, 55, 173, 67, 75, 120, 202, 179, 61, 138, 247, 56, 195, 108, 206, + 142, 6, 81, 166, 48, 28, 101, 127, 57, 24, 236, 3, 170, 220, 24, 1, 136, + 159, 152, 85, 180, 207, 12, 14, 37, 198, 202, 144, 189, 76, 68, 47, 252, + 51, 17, 189, 10, 73, 86, 199, 105, 47, 101, 15, 2, 13, 99, 27, 132, 33, 85, + 0, 74, 211, 4, 145, 22, 146, 20, 112, 79, 224, 112, 244, 16, 107, 177, 50, + 151, 108, 119, 67, 3, 47, 217, 210, 210, 31, 106, 229, 43, 53, 172, 231, 7, + 137, 78, 67, 89, 221, 174, 200, 48, 191, 246, 122, 116, 195, 94, 35, 76, + 44, 217, 98, 72, 255, 75, 47, 109, 187, 127, 26, 221, 65, 77, 100, 85, 253, + 194, 98, 76, 54, 186, 25, 101, 35, 209, 222, 111, 96, 67, 214, 58, 133, 76, + 134, 66, 161, 198, 137, 39, 234, 230, 171, 13, 97, 122, 46, 71, 168, 7, 2, + 221, 42, 131, 119, 50, 212, 209, 16, 40, 141, 72, 110, 30, 38, 248, 207, + 170, 182, 75, 31, 53, 2, 176, 171, 126, 149, 231, 99, 212, 44, 98, 221, + 133, 116, 69, 214, 202, 13, 6, 7, 87, 50, 146, 209, 143, 39, 207, 232, 180, + 49, 226, 17, 18, 137, 3, 75, 141, 216, 19, 141, 212, 84, 132, 41, 70, 88, + 49, 75, 103, 37, 3, 150, 174, 228, 95, 116, 194, 169, 132, 78, 149, 219, + 97, 57, 172, 252, 1, 106, 253, 41, 151, 132, 100, 245, 233, 32, 59, 210, + 233, 6, 117, 214, 218, 25, 106, 20, 201, 60, 83, 239, 207, 78, 114, 244, + 59, 145, 90, 130, 47, 137, 221, 222, 88, 34, 74, 222, 250, 124, 203, 210, + 56, 25, 215, 121, 207, 170, 62, 129, 163, 61, 166, 57, 204, 79, 104, 232, + 169, 126, 247, 6, 243, 64, 16, 131, 184, 182, 243, 244, 194, 181, 135, 137, + 1, 11, 178, 247, 248, 247, 74, 163, 70, 136, 39, 30, 112, 86, 204, 148, + 162, 167, 143, 206, 25, 3, 53, 170, 62, 228, 6, 13, 204, 113, 152, 70, 157, + 165, 45, 187, 62, 101, 17, 8, 170, 174, 32, 144, 117, 117, 87, 103, 50, + 109, 178, 182, 27, 147, 3, 109, 89, 16, 174, 194, 45, 122, 128, 160, 66, + 165, 251, 254, 146, 119, 225, 159, 191, 61, 68, 60, 240, 9, 175, 239, 13, + 129, 217, 27, 110, 65, 213, 97, 158, 116, 172, 100, 246, 249, 234, 89, 67, + 115, 192, 197, 126, 138, 11, 100, 243, 79, 76, 190, 195, 160, 160, 195, 14, + 253, 169, 89, 138, 4, 238, 35, 151, 195, 81, 102, 132, 253, 158, 63, 110, + 190, 77, 140, 128, 37, 85, 137, 210, 156, 198, 223, 170, 46, 180, 15, 59, + 161, 9, 188, 239, 86, 250, 205, 89, 116, 9, 31, 243, 165, 168, 143, 66, + 169, 211, 199, 38, 136, 214, 121, 24, 89, 233, 35, 255, 213, 71, 120, 32, + 189, 72, 218, 189, 1, 96, 3, 93, 219, 192, 224, 14, 83, 127, 226, 219, 226, + 6, 159, 151, 196, 127, 205, 236, 197, 16, 60, 245, 31, 18, 93, 97, 177, + 211, 125, 82, 54, 212, 61, 3, 242, 178, 38, 99, 1, 72, 166, 94, 88, 243, + 238, 15, 109, 58, 135, 98, 146, 222, 103, 159, 109, 176, 85, 63, 71, 247, + 47, 228, 216, 147, 128, 47, 22, 147, 170, 173, 171, 123, 70, 88, 213, 173, + 180, 197, 118, 55, 203, 22, 138, 46, 76, 112, 35, 98, 94, 140, 135, 204, + 145, 97, 183, 33, 44, 27, 15, 35, 235, 186, 182, 19, 203, 217, 33, 153, + 171, 36, 185, 174, 58, 178, 29, 31, 32, 21, 213, 140, 250, 116, 121, 37, + 135, 190, 33, 212, 31, 131, 173, 236, 196, 94, 131, 1, 9, 65, 122, 236, 95, + 97, 40, 53, 111, 145, 254, 215, 113, 155, 196, 228, 125, 184, 85, 196, 64, + 95, 110, 218, 132, 73, 2, 226, 171, 5, 101, 229, 254, 51, 253, 64, 131, 56, + 147, 86, 157, 242, 240, 103, 63, 253, 9, 103, 179, 57, 92, 131, 8, 126, + 106, 54, 5, 69, 82, 2, 179, 200, 64, 245, 245, 176, 42, 241, 78, 251, 150, + 217, 180, 21, 187, 39, 30, 158, 82, 211, 99, 47, 243, 176, 177, 129, 129, + 182, 91, 71, 9, 134, 255, 64, 174, 52, 111, 184, 199, 178, 95, 26, 195, 28, + 255, 64, 218, 64, 34, 127, 3, 21, 62, 237, 175, 255, 169, 58, 115, 205, + 139, 87, 56, 31, 207, 129, 170, 164, 237, 58, 15, 0, 55, 209, 245, 34, 221, + 239, 136, 255, 209, 30, 198, 82, 27, 207, 118, 39, 162, 129, 243, 134, 206, + 10, 218, 237, 242, 236, 202, 74, 218, 248, 192, 116, 201, 118, 206, 221, + 63, 151, 216, 87, 13, 202, 10, 173, 120, 218, 233, 133, 111, 22, 250, 226, + 174, 213, 168, 21, 3, 210, 195, 27, 206, 137, 111, 99, 133, 196, 250, 90, + 18, 44, 123, 19, 178, 225, 177, 134, 100, 51, 226, 43, 19, 93, 50, 253, + 172, 77, 51, 71, 49, 3, 160, 58, 151, 31, 198, 129, 118, 138, 215, 226, + 107, 48, 182, 130, 225, 136, 21, 22, 23, 120, 234, 7, 89, 203, 58, 182, + 221, 88, 127, 213, 174, 232, 251, 182, 57, 156, 32, 70, 35, 44, 98, 203, + 106, 148, 6, 109, 94, 136, 198, 232, 186, 142, 241, 217, 96, 206, 29, 44, + 177, 89, 190, 70, 201, 37, 172, 157, 3, 8, 13, 229, 26, 5, 178, 12, 8, 5, + 126, 57, 189, 144, 228, 2, 39, 147, 241, 217, 219, 23, 63, 125, 189, 106, + 226, 3, 145, 10, 198, 76, 123, 3, 68, 239, 154, 204, 90, 222, 197, 61, 215, + 43, 7, 59, 0, 235, 80, 159, 66, 121, 66, 63, 13, 214, 30, 96, 147, 110, 55, + 79, 3, 219, 62, 100, 211, 205, 34, 48, 168, 196, 45, 70, 86, 25, 241, 31, + 12, 135, 249, 75, 26, 42, 160, 76, 82, 17, 87, 127, 247, 226, 107, 115, + 158, 2, 3, 181, 62, 87, 165, 131, 167, 178, 109, 90, 205, 185, 169, 216, 5, + 139, 136, 154, 154, 126, 74, 69, 11, 46, 142, 231, 183, 41, 161, 157, 86, + 145, 42, 127, 126, 76, 112, 44, 158, 206, 77, 47, 115, 204, 18, 150, 206, + 68, 57, 251, 20, 188, 135, 243, 2, 108, 97, 94, 5, 148, 251, 159, 229, 198, + 86, 197, 223, 200, 240, 245, 203, 198, 52, 158, 219, 78, 40, 2, 184, 11, + 136, 249, 49, 14, 146, 199, 129, 130, 210, 221, 195, 188, 35, 107, 251, + 127, 106, 205, 232, 144, 206, 210, 19, 27, 33, 75, 65, 106, 36, 240, 109, + 183, 6, 110, 218, 38, 121, 95, 58, 94, 32, 182, 91, 165, 135, 81, 12, 2, 3, + 87, 92, 25, 51, 39, 51, 231, 183, 34, 73, 208, 52, 81, 14, 186, 101, 211, + 137, 203, 48, 22, 54, 119, 177, 55, 170, 22, 234, 42, 170, 173, 228, 3, 67, + 3, 9, 94, 164, 163, 27, 183, 222, 121, 141, 29, 40, 72, 252, 96, 73, 133, + 247, 240, 95, 143, 57, 167, 91, 222, 223, 140, 87, 89, 165, 16, 225, 198, + 195, 189, 54, 117, 109, 182, 202, 218, 4, 236, 31, 232, 43, 62, 112, 214, + 49, 170, 45, 204, 5, 180, 105, 240, 119, 165, 59, 47, 199, 225, 111, 202, + 229, 44, 140, 56, 225, 92, 91, 38, 35, 203, 39, 109, 55, 187, 85, 85, 194, + 212, 101, 251, 128, 232, 167, 109, 69, 113, 4, 254, 74, 170, 58, 212, 190, + 52, 236, 105, 65, 95, 245, 169, 65, 124, 234, 77, 53, 169, 234, 90, 94, + 140, 26, 77, 196, 197, 115, 208, 7, 244, 46, 202, 116, 168, 3, 224, 36, + 216, 206, 135, 111, 74, 157, 66, 20, 9, 117, 154, 139, 129, 43, 75, 96, 96, + 186, 126, 217, 82, 130, 73, 239, 43, 81, 184, 147, 219, 14, 2, 198, 245, + 128, 42, 61, 252, 118, 187, 117, 77, 250, 117, 181, 84, 168, 107, 215, 64, + 137, 178, 247, 135, 91, 44, 9, 189, 0, 73, 80, 226, 83, 253, 130, 49, 198, + 25, 119, 248, 11, 232, 1, 198, 143, 160, 107, 192, 49, 36, 34, 195, 51, + 154, 231, 165, 51, 206, 162, 120, 141, 119, 153, 66, 190, 49, 114, 213, 14, + 18, 176, 108, 184, 122, 145, 252, 35, 250, 12, 200, 53, 43, 58, 26, 182, + 132, 159, 19, 111, 59, 222, 158, 96, 18, 78, 202, 229, 194, 11, 204, 148, + 42, 63, 112, 4, 48, 81, 179, 229, 187, 190, 202, 52, 1, 221, 205, 237, 37, + 155, 5, 187, 83, 252, 101, 118, 153, 68, 115, 225, 49, 2, 127, 68, 255, 18, + 45, 117, 85, 194, 86, 49, 114, 214, 222, 164, 210, 237, 181, 202, 240, 91, + 240, 21, 37, 209, 59, 117, 185, 160, 251, 39, 98, 205, 3, 122, 92, 233, + 243, 78, 210, 199, 119, 211, 90, 242, 21, 0, 221, 246, 41, 226, 90, 167, + 54, 72, 216, 174, 236, 141, 167, 43, 237, 87, 12, 174, 171, 191, 31, 174, + 74, 77, 113, 142, 5, 28, 102, 52, 187, 8, 167, 118, 84, 167, 12, 56, 244, + 16, 221, 145, 18, 12, 92, 227, 86, 13, 174, 88, 241, 146, 121, 123, 158, + 234, 63, 208, 76, 169, 67, 135, 242, 103, 28, 207, 116, 234, 197, 121, 37, + 26, 161, 185, 201, 149, 165, 77, 186, 4, 53, 107, 115, 105, 35, 51, 208, + 188, 144, 163, 178, 74, 154, 10, 20, 32, 190, 90, 109, 168, 151, 44, 221, + 47, 227, 53, 48, 130, 73, 159, 25, 157, 203, 79, 236, 2, 220, 159, 163, 70, + 36, 2, 36, 7, 67, 148, 22, 153, 84, 106, 13, 210, 43, 228, 79, 151, 118, + 84, 15, 217, 33, 182, 82, 39, 105, 78, 36, 218, 2, 208, 45, 91, 187, 18, + 63, 230, 200, 141, 77, 89, 60, 235, 235, 123, 51, 108, 207, 42, 74, 201, + 29, 233, 234, 86, 35, 225, 247, 106, 57, 174, 250, 3, 32, 228, 92, 219, + 183, 95, 170, 253, 255, 141, 93, 145, 2, 14, 90, 56, 93, 15, 139, 19, 233, + 225, 45, 115, 210, 176, 44, 79, 2, 137, 152, 32, 180, 180, 130, 148, 181, + 229, 254, 169, 67, 44, 178, 81, 142, 123, 34, 106, 114, 57, 107, 107, 63, + 30, 138, 140, 107, 124, 5, 196, 253, 99, 60, 220, 3, 55, 217, 133, 137, + 210, 75, 154, 196, 48, 123, 109, 156, 229, 38, 193, 213, 138, 95, 110, 13, + 153, 252, 40, 90, 255, 24, 232, 249, 60, 19, 2, 42, 114, 90, 4, 224, 224, + 52, 146, 44, 223, 79, 214, 255, 118, 180, 119, 252, 116, 84, 100, 236, 196, + 151, 141, 243, 4, 222, 54, 132, 90, 45, 159, 3, 164, 170, 41, 37, 99, 29, + 111, 92, 110, 247, 18, 239, 207, 245, 220, 52, 236, 101, 70, 58, 251, 73, + 140, 66, 7, 84, 184, 75, 63, 245, 19, 193, 159, 102, 26, 121, 152, 200, 78, + 203, 234, 22, 0, 84, 220, 118, 241, 186, 21, 19, 193, 108, 41, 194, 93, 76, + 220, 13, 57, 66, 199, 156, 189, 149, 59, 106, 209, 242, 53, 115, 55, 62, + 211, 117, 138, 130, 243, 47, 154, 33, 92, 219, 185, 7, 58, 116, 207, 73, + 163, 105, 87, 5, 61, 77, 95, 61, 158, 205, 144, 57, 190, 210, 13, 134, 234, + 144, 203, 77, 87, 6, 175, 230, 146, 9, 114, 207, 77, 141, 98, 224, 116, + 241, 166, 72, 71, 227, 13, 140, 2, 62, 207, 252, 15, 181, 153, 142, 244, + 251, 41, 90, 76, 31, 33, 101, 156, 61, 85, 115, 66, 77, 140, 89, 242, 84, + 57, 26, 219, 246, 27, 219, 174, 3, 49, 47, 233, 188, 22, 51, 95, 56, 253, + 55, 107, 151, 209, 94, 104, 217, 65, 163, 26, 232, 246, 99, 70, 105, 84, + 16, 252, 217, 65, 79, 120, 185, 24, 49, 166, 26, 174, 26, 5, 112, 19, 48, + 208, 28, 97, 223, 181, 38, 187, 94, 10, 252, 97, 83, 20, 218, 239, 178, + 164, 20, 216, 154, 70, 132, 91, 163, 133, 173, 60, 65, 12, 134, 166, 246, + 145, 158, 17, 55, 38, 156, 69, 253, 111, 162, 145, 249, 204, 162, 157, 56, + 240, 67, 23, 54, 78, 77, 174, 29, 192, 184, 224, 97, 18, 35, 143, 80, 216, + 151, 135, 28, 47, 220, 87, 70, 241, 50, 151, 79, 35, 213, 165, 51, 206, + 255, 250, 154, 98, 161, 3, 38, 165, 32, 90, 168, 252, 99, 165, 218, 5, 66, + 119, 39, 213, 252, 161, 237, 94, 36, 227, 150, 46, 178, 78, 55, 230, 180, + 127, 25, 70, 150, 113, 3, 225, 200, 130, 142, 221, 185, 75, 234, 85, 37, + 239, 118, 207, 99, 0, 180, 120, 82, 110, 179, 20, 202, 179, 189, 236, 89, + 212, 239, 236, 33, 35, 195, 83, 117, 113, 141, 170, 67, 129, 150, 94, 32, + 169, 66, 149, 7, 220, 37, 4, 3, 85, 27, 13, 30, 24, 234, 24, 104, 164, 185, + 54, 34, 48, 126, 255, 134, 183, 202, 149, 3, 247, 28, 252, 145, 36, 102, + 182, 232, 37, 129, 125, 132, 46, 158, 124, 131, 31, 166, 86, 28, 154, 210, + 127, 193, 58, 196, 38, 98, 165, 83, 73, 200, 111, 234, 255, 172, 134, 161, + 215, 127, 27, 78, 200, 217, 188, 143, 152, 196, 186, 118, 88, 204, 179, 16, + 162, 197, 17, 213, 2, 128, 177, 203, 53, 249, 119, 216, 146, 102, 56, 106, + 95, 249, 207, 128, 36, 196, 129, 159, 13, 13, 64, 33, 97, 133, 102, 35, + 101, 1, 36, 192, 207, 2, 168, 39, 27, 118, 218, 211, 3, 209, 199, 45, 165, + 160, 219, 98, 86, 112, 99, 236, 220, 17, 81, 210, 31, 51, 245, 34, 65, 207, + 32, 153, 64, 142, 202, 109, 103, 20, 245, 39, 37, 191, 94, 57, 45, 18, 194, + 34, 83, 19, 124, 166, 30, 238, 184, 170, 221, 149, 11, 130, 174, 225, 78, + 239, 186, 17, 32, 25, 244, 19, 135, 125, 83, 98, 75, 166, 172, 60, 1, 244, + 102, 163, 133, 176, 208, 171, 52, 231, 173, 0, 173, 185, 190, 251, 6, 54, + 21, 118, 65, 63, 201, 55, 68, 91, 203, 176, 18, 70, 119, 90, 229, 220, 195, + 49, 45, 197, 49, 172, 179, 196, 186, 41, 38, 234, 118, 214, 35, 9, 111, + 232, 2, 180, 86, 117, 22, 87, 167, 53, 40, 249, 97, 103, 127, 182, 131, + 203, 54, 2, 214, 88, 217, 208, 67, 80, 253, 182, 193, 6, 61, 186, 66, 123, + 109, 3, 31, 146, 156, 170, 252, 113, 44, 16, 5, 54, 172, 10, 255, 47, 197, + 159, 197, 129, 199, 159, 2, 103, 40, 31, 76, 99, 115, 163, 190, 19, 90, + 176, 80, 183, 210, 85, 54, 78, 46, 85, 26, 18, 78, 247, 98, 211, 118, 22, + 162, 201, 197, 70, 6, 217, 106, 111, 20, 28, 124, 130, 221, 107, 251, 210, + 64, 205, 196, 66, 195, 122, 145, 121, 175, 91, 212, 93, 123, 31, 38, 84, + 248, 159, 119, 68, 186, 183, 184, 239, 78, 105, 83, 33, 103, 163, 49, 140, + 163, 133, 158, 207, 177, 116, 152, 132, 211, 202, 23, 221, 62, 136, 188, + 165, 192, 251, 30, 0, 190, 56, 214, 35, 127, 110, 206, 1, 30, 122, 11, 186, + 2, 107, 160, 53, 211, 239, 58, 95, 99, 129, 163, 200, 15, 68, 199, 212, 97, + 0, 230, 87, 84, 180, 22, 136, 218, 159, 131, 73, 201, 70, 133, 21, 61, 3, + 239, 65, 72, 158, 123, 4, 222, 223, 23, 15, 54, 68, 128, 116, 187, 173, + 189, 19, 35, 88, 98, 230, 52, 253, 110, 62, 144, 211, 13, 204, 167, 34, + 135, 253, 234, 127, 105, 236, 115, 111, 97, 199, 166, 119, 161, 179, 174, + 217, 229, 184, 176, 108, 199, 134, 137, 138, 18, 80, 97, 243, 227, 166, 72, + 116, 149, 212, 255, 140, 23, 178, 118, 240, 162, 176, 190, 177, 185, 32, + 195, 166, 99, 246, 45, 81, 36, 133, 56, 38, 55, 219, 217, 38, 144, 107, 82, + 40, 90, 103, 91, 171, 87, 75, 244, 238, 60, 64, 205, 42, 251, 247, 6, 155, + 115, 149, 137, 236, 137, 179, 119, 118, 47, 139, 175, 23, 9, 91, 12, 236, + 2, 203, 129, 186, 96, 102, 2, 218, 15, 122, 101, 36, 219, 137, 217, 133, + 123, 210, 151, 172, 205, 141, 164, 119, 21, 29, 128, 123, 227, 172, 145, + 166, 251, 3, 52, 139, 107, 102, 238, 147, 95, 169, 60, 52, 162, 76, 185, + 61, 192, 213, 35, 151, 205, 50, 238, 24, 244, 55, 98, 147, 58, 116, 45, + 219, 129, 46, 95, 67, 75, 190, 243, 200, 103, 195, 246, 75, 87, 222, 220, + 132, 76, 112, 30, 74, 214, 80, 17, 11, 85, 138, 22, 125, 38, 137, 33, 183, + 91, 29, 103, 213, 246, 244, 215, 92, 234, 208, 204, 242, 214, 241, 193, + 253, 158, 9, 30, 115, 129, 12, 37, 83, 217, 230, 141, 234, 161, 147, 233, + 181, 87, 209, 236, 243, 42, 55, 158, 117, 234, 85, 95, 104, 242, 69, 240, + 190, 110, 73, 32, 207, 82, 173, 49, 26, 28, 240, 40, 147, 81, 170, 203, 43, + 242, 92, 2, 227, 144, 235, 119, 166, 73, 103, 152, 44, 164, 172, 255, 111, + 99, 39, 66, 202, 245, 3, 6, 137, 235, 128, 87, 173, 82, 10, 77, 105, 157, + 156, 110, 2, 43, 75, 114, 0, 163, 33, 199, 98, 197, 1, 104, 69, 207, 200, + 170, 226, 52, 80, 67, 48, 67, 253, 91, 185, 118, 167, 169, 219, 62, 177, + 163, 98, 220, 26, 94, 205, 195, 178, 219, 175, 89, 125, 175, 11, 246, 158, + 118, 18, 45, 231, 213, 240, 216, 46, 47, 136, 42, 201, 27, 240, 168, 79, + 60, 109, 231, 220, 167, 82, 194, 195, 159, 48, 45, 63, 202, 192, 34, 124, + 64, 83, 41, 141, 61, 150, 191, 23, 54, 192, 237, 64, 105, 33, 93, 157, 244, + 155, 136, 195, 77, 182, 250, 79, 26, 52, 3, 180, 55, 177, 206, 72, 157, + 138, 72, 171, 137, 174, 222, 187, 188, 126, 30, 6, 71, 215, 189, 218, 59, + 180, 2, 221, 208, 190, 34, 172, 210, 43, 89, 207, 233, 62, 123, 18, 44, + 115, 169, 63, 30, 2, 244, 44, 28, 107, 195, 179, 36, 111, 27, 177, 143, 43, + 179, 2, 2, 43, 167, 75, 86, 250, 162, 20, 118, 198, 211, 38, 87, 101, 235, + 171, 143, 104, 244, 79, 23, 73, 34, 68, 141, 251, 31, 30, 224, 203, 165, + 181, 21, 165, 18, 9, 94, 9, 146, 104, 20, 81, 196, 79, 26, 144, 21, 134, 0, + 48, 93, 131, 101, 51, 163, 174, 34, 167, 161, 171, 135, 55, 241, 161, 141, + 232, 244, 108, 242, 111, 227, 105, 246, 49, 223, 70, 213, 173, 255, 246, + 132, 252, 209, 37, 13, 202, 32, 141, 16, 250, 57, 146, 237, 166, 112, 78, + 166, 199, 237, 145, 218, 175, 219, 168, 4, 209, 217, 7, 211, 12, 102, 253, + 18, 125, 144, 13, 108, 78, 41, 133, 82, 161, 254, 237, 216, 90, 222, 34, 2, + 46, 161, 122, 252, 159, 231, 155, 94, 52, 171, 84, 217, 215, 72, 18, 49, + 252, 168, 217, 45, 213, 86, 41, 81, 227, 165, 174, 141, 38, 176, 83, 44, 2, + 54, 204, 22, 162, 39, 179, 62, 76, 230, 61, 24, 236, 135, 91, 193, 222, 65, + 64, 123, 162, 166, 225, 49, 228, 88, 236, 141, 96, 138, 91, 5, 84, 54, 118, + 130, 70, 42, 208, 149, 250, 193, 212, 119, 199, 226, 77, 91, 211, 194, 0, + 55, 15, 23, 183, 218, 181, 71, 31, 100, 70, 35, 50, 141, 150, 11, 147, 250, + 174, 244, 51, 58, 189, 233, 246, 22, 149, 239, 72, 104, 121, 5, 79, 87, 2, + 200, 164, 90, 237, 157, 251, 248, 85, 229, 103, 217, 59, 100, 189, 223, + 240, 125, 30, 25, 193, 57, 206, 191, 170, 148, 73, 177, 188, 13, 245, 211, + 75, 2, 10, 204, 243, 79, 162, 152, 116, 3, 240, 151, 9, 2, 38, 96, 98, 225, + 2, 242, 50, 65, 161, 113, 76, 116, 36, 162, 235, 224, 230, 154, 37, 103, + 205, 187, 207, 176, 231, 87, 57, 206, 26, 51, 39, 230, 3, 151, 205, 62, + 166, 250, 67, 74, 254, 37, 157, 107, 246, 13, 114, 147, 49, 214, 35, 107, + 41, 145, 37, 44, 114, 4, 143, 171, 105, 246, 212, 166, 223, 153, 177, 245, + 158, 67, 244, 63, 60, 43, 7, 64, 154, 88, 32, 124, 101, 232, 242, 68, 192, + 57, 230, 193, 181, 57, 235, 142, 76, 134, 233, 124, 122, 72, 79, 116, 238, + 12, 122, 234, 228, 85, 66, 64, 170, 57, 78, 109, 232, 230, 49, 218, 165, + 58, 137, 102, 115, 105, 18, 73, 203, 99, 137, 172, 180, 169, 206, 3, 169, + 78, 94, 74, 160, 41, 33, 131, 60, 192, 134, 134, 88, 149, 55, 32, 112, 113, + 106, 28, 40, 115, 197, 227, 140, 160, 63, 38, 84, 3, 11, 73, 8, 230, 174, + 47, 12, 144, 183, 97, 34, 118, 179, 105, 37, 42, 93, 26, 1, 233, 197, 166, + 193, 219, 50, 215, 222, 10, 218, 78, 222, 156, 3, 87, 236, 202, 134, 117, + 216, 156, 27, 205, 88, 43, 53, 135, 200, 142, 21, 135, 205, 150, 87, 191, + 32, 221, 41, 84, 221, 156, 253, 239, 205, 123, 223, 249, 38, 201, 55, 84, + 128, 143, 99, 7, 35, 242, 172, 216, 28, 63, 231, 145, 252, 112, 225, 14, + 175, 37, 196, 124, 214, 17, 52, 116, 81, 86, 209, 69, 223, 5, 159, 150, + 111, 201, 77, 219, 60, 160, 30, 51, 109, 120, 96, 157, 232, 161, 141, 105, + 73, 4, 86, 54, 121, 236, 245, 133, 126, 21, 174, 172, 34, 165, 222, 181, + 234, 42, 133, 206, 170, 202, 196, 249, 100, 146, 208, 60, 128, 205, 12, + 216, 187, 112, 50, 100, 245, 247, 189, 155, 252, 248, 3, 3, 101, 25, 33, + 106, 42, 215, 190, 191, 30, 112, 177, 45, 152, 227, 193, 107, 243, 38, 244, + 78, 27, 28, 105, 210, 49, 233, 165, 209, 160, 182, 211, 142, 2, 123, 160, + 233, 134, 79, 57, 71, 111, 7, 110, 244, 236, 17, 170, 27, 33, 177, 239, 83, + 145, 239, 76, 140, 99, 238, 211, 23, 83, 85, 26, 8, 22, 253, 131, 154, 128, + 100, 143, 242, 243, 165, 9, 48, 239, 132, 23, 91, 22, 59, 214, 145, 37, + 255, 218, 154, 219, 227, 89, 12, 110, 169, 178, 108, 31, 116, 241, 42, 49, + 178, 247, 209, 85, 67, 110, 149, 184, 109, 210, 177, 251, 234, 98, 238, 38, + 130, 241, 66, 143, 28, 141, 95, 83, 12, 213, 195, 75, 50, 92, 164, 248, 89, + 108, 12, 248, 119, 153, 155, 234, 224, 29, 90, 158, 153, 16, 242, 20, 66, + 99, 195, 58, 37, 11, 187, 65, 81, 249, 27, 236, 2, 36, 120, 39, 191, 248, + 252, 240, 104, 232, 136, 115, 141, 9, 190, 51, 15, 189, 10, 194, 118, 7, + 183, 71, 110, 106, 68, 7, 52, 6, 157, 214, 105, 3, 100, 160, 238, 83, 207, + 160, 223, 84, 204, 166, 143, 30, 18, 203, 146, 144, 15, 109, 232, 31, 126, + 12, 245, 25, 141, 244, 47, 55, 74, 239, 136, 177, 188, 165, 132, 30, 97, + 209, 159, 221, 9, 68, 240, 28, 243, 140, 8, 51, 124, 242, 158, 198, 3, 66, + 21, 68, 220, 130, 251, 128, 88, 1, 76, 206, 240, 165, 254, 6, 12, 186, 30, + 66, 73, 71, 87, 30, 29, 236, 229, 15, 18, 83, 138, 117, 118, 149, 17, 78, + 188, 215, 173, 34, 60, 101, 4, 71, 222, 252, 67, 175, 119, 7, 161, 220, + 117, 8, 37, 170, 220, 249, 37, 219, 174, 93, 189, 31, 41, 229, 22, 202, + 159, 100, 1, 3, 100, 196, 110, 239, 3, 223, 1, 199, 135, 54, 48, 193, 117, + 136, 98, 121, 104, 215, 252, 184, 194, 128, 247, 160, 135, 79, 185, 4, 4, + 155, 165, 250, 117, 94, 152, 104, 30, 3, 126, 243, 107, 47, 216, 59, 152, + 186, 198, 153, 14, 109, 82, 239, 85, 95, 59, 139, 172, 237, 31, 75, 34, + 146, 5, 77, 118, 118, 142, 3, 93, 64, 126, 88, 138, 237, 145, 228, 245, + 155, 178, 12, 30, 42, 209, 78, 236, 26, 218, 143, 160, 62, 235, 18, 205, + 144, 136, 132, 42, 179, 149, 132, 93, 49, 249, 152, 180, 131, 115, 163, + 139, 50, 60, 68, 202, 26, 87, 217, 185, 1, 64, 57, 222, 136, 178, 21, 245, + 181, 78, 232, 23, 15, 174, 39, 153, 22, 117, 242, 219, 54, 115, 55, 27, + 236, 133, 52, 235, 99, 13, 119, 77, 19, 5, 7, 41, 22, 3, 140, 202, 138, + 160, 161, 116, 5, 65, 254, 148, 58, 3, 91, 143, 120, 167, 106, 231, 176, + 62, 143, 70, 111, 25, 153, 152, 36, 146, 96, 152, 50, 128, 62, 38, 219, + 243, 217, 125, 182, 182, 46, 184, 71, 7, 3, 117, 128, 110, 101, 98, 68, + 123, 192, 34, 18, 35, 137, 105, 108, 131, 125, 137, 8, 147, 61, 61, 133, + 113, 111, 81, 148, 14, 117, 79, 54, 108, 202, 116, 144, 66, 25, 226, 231, + 7, 233, 114, 3, 4, 186, 209, 157, 66, 64, 29, 110, 227, 193, 214, 215, 74, + 102, 101, 109, 141, 240, 91, 196, 5, 118, 202, 108, 23, 72, 66, 121, 210, + 145, 160, 248, 225, 143, 152, 49, 75, 151, 196, 174, 225, 204, 33, 255, 91, + 182, 8, 75, 186, 9, 119, 36, 203, 173, 149, 9, 30, 119, 57, 42, 80, 112, + 156, 160, 186, 57, 134, 113, 73, 127, 132, 245, 12, 248, 15, 106, 90, 61, + 118, 63, 18, 154, 79, 35, 122, 148, 3, 77, 55, 85, 27, 190, 211, 198, 66, + 203, 31, 19, 206, 21, 27, 7, 243, 197, 98, 122, 187, 215, 234, 130, 53, 23, + 166, 117, 50, 213, 241, 177, 37, 3, 64, 96, 44, 60, 99, 28, 13, 2, 153, + 119, 119, 18, 238, 3, 187, 2, 70, 229, 131, 159, 10, 79, 196, 196, 26, 199, + 80, 40, 63, 29, 21, 127, 183, 80, 12, 20, 62, 57, 14, 205, 239, 234, 146, + 136, 142, 32, 164, 135, 194, 34, 58, 152, 29, 210, 62, 115, 255, 237, 235, + 157, 153, 244, 126, 92, 231, 95, 43, 73, 45, 143, 19, 147, 16, 76, 102, 85, + 233, 231, 58, 166, 33, 241, 42, 56, 217, 246, 94, 34, 210, 83, 155, 241, + 197, 87, 17, 33, 62, 59, 173, 119, 102, 141, 46, 130, 234, 42, 7, 16, 188, + 128, 94, 185, 35, 184, 179, 153, 89, 243, 240, 50, 227, 243, 111, 64, 121, + 39, 139, 200, 3, 37, 40, 197, 126, 227, 58, 76, 111, 141, 176, 50, 126, + 146, 247, 210, 117, 249, 108, 251, 211, 184, 99, 52, 81, 183, 163, 196, 25, + 214, 119, 75, 71, 3, 34, 111, 241, 99, 183, 134, 212, 75, 163, 95, 173, + 128, 38, 240, 179, 96, 64, 204, 147, 124, 181, 8, 85, 107, 227, 148, 59, + 246, 155, 23, 11, 149, 142, 91, 240, 52, 180, 209, 78, 217, 19, 85, 56, 93, + 17, 109, 119, 107, 117, 188, 96, 180, 41, 178, 127, 210, 252, 237, 188, + 101, 158, 248, 210, 206, 55, 88, 153, 241, 189, 198, 60, 98, 26, 151, 150, + 192, 51, 191, 21, 99, 2, 178, 45, 10, 235, 222, 190, 44, 241, 100, 215, + 158, 133, 57, 162, 105, 131, 7, 27, 132, 122, 228, 197, 104, 50, 246, 192, + 47, 63, 168, 56, 58, 239, 69, 152, 95, 61, 50, 77, 22, 174, 128, 169, 85, + 139, 169, 120, 6, 3, 176, 99, 215, 140, 5, 144, 103, 214, 80, 77, 90, 116, + 26, 254, 66, 137, 234, 35, 10, 8, 166, 200, 144, 0, 89, 212, 212, 30, 34, + 27, 43, 192, 3, 136, 170, 251, 184, 203, 74, 221, 54, 30, 152, 0, 26, 189, + 147, 128, 64, 71, 17, 84, 205, 248, 171, 215, 156, 214, 16, 97, 17, 12, + 199, 230, 237, 47, 129, 76, 127, 189, 94, 187, 146, 58, 5, 70, 26, 118, + 180, 80, 136, 1, 240, 34, 191, 84, 141, 11, 54, 152, 209, 20, 17, 60, 228, + 74, 59, 13, 24, 175, 7, 35, 151, 93, 242, 9, 80, 152, 107, 32, 192, 184, + 51, 41, 42, 40, 73, 14, 110, 147, 47, 241, 190, 169, 177, 207, 207, 169, + 97, 171, 22, 186, 105, 125, 134, 34, 237, 156, 54, 126, 50, 195, 174, 138, + 0, 191, 71, 95, 31, 112, 69, 204, 154, 177, 22, 176, 19, 126, 105, 181, + 228, 2, 65, 92, 229, 92, 37, 133, 150, 72, 76, 255, 251, 240, 207, 219, + 148, 134, 94, 40, 14, 182, 25, 18, 129, 16, 109, 61, 35, 247, 92, 35, 124, + 252, 3, 176, 195, 143, 171, 181, 38, 115, 205, 146, 141, 6, 231, 173, 89, + 199, 101, 9, 190, 231, 3, 221, 229, 7, 209, 195, 233, 120, 132, 158, 188, + 20, 251, 191, 16, 64, 141, 74, 228, 144, 128, 154, 24, 223, 12, 94, 46, + 119, 189, 233, 25, 77, 224, 122, 86, 95, 186, 95, 158, 57, 51, 192, 155, 2, + 178, 91, 173, 97, 97, 23, 124, 134, 210, 40, 11, 213, 57, 186, 75, 46, 0, + 48, 98, 161, 185, 221, 74, 184, 107, 176, 153, 119, 106, 191, 166, 239, + 123, 184, 128, 124, 106, 161, 182, 245, 72, 61, 13, 157, 151, 240, 217, + 112, 35, 166, 79, 206, 113, 137, 46, 209, 209, 219, 143, 92, 15, 54, 247, + 182, 242, 2, 4, 188, 230, 11, 170, 51, 28, 95, 241, 230, 251, 125, 12, 215, + 51, 201, 167, 91, 160, 178, 162, 119, 178, 186, 93, 228, 218, 219, 205, 22, + 210, 233, 3, 91, 77, 199, 239, 143, 154, 63, 131, 135, 141, 138, 30, 66, 3, + 240, 207, 248, 134, 68, 200, 80, 69, 183, 81, 182, 20, 13, 247, 10, 17, 99, + 60, 157, 145, 66, 187, 225, 225, 141, 228, 54, 212, 108, 220, 85, 102, 90, + 216, 199, 62, 191, 73, 130, 222, 153, 124, 216, 242, 2, 13, 47, 89, 217, + 119, 52, 143, 220, 178, 254, 186, 130, 248, 45, 155, 213, 10, 6, 174, 146, + 77, 65, 219, 232, 93, 162, 171, 37, 154, 172, 198, 51, 241, 172, 120, 16, + 153, 205, 168, 157, 226, 82, 222, 121, 131, 76, 43, 216, 228, 165, 250, + 177, 193, 62, 37, 142, 150, 176, 219, 10, 221, 53, 171, 30, 46, 250, 208, + 146, 90, 3, 185, 199, 156, 161, 216, 26, 58, 120, 71, 38, 23, 159, 78, 44, + 88, 174, 255, 198, 116, 86, 142, 195, 218, 93, 116, 225, 227, 159, 148, 66, + 220, 18, 2, 222, 169, 83, 234, 253, 91, 165, 204, 138, 39, 217, 16, 210, + 101, 224, 114, 217, 80, 166, 16, 66, 44, 247, 188, 185, 62, 65, 122, 182, + 142, 115, 79, 167, 186, 99, 175, 34, 70, 20, 14, 177, 77, 151, 105, 151, + 216, 140, 64, 152, 20, 78, 190, 230, 180, 183, 185, 165, 137, 78, 132, 32, + 186, 221, 171, 138, 38, 98, 61, 118, 196, 28, 152, 236, 157, 110, 73, 189, + 196, 45, 137, 74, 100, 95, 237, 164, 84, 219, 229, 10, 79, 90, 101, 24, + 194, 64, 222, 167, 19, 205, 61, 88, 49, 144, 157, 30, 196, 205, 95, 84, 68, + 247, 229, 191, 104, 140, 210, 108, 115, 206, 114, 195, 49, 44, 4, 202, 52, + 233, 114, 2, 189, 174, 75, 47, 108, 122, 87, 40, 217, 86, 111, 240, 62, + 129, 190, 206, 251, 107, 12, 150, 242, 126, 238, 35, 167, 72, 136, 39, 255, + 9, 108, 169, 3, 5, 219, 220, 213, 69, 80, 63, 70, 149, 30, 28, 155, 81, + 118, 82, 155, 40, 49, 228, 99, 54, 72, 229, 36, 36, 243, 36, 26, 206, 245, + 56, 76, 210, 18, 184, 242, 174, 151, 124, 36, 25, 151, 185, 64, 230, 45, + 55, 47, 26, 20, 226, 86, 134, 225, 125, 251, 83, 162, 167, 77, 138, 41, 88, + 18, 225, 121, 226, 250, 61, 6, 221, 121, 80, 135, 191, 146, 186, 170, 55, + 158, 46, 120, 136, 160, 202, 234, 252, 207, 192, 192, 70, 46, 9, 85, 94, + 14, 62, 142, 112, 97, 154, 190, 76, 36, 47, 231, 86, 246, 175, 216, 3, 18, + 58, 76, 150, 196, 4, 105, 95, 195, 39, 128, 37, 152, 128, 22, 1, 35, 3, 69, + 251, 3, 198, 249, 241, 148, 72, 89, 211, 225, 73, 124, 106, 150, 52, 173, + 199, 115, 221, 18, 22, 207, 248, 129, 70, 19, 115, 89, 66, 99, 123, 3, 150, + 106, 157, 45, 111, 123, 252, 217, 81, 60, 0, 184, 227, 242, 218, 138, 240, + 195, 113, 255, 58, 78, 118, 156, 172, 207, 154, 188, 16, 72, 204, 254, 231, + 226, 180, 97, 242, 228, 42, 155, 79, 200, 159, 131, 164, 207, 240, 177, 28, + 244, 226, 62, 157, 27, 8, 8, 209, 132, 212, 21, 130, 128, 192, 63, 167, + 255, 106, 66, 71, 211, 194, 126, 114, 207, 236, 85, 165, 108, 139, 161, 20, + 154, 21, 186, 212, 74, 182, 205, 121, 53, 179, 228, 108, 152, 163, 204, 40, + 28, 105, 45, 134, 124, 21, 252, 82, 234, 112, 98, 167, 119, 155, 247, 110, + 13, 99, 200, 232, 25, 224, 179, 138, 114, 238, 89, 247, 41, 8, 156, 3, 132, + 69, 230, 128, 1, 162, 155, 34, 109, 129, 37, 175, 4, 118, 41, 143, 31, 5, + 183, 35, 198, 58, 117, 205, 27, 165, 87, 33, 184, 106, 237, 26, 3, 26, 203, + 24, 24, 157, 198, 40, 78, 56, 130, 0, 53, 234, 118, 48, 246, 56, 3, 52, + 124, 199, 181, 207, 244, 116, 234, 98, 133, 9, 102, 215, 163, 218, 135, 75, + 43, 74, 5, 188, 159, 67, 214, 159, 160, 126, 233, 247, 230, 108, 22, 163, + 197, 4, 241, 156, 33, 114, 46, 197, 95, 125, 138, 109, 196, 108, 192, 157, + 51, 57, 193, 169, 188, 170, 208, 69, 254, 246, 178, 249, 108, 113, 223, 57, + 35, 167, 57, 95, 128, 150, 212, 41, 35, 187, 118, 51, 86, 53, 238, 203, + 173, 224, 120, 212, 112, 219, 137, 174, 8, 177, 206, 101, 178, 78, 117, + 241, 238, 218, 190, 75, 153, 29, 137, 162, 140, 59, 181, 173, 150, 2, 126, + 165, 2, 208, 98, 41, 248, 136, 242, 145, 167, 16, 233, 179, 191, 222, 83, + 253, 183, 89, 216, 94, 222, 24, 72, 29, 55, 4, 222, 120, 219, 55, 2, 221, + 127, 182, 93, 101, 220, 112, 224, 164, 2, 159, 43, 57, 198, 48, 115, 130, + 126, 169, 11, 75, 185, 75, 210, 185, 26, 160, 15, 217, 194, 131, 211, 233, + 196, 68, 76, 169, 115, 127, 205, 131, 222, 169, 60, 150, 127, 242, 210, + 255, 35, 71, 228, 159, 167, 208, 207, 97, 241, 56, 165, 236, 146, 12, 138, + 19, 216, 235, 120, 48, 231, 55, 244, 166, 144, 79, 186, 103, 193, 37, 212, + 216, 81, 238, 230, 94, 63, 116, 0, 112, 5, 129, 68, 191, 156, 140, 160, 80, + 46, 33, 80, 1, 96, 253, 222, 63, 142, 27, 74, 140, 112, 64, 0, 24, 121, + 158, 100, 192, 80, 182, 62, 233, 89, 59, 121, 35, 45, 41, 94, 2, 177, 101, + 72, 9, 103, 33, 218, 24, 114, 86, 198, 222, 89, 181, 6, 237, 46, 6, 192, + 175, 171, 205, 251, 81, 34, 45, 150, 185, 215, 85, 250, 188, 3, 45, 174, + 19, 47, 46, 142, 164, 146, 87, 253, 174, 150, 166, 90, 28, 144, 183, 168, + 217, 65, 7, 181, 207, 243, 96, 84, 26, 118, 96, 101, 134, 183, 93, 15, 212, + 245, 218, 121, 102, 135, 216, 18, 167, 177, 183, 188, 208, 77, 86, 80, 172, + 235, 101, 239, 166, 66, 162, 16, 208, 170, 248, 2, 242, 171, 169, 245, 192, + 29, 149, 13, 172, 171, 117, 237, 22, 224, 103, 158, 201, 107, 65, 14, 170, + 230, 195, 181, 198, 17, 69, 6, 127, 136, 56, 196, 176, 232, 236, 210, 111, + 164, 150, 136, 232, 152, 99, 51, 235, 29, 125, 76, 181, 71, 201, 216, 1, + 85, 135, 195, 71, 49, 193, 36, 200, 34, 249, 23, 77, 170, 3, 87, 89, 78, + 24, 149, 235, 249, 80, 88, 139, 87, 91, 152, 191, 245, 115, 22, 228, 153, + 99, 125, 5, 100, 147, 249, 23, 241, 217, 129, 124, 151, 145, 2, 57, 153, + 76, 147, 152, 100, 99, 158, 173, 20, 0, 205, 75, 83, 6, 24, 52, 224, 55, + 189, 160, 15, 237, 187, 25, 53, 89, 2, 35, 196, 173, 77, 97, 132, 27, 239, + 84, 199, 189, 37, 90, 153, 188, 181, 93, 122, 180, 123, 113, 210, 223, 253, + 214, 210, 41, 221, 56, 79, 36, 84, 26, 238, 203, 72, 196, 171, 0, 20, 34, + 20, 111, 106, 7, 34, 155, 10, 171, 135, 100, 235, 245, 10, 134, 91, 39, + 187, 204, 109, 99, 213, 210, 19, 54, 67, 47, 243, 118, 165, 124, 237, 63, + 94, 181, 37, 141, 193, 237, 133, 254, 142, 238, 65, 115, 104, 176, 172, + 128, 232, 36, 239, 51, 50, 54, 55, 77, 37, 3, 105, 2, 176, 118, 91, 176, + 152, 195, 104, 22, 42, 118, 192, 246, 201, 115, 73, 196, 132, 157, 132, + 108, 60, 105, 186, 23, 190, 109, 1, 40, 143, 60, 54, 91, 2, 60, 234, 180, + 209, 30, 184, 41, 207, 241, 67, 80, 209, 191, 112, 156, 143, 244, 158, 24, + 51, 173, 253, 38, 229, 252, 80, 100, 51, 48, 57, 139, 61, 142, 3, 76, 148, + 253, 220, 147, 169, 127, 230, 253, 172, 178, 99, 94, 203, 210, 126, 192, + 17, 74, 195, 87, 199, 161, 33, 237, 146, 95, 126, 6, 241, 94, 55, 96, 45, + 80, 26, 254, 238, 61, 171, 120, 155, 244, 81, 34, 45, 50, 111, 95, 151, + 152, 172, 242, 75, 151, 252, 251, 206, 248, 78, 36, 101, 77, 149, 249, 30, + 175, 225, 155, 192, 240, 123, 138, 119, 254, 34, 222, 129, 201, 49, 101, + 210, 209, 103, 24, 31, 189, 31, 214, 193, 253, 75, 45, 63, 2, 31, 35, 86, + 67, 203, 217, 57, 101, 202, 105, 54, 35, 95, 107, 89, 113, 216, 198, 224, + 95, 31, 9, 195, 157, 10, 140, 103, 40, 75, 141, 21, 86, 2, 138, 114, 9, 51, + 127, 210, 226, 178, 15, 15, 174, 125, 23, 77, 190, 245, 190, 208, 34, 160, + 199, 99, 72, 247, 75, 92, 201, 227, 253, 9, 130, 109, 159, 65, 47, 67, 253, + 56, 118, 47, 185, 181, 2, 20, 146, 212, 19, 221, 51, 35, 117, 22, 193, 29, + 103, 140, 248, 101, 194, 223, 107, 180, 248, 127, 222, 192, 112, 106, 4, + 250, 167, 32, 128, 19, 250, 123, 148, 208, 243, 86, 159, 11, 164, 5, 214, + 246, 8, 83, 126, 11, 126, 251, 205, 122, 184, 184, 247, 46, 3, 224, 149, + 209, 231, 142, 135, 61, 68, 1, 98, 139, 121, 9, 27, 19, 14, 83, 194, 83, + 27, 23, 111, 105, 217, 11, 11, 147, 140, 36, 3, 190, 148, 22, 115, 42, 134, + 88, 58, 203, 242, 119, 212, 233, 106, 115, 69, 7, 92, 85, 107, 30, 10, 203, + 16, 150, 191, 188, 61, 150, 169, 131, 16, 3, 173, 89, 28, 38, 238, 14, 161, + 230, 85, 54, 232, 236, 40, 248, 50, 237, 60, 166, 156, 215, 27, 4, 135, 15, + 173, 101, 18, 212, 24, 246, 25, 203, 194, 249, 223, 230, 28, 154, 219, 199, + 202, 197, 163, 81, 192, 112, 82, 138, 36, 214, 140, 7, 49, 2, 166, 254, + 199, 12, 135, 102, 125, 17, 37, 3, 164, 86, 25, 43, 97, 231, 36, 119, 191, + 21, 186, 129, 196, 228, 96, 75, 187, 190, 252, 250, 73, 25, 58, 17, 10, + 104, 116, 100, 75, 215, 162, 21, 11, 201, 181, 15, 106, 135, 96, 21, 152, + 160, 218, 53, 123, 254, 91, 190, 239, 156, 143, 125, 186, 177, 165, 181, + 34, 163, 62, 138, 204, 57, 102, 76, 2, 210, 64, 211, 20, 101, 233, 113, 18, + 36, 132, 201, 33, 173, 229, 240, 163, 206, 43, 234, 87, 151, 23, 17, 85, 0, + 189, 1, 255, 103, 160, 138, 160, 2, 218, 234, 184, 205, 152, 192, 81, 196, + 29, 52, 94, 53, 180, 110, 139, 222, 21, 27, 54, 114, 81, 40, 39, 225, 28, + 169, 211, 193, 118, 44, 38, 62, 201, 25, 215, 110, 88, 5, 142, 116, 224, + 54, 130, 45, 230, 246, 104, 251, 172, 159, 50, 212, 46, 171, 21, 213, 200, + 189, 6, 226, 234, 238, 226, 241, 219, 85, 8, 47, 152, 11, 238, 0, 132, 194, + 254, 135, 15, 85, 110, 31, 243, 54, 235, 240, 5, 19, 85, 176, 130, 224, + 127, 183, 83, 93, 179, 217, 185, 126, 52, 10, 14, 113, 19, 5, 201, 201, + 161, 30, 176, 132, 72, 179, 9, 110, 68, 87, 203, 201, 160, 111, 163, 35, + 247, 13, 132, 176, 214, 63, 3, 193, 251, 139, 79, 215, 178, 218, 56, 222, + 162, 33, 46, 57, 4, 129, 65, 166, 110, 237, 23, 186, 226, 100, 133, 187, + 151, 155, 217, 238, 252, 2, 147, 3, 213, 55, 166, 184, 148, 152, 194, 230, + 97, 203, 161, 191, 127, 213, 240, 121, 99, 70, 171, 83, 155, 88, 91, 200, + 26, 92, 3, 218, 233, 23, 215, 63, 47, 55, 133, 185, 189, 223, 135, 202, + 182, 237, 107, 248, 219, 138, 158, 2, 153, 236, 98, 18, 135, 141, 243, 120, + 195, 213, 169, 176, 218, 241, 58, 175, 238, 121, 218, 175, 8, 246, 18, 217, + 58, 154, 67, 164, 25, 76, 222, 47, 227, 62, 136, 20, 215, 46, 163, 42, 188, + 109, 9, 122, 76, 221, 165, 150, 201, 9, 246, 100, 88, 184, 219, 129, 43, + 143, 45, 91, 21, 89, 118, 27, 131, 253, 41, 20, 67, 55, 252, 90, 98, 197, + 123, 169, 120, 202, 168, 239, 3, 23, 28, 110, 164, 201, 219, 123, 239, 64, + 146, 50, 185, 241, 47, 17, 27, 201, 87, 156, 104, 89, 114, 165, 71, 26, + 121, 88, 231, 5, 215, 72, 204, 3, 121, 57, 23, 165, 63, 43, 115, 232, 182, + 37, 41, 67, 229, 131, 139, 249, 101, 17, 147, 225, 125, 170, 4, 19, 174, + 188, 237, 110, 18, 155, 113, 45, 107, 8, 108, 20, 189, 239, 248, 4, 31, 97, + 215, 190, 113, 34, 137, 110, 183, 119, 239, 221, 165, 99, 199, 107, 124, + 127, 48, 46, 68, 70, 249, 191, 218, 185, 114, 253, 16, 28, 131, 3, 201, + 215, 247, 208, 199, 219, 146, 127, 62, 64, 40, 98, 136, 4, 135, 2, 192, + 164, 107, 116, 8, 189, 84, 190, 104, 113, 230, 191, 200, 18, 186, 215, 32, + 2, 98, 211, 11, 145, 22, 217, 12, 14, 94, 173, 5, 91, 74, 189, 173, 250, + 181, 61, 153, 68, 226, 241, 2, 238, 229, 24, 145, 62, 83, 178, 113, 172, + 86, 43, 105, 153, 25, 117, 254, 244, 155, 111, 212, 187, 23, 109, 232, 188, + 177, 180, 83, 65, 94, 80, 130, 2, 185, 146, 202, 44, 71, 205, 252, 25, 52, + 109, 182, 234, 207, 167, 79, 52, 127, 204, 91, 185, 166, 61, 134, 55, 25, + 139, 177, 92, 131, 213, 118, 61, 123, 237, 80, 107, 153, 77, 218, 197, 212, + 95, 165, 161, 36, 152, 25, 170, 227, 17, 202, 79, 243, 34, 50, 190, 75, 7, + 154, 159, 140, 217, 84, 125, 190, 168, 123, 74, 115, 72, 4, 164, 169, 132, + 85, 169, 20, 212, 183, 164, 115, 9, 91, 33, 95, 184, 26, 61, 155, 243, 158, + 19, 126, 46, 126, 63, 214, 227, 191, 12, 62, 231, 87, 110, 229, 47, 156, + 47, 47, 241, 208, 49, 213, 49, 67, 230, 44, 210, 250, 251, 219, 246, 39, + 153, 249, 226, 166, 228, 3, 41, 36, 114, 82, 242, 73, 40, 54, 12, 1, 221, + 99, 116, 50, 220, 171, 220, 47, 134, 160, 142, 35, 255, 123, 13, 31, 32, + 240, 27, 188, 203, 236, 2, 11, 71, 190, 206, 92, 140, 151, 224, 223, 140, + 97, 98, 172, 180, 170, 56, 168, 32, 170, 5, 142, 36, 75, 6, 164, 73, 23, + 204, 167, 54, 241, 66, 255, 33, 175, 61, 188, 220, 49, 234, 15, 136, 19, + 197, 232, 64, 38, 145, 249, 23, 233, 172, 15, 78, 48, 238, 210, 90, 44, 69, + 110, 221, 36, 239, 28, 162, 203, 103, 213, 44, 255, 88, 168, 254, 236, 86, + 60, 176, 148, 17, 213, 1, 149, 135, 127, 76, 211, 176, 162, 121, 253, 188, + 149, 1, 177, 137, 22, 183, 225, 29, 122, 191, 112, 157, 102, 19, 108, 188, + 227, 38, 48, 101, 213, 88, 12, 227, 6, 73, 185, 13, 194, 206, 75, 181, 243, + 56, 194, 134, 2, 62, 236, 102, 164, 241, 236, 180, 222, 124, 34, 195, 118, + 72, 115, 19, 120, 237, 231, 36, 245, 26, 77, 237, 8, 72, 11, 241, 248, 214, + 248, 153, 80, 2, 13, 49, 125, 116, 159, 11, 95, 23, 248, 66, 197, 122, 47, + 16, 92, 67, 189, 172, 29, 70, 230, 120, 227, 147, 190, 165, 246, 26, 219, + 17, 191, 239, 46, 4, 79, 198, 75, 155, 161, 4, 110, 102, 128, 24, 241, 59, + 249, 124, 148, 75, 136, 144, 88, 59, 235, 103, 46, 222, 255, 198, 233, 229, + 22, 16, 152, 15, 5, 191, 138, 38, 93, 231, 239, 234, 62, 25, 60, 121, 82, + 212, 187, 249, 193, 139, 7, 33, 87, 32, 140, 25, 98, 232, 18, 248, 109, 80, + 193, 8, 94, 26, 178, 198, 50, 106, 153, 198, 252, 165, 231, 196, 224, 160, + 249, 191, 211, 124, 48, 143, 78, 118, 138, 38, 152, 252, 174, 48, 103, 51, + 3, 3, 197, 20, 145, 48, 31, 65, 112, 72, 92, 84, 188, 238, 227, 229, 26, + 57, 97, 90, 254, 53, 44, 79, 217, 252, 73, 173, 32, 237, 70, 140, 212, 3, + 49, 139, 22, 59, 90, 33, 27, 255, 179, 84, 8, 47, 4, 154, 84, 233, 152, + 148, 68, 135, 163, 238, 165, 63, 208, 179, 250, 233, 8, 149, 126, 156, 43, + 82, 179, 60, 121, 230, 109, 173, 14, 166, 81, 212, 101, 58, 152, 229, 62, + 247, 130, 38, 212, 126, 111, 5, 135, 252, 9, 54, 235, 53, 100, 97, 107, + 127, 69, 150, 134, 73, 20, 20, 205, 91, 142, 73, 236, 2, 160, 222, 1, 33, + 39, 72, 144, 230, 218, 217, 1, 58, 223, 70, 123, 123, 214, 248, 207, 213, + 46, 3, 213, 175, 97, 251, 107, 238, 138, 221, 37, 206, 214, 38, 252, 116, + 101, 29, 173, 139, 251, 177, 101, 28, 178, 8, 200, 64, 138, 239, 3, 235, + 160, 228, 94, 235, 54, 164, 147, 178, 107, 64, 249, 165, 228, 18, 225, 94, + 225, 122, 21, 146, 42, 216, 73, 129, 133, 131, 120, 1, 252, 92, 160, 3, + 245, 199, 59, 252, 44, 74, 253, 226, 74, 15, 16, 250, 82, 208, 87, 177, + 131, 232, 142, 230, 99, 97, 138, 14, 72, 249, 82, 248, 85, 60, 63, 238, + 225, 98, 225, 98, 235, 24, 63, 227, 54, 138, 240, 70, 100, 99, 24, 254, + 201, 43, 242, 228, 4, 233, 183, 233, 217, 218, 31, 142, 80, 125, 91, 116, + 165, 173, 222, 241, 132, 3, 1, 121, 180, 82, 106, 242, 48, 21, 82, 156, + 175, 72, 82, 17, 217, 174, 113, 68, 40, 138, 110, 28, 224, 240, 29, 49, + 244, 243, 13, 145, 65, 254, 195, 102, 50, 137, 71, 105, 30, 65, 254, 219, + 22, 70, 61, 65, 92, 200, 149, 218, 198, 2, 84, 143, 33, 35, 175, 25, 2, 98, + 239, 199, 226, 31, 141, 219, 151, 119, 44, 197, 18, 49, 106, 76, 162, 33, + 57, 243, 101, 17, 171, 246, 158, 234, 75, 45, 248, 154, 37, 82, 85, 3, 196, + 158, 115, 164, 194, 75, 242, 246, 54, 129, 109, 89, 59, 120, 37, 249, 127, + 162, 249, 176, 251, 115, 155, 35, 20, 64, 247, 85, 185, 253, 165, 130, 90, + 198, 147, 200, 21, 19, 14, 209, 197, 254, 140, 180, 56, 49, 14, 172, 150, + 19, 78, 255, 199, 21, 145, 123, 138, 232, 188, 95, 65, 78, 167, 116, 67, + 110, 205, 223, 120, 154, 115, 73, 34, 147, 93, 235, 51, 223, 47, 14, 97, + 240, 17, 7, 73, 31, 38, 18, 251, 111, 67, 84, 220, 68, 112, 241, 197, 93, + 28, 234, 198, 206, 226, 59, 23, 227, 195, 70, 242, 161, 157, 232, 149, 2, + 226, 112, 60, 70, 210, 18, 147, 28, 148, 24, 242, 11, 184, 216, 3, 243, + 119, 117, 101, 69, 199, 177, 142, 223, 141, 86, 255, 219, 245, 100, 209, + 76, 30, 157, 70, 209, 146, 169, 137, 9, 87, 128, 162, 241, 182, 113, 65, 2, + 64, 13, 107, 40, 97, 191, 242, 18, 207, 246, 164, 24, 61, 180, 86, 67, 104, + 69, 27, 125, 249, 123, 106, 223, 116, 174, 230, 113, 239, 147, 89, 225, + 143, 7, 6, 126, 174, 164, 32, 149, 3, 124, 198, 75, 75, 21, 8, 95, 107, 83, + 253, 216, 201, 240, 7, 212, 67, 46, 137, 27, 32, 27, 46, 15, 228, 62, 146, + 219, 147, 200, 211, 143, 95, 14, 6, 245, 177, 242, 139, 246, 150, 39, 201, + 1, 58, 23, 188, 104, 232, 227, 252, 21, 96, 100, 118, 216, 227, 49, 99, + 199, 198, 88, 130, 207, 123, 173, 226, 105, 187, 206, 236, 7, 194, 41, 99, + 160, 74, 41, 205, 142, 34, 225, 145, 238, 98, 217, 160, 155, 3, 66, 84, + 146, 173, 203, 14, 252, 236, 17, 103, 239, 44, 241, 80, 24, 176, 176, 197, + 230, 208, 227, 134, 196, 9, 222, 109, 172, 189, 215, 173, 142, 175, 3, 72, + 90, 155, 219, 29, 54, 57, 202, 217, 247, 12, 89, 162, 14, 79, 229, 24, 185, + 238, 80, 139, 45, 150, 48, 136, 192, 49, 82, 241, 0, 23, 114, 122, 107, + 165, 196, 17, 87, 229, 236, 174, 142, 34, 32, 11, 78, 222, 217, 121, 163, + 193, 254, 62, 192, 43, 0, 60, 27, 169, 96, 238, 171, 93, 21, 60, 5, 168, + 23, 27, 130, 142, 19, 102, 245, 16, 21, 85, 131, 212, 96, 179, 215, 173, + 68, 116, 51, 40, 47, 181, 45, 32, 93, 225, 105, 173, 69, 49, 134, 7, 46, + 162, 203, 181, 176, 84, 92, 11, 42, 193, 211, 77, 227, 85, 15, 49, 119, 34, + 64, 148, 51, 117, 37, 205, 70, 40, 39, 85, 239, 3, 139, 100, 67, 163, 137, + 101, 9, 215, 71, 32, 49, 224, 12, 174, 8, 177, 12, 65, 81, 191, 66, 146, + 111, 22, 235, 78, 46, 55, 211, 144, 84, 210, 3, 38, 89, 164, 43, 133, 39, + 109, 147, 152, 162, 133, 50, 56, 88, 229, 35, 90, 77, 171, 99, 158, 132, + 144, 11, 121, 16, 172, 119, 83, 24, 220, 97, 70, 247, 215, 36, 115, 70, 77, + 131, 119, 197, 147, 17, 227, 12, 249, 8, 164, 40, 36, 91, 130, 224, 18, 1, + 169, 248, 118, 100, 211, 1, 135, 81, 163, 216, 71, 73, 57, 85, 72, 116, + 125, 111, 189, 78, 66, 62, 36, 100, 110, 178, 207, 122, 114, 184, 158, 200, + 187, 18, 156, 178, 8, 58, 116, 51, 173, 17, 164, 66, 104, 201, 205, 220, + 20, 59, 211, 118, 167, 217, 13, 246, 228, 105, 74, 93, 211, 243, 65, 54, + 17, 114, 247, 24, 29, 221, 138, 141, 2, 183, 117, 66, 42, 50, 28, 167, 5, + 177, 30, 113, 253, 105, 2, 213, 101, 198, 55, 174, 237, 250, 186, 76, 200, + 11, 42, 142, 163, 69, 107, 82, 74, 3, 11, 94, 150, 3, 252, 176, 128, 53, + 14, 247, 97, 165, 63, 165, 61, 94, 101, 119, 124, 68, 231, 35, 231, 145, 2, + 151, 188, 56, 133, 135, 44, 38, 108, 46, 66, 212, 9, 40, 207, 250, 68, 88, + 212, 141, 195, 240, 204, 114, 49, 175, 98, 32, 19, 153, 75, 104, 170, 204, + 11, 242, 95, 204, 203, 96, 168, 47, 52, 165, 56, 136, 18, 241, 47, 227, + 172, 152, 101, 195, 94, 45, 209, 44, 97, 38, 58, 99, 10, 185, 133, 139, + 117, 12, 30, 23, 229, 155, 203, 77, 143, 248, 50, 113, 18, 56, 166, 214, + 224, 208, 82, 173, 135, 168, 58, 176, 231, 216, 52, 20, 169, 43, 203, 26, + 5, 52, 137, 103, 164, 212, 2, 134, 195, 113, 108, 156, 215, 175, 183, 91, + 144, 145, 235, 172, 118, 252, 59, 248, 135, 173, 164, 27, 32, 220, 234, + 108, 171, 248, 244, 1, 3, 47, 150, 2, 182, 100, 74, 69, 250, 93, 106, 189, + 196, 13, 111, 226, 111, 34, 12, 122, 224, 44, 181, 250, 77, 130, 27, 117, + 50, 44, 89, 239, 128, 224, 151, 31, 135, 61, 106, 197, 85, 179, 159, 18, + 218, 138, 217, 143, 104, 21, 46, 49, 214, 25, 88, 198, 44, 61, 51, 39, 210, + 254, 197, 84, 110, 139, 127, 241, 192, 70, 189, 6, 198, 85, 126, 112, 113, + 125, 70, 16, 246, 214, 222, 83, 46, 26, 221, 236, 207, 1, 251, 232, 147, + 234, 157, 238, 240, 38, 238, 221, 114, 218, 67, 66, 138, 90, 104, 220, 132, + 129, 101, 145, 120, 80, 14, 155, 238, 107, 61, 71, 207, 97, 153, 163, 22, + 111, 117, 137, 9, 226, 124, 183, 2, 170, 68, 187, 8, 4, 86, 191, 230, 90, + 168, 235, 152, 60, 147, 15, 52, 132, 192, 178, 204, 4, 37, 178, 228, 217, + 165, 208, 58, 57, 34, 111, 47, 2, 151, 28, 77, 0, 66, 133, 109, 255, 122, + 243, 25, 174, 204, 220, 52, 171, 207, 48, 239, 127, 243, 74, 173, 155, 89, + 68, 132, 70, 60, 32, 173, 167, 225, 250, 232, 156, 238, 254, 244, 242, 200, + 39, 201, 243, 149, 117, 171, 87, 185, 29, 202, 46, 36, 246, 174, 18, 192, + 87, 243, 219, 124, 70, 165, 208, 20, 186, 42, 238, 62, 200, 171, 191, 94, + 102, 247, 184, 40, 130, 207, 44, 161, 249, 25, 193, 221, 45, 122, 33, 231, + 232, 167, 21, 145, 170, 45, 146, 45, 247, 101, 127, 113, 52, 121, 187, 184, + 136, 206, 238, 133, 10, 137, 103, 79, 84, 179, 239, 140, 123, 100, 7, 108, + 45, 140, 147, 153, 213, 121, 140, 2, 32, 88, 230, 156, 33, 156, 163, 80, + 175, 50, 62, 105, 97, 34, 18, 116, 16, 38, 47, 7, 126, 74, 53, 245, 126, + 37, 221, 70, 185, 90, 204, 156, 2, 226, 39, 53, 68, 47, 39, 21, 108, 228, + 225, 6, 2, 152, 174, 174, 236, 132, 25, 63, 197, 245, 178, 134, 245, 234, + 72, 165, 96, 74, 178, 208, 232, 234, 159, 225, 96, 73, 18, 49, 79, 140, + 199, 126, 70, 159, 146, 72, 255, 152, 154, 149, 77, 161, 73, 64, 248, 201, + 26, 234, 120, 22, 12, 91, 71, 30, 6, 239, 103, 209, 235, 121, 49, 154, 147, + 175, 35, 30, 71, 38, 252, 142, 52, 109, 213, 79, 142, 87, 239, 10, 131, + 201, 193, 28, 106, 221, 206, 221, 33, 188, 167, 254, 14, 145, 151, 210, 4, + 56, 63, 206, 180, 233, 79, 70, 110, 139, 227, 241, 134, 56, 58, 43, 95, + 222, 148, 30, 142, 68, 194, 3, 119, 61, 16, 254, 157, 152, 182, 137, 113, + 177, 225, 2, 223, 217, 201, 186, 156, 103, 184, 99, 226, 121, 197, 236, + 201, 115, 4, 245, 101, 93, 93, 79, 3, 56, 24, 154, 230, 155, 111, 238, 218, + 10, 119, 102, 66, 29, 79, 10, 221, 189, 178, 121, 104, 167, 10, 11, 110, + 203, 186, 94, 224, 233, 175, 1, 180, 206, 23, 70, 195, 79, 152, 205, 178, + 101, 203, 57, 175, 207, 37, 100, 122, 39, 127, 190, 172, 139, 49, 7, 166, + 123, 247, 118, 64, 66, 10, 37, 176, 24, 62, 11, 227, 142, 215, 87, 129, + 154, 203, 245, 205, 54, 219, 89, 169, 8, 103, 248, 1, 170, 215, 80, 243, + 226, 242, 26, 12, 34, 156, 151, 119, 104, 230, 27, 77, 245, 174, 137, 49, + 100, 62, 186, 245, 138, 89, 2, 111, 222, 6, 57, 240, 186, 107, 163, 117, + 204, 200, 70, 111, 80, 205, 94, 193, 3, 166, 14, 57, 212, 55, 190, 119, + 142, 158, 141, 146, 138, 238, 241, 237, 139, 20, 80, 63, 126, 102, 41, 187, + 78, 5, 186, 238, 220, 241, 15, 156, 189, 3, 133, 136, 129, 135, 193, 147, + 187, 100, 217, 172, 175, 58, 73, 87, 126, 148, 108, 130, 37, 201, 254, 95, + 158, 18, 192, 39, 188, 143, 28, 20, 248, 143, 188, 10, 228, 194, 174, 148, + 251, 49, 132, 123, 23, 210, 171, 230, 226, 17, 16, 15, 76, 23, 33, 199, + 207, 181, 224, 171, 3, 71, 7, 90, 180, 164, 60, 21, 117, 69, 120, 199, 143, + 152, 212, 194, 16, 47, 10, 30, 137, 15, 99, 205, 238, 115, 245, 135, 228, + 62, 192, 112, 153, 93, 164, 92, 146, 250, 244, 140, 69, 185, 4, 53, 50, + 221, 29, 1, 195, 198, 246, 189, 230, 82, 60, 164, 21, 86, 111, 157, 211, + 241, 81, 36, 206, 3, 16, 180, 219, 106, 3, 137, 135, 206, 172, 41, 24, 191, + 34, 180, 20, 119, 56, 89, 100, 204, 154, 124, 221, 114, 183, 138, 244, 56, + 94, 8, 174, 114, 251, 97, 82, 191, 16, 3, 108, 181, 118, 79, 173, 119, 142, + 75, 214, 11, 204, 228, 213, 218, 68, 18, 86, 238, 169, 110, 54, 34, 115, + 31, 48, 114, 0, 127, 5, 233, 204, 125, 183, 32, 244, 55, 44, 181, 139, 62, + 212, 116, 117, 142, 58, 168, 18, 189, 78, 131, 128, 93, 68, 125, 52, 245, + 59, 13, 213, 215, 1, 47, 159, 136, 183, 48, 128, 65, 199, 220, 17, 179, + 224, 163, 103, 190, 11, 144, 224, 63, 154, 90, 152, 185, 24, 45, 34, 220, + 72, 252, 62, 154, 250, 55, 218, 29, 221, 51, 78, 104, 228, 161, 34, 33, 15, + 167, 233, 138, 128, 35, 106, 132, 160, 67, 40, 11, 201, 197, 250, 143, 165, + 204, 206, 88, 81, 76, 149, 73, 2, 41, 52, 90, 235, 93, 111, 16, 226, 16, + 245, 231, 250, 18, 205, 174, 171, 113, 229, 92, 146, 107, 186, 148, 195, + 19, 145, 182, 91, 7, 84, 199, 17, 3, 136, 41, 251, 89, 176, 20, 163, 214, + 139, 92, 58, 239, 150, 142, 148, 202, 196, 17, 226, 215, 174, 107, 54, 0, + 205, 104, 140, 150, 177, 34, 132, 216, 101, 159, 85, 255, 135, 85, 45, 220, + 225, 121, 91, 201, 211, 110, 59, 188, 5, 180, 40, 110, 93, 75, 189, 45, + 105, 102, 194, 168, 65, 243, 172, 195, 202, 87, 188, 254, 165, 119, 71, + 102, 115, 33, 15, 219, 209, 207, 172, 148, 56, 141, 248, 137, 83, 88, 29, + 93, 22, 65, 27, 219, 178, 97, 94, 10, 59, 14, 4, 86, 176, 88, 69, 39, 31, + 255, 182, 246, 165, 95, 145, 98, 1, 58, 59, 38, 40, 246, 29, 148, 9, 224, + 10, 210, 31, 91, 229, 116, 3, 172, 73, 107, 120, 189, 191, 17, 71, 160, + 113, 144, 215, 63, 65, 153, 26, 214, 66, 139, 92, 255, 169, 13, 183, 164, + 114, 65, 71, 54, 255, 212, 44, 3, 63, 152, 205, 25, 109, 134, 92, 65, 119, + 194, 97, 177, 51, 201, 113, 123, 33, 18, 231, 154, 235, 171, 205, 70, 164, + 82, 195, 163, 103, 95, 228, 149, 64, 7, 250, 222, 91, 156, 119, 50, 28, + 119, 237, 144, 117, 245, 117, 189, 220, 111, 164, 203, 125, 2, 84, 173, 82, + 176, 170, 167, 138, 42, 159, 51, 74, 178, 61, 30, 61, 85, 220, 197, 12, 11, + 86, 155, 51, 195, 76, 71, 208, 87, 64, 112, 80, 243, 50, 79, 159, 255, 170, + 242, 229, 50, 158, 138, 153, 130, 110, 64, 65, 220, 88, 225, 98, 70, 110, + 206, 141, 25, 211, 186, 225, 226, 186, 148, 7, 88, 57, 136, 171, 50, 40, + 170, 181, 184, 193, 23, 2, 96, 165, 111, 173, 204, 11, 19, 154, 225, 153, + 226, 83, 142, 165, 239, 244, 124, 127, 236, 75, 211, 204, 185, 206, 18, + 238, 213, 193, 28, 5, 250, 99, 3, 98, 177, 180, 173, 234, 91, 28, 192, 226, + 83, 94, 98, 209, 110, 209, 168, 182, 41, 247, 93, 221, 174, 220, 113, 101, + 30, 203, 212, 237, 56, 82, 92, 146, 41, 32, 93, 114, 215, 29, 170, 24, 25, + 136, 253, 247, 132, 234, 242, 44, 219, 11, 192, 105, 37, 95, 87, 68, 206, + 110, 115, 33, 21, 188, 105, 249, 217, 219, 94, 169, 51, 89, 112, 208, 139, + 117, 120, 78, 221, 81, 93, 97, 63, 28, 128, 2, 187, 90, 180, 233, 76, 43, + 226, 70, 40, 75, 214, 153, 149, 18, 197, 35, 209, 36, 69, 45, 134, 74, 143, + 217, 35, 254, 235, 28, 144, 199, 38, 142, 23, 90, 230, 186, 55, 96, 123, + 36, 41, 111, 116, 2, 240, 14, 108, 128, 93, 164, 203, 56, 91, 207, 52, 38, + 116, 87, 95, 217, 166, 50, 184, 138, 61, 68, 154, 158, 255, 50, 235, 243, + 45, 224, 73, 8, 2, 3, 0, 101, 215, 8, 145, 42, 179, 120, 232, 81, 227, 215, + 18, 36, 165, 23, 186, 162, 247, 117, 43, 66, 44, 184, 186, 96, 200, 226, 8, + 113, 124, 163, 12, 76, 220, 50, 215, 243, 209, 40, 139, 201, 129, 68, 226, + 0, 56, 32, 155, 27, 219, 64, 78, 235, 251, 111, 192, 114, 241, 32, 109, + 154, 173, 212, 151, 158, 149, 221, 117, 23, 55, 70, 87, 56, 108, 61, 201, + 232, 25, 51, 189, 71, 189, 101, 115, 25, 240, 125, 210, 155, 99, 253, 242, + 252, 149, 119, 25, 168, 30, 86, 100, 249, 96, 149, 74, 174, 213, 209, 252, + 192, 96, 2, 252, 189, 114, 247, 18, 245, 88, 102, 18, 78, 98, 134, 251, + 213, 249, 3, 195, 109, 118, 163, 224, 75, 149, 66, 242, 231, 160, 19, 250, + 213, 12, 163, 23, 17, 79, 26, 115, 254, 51, 241, 171, 74, 231, 189, 217, + 99, 149, 187, 2, 38, 25, 83, 109, 176, 213, 204, 153, 119, 162, 102, 147, + 245, 77, 92, 83, 11, 216, 100, 175, 122, 73, 151, 108, 106, 18, 74, 105, + 219, 21, 193, 185, 29, 14, 145, 81, 122, 218, 157, 47, 56, 100, 116, 38, + 123, 253, 155, 70, 232, 118, 137, 34, 208, 218, 179, 110, 102, 33, 46, 165, + 120, 173, 212, 123, 90, 34, 167, 206, 94, 12, 233, 25, 102, 64, 148, 145, + 223, 65, 183, 36, 173, 42, 107, 25, 41, 8, 29, 168, 43, 49, 252, 193, 230, + 26, 51, 206, 203, 116, 229, 19, 197, 237, 227, 65, 242, 171, 181, 121, 81, + 123, 244, 188, 201, 138, 77, 137, 190, 206, 5, 97, 69, 181, 171, 65, 1, + 141, 117, 226, 2, 155, 46, 192, 58, 208, 93, 12, 50, 254, 144, 150, 81, + 131, 37, 142, 139, 10, 83, 68, 121, 241, 85, 160, 82, 78, 84, 42, 25, 209, + 82, 59, 249, 2, 15, 3, 143, 35, 91, 114, 100, 116, 227, 180, 80, 23, 2, + 195, 229, 42, 5, 92, 57, 162, 16, 93, 12, 193, 42, 41, 101, 246, 63, 148, + 73, 217, 232, 51, 174, 72, 144, 26, 252, 210, 104, 57, 82, 216, 202, 104, + 187, 97, 23, 95, 25, 155, 244, 61, 60, 29, 3, 19, 76, 226, 62, 48, 34, 62, + 254, 61, 238, 11, 244, 76, 169, 250, 73, 205, 100, 15, 47, 90, 84, 139, + 125, 153, 91, 107, 234, 83, 5, 154, 31, 100, 111, 158, 49, 176, 122, 232, + 204, 86, 154, 5, 187, 171, 59, 112, 242, 9, 52, 78, 166, 224, 91, 51, 164, + 191, 80, 139, 153, 207, 44, 51, 201, 128, 120, 147, 21, 6, 57, 252, 2, 75, + 202, 81, 220, 81, 5, 19, 124, 72, 249, 115, 219, 27, 223, 138, 18, 33, 214, + 173, 44, 67, 25, 223, 104, 143, 197, 252, 155, 95, 168, 74, 49, 3, 23, 48, + 58, 80, 78, 2, 140, 248, 155, 129, 94, 216, 169, 60, 175, 215, 7, 10, 81, + 81, 25, 88, 182, 131, 75, 54, 176, 70, 228, 37, 49, 48, 203, 7, 148, 83, + 243, 125, 122, 107, 35, 23, 228, 45, 61, 108, 169, 241, 129, 163, 57, 247, + 56, 159, 78, 133, 7, 143, 67, 103, 157, 212, 41, 160, 130, 111, 1, 230, 77, + 121, 72, 101, 222, 112, 63, 206, 191, 89, 189, 175, 166, 100, 90, 106, 145, + 186, 0, 179, 155, 136, 204, 141, 130, 57, 91, 30, 196, 233, 201, 168, 7, + 197, 129, 70, 202, 93, 161, 102, 11, 118, 133, 157, 192, 103, 46, 190, 255, + 102, 23, 46, 177, 177, 245, 169, 52, 88, 35, 250, 3, 221, 198, 124, 178, + 160, 234, 147, 15, 21, 56, 47, 56, 220, 186, 139, 49, 181, 4, 15, 100, 126, + 136, 185, 115, 135, 46, 194, 252, 209, 253, 221, 179, 2, 105, 239, 60, 43, + 173, 4, 167, 92, 176, 199, 88, 132, 14, 190, 34, 121, 133, 195, 98, 63, 64, + 194, 192, 37, 129, 138, 223, 33, 128, 72, 21, 77, 169, 100, 106, 25, 96, + 251, 175, 185, 16, 179, 223, 105, 60, 108, 192, 22, 0, 52, 20, 160, 140, + 238, 195, 114, 228, 20, 188, 202, 255, 206, 163, 72, 85, 16, 112, 159, 198, + 85, 7, 44, 106, 77, 144, 105, 131, 188, 218, 111, 65, 56, 35, 67, 224, 203, + 254, 147, 249, 189, 52, 154, 157, 227, 235, 40, 230, 196, 247, 185, 20, + 155, 34, 216, 237, 47, 126, 75, 196, 212, 67, 155, 123, 133, 195, 141, 136, + 78, 202, 175, 203, 175, 215, 50, 92, 157, 18, 115, 3, 29, 171, 180, 93, 0, + 20, 15, 53, 51, 115, 103, 197, 81, 57, 54, 8, 136, 51, 157, 33, 158, 4, + 121, 72, 56, 126, 48, 188, 251, 103, 142, 168, 2, 203, 161, 5, 215, 56, + 191, 166, 251, 223, 204, 76, 224, 59, 50, 68, 113, 210, 52, 60, 242, 238, + 105, 88, 160, 52, 106, 221, 231, 167, 127, 183, 109, 147, 38, 170, 22, 195, + 180, 142, 160, 76, 223, 142, 109, 212, 132, 205, 56, 230, 51, 12, 221, 86, + 129, 244, 116, 2, 98, 68, 36, 40, 196, 109, 1, 39, 20, 84, 202, 242, 32, + 169, 139, 223, 122, 182, 45, 214, 64, 139, 93, 127, 171, 248, 173, 67, 211, + 168, 193, 70, 58, 230, 85, 172, 127, 192, 230, 177, 166, 237, 173, 243, 86, + 53, 43, 182, 119, 229, 174, 2, 133, 199, 214, 151, 130, 190, 110, 176, 35, + 63, 56, 23, 246, 106, 23, 202, 102, 90, 143, 3, 120, 0, 137, 147, 77, 51, + 109, 89, 123, 87, 242, 85, 248, 9, 45, 124, 144, 176, 185, 246, 94, 124, + 241, 183, 218, 250, 54, 216, 97, 224, 37, 111, 3, 174, 59, 122, 158, 226, + 103, 57, 217, 168, 208, 151, 208, 183, 187, 106, 18, 235, 118, 234, 248, + 152, 232, 115, 176, 221, 31, 129, 169, 36, 149, 205, 35, 101, 70, 145, 2, + 149, 171, 84, 41, 229, 26, 73, 52, 233, 43, 10, 101, 82, 222, 214, 88, 239, + 49, 81, 25, 248, 250, 244, 49, 72, 81, 237, 104, 98, 51, 37, 186, 158, 26, + 94, 143, 124, 9, 62, 38, 3, 50, 138, 52, 125, 9, 63, 232, 101, 31, 167, 74, + 189, 102, 190, 129, 115, 167, 25, 192, 223, 217, 117, 182, 51, 182, 151, + 191, 173, 79, 16, 204, 155, 233, 218, 144, 73, 36, 187, 1, 96, 252, 18, 95, + 42, 245, 78, 10, 11, 18, 42, 184, 3, 31, 191, 83, 215, 180, 170, 23, 15, + 64, 169, 203, 190, 151, 254, 199, 97, 23, 158, 207, 11, 131, 112, 49, 45, + 203, 156, 103, 44, 252, 47, 169, 168, 2, 64, 108, 40, 229, 52, 173, 69, 81, + 13, 123, 99, 121, 184, 92, 123, 18, 119, 128, 176, 22, 150, 45, 109, 30, + 141, 85, 229, 183, 226, 193, 149, 26, 228, 153, 104, 230, 41, 81, 177, 52, + 41, 235, 215, 152, 155, 172, 145, 241, 91, 75, 72, 160, 103, 95, 25, 88, + 187, 40, 51, 27, 47, 154, 13, 57, 4, 104, 167, 191, 164, 73, 228, 2, 219, + 224, 122, 93, 201, 133, 221, 201, 213, 178, 50, 123, 203, 178, 173, 205, + 107, 148, 6, 167, 244, 91, 11, 115, 250, 209, 28, 11, 146, 82, 74, 116, + 102, 109, 8, 23, 176, 12, 74, 206, 237, 100, 186, 178, 76, 166, 198, 52, + 225, 18, 9, 254, 184, 245, 224, 155, 2, 10, 75, 56, 236, 73, 233, 240, 19, + 147, 167, 184, 17, 160, 196, 135, 19, 35, 3, 70, 91, 147, 64, 138, 218, + 252, 87, 33, 199, 68, 116, 243, 117, 2, 20, 220, 245, 28, 125, 54, 146, + 163, 183, 115, 120, 67, 155, 244, 51, 198, 220, 116, 48, 120, 186, 90, 168, + 210, 83, 97, 161, 69, 241, 53, 92, 135, 74, 133, 134, 30, 134, 245, 246, + 22, 246, 99, 102, 159, 92, 208, 126, 210, 81, 17, 119, 55, 12, 70, 238, + 226, 69, 176, 22, 23, 5, 204, 140, 217, 33, 220, 223, 218, 201, 23, 68, + 174, 181, 12, 161, 97, 146, 221, 122, 107, 19, 14, 163, 228, 161, 204, 230, + 114, 202, 102, 249, 101, 24, 123, 177, 86, 132, 182, 61, 16, 4, 141, 38, + 96, 222, 151, 181, 40, 252, 3, 195, 46, 194, 251, 185, 122, 238, 78, 196, + 213, 252, 191, 127, 232, 171, 6, 63, 74, 3, 71, 133, 140, 132, 219, 170, + 107, 213, 141, 59, 37, 81, 120, 193, 157, 108, 2, 0, 153, 100, 177, 252, + 152, 6, 213, 194, 175, 135, 73, 145, 34, 94, 3, 164, 94, 46, 14, 108, 180, + 112, 59, 73, 36, 210, 240, 194, 69, 35, 84, 115, 32, 26, 11, 76, 44, 115, + 156, 141, 108, 153, 180, 161, 195, 103, 109, 210, 88, 100, 40, 34, 20, 44, + 94, 51, 107, 104, 51, 190, 207, 128, 254, 221, 16, 76, 211, 182, 183, 181, + 252, 13, 95, 186, 119, 66, 134, 64, 41, 255, 97, 249, 179, 158, 158, 127, + 88, 144, 201, 53, 120, 109, 158, 240, 84, 211, 187, 121, 0, 138, 233, 150, + 200, 11, 181, 220, 15, 43, 111, 139, 241, 187, 143, 36, 120, 193, 228, 238, + 152, 7, 173, 159, 2, 105, 118, 64, 36, 55, 183, 246, 114, 123, 42, 161, 56, + 175, 9, 244, 205, 17, 89, 200, 241, 3, 40, 124, 134, 23, 201, 207, 110, 41, + 97, 152, 89, 32, 113, 74, 107, 172, 96, 244, 131, 213, 91, 206, 61, 107, 7, + 113, 85, 213, 21, 188, 171, 110, 3, 180, 172, 151, 174, 223, 108, 135, 32, + 109, 159, 140, 247, 78, 104, 143, 10, 93, 135, 220, 86, 80, 227, 238, 46, + 142, 28, 174, 90, 180, 120, 55, 196, 113, 54, 129, 48, 112, 92, 72, 187, + 225, 189, 148, 71, 79, 247, 255, 126, 179, 45, 173, 120, 42, 236, 63, 6, + 227, 251, 76, 228, 126, 42, 11, 251, 211, 172, 16, 63, 223, 246, 92, 112, + 123, 184, 114, 62, 203, 150, 112, 17, 128, 114, 156, 207, 224, 235, 199, + 166, 11, 128, 56, 185, 221, 7, 121, 116, 100, 36, 113, 10, 246, 188, 200, + 39, 119, 162, 208, 130, 141, 144, 220, 90, 120, 123, 10, 215, 237, 16, 24, + 18, 219, 252, 115, 11, 2, 244, 166, 142, 3, 10, 190, 25, 117, 3, 60, 91, + 112, 4, 65, 157, 219, 142, 116, 171, 5, 65, 47, 113, 60, 118, 17, 168, 248, + 94, 10, 40, 123, 144, 91, 83, 251, 2, 125, 26, 19, 133, 150, 96, 18, 80, + 135, 194, 169, 210, 174, 140, 225, 173, 47, 52, 230, 75, 219, 37, 122, 38, + 179, 173, 177, 65, 149, 73, 55, 130, 78, 229, 22, 203, 145, 85, 69, 246, + 244, 13, 197, 85, 162, 73, 138, 69, 225, 241, 136, 235, 59, 138, 28, 34, + 171, 34, 77, 88, 52, 141, 98, 70, 50, 137, 73, 31, 214, 43, 58, 219, 156, + 244, 81, 97, 129, 237, 213, 61, 116, 66, 108, 149, 204, 220, 139, 81, 164, + 34, 182, 111, 63, 217, 161, 221, 103, 76, 215, 127, 179, 205, 35, 162, 44, + 76, 66, 216, 85, 97, 108, 193, 12, 140, 68, 21, 210, 236, 129, 236, 91, + 253, 203, 200, 209, 164, 107, 22, 3, 150, 5, 105, 153, 145, 5, 28, 159, + 165, 75, 16, 21, 119, 46, 108, 190, 120, 211, 41, 113, 45, 149, 125, 211, + 22, 39, 197, 61, 220, 39, 225, 111, 2, 236, 83, 224, 157, 212, 158, 87, + 152, 128, 147, 7, 155, 127, 33, 102, 156, 239, 154, 149, 215, 144, 193, + 222, 169, 94, 46, 128, 22, 186, 97, 26, 144, 151, 221, 206, 165, 120, 249, + 235, 145, 2, 144, 86, 77, 23, 163, 108, 225, 244, 198, 209, 119, 101, 147, + 252, 165, 93, 152, 198, 51, 70, 136, 138, 120, 60, 123, 5, 13, 253, 209, + 109, 40, 224, 244, 34, 230, 54, 3, 178, 218, 114, 157, 119, 76, 143, 200, + 58, 96, 35, 220, 113, 171, 175, 118, 172, 21, 159, 252, 64, 32, 2, 189, + 198, 204, 177, 250, 168, 213, 9, 144, 73, 245, 61, 45, 124, 201, 122, 53, + 208, 58, 156, 201, 115, 10, 250, 83, 89, 25, 2, 219, 57, 239, 215, 2, 213, + 220, 92, 248, 192, 67, 54, 241, 155, 181, 85, 58, 113, 125, 200, 151, 54, + 8, 176, 105, 60, 220, 63, 94, 230, 45, 238, 3, 112, 224, 42, 62, 199, 90, + 131, 216, 214, 115, 48, 107, 142, 55, 24, 64, 92, 12, 202, 7, 224, 4, 151, + 175, 167, 184, 109, 11, 185, 30, 165, 4, 202, 124, 233, 119, 48, 63, 50, + 116, 247, 147, 228, 52, 254, 5, 1, 90, 67, 135, 118, 95, 234, 188, 36, 199, + 2, 224, 238, 167, 246, 35, 253, 255, 71, 33, 183, 229, 138, 196, 176, 193, + 2, 54, 141, 47, 72, 22, 49, 160, 86, 246, 101, 186, 180, 52, 45, 41, 218, + 107, 217, 233, 13, 244, 90, 127, 96, 140, 5, 117, 111, 22, 10, 47, 218, 21, + 243, 214, 216, 221, 54, 218, 173, 133, 219, 106, 193, 208, 100, 164, 189, + 140, 209, 21, 186, 90, 214, 67, 2, 135, 201, 111, 252, 43, 141, 171, 22, + 74, 250, 215, 3, 39, 218, 100, 236, 160, 140, 95, 19, 191, 121, 202, 3, + 255, 171, 42, 192, 145, 254, 63, 78, 3, 72, 86, 36, 253, 152, 128, 51, 12, + 223, 60, 253, 221, 229, 117, 100, 123, 116, 236, 111, 95, 70, 102, 21, 197, + 96, 92, 172, 246, 125, 165, 233, 47, 46, 109, 71, 148, 168, 69, 232, 231, + 182, 78, 51, 181, 90, 215, 66, 213, 182, 4, 190, 230, 166, 140, 156, 98, + 50, 72, 167, 187, 149, 109, 85, 38, 204, 82, 125, 224, 14, 122, 91, 10, 35, + 168, 208, 156, 133, 13, 97, 228, 115, 135, 141, 85, 29, 220, 32, 27, 75, + 202, 167, 184, 38, 100, 242, 77, 158, 210, 130, 55, 61, 251, 159, 61, 253, + 162, 7, 222, 83, 188, 200, 216, 106, 207, 44, 142, 60, 178, 82, 8, 106, + 211, 196, 226, 145, 114, 163, 159, 3, 194, 157, 97, 93, 9, 33, 220, 197, + 101, 36, 69, 241, 159, 249, 76, 143, 78, 8, 112, 233, 182, 81, 149, 246, + 32, 114, 20, 161, 150, 86, 10, 77, 3, 20, 87, 56, 63, 21, 115, 40, 103, 33, + 178, 129, 133, 242, 254, 22, 220, 8, 97, 235, 67, 125, 151, 152, 81, 211, + 175, 144, 231, 68, 170, 210, 202, 223, 138, 152, 226, 140, 38, 32, 57, 26, + 178, 97, 14, 96, 69, 134, 60, 111, 243, 118, 254, 31, 84, 139, 42, 2, 183, + 115, 216, 95, 27, 151, 132, 210, 137, 195, 135, 247, 16, 1, 227, 69, 72, + 191, 227, 133, 170, 96, 207, 141, 144, 92, 184, 192, 146, 75, 219, 237, + 155, 122, 190, 225, 116, 67, 255, 96, 166, 171, 149, 64, 140, 30, 38, 154, + 5, 97, 22, 198, 30, 5, 110, 185, 174, 164, 122, 109, 28, 250, 132, 190, 10, + 143, 64, 155, 219, 122, 254, 3, 231, 160, 139, 195, 18, 235, 74, 170, 92, + 199, 143, 113, 182, 180, 106, 215, 210, 121, 214, 149, 118, 253, 224, 140, + 245, 98, 96, 147, 226, 18, 151, 242, 3, 216, 150, 33, 84, 24, 53, 46, 183, + 252, 249, 252, 61, 133, 84, 107, 121, 163, 41, 195, 194, 93, 135, 3, 155, + 36, 173, 0, 56, 118, 210, 60, 22, 250, 215, 156, 79, 233, 159, 176, 191, 2, + 79, 156, 161, 142, 72, 238, 74, 225, 201, 158, 145, 167, 42, 147, 178, 147, + 33, 232, 52, 199, 93, 213, 181, 171, 94, 9, 232, 250, 129, 104, 95, 100, + 212, 29, 210, 197, 147, 119, 168, 217, 20, 112, 126, 244, 150, 91, 76, 54, + 77, 25, 130, 169, 104, 26, 66, 250, 213, 102, 208, 29, 68, 90, 116, 114, + 156, 179, 49, 198, 101, 163, 201, 205, 127, 185, 78, 254, 252, 207, 97, 7, + 79, 92, 153, 124, 47, 174, 85, 2, 73, 8, 68, 163, 224, 117, 215, 32, 163, + 251, 182, 255, 213, 35, 167, 247, 6, 87, 19, 125, 199, 1, 152, 112, 59, 2, + 151, 14, 138, 12, 126, 219, 3, 140, 58, 0, 237, 219, 177, 143, 83, 159, 15, + 245, 209, 125, 208, 112, 80, 74, 205, 230, 112, 1, 129, 37, 31, 87, 108, + 17, 98, 63, 46, 197, 29, 34, 155, 89, 77, 120, 47, 59, 163, 187, 207, 46, + 155, 84, 236, 165, 199, 161, 78, 218, 192, 84, 13, 46, 32, 146, 144, 237, + 182, 217, 151, 255, 11, 51, 51, 172, 44, 203, 166, 232, 228, 50, 174, 113, + 92, 110, 49, 229, 62, 6, 203, 72, 172, 163, 85, 3, 169, 235, 223, 202, 3, + 78, 230, 46, 21, 136, 120, 245, 210, 212, 64, 96, 113, 135, 209, 28, 160, + 174, 109, 222, 87, 72, 7, 10, 27, 23, 46, 143, 75, 74, 211, 135, 37, 38, 8, + 104, 251, 2, 165, 16, 46, 178, 242, 76, 94, 13, 24, 117, 183, 161, 99, 132, + 197, 44, 201, 212, 181, 18, 40, 39, 233, 71, 50, 11, 54, 96, 25, 48, 217, + 208, 3, 106, 171, 156, 174, 81, 143, 144, 58, 193, 96, 124, 254, 76, 250, + 78, 183, 154, 255, 170, 52, 36, 224, 116, 239, 67, 51, 41, 136, 190, 179, + 77, 131, 231, 143, 110, 186, 93, 121, 35, 89, 115, 62, 224, 220, 52, 70, + 26, 13, 208, 206, 162, 106, 160, 111, 162, 40, 11, 96, 85, 124, 44, 246, + 191, 212, 215, 10, 3, 34, 97, 217, 92, 185, 210, 245, 131, 191, 128, 32, + 86, 240, 63, 177, 122, 2, 137, 63, 108, 230, 191, 69, 110, 208, 142, 235, + 110, 71, 131, 184, 234, 19, 19, 63, 183, 166, 170, 6, 70, 213, 227, 233, + 112, 231, 49, 98, 212, 162, 50, 150, 182, 66, 208, 10, 238, 167, 118, 214, + 87, 225, 3, 237, 167, 238, 23, 11, 219, 51, 99, 76, 201, 205, 112, 151, + 248, 43, 218, 66, 117, 143, 176, 74, 227, 184, 194, 103, 137, 208, 80, 222, + 82, 247, 198, 2, 219, 136, 12, 110, 49, 2, 106, 190, 183, 104, 65, 164, + 207, 191, 12, 17, 238, 21, 49, 102, 86, 219, 50, 46, 155, 126, 174, 15, + 200, 144, 248, 148, 61, 33, 206, 170, 6, 100, 228, 22, 244, 79, 140, 153, + 3, 155, 41, 217, 144, 240, 140, 61, 97, 126, 236, 45, 153, 212, 78, 173, + 238, 234, 21, 38, 4, 13, 49, 101, 118, 199, 185, 86, 123, 231, 230, 186, + 175, 151, 140, 123, 3, 210, 14, 105, 79, 228, 67, 187, 173, 6, 70, 186, 43, + 136, 110, 63, 194, 43, 28, 222, 117, 9, 75, 133, 107, 81, 235, 105, 139, + 136, 194, 20, 63, 148, 221, 65, 213, 131, 216, 203, 11, 29, 211, 8, 41, 53, + 184, 225, 2, 253, 171, 247, 242, 164, 21, 132, 222, 106, 215, 58, 116, 234, + 80, 89, 252, 252, 52, 206, 159, 246, 87, 145, 102, 88, 224, 30, 107, 227, + 2, 104, 110, 2, 163, 82, 171, 85, 8, 135, 240, 171, 53, 245, 8, 134, 108, + 4, 176, 99, 236, 88, 130, 194, 201, 166, 231, 251, 142, 19, 152, 77, 111, + 61, 67, 212, 44, 68, 30, 33, 239, 246, 82, 95, 88, 183, 175, 78, 141, 45, + 179, 95, 173, 191, 136, 246, 25, 114, 29, 175, 244, 74, 212, 125, 228, 9, + 166, 37, 89, 224, 170, 100, 118, 203, 33, 186, 221, 91, 223, 87, 228, 237, + 178, 167, 238, 177, 172, 66, 240, 71, 188, 46, 95, 255, 125, 251, 161, 78, + 168, 193, 174, 225, 18, 220, 75, 147, 156, 102, 133, 204, 205, 130, 18, + 242, 113, 172, 26, 108, 106, 17, 162, 241, 187, 178, 211, 218, 174, 136, + 194, 202, 62, 124, 3, 35, 141, 252, 96, 127, 240, 244, 225, 253, 222, 88, + 46, 45, 234, 232, 155, 18, 226, 171, 200, 203, 163, 56, 3, 77, 135, 50, 28, + 229, 175, 124, 182, 2, 91, 28, 238, 131, 167, 82, 51, 76, 132, 243, 122, + 243, 153, 88, 110, 41, 45, 24, 243, 144, 71, 125, 234, 115, 189, 236, 90, + 106, 19, 93, 156, 103, 37, 148, 111, 184, 17, 91, 226, 39, 156, 2, 179, + 205, 185, 161, 58, 113, 119, 86, 108, 74, 149, 17, 116, 201, 255, 6, 223, + 137, 196, 183, 88, 171, 139, 156, 97, 35, 94, 254, 182, 242, 180, 18, 84, + 4, 127, 11, 53, 215, 91, 35, 150, 8, 170, 250, 248, 189, 135, 129, 155, + 184, 236, 203, 162, 161, 94, 231, 19, 8, 12, 83, 168, 120, 79, 28, 159, + 204, 82, 41, 231, 16, 231, 8, 150, 24, 17, 84, 105, 61, 41, 96, 33, 38, + 236, 99, 130, 55, 2, 14, 18, 137, 145, 64, 141, 30, 8, 65, 99, 234, 197, + 231, 156, 145, 192, 215, 58, 189, 234, 101, 77, 111, 174, 151, 198, 179, + 178, 112, 14, 122, 74, 2, 255, 118, 129, 151, 26, 140, 141, 67, 203, 207, + 207, 31, 105, 48, 14, 230, 130, 93, 111, 76, 158, 224, 36, 151, 215, 219, + 220, 248, 13, 147, 196, 9, 218, 203, 102, 66, 125, 252, 116, 48, 197, 70, + 60, 187, 46, 54, 26, 189, 208, 237, 44, 179, 95, 55, 4, 167, 228, 175, 183, + 85, 254, 64, 53, 47, 4, 134, 176, 182, 71, 216, 249, 183, 171, 188, 0, 158, + 1, 20, 199, 10, 75, 180, 225, 48, 73, 207, 104, 219, 146, 193, 74, 252, + 248, 56, 153, 247, 56, 180, 220, 55, 213, 210, 73, 86, 193, 60, 89, 139, + 238, 5, 60, 61, 55, 26, 63, 118, 168, 226, 94, 128, 245, 54, 150, 66, 116, + 134, 177, 174, 3, 175, 84, 216, 8, 42, 65, 162, 196, 119, 113, 66, 52, 219, + 175, 230, 107, 173, 174, 96, 237, 139, 9, 39, 202, 147, 188, 84, 209, 194, + 5, 141, 243, 2, 105, 136, 43, 97, 68, 140, 9, 103, 86, 97, 181, 146, 93, + 203, 82, 225, 173, 213, 118, 152, 121, 194, 255, 61, 235, 46, 163, 221, + 138, 98, 120, 224, 67, 205, 193, 214, 183, 230, 83, 199, 142, 55, 89, 82, + 95, 245, 17, 3, 149, 227, 165, 12, 148, 50, 88, 37, 144, 202, 205, 141, 94, + 85, 227, 100, 9, 18, 78, 20, 189, 95, 244, 92, 205, 165, 11, 6, 252, 93, + 146, 88, 22, 166, 34, 133, 101, 171, 208, 6, 143, 106, 18, 171, 117, 14, + 87, 35, 47, 239, 133, 109, 142, 3, 108, 1, 127, 208, 90, 160, 56, 138, 81, + 126, 62, 229, 149, 213, 10, 103, 94, 24, 167, 216, 239, 85, 91, 19, 200, + 69, 3, 170, 233, 43, 133, 180, 164, 37, 218, 86, 177, 139, 54, 120, 103, + 247, 207, 141, 84, 136, 239, 25, 189, 138, 102, 35, 0, 186, 226, 91, 137, + 220, 253, 2, 80, 70, 174, 240, 67, 32, 5, 3, 219, 139, 216, 221, 246, 145, + 64, 39, 235, 113, 181, 98, 53, 84, 219, 122, 164, 209, 67, 184, 93, 32, 53, + 6, 2, 96, 36, 189, 113, 154, 82, 130, 201, 33, 126, 126, 118, 60, 63, 248, + 240, 35, 123, 37, 31, 187, 41, 8, 96, 193, 127, 167, 85, 253, 111, 135, 62, + 130, 17, 197, 220, 171, 254, 54, 255, 253, 195, 31, 144, 39, 231, 113, 232, + 0, 213, 221, 156, 7, 27, 219, 85, 191, 104, 221, 1, 103, 104, 207, 52, 130, + 100, 69, 177, 0, 57, 92, 226, 82, 249, 155, 129, 47, 79, 21, 115, 177, 142, + 7, 60, 224, 100, 106, 36, 96, 173, 24, 115, 45, 243, 140, 2, 240, 52, 226, + 73, 193, 182, 10, 152, 183, 167, 239, 18, 143, 187, 12, 201, 174, 243, 49, + 185, 208, 63, 132, 112, 128, 189, 156, 15, 179, 132, 122, 60, 2, 159, 39, + 3, 255, 17, 151, 247, 19, 76, 38, 220, 115, 132, 245, 169, 176, 249, 238, + 235, 219, 161, 27, 169, 85, 155, 243, 117, 218, 75, 10, 146, 247, 100, 254, + 215, 193, 155, 225, 29, 119, 115, 38, 95, 241, 148, 224, 151, 21, 208, 2, + 187, 11, 135, 17, 16, 90, 183, 93, 249, 195, 78, 154, 42, 151, 52, 57, 6, + 13, 233, 216, 137, 99, 225, 196, 53, 144, 28, 209, 228, 170, 99, 122, 22, + 4, 206, 100, 87, 108, 16, 192, 64, 179, 159, 229, 231, 59, 79, 252, 109, + 125, 48, 62, 62, 157, 108, 184, 76, 228, 137, 179, 183, 47, 202, 174, 96, + 131, 215, 125, 17, 195, 25, 222, 222, 207, 217, 208, 60, 175, 2, 27, 138, + 0, 8, 207, 249, 186, 139, 17, 183, 176, 61, 248, 22, 251, 170, 131, 172, + 71, 18, 134, 133, 250, 119, 237, 57, 164, 121, 175, 76, 48, 225, 3, 59, + 150, 22, 50, 126, 101, 20, 244, 156, 58, 229, 38, 226, 10, 181, 238, 155, + 67, 141, 131, 56, 134, 89, 33, 248, 37, 210, 110, 235, 14, 169, 241, 136, + 25, 156, 224, 123, 15, 1, 47, 29, 228, 213, 25, 208, 188, 168, 64, 59, 166, + 96, 179, 199, 24, 144, 140, 14, 11, 10, 124, 133, 136, 136, 176, 47, 162, + 204, 189, 118, 31, 72, 22, 193, 237, 221, 39, 95, 15, 159, 160, 30, 55, 27, + 198, 31, 78, 195, 58, 202, 217, 197, 43, 154, 96, 138, 195, 122, 110, 189, + 223, 168, 235, 78, 185, 23, 189, 11, 16, 156, 103, 96, 119, 232, 42, 166, + 165, 72, 209, 72, 77, 227, 181, 196, 49, 188, 77, 73, 25, 2, 4, 4, 154, + 224, 146, 12, 92, 39, 133, 185, 111, 15, 94, 11, 100, 32, 228, 146, 66, 19, + 7, 231, 128, 91, 14, 28, 11, 211, 171, 252, 175, 146, 2, 185, 6, 156, 220, + 158, 103, 111, 111, 94, 103, 203, 251, 118, 109, 239, 68, 39, 246, 214, 74, + 249, 17, 202, 189, 255, 14, 186, 41, 141, 10, 70, 236, 232, 50, 38, 93, 78, + 23, 39, 186, 175, 122, 73, 22, 62, 91, 90, 50, 113, 113, 220, 209, 54, 249, + 196, 18, 74, 117, 220, 78, 121, 230, 217, 35, 164, 101, 213, 43, 133, 170, + 91, 43, 116, 45, 212, 251, 48, 217, 215, 45, 139, 163, 203, 199, 112, 199, + 166, 146, 164, 74, 102, 53, 130, 140, 83, 214, 66, 28, 153, 142, 187, 62, + 234, 235, 31, 242, 28, 159, 172, 115, 98, 155, 21, 197, 81, 230, 231, 57, + 130, 167, 20, 128, 168, 61, 83, 152, 195, 88, 3, 138, 102, 248, 167, 60, + 147, 221, 166, 129, 90, 132, 132, 41, 120, 241, 156, 252, 182, 7, 229, 77, + 193, 137, 45, 253, 20, 239, 210, 172, 115, 1, 149, 2, 96, 255, 140, 199, + 202, 14, 113, 83, 122, 97, 68, 205, 32, 199, 123, 136, 186, 228, 184, 126, + 169, 73, 67, 61, 96, 21, 241, 248, 236, 27, 52, 4, 7, 88, 76, 49, 72, 36, + 251, 251, 113, 165, 99, 167, 237, 238, 34, 30, 214, 55, 160, 181, 197, 56, + 59, 34, 103, 102, 186, 77, 10, 179, 170, 148, 194, 179, 241, 164, 245, 26, + 146, 97, 228, 98, 41, 62, 74, 243, 121, 241, 152, 33, 82, 102, 149, 139, + 49, 19, 122, 193, 246, 163, 229, 189, 162, 32, 184, 251, 205, 170, 23, 250, + 16, 160, 42, 25, 167, 97, 65, 28, 149, 4, 41, 55, 229, 143, 247, 124, 112, + 48, 120, 184, 97, 221, 141, 189, 165, 128, 3, 243, 207, 127, 243, 28, 113, + 18, 45, 249, 161, 44, 54, 172, 57, 223, 211, 10, 96, 3, 47, 22, 11, 28, + 217, 90, 61, 132, 190, 212, 21, 28, 137, 2, 108, 33, 92, 8, 87, 188, 36, 3, + 243, 90, 92, 59, 172, 168, 86, 213, 6, 80, 220, 194, 176, 34, 110, 167, + 189, 192, 205, 147, 82, 222, 210, 241, 252, 176, 41, 182, 136, 143, 64, + 236, 99, 255, 239, 135, 17, 183, 3, 20, 145, 170, 50, 134, 219, 87, 26, + 224, 136, 43, 236, 127, 39, 205, 171, 57, 180, 102, 153, 71, 81, 19, 38, + 86, 241, 222, 150, 252, 91, 22, 108, 77, 140, 90, 212, 87, 241, 186, 212, + 182, 54, 210, 223, 84, 182, 182, 148, 74, 198, 174, 141, 119, 72, 111, 152, + 223, 193, 96, 242, 159, 64, 141, 207, 215, 221, 181, 60, 182, 69, 108, 136, + 200, 167, 69, 40, 184, 150, 19, 40, 212, 3, 184, 59, 234, 214, 68, 66, 11, + 223, 136, 61, 174, 129, 28, 48, 221, 47, 125, 207, 7, 99, 191, 116, 143, + 235, 105, 92, 245, 27, 95, 146, 242, 181, 2, 177, 48, 195, 29, 237, 14, 99, + 40, 222, 90, 223, 62, 28, 22, 149, 69, 210, 6, 32, 45, 224, 15, 29, 134, + 102, 30, 157, 60, 182, 88, 39, 82, 69, 236, 4, 120, 191, 195, 66, 26, 158, + 12, 139, 187, 83, 114, 218, 13, 65, 12, 108, 132, 32, 162, 221, 70, 0, 35, + 69, 164, 210, 108, 127, 255, 79, 156, 179, 157, 32, 142, 235, 92, 37, 51, + 133, 217, 236, 216, 173, 108, 59, 136, 67, 8, 50, 2, 142, 61, 3, 182, 47, + 81, 212, 162, 32, 149, 212, 33, 76, 118, 129, 80, 193, 155, 137, 208, 253, + 28, 87, 134, 226, 59, 82, 207, 200, 213, 34, 143, 22, 255, 126, 217, 241, + 38, 193, 46, 29, 104, 3, 88, 100, 208, 7, 114, 155, 43, 160, 180, 254, 201, + 36, 83, 254, 106, 206, 234, 127, 154, 240, 200, 36, 98, 195, 88, 193, 167, + 181, 169, 35, 84, 48, 3, 127, 144, 78, 165, 1, 218, 18, 52, 139, 157, 138, + 19, 10, 197, 241, 111, 134, 61, 196, 2, 214, 130, 120, 246, 119, 129, 45, + 11, 100, 0, 239, 227, 46, 156, 20, 135, 201, 159, 48, 48, 198, 15, 44, 59, + 237, 5, 49, 85, 238, 206, 179, 208, 233, 193, 151, 92, 22, 99, 209, 20, + 161, 210, 28, 73, 247, 154, 121, 78, 114, 12, 233, 88, 128, 236, 244, 230, + 153, 129, 218, 15, 106, 247, 43, 5, 245, 126, 113, 235, 196, 114, 4, 59, + 70, 47, 203, 92, 229, 238, 132, 207, 250, 14, 28, 211, 232, 64, 218, 206, + 158, 44, 186, 210, 38, 147, 1, 71, 130, 188, 0, 179, 129, 97, 208, 127, + 147, 181, 121, 39, 3, 131, 101, 131, 55, 87, 237, 91, 22, 12, 69, 150, 243, + 43, 179, 220, 133, 209, 223, 58, 200, 220, 43, 59, 19, 255, 200, 235, 192, + 169, 112, 87, 0, 2, 169, 50, 86, 16, 107, 13, 254, 105, 160, 141, 104, 220, + 75, 141, 159, 73, 148, 175, 222, 228, 50, 64, 155, 47, 111, 226, 36, 61, + 47, 246, 80, 108, 221, 68, 191, 82, 141, 161, 177, 69, 112, 40, 11, 55, + 196, 56, 83, 6, 42, 48, 241, 65, 155, 151, 107, 54, 71, 229, 49, 186, 93, + 241, 63, 59, 114, 96, 235, 99, 193, 166, 13, 101, 150, 21, 131, 59, 142, + 22, 150, 97, 112, 251, 193, 147, 115, 82, 212, 254, 232, 106, 25, 128, 213, + 122, 84, 203, 253, 164, 5, 246, 246, 19, 152, 57, 168, 236, 132, 19, 71, + 168, 240, 201, 188, 30, 250, 123, 0, 238, 98, 214, 189, 56, 248, 38, 229, + 87, 105, 74, 2, 162, 178, 216, 92, 72, 17, 249, 95, 121, 244, 52, 87, 133, + 198, 30, 41, 16, 191, 84, 137, 160, 83, 179, 47, 31, 157, 195, 76, 121, + 155, 118, 203, 3, 156, 214, 171, 235, 184, 45, 229, 97, 26, 190, 238, 3, + 61, 169, 164, 47, 14, 147, 90, 175, 74, 96, 73, 77, 29, 31, 155, 42, 145, + 70, 58, 147, 43, 13, 126, 111, 41, 38, 221, 233, 84, 170, 170, 230, 245, + 12, 237, 151, 75, 191, 197, 224, 222, 123, 94, 141, 170, 119, 214, 24, 73, + 169, 151, 81, 171, 42, 187, 216, 233, 170, 67, 5, 4, 76, 119, 195, 180, + 184, 175, 30, 34, 21, 34, 160, 143, 139, 1, 58, 193, 70, 150, 179, 11, 54, + 103, 230, 205, 164, 2, 211, 38, 53, 235, 117, 253, 55, 57, 118, 91, 25, + 161, 146, 164, 236, 179, 32, 66, 36, 86, 161, 228, 210, 89, 202, 1, 85, 91, + 41, 2, 55, 230, 49, 73, 183, 248, 124, 58, 175, 131, 69, 253, 170, 146, + 210, 57, 251, 211, 196, 174, 35, 157, 96, 75, 26, 89, 169, 14, 72, 235, 25, + 55, 2, 149, 251, 180, 183, 200, 56, 233, 218, 117, 9, 68, 199, 54, 183, 5, + 197, 73, 134, 66, 181, 92, 95, 145, 144, 199, 234, 182, 133, 226, 46, 219, + 84, 172, 153, 77, 217, 138, 178, 157, 235, 156, 190, 140, 189, 207, 37, + 152, 117, 63, 175, 140, 201, 70, 35, 196, 75, 30, 119, 160, 149, 77, 195, + 118, 148, 235, 238, 83, 44, 63, 34, 12, 164, 125, 34, 213, 16, 102, 175, + 231, 253, 167, 33, 177, 70, 149, 223, 118, 235, 189, 175, 88, 27, 213, 42, + 37, 27, 139, 71, 6, 160, 214, 34, 194, 40, 53, 188, 44, 14, 68, 107, 80, + 216, 181, 117, 126, 109, 147, 92, 28, 207, 84, 124, 196, 180, 131, 78, 125, + 224, 3, 99, 149, 79, 245, 237, 15, 157, 199, 231, 71, 212, 237, 203, 137, + 153, 71, 161, 241, 154, 47, 46, 63, 202, 90, 202, 246, 87, 197, 13, 218, + 213, 127, 2, 127, 57, 191, 106, 22, 32, 84, 93, 233, 39, 231, 172, 117, + 191, 221, 55, 134, 93, 118, 82, 95, 117, 27, 180, 241, 43, 172, 15, 146, + 35, 96, 224, 175, 160, 56, 10, 3, 134, 55, 254, 201, 159, 49, 65, 237, 160, + 121, 118, 105, 46, 32, 27, 6, 228, 110, 63, 254, 133, 25, 24, 209, 162, + 166, 46, 90, 22, 28, 214, 63, 111, 25, 54, 54, 127, 94, 250, 196, 14, 136, + 102, 3, 225, 184, 197, 226, 53, 113, 43, 83, 94, 3, 111, 188, 170, 248, 16, + 186, 9, 152, 130, 51, 34, 60, 160, 55, 230, 2, 188, 118, 66, 147, 220, 138, + 31, 224, 251, 52, 224, 219, 193, 187, 150, 84, 108, 129, 224, 6, 206, 3, + 163, 15, 107, 44, 149, 151, 255, 215, 42, 30, 80, 34, 64, 135, 220, 172, + 58, 73, 255, 183, 194, 146, 91, 182, 154, 0, 123, 152, 115, 98, 39, 24, 2, + 219, 167, 33, 215, 119, 226, 113, 13, 175, 243, 75, 35, 186, 219, 81, 193, + 157, 77, 144, 137, 93, 19, 197, 192, 141, 166, 6, 148, 131, 237, 181, 66, + 173, 55, 86, 158, 44, 253, 176, 20, 109, 164, 170, 16, 247, 20, 121, 245, + 105, 56, 182, 65, 228, 43, 96, 28, 42, 219, 73, 158, 69, 254, 178, 190, + 129, 245, 144, 111, 34, 114, 5, 24, 120, 148, 123, 149, 131, 138, 246, 29, + 111, 146, 225, 185, 242, 212, 246, 90, 143, 59, 65, 152, 72, 59, 146, 70, + 221, 239, 92, 254, 167, 19, 164, 122, 200, 195, 166, 207, 251, 108, 243, + 181, 200, 235, 71, 86, 226, 117, 121, 92, 201, 74, 156, 225, 140, 113, 17, + 163, 2, 232, 116, 10, 51, 230, 92, 2, 18, 146, 224, 197, 54, 179, 162, 133, + 0, 197, 7, 218, 189, 191, 170, 49, 206, 12, 247, 240, 6, 253, 177, 66, 67, + 3, 212, 143, 104, 25, 164, 91, 34, 50, 20, 13, 165, 240, 214, 0, 64, 252, + 183, 240, 74, 118, 185, 113, 113, 103, 169, 36, 34, 84, 192, 234, 7, 91, + 202, 254, 121, 99, 231, 13, 204, 131, 53, 17, 201, 131, 83, 205, 74, 43, + 129, 16, 82, 200, 0, 108, 107, 30, 150, 105, 224, 245, 221, 222, 209, 122, + 20, 214, 192, 17, 191, 120, 189, 114, 202, 121, 74, 238, 24, 28, 188, 8, + 199, 75, 130, 153, 215, 243, 83, 175, 195, 20, 156, 181, 78, 112, 84, 152, + 232, 126, 116, 191, 52, 173, 235, 238, 123, 197, 198, 78, 166, 142, 134, + 102, 141, 18, 145, 236, 42, 160, 37, 101, 139, 224, 40, 195, 177, 0, 155, + 7, 3, 12, 24, 215, 87, 215, 161, 169, 188, 224, 171, 5, 235, 55, 103, 144, + 250, 211, 156, 165, 75, 53, 42, 111, 163, 115, 124, 5, 177, 107, 199, 176, + 205, 3, 16, 143, 36, 132, 136, 52, 12, 109, 178, 238, 64, 201, 219, 11, 20, + 152, 164, 99, 65, 118, 98, 186, 53, 50, 103, 118, 83, 96, 21, 119, 68, 6, + 244, 192, 71, 182, 94, 177, 138, 118, 42, 255, 157, 103, 239, 38, 181, 238, + 201, 173, 77, 178, 19, 34, 22, 203, 56, 166, 205, 183, 120, 180, 187, 231, + 94, 253, 18, 231, 117, 90, 175, 103, 137, 192, 201, 13, 115, 71, 190, 105, + 49, 103, 134, 32, 191, 101, 190, 214, 187, 110, 86, 64, 254, 44, 176, 160, + 4, 250, 10, 165, 237, 185, 198, 181, 30, 52, 84, 53, 93, 14, 125, 81, 136, + 115, 96, 113, 36, 11, 51, 43, 183, 50, 65, 217, 231, 212, 200, 233, 2, 23, + 30, 93, 12, 207, 210, 225, 120, 126, 239, 55, 216, 130, 219, 124, 10, 27, + 160, 147, 94, 195, 81, 110, 187, 231, 63, 60, 137, 112, 32, 190, 237, 2, + 148, 237, 213, 57, 112, 66, 22, 64, 189, 10, 183, 128, 72, 127, 175, 60, + 197, 28, 46, 228, 110, 231, 181, 124, 123, 143, 110, 23, 48, 162, 217, 154, + 250, 152, 28, 4, 1, 141, 123, 125, 212, 22, 252, 253, 72, 196, 144, 92, + 118, 98, 59, 86, 73, 162, 29, 244, 91, 98, 80, 137, 201, 251, 43, 12, 158, + 219, 8, 141, 195, 113, 140, 93, 140, 183, 47, 106, 178, 8, 174, 43, 157, + 126, 124, 118, 128, 230, 98, 169, 201, 233, 253, 196, 149, 37, 134, 145, + 63, 203, 101, 131, 82, 57, 251, 247, 142, 38, 193, 183, 232, 243, 188, 246, + 221, 1, 23, 131, 74, 102, 199, 241, 159, 113, 126, 140, 195, 50, 37, 56, 3, + 205, 120, 17, 232, 168, 140, 70, 18, 237, 61, 135, 48, 126, 187, 222, 22, + 237, 66, 69, 165, 23, 43, 227, 173, 224, 82, 239, 138, 8, 74, 180, 36, 3, + 45, 113, 25, 173, 86, 7, 12, 105, 139, 153, 164, 251, 179, 139, 130, 186, + 23, 116, 221, 80, 231, 53, 202, 40, 56, 65, 121, 193, 238, 32, 95, 134, + 211, 19, 75, 222, 3, 116, 167, 51, 138, 199, 129, 136, 155, 180, 234, 163, + 98, 82, 83, 152, 105, 152, 249, 55, 101, 222, 202, 192, 164, 15, 250, 172, + 45, 46, 14, 206, 123, 246, 111, 164, 231, 81, 106, 219, 224, 241, 96, 233, + 196, 230, 81, 132, 21, 74, 100, 27, 140, 138, 243, 63, 177, 171, 58, 215, + 153, 67, 165, 95, 101, 68, 164, 161, 38, 245, 173, 149, 152, 69, 131, 30, + 128, 48, 0, 8, 173, 130, 147, 164, 71, 206, 88, 83, 3, 131, 241, 202, 3, + 183, 141, 162, 206, 42, 78, 181, 47, 253, 81, 80, 159, 225, 44, 83, 160, + 190, 115, 112, 244, 194, 78, 157, 149, 224, 122, 52, 173, 40, 160, 93, 13, + 2, 87, 237, 28, 63, 238, 189, 94, 215, 201, 116, 92, 71, 38, 193, 1, 198, + 43, 195, 228, 79, 34, 243, 225, 110, 187, 129, 25, 26, 76, 245, 17, 33, + 127, 90, 31, 65, 181, 78, 192, 173, 91, 156, 87, 94, 132, 86, 199, 50, 239, + 210, 165, 232, 153, 58, 243, 123, 52, 163, 60, 18, 203, 50, 65, 152, 219, + 146, 89, 240, 70, 102, 37, 138, 52, 120, 67, 127, 240, 173, 14, 134, 4, 31, + 238, 149, 199, 158, 49, 188, 67, 252, 88, 196, 186, 64, 6, 80, 180, 6, 77, + 92, 82, 232, 111, 183, 134, 149, 128, 203, 238, 35, 162, 75, 135, 142, 30, + 193, 132, 132, 49, 130, 157, 95, 104, 66, 195, 206, 169, 99, 3, 44, 61, + 182, 202, 64, 4, 159, 39, 67, 113, 30, 188, 253, 131, 142, 90, 100, 115, + 185, 174, 19, 195, 246, 92, 203, 45, 64, 128, 2, 83, 251, 189, 2, 62, 185, + 176, 48, 41, 244, 162, 10, 20, 81, 229, 128, 44, 253, 124, 41, 41, 98, 112, + 154, 228, 184, 172, 244, 184, 234, 230, 183, 148, 242, 243, 106, 252, 47, + 33, 68, 4, 191, 162, 44, 139, 29, 138, 188, 51, 2, 223, 185, 185, 27, 26, + 227, 28, 189, 96, 241, 213, 230, 64, 28, 187, 194, 204, 192, 49, 5, 77, + 201, 49, 162, 16, 47, 81, 194, 202, 61, 39, 168, 178, 122, 28, 208, 244, + 61, 134, 5, 197, 45, 136, 242, 19, 153, 119, 64, 42, 204, 21, 231, 101, 66, + 208, 151, 239, 146, 140, 81, 80, 42, 32, 41, 205, 137, 175, 41, 97, 162, + 17, 187, 220, 225, 93, 97, 41, 107, 16, 132, 118, 138, 3, 53, 163, 140, 41, + 222, 223, 240, 36, 92, 98, 103, 245, 194, 219, 171, 24, 197, 65, 115, 11, + 243, 90, 7, 33, 157, 159, 84, 127, 101, 63, 210, 239, 2, 188, 116, 130, + 188, 131, 140, 123, 115, 205, 204, 111, 168, 167, 130, 94, 52, 158, 5, 6, + 83, 240, 1, 192, 27, 47, 48, 102, 104, 0, 51, 83, 30, 57, 82, 85, 170, 0, + 9, 123, 127, 63, 249, 118, 232, 67, 127, 64, 20, 125, 203, 186, 189, 81, + 55, 64, 27, 27, 1, 22, 109, 123, 65, 180, 59, 186, 47, 74, 34, 222, 47, 75, + 224, 7, 76, 26, 63, 133, 106, 200, 91, 65, 168, 137, 18, 243, 130, 250, 76, + 37, 163, 96, 92, 47, 93, 255, 73, 119, 106, 208, 255, 67, 74, 71, 74, 215, + 153, 136, 229, 246, 47, 31, 147, 128, 48, 72, 252, 5, 250, 216, 146, 144, + 94, 230, 17, 136, 253, 207, 54, 2, 125, 154, 15, 126, 170, 99, 219, 15, 45, + 241, 186, 42, 209, 184, 198, 233, 27, 141, 0, 107, 19, 181, 175, 213, 202, + 141, 205, 5, 56, 185, 247, 250, 3, 48, 129, 198, 138, 234, 83, 78, 182, + 116, 6, 84, 21, 193, 225, 185, 85, 24, 251, 74, 0, 15, 43, 110, 149, 34, + 40, 132, 223, 191, 251, 158, 129, 29, 13, 22, 35, 86, 143, 177, 250, 7, 89, + 31, 254, 98, 223, 0, 48, 212, 107, 160, 245, 63, 86, 246, 145, 208, 86, + 228, 33, 10, 243, 91, 118, 55, 167, 216, 69, 117, 70, 71, 214, 26, 190, 55, + 43, 138, 168, 203, 123, 3, 185, 91, 218, 197, 150, 110, 187, 77, 47, 250, + 119, 225, 6, 214, 102, 110, 188, 199, 218, 142, 253, 235, 221, 149, 190, + 119, 99, 104, 26, 139, 215, 231, 162, 216, 245, 213, 219, 240, 161, 63, + 141, 173, 19, 4, 169, 148, 244, 2, 97, 6, 52, 28, 159, 80, 243, 93, 57, + 130, 24, 146, 227, 102, 176, 232, 185, 202, 132, 253, 127, 108, 213, 128, + 194, 73, 238, 125, 217, 222, 202, 126, 2, 146, 76, 244, 204, 147, 174, 55, + 192, 205, 240, 176, 14, 76, 127, 205, 198, 64, 173, 77, 255, 107, 186, 124, + 178, 39, 232, 245, 216, 97, 192, 36, 58, 87, 186, 103, 200, 87, 210, 132, + 146, 74, 104, 194, 123, 32, 191, 84, 46, 63, 30, 119, 202, 66, 136, 206, + 92, 11, 214, 144, 104, 173, 6, 146, 109, 71, 254, 86, 211, 16, 158, 84, + 161, 90, 221, 208, 227, 166, 71, 190, 212, 96, 186, 39, 165, 203, 24, 109, + 9, 125, 69, 147, 55, 14, 187, 75, 67, 146, 210, 57, 91, 13, 247, 164, 133, + 64, 134, 227, 188, 91, 207, 141, 135, 255, 94, 254, 8, 214, 101, 66, 136, + 233, 11, 193, 236, 159, 204, 221, 238, 2, 253, 64, 178, 175, 151, 199, 42, + 52, 8, 217, 129, 74, 15, 141, 85, 108, 233, 157, 203, 164, 239, 65, 182, + 23, 23, 61, 218, 87, 84, 2, 81, 149, 2, 84, 164, 33, 145, 200, 32, 73, 172, + 159, 158, 128, 194, 229, 7, 40, 155, 209, 154, 147, 139, 170, 72, 176, 129, + 100, 142, 20, 168, 115, 22, 247, 185, 249, 45, 221, 50, 99, 5, 75, 203, + 159, 100, 100, 123, 188, 125, 239, 77, 255, 55, 15, 253, 13, 121, 110, 30, + 182, 212, 247, 241, 92, 94, 99, 77, 7, 210, 180, 37, 239, 180, 196, 125, + 236, 13, 109, 50, 50, 86, 214, 55, 72, 188, 40, 67, 234, 81, 80, 10, 89, + 18, 144, 174, 239, 42, 53, 197, 65, 57, 132, 10, 221, 114, 170, 219, 45, + 165, 26, 148, 165, 11, 21, 151, 91, 220, 13, 209, 172, 14, 68, 55, 232, + 177, 229, 114, 15, 206, 255, 196, 2, 236, 195, 166, 244, 212, 95, 184, 166, + 89, 185, 72, 47, 62, 65, 137, 13, 142, 63, 62, 116, 31, 160, 122, 110, 223, + 205, 116, 225, 101, 71, 27, 247, 3, 68, 46, 147, 195, 1, 27, 124, 195, 164, + 85, 158, 122, 54, 98, 210, 153, 188, 12, 120, 161, 157, 13, 19, 42, 41, + 120, 173, 206, 180, 193, 178, 217, 48, 198, 23, 80, 34, 229, 93, 177, 15, + 34, 112, 43, 63, 200, 254, 157, 129, 132, 46, 192, 231, 209, 137, 171, 154, + 175, 130, 149, 252, 27, 44, 178, 36, 224, 224, 86, 194, 104, 30, 63, 77, + 135, 77, 233, 224, 98, 76, 91, 59, 206, 133, 202, 212, 255, 226, 76, 150, + 229, 88, 156, 91, 243, 19, 41, 252, 51, 117, 181, 78, 32, 35, 103, 193, 50, + 69, 9, 118, 37, 164, 174, 212, 7, 113, 29, 30, 55, 206, 16, 22, 78, 124, + 119, 159, 79, 184, 255, 2, 151, 165, 54, 161, 6, 238, 85, 200, 233, 199, + 59, 115, 26, 55, 127, 20, 89, 171, 255, 19, 16, 96, 143, 2, 185, 133, 217, + 149, 10, 37, 188, 180, 3, 188, 115, 49, 176, 182, 203, 254, 79, 1, 36, 178, + 59, 211, 209, 180, 83, 251, 239, 196, 254, 142, 60, 138, 169, 56, 18, 86, + 236, 42, 80, 72, 154, 114, 212, 226, 58, 254, 203, 107, 146, 12, 36, 40, + 217, 3, 199, 124, 89, 116, 142, 4, 2, 225, 239, 6, 89, 123, 44, 249, 245, + 47, 229, 121, 43, 187, 236, 152, 162, 9, 42, 242, 162, 196, 112, 213, 63, + 132, 93, 243, 60, 29, 220, 99, 155, 164, 232, 110, 18, 180, 175, 220, 99, + 176, 181, 159, 56, 77, 8, 90, 133, 20, 212, 170, 18, 124, 109, 33, 201, + 133, 56, 255, 202, 222, 193, 62, 243, 233, 71, 218, 119, 157, 32, 166, 161, + 165, 106, 242, 163, 2, 211, 199, 180, 135, 21, 64, 133, 133, 87, 12, 252, + 136, 67, 28, 42, 11, 190, 71, 50, 213, 13, 234, 89, 55, 63, 244, 73, 80, + 12, 17, 236, 183, 2, 131, 0, 124, 150, 134, 248, 209, 15, 221, 26, 178, 42, + 215, 177, 143, 86, 19, 67, 128, 191, 135, 171, 110, 233, 64, 113, 198, 115, + 43, 92, 38, 203, 162, 50, 191, 59, 230, 187, 77, 8, 216, 167, 198, 149, + 104, 61, 82, 249, 22, 102, 10, 199, 96, 106, 61, 133, 215, 134, 52, 128, + 146, 63, 84, 206, 227, 213, 103, 57, 1, 14, 192, 103, 81, 251, 27, 155, + 173, 186, 6, 45, 12, 236, 8, 188, 227, 13, 71, 79, 172, 252, 86, 254, 9, + 89, 5, 136, 58, 178, 124, 56, 204, 118, 26, 217, 145, 72, 110, 163, 79, + 241, 135, 77, 3, 183, 15, 95, 38, 142, 197, 93, 195, 146, 245, 117, 42, + 104, 205, 210, 2, 80, 188, 125, 114, 134, 48, 12, 244, 91, 173, 150, 170, + 244, 180, 208, 215, 116, 205, 127, 183, 175, 25, 89, 47, 168, 180, 35, 16, + 145, 222, 71, 167, 2, 180, 139, 17, 204, 195, 220, 229, 37, 97, 126, 152, + 25, 128, 152, 123, 0, 143, 113, 69, 34, 83, 228, 45, 112, 26, 98, 186, 110, + 131, 156, 45, 206, 179, 110, 12, 49, 127, 247, 202, 200, 209, 91, 3, 195, + 239, 66, 147, 87, 254, 180, 103, 208, 70, 89, 253, 71, 221, 200, 121, 211, + 3, 180, 4, 186, 24, 89, 58, 27, 192, 26, 108, 25, 195, 106, 69, 239, 32, + 130, 127, 187, 127, 26, 107, 82, 117, 35, 50, 118, 11, 39, 85, 49, 14, 151, + 123, 144, 234, 45, 71, 196, 37, 179, 232, 156, 229, 53, 47, 128, 20, 4, + 139, 132, 68, 142, 225, 251, 58, 155, 36, 29, 173, 194, 254, 26, 199, 140, + 46, 122, 2, 230, 117, 112, 106, 101, 157, 97, 19, 151, 51, 37, 33, 235, 56, + 5, 157, 43, 210, 13, 154, 71, 65, 114, 178, 178, 246, 140, 206, 96, 199, + 114, 85, 3, 133, 242, 37, 107, 159, 224, 241, 131, 101, 51, 211, 128, 95, + 192, 223, 112, 117, 126, 73, 149, 193, 14, 133, 170, 52, 215, 184, 84, 25, + 22, 23, 75, 41, 245, 227, 195, 197, 22, 44, 72, 185, 45, 175, 217, 192, + 136, 32, 131, 178, 40, 121, 10, 89, 241, 55, 58, 246, 177, 197, 238, 40, + 160, 210, 247, 75, 76, 13, 120, 252, 166, 131, 104, 50, 135, 120, 134, 204, + 117, 191, 51, 63, 190, 161, 48, 143, 66, 115, 216, 35, 46, 241, 68, 95, + 202, 118, 101, 238, 25, 247, 114, 141, 223, 87, 103, 139, 126, 164, 64, + 150, 177, 252, 16, 216, 98, 250, 0, 254, 229, 50, 71, 123, 16, 2, 125, 212, + 154, 143, 127, 2, 106, 24, 181, 215, 119, 124, 43, 48, 207, 35, 19, 123, + 71, 92, 145, 253, 247, 212, 105, 103, 5, 235, 91, 208, 213, 94, 69, 250, 2, + 187, 148, 90, 2, 241, 246, 82, 3, 64, 201, 110, 50, 167, 91, 153, 224, 213, + 71, 126, 180, 189, 189, 150, 156, 237, 7, 217, 224, 229, 215, 51, 206, 117, + 65, 105, 36, 108, 124, 240, 90, 0, 176, 193, 64, 202, 134, 7, 100, 123, 60, + 147, 2, 207, 139, 235, 207, 124, 225, 171, 109, 137, 59, 52, 176, 120, 242, + 80, 8, 235, 62, 88, 55, 243, 173, 131, 28, 204, 32, 213, 155, 203, 27, 144, + 229, 123, 112, 161, 63, 63, 173, 118, 160, 84, 31, 160, 1, 249, 242, 215, + 204, 99, 181, 183, 189, 12, 251, 134, 31, 146, 19, 148, 233, 56, 234, 151, + 186, 5, 106, 194, 156, 118, 124, 51, 207, 54, 230, 105, 158, 182, 123, 237, + 114, 2, 59, 210, 93, 188, 8, 123, 247, 224, 173, 148, 251, 22, 165, 4, 246, + 185, 144, 98, 136, 198, 188, 100, 6, 226, 147, 194, 0, 129, 155, 17, 5, + 177, 3, 189, 60, 190, 178, 238, 190, 26, 7, 84, 93, 96, 133, 36, 213, 220, + 236, 51, 120, 6, 245, 104, 20, 24, 36, 226, 31, 230, 102, 86, 11, 119, 154, + 152, 104, 212, 11, 128, 123, 193, 239, 17, 30, 63, 88, 235, 1, 79, 190, 54, + 68, 118, 199, 220, 156, 36, 107, 113, 43, 183, 119, 67, 249, 195, 69, 29, + 39, 95, 21, 201, 76, 202, 43, 171, 140, 93, 13, 156, 93, 70, 238, 112, 215, + 30, 175, 41, 134, 23, 45, 90, 2, 29, 69, 157, 212, 88, 138, 6, 54, 2, 39, + 132, 50, 139, 243, 98, 68, 172, 91, 24, 115, 64, 64, 195, 193, 173, 156, + 25, 117, 33, 253, 202, 174, 219, 225, 29, 190, 96, 233, 3, 86, 96, 77, 122, + 18, 63, 98, 30, 108, 113, 224, 86, 180, 116, 135, 145, 217, 90, 224, 2, 68, + 174, 15, 90, 119, 252, 99, 13, 72, 72, 74, 16, 2, 167, 94, 138, 165, 16, + 164, 144, 77, 39, 89, 119, 136, 65, 209, 61, 184, 212, 81, 103, 13, 199, + 192, 77, 196, 222, 62, 120, 133, 193, 87, 39, 128, 120, 100, 84, 156, 168, + 21, 169, 172, 204, 153, 138, 49, 189, 122, 182, 228, 94, 62, 79, 151, 81, + 50, 225, 195, 167, 231, 46, 61, 172, 57, 232, 216, 58, 248, 45, 95, 210, + 58, 2, 6, 50, 213, 229, 24, 79, 173, 144, 113, 9, 233, 67, 248, 12, 155, + 233, 197, 80, 61, 255, 30, 194, 92, 22, 45, 175, 146, 223, 197, 16, 169, + 172, 190, 92, 181, 20, 110, 64, 131, 235, 165, 98, 51, 21, 36, 117, 95, + 183, 122, 2, 182, 59, 212, 186, 100, 32, 16, 3, 231, 112, 111, 135, 159, + 124, 20, 63, 24, 52, 229, 52, 56, 186, 160, 135, 251, 51, 174, 45, 235, + 176, 164, 139, 133, 107, 59, 180, 245, 55, 170, 202, 3, 251, 97, 158, 36, + 237, 144, 202, 233, 187, 145, 108, 22, 140, 190, 241, 247, 114, 150, 162, + 177, 80, 149, 189, 234, 36, 107, 243, 95, 86, 33, 181, 7, 88, 4, 81, 16, + 55, 131, 19, 206, 212, 90, 13, 44, 35, 34, 13, 250, 173, 37, 107, 126, 178, + 118, 143, 203, 213, 172, 168, 192, 18, 149, 169, 157, 242, 97, 231, 107, + 124, 21, 231, 88, 71, 53, 110, 33, 60, 23, 179, 4, 141, 213, 146, 16, 111, + 255, 179, 34, 96, 211, 195, 188, 207, 1, 87, 116, 65, 140, 199, 17, 236, + 51, 107, 55, 173, 67, 75, 120, 202, 179, 61, 138, 247, 56, 195, 108, 206, + 142, 6, 81, 166, 48, 28, 101, 127, 57, 24, 236, 3, 170, 220, 24, 1, 136, + 159, 152, 85, 180, 207, 12, 14, 37, 198, 202, 144, 189, 76, 68, 47, 252, + 51, 17, 189, 10, 73, 86, 199, 105, 47, 101, 15, 2, 13, 99, 27, 132, 33, 85, + 0, 74, 211, 4, 145, 22, 146, 20, 112, 79, 224, 112, 244, 16, 107, 177, 50, + 151, 108, 119, 67, 3, 47, 217, 210, 210, 31, 106, 229, 43, 53, 172, 231, 7, + 137, 78, 67, 89, 221, 174, 200, 48, 191, 246, 122, 116, 195, 94, 35, 76, + 44, 217, 98, 72, 255, 75, 47, 109, 187, 127, 26, 221, 65, 77, 100, 85, 253, + 194, 98, 76, 54, 186, 25, 101, 35, 209, 222, 111, 96, 67, 214, 58, 133, 76, + 134, 66, 161, 198, 137, 39, 234, 230, 171, 13, 97, 122, 46, 71, 168, 7, 2, + 221, 42, 131, 119, 50, 212, 209, 16, 40, 141, 72, 110, 30, 38, 248, 207, + 170, 182, 75, 31, 53, 2, 176, 171, 126, 149, 231, 99, 212, 44, 98, 221, + 133, 116, 69, 214, 202, 13, 6, 7, 87, 50, 146, 209, 143, 39, 207, 232, 180, + 49, 226, 17, 18, 137, 3, 75, 141, 216, 19, 141, 212, 84, 132, 41, 70, 88, + 49, 75, 103, 37, 3, 150, 174, 228, 95, 116, 194, 169, 132, 78, 149, 219, + 97, 57, 172, 252, 1, 106, 253, 41, 151, 132, 100, 245, 233, 32, 59, 210, + 233, 6, 117, 214, 218, 25, 106, 20, 201, 60, 83, 239, 207, 78, 114, 244, + 59, 145, 90, 130, 47, 137, 221, 222, 88, 34, 74, 222, 250, 124, 203, 210, + 56, 25, 215, 121, 207, 170, 62, 129, 163, 61, 166, 57, 204, 79, 104, 232, + 169, 126, 247, 6, 243, 64, 16, 131, 184, 182, 243, 244, 194, 181, 135, 137, + 1, 11, 178, 247, 248, 247, 74, 163, 70, 136, 39, 30, 112, 86, 204, 148, + 162, 167, 143, 206, 25, 3, 53, 170, 62, 228, 6, 13, 204, 113, 152, 70, 157, + 165, 45, 187, 62, 101, 17, 8, 170, 174, 32, 144, 117, 117, 87, 103, 50, + 109, 178, 182, 27, 147, 3, 109, 89, 16, 174, 194, 45, 122, 128, 160, 66, + 165, 251, 254, 146, 119, 225, 159, 191, 61, 68, 60, 240, 9, 175, 239, 13, + 129, 217, 27, 110, 65, 213, 97, 158, 116, 172, 100, 246, 249, 234, 89, 67, + 115, 192, 197, 126, 138, 11, 100, 243, 79, 76, 190, 195, 160, 160, 195, 14, + 253, 169, 89, 138, 4, 238, 35, 151, 195, 81, 102, 132, 253, 158, 63, 110, + 190, 77, 140, 128, 37, 85, 137, 210, 156, 198, 223, 170, 46, 180, 15, 59, + 161, 9, 188, 239, 86, 250, 205, 89, 116, 9, 31, 243, 165, 168, 143, 66, + 169, 211, 199, 38, 136, 214, 121, 24, 89, 233, 35, 255, 213, 71, 120, 32, + 189, 72, 218, 189, 1, 96, 3, 93, 219, 192, 224, 14, 83, 127, 226, 219, 226, + 6, 159, 151, 196, 127, 205, 236, 197, 16, 60, 245, 31, 18, 93, 97, 177, + 211, 125, 82, 54, 212, 61, 3, 242, 178, 38, 99, 1, 72, 166, 94, 88, 243, + 238, 15, 109, 58, 135, 98, 146, 222, 103, 159, 109, 176, 85, 63, 71, 247, + 47, 228, 216, 147, 128, 47, 22, 147, 170, 173, 171, 123, 70, 88, 213, 173, + 180, 197, 118, 55, 203, 22, 138, 46, 76, 112, 35, 98, 94, 140, 135, 204, + 145, 97, 183, 33, 44, 27, 15, 35, 235, 186, 182, 19, 203, 217, 33, 153, + 171, 36, 185, 174, 58, 178, 29, 31, 32, 21, 213, 140, 250, 116, 121, 37, + 135, 190, 33, 212, 31, 131, 173, 236, 196, 94, 131, 1, 9, 65, 122, 236, 95, + 97, 40, 53, 111, 145, 254, 215, 113, 155, 196, 228, 125, 184, 85, 196, 64, + 95, 110, 218, 132, 73, 2, 226, 171, 5, 101, 229, 254, 51, 253, 64, 131, 56, + 147, 86, 157, 242, 240, 103, 63, 253, 9, 103, 179, 57, 92, 131, 8, 126, + 106, 54, 5, 69, 82, 2, 179, 200, 64, 245, 245, 176, 42, 241, 78, 251, 150, + 217, 180, 21, 187, 39, 30, 158, 82, 211, 99, 47, 243, 176, 177, 129, 129, + 182, 91, 71, 9, 134, 255, 64, 174, 52, 111, 184, 199, 178, 95, 26, 195, 28, + 255, 64, 218, 64, 34, 127, 3, 21, 62, 237, 175, 255, 169, 58, 115, 205, + 139, 87, 56, 31, 207, 129, 170, 164, 237, 58, 15, 0, 55, 209, 245, 34, 221, + 239, 136, 255, 209, 30, 198, 82, 27, 207, 118, 39, 162, 129, 243, 134, 206, + 10, 218, 237, 242, 236, 202, 74, 218, 248, 192, 116, 201, 118, 206, 221, + 63, 151, 216, 87, 13, 202, 10, 173, 120, 218, 233, 133, 111, 22, 250, 226, + 174, 213, 168, 21, 3, 210, 195, 27, 206, 137, 111, 99, 133, 196, 250, 90, + 18, 44, 123, 19, 178, 225, 177, 134, 100, 51, 226, 43, 19, 93, 50, 253, + 172, 77, 51, 71, 49, 3, 160, 58, 151, 31, 198, 129, 118, 138, 215, 226, + 107, 48, 182, 130, 225, 136, 21, 22, 23, 120, 234, 7, 89, 203, 58, 182, + 221, 88, 127, 213, 174, 232, 251, 182, 57, 156, 32, 70, 35, 44, 98, 203, + 106, 148, 6, 109, 94, 136, 198, 232, 186, 142, 241, 217, 96, 206, 29, 44, + 177, 89, 190, 70, 201, 37, 172, 157, 3, 8, 13, 229, 26, 5, 178, 12, 8, 5, + 126, 57, 189, 144, 228, 2, 39, 147, 241, 217, 219, 23, 63, 125, 189, 106, + 226, 3, 145, 10, 198, 76, 123, 3, 68, 239, 154, 204, 90, 222, 197, 61, 215, + 43, 7, 59, 0, 235, 80, 159, 66, 121, 66, 63, 13, 214, 30, 96, 147, 110, 55, + 79, 3, 219, 62, 100, 211, 205, 34, 48, 168, 196, 45, 70, 86, 25, 241, 31, + 12, 135, 249, 75, 26, 42, 160, 76, 82, 17, 87, 127, 247, 226, 107, 115, + 158, 2, 3, 181, 62, 87, 165, 131, 167, 178, 109, 90, 205, 185, 169, 216, 5, + 139, 136, 154, 154, 126, 74, 69, 11, 46, 142, 231, 183, 41, 161, 157, 86, + 145, 42, 127, 126, 76, 112, 44, 158, 206, 77, 47, 115, 204, 18, 150, 206, + 68, 57, 251, 20, 188, 135, 243, 2, 108, 97, 94, 5, 148, 251, 159, 229, 198, + 86, 197, 223, 200, 240, 245, 203, 198, 52, 158, 219, 78, 40, 2, 184, 11, + 136, 249, 49, 14, 146, 199, 129, 130, 210, 221, 195, 188, 35, 107, 251, + 127, 106, 205, 232, 144, 206, 210, 19, 27, 33, 75, 65, 106, 36, 240, 109, + 183, 6, 110, 218, 38, 121, 95, 58, 94, 32, 182, 91, 165, 135, 81, 12, 2, 3, + 87, 92, 25, 51, 39, 51, 231, 183, 34, 73, 208, 52, 81, 14, 186, 101, 211, + 137, 203, 48, 22, 54, 119, 177, 55, 170, 22, 234, 42, 170, 173, 228, 3, 67, + 3, 9, 94, 164, 163, 27, 183, 222, 121, 141, 29, 40, 72, 252, 96, 73, 133, + 247, 240, 95, 143, 57, 167, 91, 222, 223, 140, 87, 89, 165, 16, 225, 198, + 195, 189, 54, 117, 109, 182, 202, 218, 4, 236, 31, 232, 43, 62, 112, 214, + 49, 170, 45, 204, 5, 180, 105, 240, 119, 165, 59, 47, 199, 225, 111, 202, + 229, 44, 140, 56, 225, 92, 91, 38, 35, 203, 39, 109, 55, 187, 85, 85, 194, + 212, 101, 251, 128, 232, 167, 109, 69, 113, 4, 254, 74, 170, 58, 212, 190, + 52, 236, 105, 65, 95, 245, 169, 65, 124, 234, 77, 53, 169, 234, 90, 94, + 140, 26, 77, 196, 197, 115, 208, 7, 244, 46, 202, 116, 168, 3, 224, 36, + 216, 206, 135, 111, 74, 157, 66, 20, 9, 117, 154, 139, 129, 43, 75, 96, 96, + 186, 126, 217, 82, 130, 73, 239, 43, 81, 184, 147, 219, 14, 2, 198, 245, + 128, 42, 61, 252, 118, 187, 117, 77, 250, 117, 181, 84, 168, 107, 215, 64, + 137, 178, 247, 135, 91, 44, 9, 189, 0, 73, 80, 226, 83, 253, 130, 49, 198, + 25, 119, 248, 11, 232, 1, 198, 143, 160, 107, 192, 49, 36, 34, 195, 51, + 154, 231, 165, 51, 206, 162, 120, 141, 119, 153, 66, 190, 49, 114, 213, 14, + 18, 176, 108, 184, 122, 145, 252, 35, 250, 12, 200, 53, 43, 58, 26, 182, + 132, 159, 19, 111, 59, 222, 158, 96, 18, 78, 202, 229, 194, 11, 204, 148, + 42, 63, 112, 4, 48, 81, 179, 229, 187, 190, 202, 52, 1, 221, 205, 237, 37, + 155, 5, 187, 83, 252, 101, 118, 153, 68, 115, 225, 49, 2, 127, 68, 255, 18, + 45, 117, 85, 194, 86, 49, 114, 214, 222, 164, 210, 237, 181, 202, 240, 91, + 240, 21, 37, 209, 59, 117, 185, 160, 251, 39, 98, 205, 3, 122, 92, 233, + 243, 78, 210, 199, 119, 211, 90, 242, 21, 0, 221, 246, 41, 226, 90, 167, + 54, 72, 216, 174, 236, 141, 167, 43, 237, 87, 12, 174, 171, 191, 31, 174, + 74, 77, 113, 142, 5, 28, 102, 52, 187, 8, 167, 118, 84, 167, 12, 56, 244, + 16, 221, 145, 18, 12, 92, 227, 86, 13, 174, 88, 241, 146, 121, 123, 158, + 234, 63, 208, 76, 169, 67, 135, 242, 103, 28, 207, 116, 234, 197, 121, 37, + 26, 161, 185, 201, 149, 165, 77, 186, 4, 53, 107, 115, 105, 35, 51, 208, + 188, 144, 163, 178, 74, 154, 10, 20, 32, 190, 90, 109, 168, 151, 44, 221, + 47, 227, 53, 48, 130, 73, 159, 25, 157, 203, 79, 236, 2, 220, 159, 163, 70, + 36, 2, 36, 7, 67, 148, 22, 153, 84, 106, 13, 210, 43, 228, 79, 151, 118, + 84, 15, 217, 33, 182, 82, 39, 105, 78, 36, 218, 2, 208, 45, 91, 187, 18, + 63, 230, 200, 141, 77, 89, 60, 235, 235, 123, 51, 108, 207, 42, 74, 201, + 29, 233, 234, 86, 35, 225, 247, 106, 57, 174, 250, 3, 32, 228, 92, 219, + 183, 95, 170, 253, 255, 141, 93, 145, 2, 14, 90, 56, 93, 15, 139, 19, 233, + 225, 45, 115, 210, 176, 44, 79, 2, 137, 152, 32, 180, 180, 130, 148, 181, + 229, 254, 169, 67, 44, 178, 81, 142, 123, 34, 106, 114, 57, 107, 107, 63, + 30, 138, 140, 107, 124, 5, 196, 253, 99, 60, 220, 3, 55, 217, 133, 137, + 210, 75, 154, 196, 48, 123, 109, 156, 229, 38, 193, 213, 138, 95, 110, 13, + 153, 252, 40, 90, 255, 24, 232, 249, 60, 19, 2, 42, 114, 90, 4, 224, 224, + 52, 146, 44, 223, 79, 214, 255, 118, 180, 119, 252, 116, 84, 100, 236, 196, + 151, 141, 243, 4, 222, 54, 132, 90, 45, 159, 3, 164, 170, 41, 37, 99, 29, + 111, 92, 110, 247, 18, 239, 207, 245, 220, 52, 236, 101, 70, 58, 251, 73, + 140, 66, 7, 84, 184, 75, 63, 245, 19, 193, 159, 102, 26, 121, 152, 200, 78, + 203, 234, 22, 0, 84, 220, 118, 241, 186, 21, 19, 193, 108, 41, 194, 93, 76, + 220, 13, 57, 66, 199, 156, 189, 149, 59, 106, 209, 242, 53, 115, 55, 62, + 211, 117, 138, 130, 243, 47, 154, 33, 92, 219, 185, 7, 58, 116, 207, 73, + 163, 105, 87, 5, 61, 77, 95, 61, 158, 205, 144, 57, 190, 210, 13, 134, 234, + 144, 203, 77, 87, 6, 175, 230, 146, 9, 114, 207, 77, 141, 98, 224, 116, + 241, 166, 72, 71, 227, 13, 140, 2, 62, 207, 252, 15, 181, 153, 142, 244, + 251, 41, 90, 76, 31, 33, 101, 156, 61, 85, 115, 66, 77, 140, 89, 242, 84, + 57, 26, 219, 246, 27, 219, 174, 3, 49, 47, 233, 188, 22, 51, 95, 56, 253, + 55, 107, 151, 209, 94, 104, 217, 65, 163, 26, 232, 246, 99, 70, 105, 84, + 16, 252, 217, 65, 79, 120, 185, 24, 49, 166, 26, 174, 26, 5, 112, 19, 48, + 208, 28, 97, 223, 181, 38, 187, 94, 10, 252, 97, 83, 20, 218, 239, 178, + 164, 20, 216, 154, 70, 132, 91, 163, 133, 173, 60, 65, 12, 134, 166, 246, + 145, 158, 17, 55, 38, 156, 69, 253, 111, 162, 145, 249, 204, 162, 157, 56, + 240, 67, 23, 54, 78, 77, 174, 29, 192, 184, 224, 97, 18, 35, 143, 80, 216, + 151, 135, 28, 47, 220, 87, 70, 241, 50, 151, 79, 35, 213, 165, 51, 206, + 255, 250, 154, 98, 161, 3, 38, 165, 32, 90, 168, 252, 99, 165, 218, 5, 66, + 119, 39, 213, 252, 161, 237, 94, 36, 227, 150, 46, 178, 78, 55, 230, 180, + 127, 25, 70, 150, 113, 3, 225, 200, 130, 142, 221, 185, 75, 234, 85, 37, + 239, 118, 207, 99, 0, 180, 120, 82, 110, 179, 20, 202, 179, 189, 236, 89, + 212, 239, 236, 33, 35, 195, 83, 117, 113, 141, 170, 67, 129, 150, 94, 32, + 169, 66, 149, 7, 220, 37, 4, 3, 85, 27, 13, 30, 24, 234, 24, 104, 164, 185, + 54, 34, 48, 126, 255, 134, 183, 202, 149, 3, 247, 28, 252, 145, 36, 102, + 182, 232, 37, 129, 125, 132, 46, 158, 124, 131, 31, 166, 86, 28, 154, 210, + 127, 193, 58, 196, 38, 98, 165, 83, 73, 200, 111, 234, 255, 172, 134, 161, + 215, 127, 27, 78, 200, 217, 188, 143, 152, 196, 186, 118, 88, 204, 179, 16, + 162, 197, 17, 213, 2, 128, 177, 203, 53, 249, 119, 216, 146, 102, 56, 106, + 95, 249, 207, 128, 36, 196, 129, 159, 13, 13, 64, 33, 97, 133, 102, 35, + 101, 1, 36, 192, 207, 2, 168, 39, 27, 118, 218, 211, 3, 209, 199, 45, 165, + 160, 219, 98, 86, 112, 99, 236, 220, 17, 81, 210, 31, 51, 245, 34, 65, 207, + 32, 153, 64, 142, 202, 109, 103, 20, 245, 39, 37, 191, 94, 57, 45, 18, 194, + 34, 83, 19, 124, 166, 30, 238, 184, 170, 221, 149, 11, 130, 174, 225, 78, + 239, 186, 17, 32, 25, 244, 19, 135, 125, 83, 98, 75, 166, 172, 60, 1, 244, + 102, 163, 133, 176, 208, 171, 52, 231, 173, 0, 173, 185, 190, 251, 6, 54, + 21, 118, 65, 63, 201, 55, 68, 91, 203, 176, 18, 70, 119, 90, 229, 220, 195, + 49, 45, 197, 49, 172, 179, 196, 186, 41, 38, 234, 118, 214, 35, 9, 111, + 232, 2, 180, 86, 117, 22, 87, 167, 53, 40, 249, 97, 103, 127, 182, 131, + 203, 54, 2, 214, 88, 217, 208, 67, 80, 253, 182, 193, 6, 61, 186, 66, 123, + 109, 3, 31, 146, 156, 170, 252, 113, 44, 16, 5, 54, 172, 10, 255, 47, 197, + 159, 197, 129, 199, 159, 2, 103, 40, 31, 76, 99, 115, 163, 190, 19, 90, + 176, 80, 183, 210, 85, 54, 78, 46, 85, 26, 18, 78, 247, 98, 211, 118, 22, + 162, 201, 197, 70, 6, 217, 106, 111, 20, 28, 124, 130, 221, 107, 251, 210, + 64, 205, 196, 66, 195, 122, 145, 121, 175, 91, 212, 93, 123, 31, 38, 84, + 248, 159, 119, 68, 186, 183, 184, 239, 78, 105, 83, 33, 103, 163, 49, 140, + 163, 133, 158, 207, 177, 116, 152, 132, 211, 202, 23, 221, 62, 136, 188, + 165, 192, 251, 30, 0, 190, 56, 214, 35, 127, 110, 206, 1, 30, 122, 11, 186, + 2, 107, 160, 53, 211, 239, 58, 95, 99, 129, 163, 200, 15, 68, 199, 212, 97, + 0, 230, 87, 84, 180, 22, 136, 218, 159, 131, 73, 201, 70, 133, 21, 61, 3, + 239, 65, 72, 158, 123, 4, 222, 223, 23, 15, 54, 68, 128, 116, 187, 173, + 189, 19, 35, 88, 98, 230, 52, 253, 110, 62, 144, 211, 13, 204, 167, 34, + 135, 253, 234, 127, 105, 236, 115, 111, 97, 199, 166, 119, 161, 179, 174, + 217, 229, 184, 176, 108, 199, 134, 137, 138, 18, 80, 97, 243, 227, 166, 72, + 116, 149, 212, 255, 140, 23, 178, 118, 240, 162, 176, 190, 177, 185, 32, + 195, 166, 99, 246, 45, 81, 36, 133, 56, 38, 55, 219, 217, 38, 144, 107, 82, + 40, 90, 103, 91, 171, 87, 75, 244, 238, 60, 64, 205, 42, 251, 247, 6, 155, + 115, 149, 137, 236, 137, 179, 119, 118, 47, 139, 175, 23, 9, 91, 12, 236, + 2, 203, 129, 186, 96, 102, 2, 218, 15, 122, 101, 36, 219, 137, 217, 133, + 123, 210, 151, 172, 205, 141, 164, 119, 21, 29, 128, 123, 227, 172, 145, + 166, 251, 3, 52, 139, 107, 102, 238, 147, 95, 169, 60, 52, 162, 76, 185, + 61, 192, 213, 35, 151, 205, 50, 238, 24, 244, 55, 98, 147, 58, 116, 45, + 219, 129, 46, 95, 67, 75, 190, 243, 200, 103, 195, 246, 75, 87, 222, 220, + 132, 76, 112, 30, 74, 214, 80, 17, 11, 85, 138, 22, 125, 38, 137, 33, 183, + 91, 29, 103, 213, 246, 244, 215, 92, 234, 208, 204, 242, 214, 241, 193, + 253, 158, 9, 30, 115, 129, 12, 37, 83, 217, 230, 141, 234, 161, 147, 233, + 181, 87, 209, 236, 243, 42, 55, 158, 117, 234, 85, 95, 104, 242, 69, 240, + 190, 110, 73, 32, 207, 82, 173, 49, 26, 28, 240, 40, 147, 81, 170, 203, 43, + 242, 92, 2, 227, 144, 235, 119, 166, 73, 103, 152, 44, 164, 172, 255, 111, + 99, 39, 66, 202, 245, 3, 6, 137, 235, 128, 87, 173, 82, 10, 77, 105, 157, + 156, 110, 2, 43, 75, 114, 0, 163, 33, 199, 98, 197, 1, 104, 69, 207, 200, + 170, 226, 52, 80, 67, 48, 67, 253, 91, 185, 118, 167, 169, 219, 62, 177, + 163, 98, 220, 26, 94, 205, 195, 178, 219, 175, 89, 125, 175, 11, 246, 158, + 118, 18, 45, 231, 213, 240, 216, 46, 47, 136, 42, 201, 27, 240, 168, 79, + 60, 109, 231, 220, 167, 82, 194, 195, 159, 48, 45, 63, 202, 192, 34, 124, + 64, 83, 41, 141, 61, 150, 191, 23, 54, 192, 237, 64, 105, 33, 93, 157, 244, + 155, 136, 195, 77, 182, 250, 79, 26, 52, 3, 180, 55, 177, 206, 72, 157, + 138, 72, 171, 137, 174, 222, 187, 188, 126, 30, 6, 71, 215, 189, 218, 59, + 180, 2, 221, 208, 190, 34, 172, 210, 43, 89, 207, 233, 62, 123, 18, 44, + 115, 169, 63, 30, 2, 244, 44, 28, 107, 195, 179, 36, 111, 27, 177, 143, 43, + 179, 2, 2, 43, 167, 75, 86, 250, 162, 20, 118, 198, 211, 38, 87, 101, 235, + 171, 143, 104, 244, 79, 23, 73, 34, 68, 141, 251, 31, 30, 224, 203, 165, + 181, 21, 165, 18, 9, 94, 9, 146, 104, 20, 81, 196, 79, 26, 144, 21, 134, 0, + 48, 93, 131, 101, 51, 163, 174, 34, 167, 161, 171, 135, 55, 241, 161, 141, + 232, 244, 108, 242, 111, 227, 105, 246, 49, 223, 70, 213, 173, 255, 246, + 132, 252, 209, 37, 13, 202, 32, 141, 16, 250, 57, 146, 237, 166, 112, 78, + 166, 199, 237, 145, 218, 175, 219, 168, 4, 209, 217, 7, 211, 12, 102, 253, + 18, 125, 144, 13, 108, 78, 41, 133, 82, 161, 254, 237, 216, 90, 222, 34, 2, + 46, 161, 122, 252, 159, 231, 155, 94, 52, 171, 84, 217, 215, 72, 18, 49, + 252, 168, 217, 45, 213, 86, 41, 81, 227, 165, 174, 141, 38, 176, 83, 44, 2, + 54, 204, 22, 162, 39, 179, 62, 76, 230, 61, 24, 236, 135, 91, 193, 222, 65, + 64, 123, 162, 166, 225, 49, 228, 88, 236, 141, 96, 138, 91, 5, 84, 54, 118, + 130, 70, 42, 208, 149, 250, 193, 212, 119, 199, 226, 77, 91, 211, 194, 0, + 55, 15, 23, 183, 218, 181, 71, 31, 100, 70, 35, 50, 141, 150, 11, 147, 250, + 174, 244, 51, 58, 189, 233, 246, 22, 149, 239, 72, 104, 121, 5, 79, 87, 2, + 200, 164, 90, 237, 157, 251, 248, 85, 229, 103, 217, 59, 100, 189, 223, + 240, 125, 30, 25, 193, 57, 206, 191, 170, 148, 73, 177, 188, 13, 245, 211, + 75, 2, 10, 204, 243, 79, 162, 152, 116, 3, 240, 151, 9, 2, 38, 96, 98, 225, + 2, 242, 50, 65, 161, 113, 76, 116, 36, 162, 235, 224, 230, 154, 37, 103, + 205, 187, 207, 176, 231, 87, 57, 206, 26, 51, 39, 230, 3, 151, 205, 62, + 166, 250, 67, 74, 254, 37, 157, 107, 246, 13, 114, 147, 49, 214, 35, 107, + 41, 145, 37, 44, 114, 4, 143, 171, 105, 246, 212, 166, 223, 153, 177, 245, + 158, 67, 244, 63, 60, 43, 7, 64, 154, 88, 32, 124, 101, 232, 242, 68, 192, + 57, 230, 193, 181, 57, 235, 142, 76, 134, 233, 124, 122, 72, 79, 116, 238, + 12, 122, 234, 228, 85, 66, 64, 170, 57, 78, 109, 232, 230, 49, 218, 165, + 58, 137, 102, 115, 105, 18, 73, 203, 99, 137, 172, 180, 169, 206, 3, 169, + 78, 94, 74, 160, 41, 33, 131, 60, 192, 134, 134, 88, 149, 55, 32, 112, 113, + 106, 28, 40, 115, 197, 227, 140, 160, 63, 38, 84, 3, 11, 73, 8, 230, 174, + 47, 12, 144, 183, 97, 34, 118, 179, 105, 37, 42, 93, 26, 1, 233, 197, 166, + 193, 219, 50, 215, 222, 10, 218, 78, 222, 156, 3, 87, 236, 202, 134, 117, + 216, 156, 27, 205, 88, 43, 53, 135, 200, 142, 21, 135, 205, 150, 87, 191, + 32, 221, 41, 84, 221, 156, 253, 239, 205, 123, 223, 249, 38, 201, 55, 84, + 128, 143, 99, 7, 35, 242, 172, 216, 28, 63, 231, 145, 252, 112, 225, 14, + 175, 37, 196, 124, 214, 17, 52, 116, 81, 86, 209, 69, 223, 5, 159, 150, + 111, 201, 77, 219, 60, 160, 30, 51, 109, 120, 96, 157, 232, 161, 141, 105, + 73, 4, 86, 54, 121, 236, 245, 133, 126, 21, 174, 172, 34, 165, 222, 181, + 234, 42, 133, 206, 170, 202, 196, 249, 100, 146, 208, 60, 128, 205, 12, + 216, 187, 112, 50, 100, 245, 247, 189, 155, 252, 248, 3, 3, 101, 25, 33, + 106, 42, 215, 190, 191, 30, 112, 177, 45, 152, 227, 193, 107, 243, 38, 244, + 78, 27, 28, 105, 210, 49, 233, 165, 209, 160, 182, 211, 142, 2, 123, 160, + 233, 134, 79, 57, 71, 111, 7, 110, 244, 236, 17, 170, 27, 33, 177, 239, 83, + 145, 239, 76, 140, 99, 238, 211, 23, 83, 85, 26, 8, 22, 253, 131, 154, 128, + 100, 143, 242, 243, 165, 9, 48, 239, 132, 23, 91, 22, 59, 214, 145, 37, + 255, 218, 154, 219, 227, 89, 12, 110, 169, 178, 108, 31, 116, 241, 42, 49, + 178, 247, 209, 85, 67, 110, 149, 184, 109, 210, 177, 251, 234, 98, 238, 38, + 130, 241, 66, 143, 28, 141, 95, 83, 12, 213, 195, 75, 50, 92, 164, 248, 89, + 108, 12, 248, 119, 153, 155, 234, 224, 29, 90, 158, 153, 16, 242, 20, 66, + 99, 195, 58, 37, 11, 187, 65, 81, 249, 27, 236, 2, 36, 120, 39, 191, 248, + 252, 240, 104, 232, 136, 115, 141, 9, 190, 51, 15, 189, 10, 194, 118, 7, + 183, 71, 110, 106, 68, 7, 52, 6, 157, 214, 105, 3, 100, 160, 238, 83, 207, + 160, 223, 84, 204, 166, 143, 30, 18, 203, 146, 144, 15, 109, 232, 31, 126, + 12, 245, 25, 141, 244, 47, 55, 74, 239, 136, 177, 188, 165, 132, 30, 97, + 209, 159, 221, 9, 68, 240, 28, 243, 140, 8, 51, 124, 242, 158, 198, 3, 66, + 21, 68, 220, 130, 251, 128, 88, 1, 76, 206, 240, 165, 254, 6, 12, 186, 30, + 66, 73, 71, 87, 30, 29, 236, 229, 15, 18, 83, 138, 117, 118, 149, 17, 78, + 188, 215, 173, 34, 60, 101, 4, 71, 222, 252, 67, 175, 119, 7, 161, 220, + 117, 8, 37, 170, 220, 249, 37, 219, 174, 93, 189, 31, 41, 229, 22, 202, + 159, 100, 1, 3, 100, 196, 110, 239, 3, 223, 1, 199, 135, 54, 48, 193, 117, + 136, 98, 121, 104, 215, 252, 184, 194, 128, 247, 160, 135, 79, 185, 4, 4, + 155, 165, 250, 117, 94, 152, 104, 30, 3, 126, 243, 107, 47, 216, 59, 152, + 186, 198, 153, 14, 109, 82, 239, 85, 95, 59, 139, 172, 237, 31, 75, 34, + 146, 5, 77, 118, 118, 142, 3, 93, 64, 126, 88, 138, 237, 145, 228, 245, + 155, 178, 12, 30, 42, 209, 78, 236, 26, 218, 143, 160, 62, 235, 18, 205, + 144, 136, 132, 42, 179, 149, 132, 93, 49, 249, 152, 180, 131, 115, 163, + 139, 50, 60, 68, 202, 26, 87, 217, 185, 1, 64, 57, 222, 136, 178, 21, 245, + 181, 78, 232, 23, 15, 174, 39, 153, 22, 117, 242, 219, 54, 115, 55, 27, + 236, 133, 52, 235, 99, 13, 119, 77, 19, 5, 7, 41, 22, 3, 140, 202, 138, + 160, 161, 116, 5, 65, 254, 148, 58, 3, 91, 143, 120, 167, 106, 231, 176, + 62, 143, 70, 111, 25, 153, 152, 36, 146, 96, 152, 50, 128, 62, 38, 219, + 243, 217, 125, 182, 182, 46, 184, 71, 7, 3, 117, 128, 110, 101, 98, 68, + 123, 192, 34, 18, 35, 137, 105, 108, 131, 125, 137, 8, 147, 61, 61, 133, + 113, 111, 81, 148, 14, 117, 79, 54, 108, 202, 116, 144, 66, 25, 226, 231, + 7, 233, 114, 3, 4, 186, 209, 157, 66, 64, 29, 110, 227, 193, 214, 215, 74, + 102, 101, 109, 141, 240, 91, 196, 5, 118, 202, 108, 23, 72, 66, 121, 210, + 145, 160, 248, 225, 143, 152, 49, 75, 151, 196, 174, 225, 204, 33, 255, 91, + 182, 8, 75, 186, 9, 119, 36, 203, 173, 149, 9, 30, 119, 57, 42, 80, 112, + 156, 160, 186, 57, 134, 113, 73, 127, 132, 245, 12, 248, 15, 106, 90, 61, + 118, 63, 18, 154, 79, 35, 122, 148, 3, 77, 55, 85, 27, 190, 211, 198, 66, + 203, 31, 19, 206, 21, 27, 7, 243, 197, 98, 122, 187, 215, 234, 130, 53, 23, + 166, 117, 50, 213, 241, 177, 37, 3, 64, 96, 44, 60, 99, 28, 13, 2, 153, + 119, 119, 18, 238, 3, 187, 2, 70, 229, 131, 159, 10, 79, 196, 196, 26, 199, + 80, 40, 63, 29, 21, 127, 183, 80, 12, 20, 62, 57, 14, 205, 239, 234, 146, + 136, 142, 32, 164, 135, 194, 34, 58, 152, 29, 210, 62, 115, 255, 237, 235, + 157, 153, 244, 126, 92, 231, 95, 43, 73, 45, 143, 19, 147, 16, 76, 102, 85, + 233, 231, 58, 166, 33, 241, 42, 56, 217, 246, 94, 34, 210, 83, 155, 241, + 197, 87, 17, 33, 62, 59, 173, 119, 102, 141, 46, 130, 234, 42, 7, 16, 188, + 128, 94, 185, 35, 184, 179, 153, 89, 243, 240, 50, 227, 243, 111, 64, 121, + 39, 139, 200, 3, 37, 40, 197, 126, 227, 58, 76, 111, 141, 176, 50, 126, + 146, 247, 210, 117, 249, 108, 251, 211, 184, 99, 52, 81, 183, 163, 196, 25, + 214, 119, 75, 71, 3, 34, 111, 241, 99, 183, 134, 212, 75, 163, 95, 173, + 128, 38, 240, 179, 96, 64, 204, 147, 124, 181, 8, 85, 107, 227, 148, 59, + 246, 155, 23, 11, 149, 142, 91, 240, 52, 180, 209, 78, 217, 19, 85, 56, 93, + 17, 109, 119, 107, 117, 188, 96, 180, 41, 178, 127, 210, 252, 237, 188, + 101, 158, 248, 210, 206, 55, 88, 153, 241, 189, 198, 60, 98, 26, 151, 150, + 192, 51, 191, 21, 99, 2, 178, 45, 10, 235, 222, 190, 44, 241, 100, 215, + 158, 133, 57, 162, 105, 131, 7, 27, 132, 122, 228, 197, 104, 50, 246, 192, + 47, 63, 168, 56, 58, 239, 69, 152, 95, 61, 50, 77, 22, 174, 128, 169, 85, + 139, 169, 120, 6, 3, 176, 99, 215, 140, 5, 144, 103, 214, 80, 77, 90, 116, + 26, 254, 66, 137, 234, 35, 10, 8, 166, 200, 144, 0, 89, 212, 212, 30, 34, + 27, 43, 192, 3, 136, 170, 251, 184, 203, 74, 221, 54, 30, 152, 0, 26, 189, + 147, 128, 64, 71, 17, 84, 205, 248, 171, 215, 156, 214, 16, 97, 17, 12, + 199, 230, 237, 47, 129, 76, 127, 189, 94, 187, 146, 58, 5, 70, 26, 118, + 180, 80, 136, 1, 240, 34, 191, 84, 141, 11, 54, 152, 209, 20, 17, 60, 228, + 74, 59, 13, 24, 175, 7, 35, 151, 93, 242, 9, 80, 152, 107, 32, 192, 184, + 51, 41, 42, 40, 73, 14, 110, 147, 47, 241, 190, 169, 177, 207, 207, 169, + 97, 171, 22, 186, 105, 125, 134, 34, 237, 156, 54, 126, 50, 195, 174, 138, + 0, 191, 71, 95, 31, 112, 69, 204, 154, 177, 22, 176, 19, 126, 105, 181, + 228, 2, 65, 92, 229, 92, 37, 133, 150, 72, 76, 255, 251, 240, 207, 219, + 148, 134, 94, 40, 14, 182, 25, 18, 129, 16, 109, 61, 35, 247, 92, 35, 124, + 252, 3, 176, 195, 143, 171, 181, 38, 115, 205, 146, 141, 6, 231, 173, 89, + 199, 101, 9, 190, 231, 3, 221, 229, 7, 209, 195, 233, 120, 132, 158, 188, + 20, 251, 191, 16, 64, 141, 74, 228, 144, 128, 154, 24, 223, 12, 94, 46, + 119, 189, 233, 25, 77, 224, 122, 86, 95, 186, 95, 158, 57, 51, 192, 155, 2, + 178, 91, 173, 97, 97, 23, 124, 134, 210, 40, 11, 213, 57, 186, 75, 46, 0, + 48, 98, 161, 185, 221, 74, 184, 107, 176, 153, 119, 106, 191, 166, 239, + 123, 184, 128, 124, 106, 161, 182, 245, 72, 61, 13, 157, 151, 240, 217, + 112, 35, 166, 79, 206, 113, 137, 46, 209, 209, 219, 143, 92, 15, 54, 247, + 182, 242, 2, 4, 188, 230, 11, 170, 51, 28, 95, 241, 230, 251, 125, 12, 215, + 51, 201, 167, 91, 160, 178, 162, 119, 178, 186, 93, 228, 218, 219, 205, 22, + 210, 233, 3, 91, 77, 199, 239, 143, 154, 63, 131, 135, 141, 138, 30, 66, 3, + 240, 207, 248, 134, 68, 200, 80, 69, 183, 81, 182, 20, 13, 247, 10, 17, 99, + 60, 157, 145, 66, 187, 225, 225, 141, 228, 54, 212, 108, 220, 85, 102, 90, + 216, 199, 62, 191, 73, 130, 222, 153, 124, 216, 242, 2, 13, 47, 89, 217, + 119, 52, 143, 220, 178, 254, 186, 130, 248, 45, 155, 213, 10, 6, 174, 146, + 77, 65, 219, 232, 93, 162, 171, 37, 154, 172, 198, 51, 241, 172, 120, 16, + 153, 205, 168, 157, 226, 82, 222, 121, 131, 76, 43, 216, 228, 165, 250, + 177, 193, 62, 37, 142, 150, 176, 219, 10, 221, 53, 171, 30, 46, 250, 208, + 146, 90, 3, 185, 199, 156, 161, 216, 26, 58, 120, 71, 38, 23, 159, 78, 44, + 88, 174, 255, 198, 116, 86, 142, 195, 218, 93, 116, 225, 227, 159, 148, 66, + 220, 18, 2, 222, 169, 83, 234, 253, 91, 165, 204, 138, 39, 217, 16, 210, + 101, 224, 114, 217, 80, 166, 16, 66, 44, 247, 188, 185, 62, 65, 122, 182, + 142, 115, 79, 167, 186, 99, 175, 34, 70, 20, 14, 177, 77, 151, 105, 151, + 216, 140, 64, 152, 20, 78, 190, 230, 180, 183, 185, 165, 137, 78, 132, 32, + 186, 221, 171, 138, 38, 98, 61, 118, 196, 28, 152, 236, 157, 110, 73, 189, + 196, 45, 137, 74, 100, 95, 237, 164, 84, 219, 229, 10, 79, 90, 101, 24, + 194, 64, 222, 167, 19, 205, 61, 88, 49, 144, 157, 30, 196, 205, 95, 84, 68, + 247, 229, 191, 104, 140, 210, 108, 115, 206, 114, 195, 49, 44, 4, 202, 52, + 233, 114, 2, 189, 174, 75, 47, 108, 122, 87, 40, 217, 86, 111, 240, 62, + 129, 190, 206, 251, 107, 12, 150, 242, 126, 238, 35, 167, 72, 136, 39, 255, + 9, 108, 169, 3, 5, 219, 220, 213, 69, 80, 63, 70, 149, 30, 28, 155, 81, + 118, 82, 155, 40, 49, 228, 99, 54, 72, 229, 36, 36, 243, 36, 26, 206, 245, + 56, 76, 210, 18, 184, 242, 174, 151, 124, 36, 25, 151, 185, 64, 230, 45, + 55, 47, 26, 20, 226, 86, 134, 225, 125, 251, 83, 162, 167, 77, 138, 41, 88, + 18, 225, 121, 226, 250, 61, 6, 221, 121, 80, 135, 191, 146, 186, 170, 55, + 158, 46, 120, 136, 160, 202, 234, 252, 207, 192, 192, 70, 46, 9, 85, 94, + 14, 62, 142, 112, 97, 154, 190, 76, 36, 47, 231, 86, 246, 175, 216, 3, 18, + 58, 76, 150, 196, 4, 105, 95, 195, 39, 128, 37, 152, 128, 22, 1, 35, 3, 69, + 251, 3, 198, 249, 241, 148, 72, 89, 211, 225, 73, 124, 106, 150, 52, 173, + 199, 115, 221, 18, 22, 207, 248, 129, 70, 19, 115, 89, 66, 99, 123, 3, 150, + 106, 157, 45, 111, 123, 252, 217, 81, 60, 0, 184, 227, 242, 218, 138, 240, + 195, 113, 255, 58, 78, 118, 156, 172, 207, 154, 188, 16, 72, 204, 254, 231, + 226, 180, 97, 242, 228, 42, 155, 79, 200, 159, 131, 164, 207, 240, 177, 28, + 244, 226, 62, 157, 27, 8, 8, 209, 132, 212, 21, 130, 128, 192, 63, 167, + 255, 106, 66, 71, 211, 194, 126, 114, 207, 236, 85, 165, 108, 139, 161, 20, + 154, 21, 186, 212, 74, 182, 205, 121, 53, 179, 228, 108, 152, 163, 204, 40, + 28, 105, 45, 134, 124, 21, 252, 82, 234, 112, 98, 167, 119, 155, 247, 110, + 13, 99, 200, 232, 25, 224, 179, 138, 114, 238, 89, 247, 41, 8, 156, 3, 132, + 69, 230, 128, 1, 162, 155, 34, 109, 129, 37, 175, 4, 118, 41, 143, 31, 5, + 183, 35, 198, 58, 117, 205, 27, 165, 87, 33, 184, 106, 237, 26, 3, 26, 203, + 24, 24, 157, 198, 40, 78, 56, 130, 0, 53, 234, 118, 48, 246, 56, 3, 52, + 124, 199, 181, 207, 244, 116, 234, 98, 133, 9, 102, 215, 163, 218, 135, 75, + 43, 74, 5, 188, 159, 67, 214, 159, 160, 126, 233, 247, 230, 108, 22, 163, + 197, 4, 241, 156, 33, 114, 46, 197, 95, 125, 138, 109, 196, 108, 192, 157, + 51, 57, 193, 169, 188, 170, 208, 69, 254, 246, 178, 249, 108, 113, 223, 57, + 35, 167, 57, 95, 128, 150, 212, 41, 35, 187, 118, 51, 86, 53, 238, 203, + 173, 224, 120, 212, 112, 219, 137, 174, 8, 177, 206, 101, 178, 78, 117, + 241, 238, 218, 190, 75, 153, 29, 137, 162, 140, 59, 181, 173, 150, 2, 126, + 165, 2, 208, 98, 41, 248, 136, 242, 145, 167, 16, 233, 179, 191, 222, 83, + 253, 183, 89, 216, 94, 222, 24, 72, 29, 55, 4, 222, 120, 219, 55, 2, 221, + 127, 182, 93, 101, 220, 112, 224, 164, 2, 159, 43, 57, 198, 48, 115, 130, + 126, 169, 11, 75, 185, 75, 210, 185, 26, 160, 15, 217, 194, 131, 211, 233, + 196, 68, 76, 169, 115, 127, 205, 131, 222, 169, 60, 150, 127, 242, 210, + 255, 35, 71, 228, 159, 167, 208, 207, 97, 241, 56, 165, 236, 146, 12, 138, + 19, 216, 235, 120, 48, 231, 55, 244, 166, 144, 79, 186, 103, 193, 37, 212, + 216, 81, 238, 230, 94, 63, 116, 0, 112, 5, 129, 68, 191, 156, 140, 160, 80, + 46, 33, 80, 1, 96, 253, 222, 63, 142, 27, 74, 140, 112, 64, 0, 24, 121, + 158, 100, 192, 80, 182, 62, 233, 89, 59, 121, 35, 45, 41, 94, 2, 177, 101, + 72, 9, 103, 33, 218, 24, 114, 86, 198, 222, 89, 181, 6, 237, 46, 6, 192, + 175, 171, 205, 251, 81, 34, 45, 150, 185, 215, 85, 250, 188, 3, 45, 174, + 19, 47, 46, 142, 164, 146, 87, 253, 174, 150, 166, 90, 28, 144, 183, 168, + 217, 65, 7, 181, 207, 243, 96, 84, 26, 118, 96, 101, 134, 183, 93, 15, 212, + 245, 218, 121, 102, 135, 216, 18, 167, 177, 183, 188, 208, 77, 86, 80, 172, + 235, 101, 239, 166, 66, 162, 16, 208, 170, 248, 2, 242, 171, 169, 245, 192, + 29, 149, 13, 172, 171, 117, 237, 22, 224, 103, 158, 201, 107, 65, 14, 170, + 230, 195, 181, 198, 17, 69, 6, 127, 136, 56, 196, 176, 232, 236, 210, 111, + 164, 150, 136, 232, 152, 99, 51, 235, 29, 125, 76, 181, 71, 201, 216, 1, + 85, 135, 195, 71, 49, 193, 36, 200, 34, 249, 23, 77, 170, 3, 87, 89, 78, + 24, 149, 235, 249, 80, 88, 139, 87, 91, 152, 191, 245, 115, 22, 228, 153, + 99, 125, 5, 100, 147, 249, 23, 241, 217, 129, 124, 151, 145, 2, 57, 153, + 76, 147, 152, 100, 99, 158, 173, 20, 0, 205, 75, 83, 6, 24, 52, 224, 55, + 189, 160, 15, 237, 187, 25, 53, 89, 2, 35, 196, 173, 77, 97, 132, 27, 239, + 84, 199, 189, 37, 90, 153, 188, 181, 93, 122, 180, 123, 113, 210, 223, 253, + 214, 210, 41, 221, 56, 79, 36, 84, 26, 238, 203, 72, 196, 171, 0, 20, 34, + 20, 111, 106, 7, 34, 155, 10, 171, 135, 100, 235, 245, 10, 134, 91, 39, + 187, 204, 109, 99, 213, 210, 19, 54, 67, 47, 243, 118, 165, 124, 237, 63, + 94, 181, 37, 141, 193, 237, 133, 254, 142, 238, 65, 115, 104, 176, 172, + 128, 232, 36, 239, 51, 50, 54, 55, 77, 37, 3, 105, 2, 176, 118, 91, 176, + 152, 195, 104, 22, 42, 118, 192, 246, 201, 115, 73, 196, 132, 157, 132, + 108, 60, 105, 186, 23, 190, 109, 1, 40, 143, 60, 54, 91, 2, 60, 234, 180, + 209, 30, 184, 41, 207, 241, 67, 80, 209, 191, 112, 156, 143, 244, 158, 24, + 51, 173, 253, 38, 229, 252, 80, 100, 51, 48, 57, 139, 61, 142, 3, 76, 148, + 253, 220, 147, 169, 127, 230, 253, 172, 178, 99, 94, 203, 210, 126, 192, + 17, 74, 195, 87, 199, 161, 33, 237, 146, 95, 126, 6, 241, 94, 55, 96, 45, + 80, 26, 254, 238, 61, 171, 120, 155, 244, 81, 34, 45, 50, 111, 95, 151, + 152, 172, 242, 75, 151, 252, 251, 206, 248, 78, 36, 101, 77, 149, 249, 30, + 175, 225, 155, 192, 240, 123, 138, 119, 254, 34, 222, 129, 201, 49, 101, + 210, 209, 103, 24, 31, 189, 31, 214, 193, 253, 75, 45, 63, 2, 31, 35, 86, + 67, 203, 217, 57, 101, 202, 105, 54, 35, 95, 107, 89, 113, 216, 198, 224, + 95, 31, 9, 195, 157, 10, 140, 103, 40, 75, 141, 21, 86, 2, 138, 114, 9, 51, + 127, 210, 226, 178, 15, 15, 174, 125, 23, 77, 190, 245, 190, 208, 34, 160, + 199, 99, 72, 247, 75, 92, 201, 227, 253, 9, 130, 109, 159, 65, 47, 67, 253, + 56, 118, 47, 185, 181, 2, 20, 146, 212, 19, 221, 51, 35, 117, 22, 193, 29, + 103, 140, 248, 101, 194, 223, 107, 180, 248, 127, 222, 192, 112, 106, 4, + 250, 167, 32, 128, 19, 250, 123, 148, 208, 243, 86, 159, 11, 164, 5, 214, + 246, 8, 83, 126, 11, 126, 251, 205, 122, 184, 184, 247, 46, 3, 224, 149, + 209, 231, 142, 135, 61, 68, 1, 98, 139, 121, 9, 27, 19, 14, 83, 194, 83, + 27, 23, 111, 105, 217, 11, 11, 147, 140, 36, 3, 190, 148, 22, 115, 42, 134, + 88, 58, 203, 242, 119, 212, 233, 106, 115, 69, 7, 92, 85, 107, 30, 10, 203, + 16, 150, 191, 188, 61, 150, 169, 131, 16, 3, 173, 89, 28, 38, 238, 14, 161, + 230, 85, 54, 232, 236, 40, 248, 50, 237, 60, 166, 156, 215, 27, 4, 135, 15, + 173, 101, 18, 212, 24, 246, 25, 203, 194, 249, 223, 230, 28, 154, 219, 199, + 202, 197, 163, 81, 192, 112, 82, 138, 36, 214, 140, 7, 49, 2, 166, 254, + 199, 12, 135, 102, 125, 17, 37, 3, 164, 86, 25, 43, 97, 231, 36, 119, 191, + 21, 186, 129, 196, 228, 96, 75, 187, 190, 252, 250, 73, 25, 58, 17, 10, + 104, 116, 100, 75, 215, 162, 21, 11, 201, 181, 15, 106, 135, 96, 21, 152, + 160, 218, 53, 123, 254, 91, 190, 239, 156, 143, 125, 186, 177, 165, 181, + 34, 163, 62, 138, 204, 57, 102, 76, 2, 210, 64, 211, 20, 101, 233, 113, 18, + 36, 132, 201, 33, 173, 229, 240, 163, 206, 43, 234, 87, 151, 23, 17, 85, 0, + 189, 1, 255, 103, 160, 138, 160, 2, 218, 234, 184, 205, 152, 192, 81, 196, + 29, 52, 94, 53, 180, 110, 139, 222, 21, 27, 54, 114, 81, 40, 39, 225, 28, + 169, 211, 193, 118, 44, 38, 62, 201, 25, 215, 110, 88, 5, 142, 116, 224, + 54, 130, 45, 230, 246, 104, 251, 172, 159, 50, 212, 46, 171, 21, 213, 200, + 189, 6, 226, 234, 238, 226, 241, 219, 85, 8, 47, 152, 11, 238, 0, 132, 194, + 254, 135, 15, 85, 110, 31, 243, 54, 235, 240, 5, 19, 85, 176, 130, 224, + 127, 183, 83, 93, 179, 217, 185, 126, 52, 10, 14, 113, 19, 5, 201, 201, + 161, 30, 176, 132, 72, 179, 9, 110, 68, 87, 203, 201, 160, 111, 163, 35, + 247, 13, 132, 176, 214, 63, 3, 193, 251, 139, 79, 215, 178, 218, 56, 222, + 162, 33, 46, 57, 4, 129, 65, 166, 110, 237, 23, 186, 226, 100, 133, 187, + 151, 155, 217, 238, 252, 2, 147, 3, 213, 55, 166, 184, 148, 152, 194, 230, + 97, 203, 161, 191, 127, 213, 240, 121, 99, 70, 171, 83, 155, 88, 91, 200, + 26, 92, 3, 218, 233, 23, 215, 63, 47, 55, 133, 185, 189, 223, 135, 202, + 182, 237, 107, 248, 219, 138, 158, 2, 153, 236, 98, 18, 135, 141, 243, 120, + 195, 213, 169, 176, 218, 241, 58, 175, 238, 121, 218, 175, 8, 246, 18, 217, + 58, 154, 67, 164, 25, 76, 222, 47, 227, 62, 136, 20, 215, 46, 163, 42, 188, + 109, 9, 122, 76, 221, 165, 150, 201, 9, 246, 100, 88, 184, 219, 129, 43, + 143, 45, 91, 21, 89, 118, 27, 131, 253, 41, 20, 67, 55, 252, 90, 98, 197, + 123, 169, 120, 202, 168, 239, 3, 23, 28, 110, 164, 201, 219, 123, 239, 64, + 146, 50, 185, 241, 47, 17, 27, 201, 87, 156, 104, 89, 114, 165, 71, 26, + 121, 88, 231, 5, 215, 72, 204, 3, 121, 57, 23, 165, 63, 43, 115, 232, 182, + 37, 41, 67, 229, 131, 139, 249, 101, 17, 147, 225, 125, 170, 4, 19, 174, + 188, 237, 110, 18, 155, 113, 45, 107, 8, 108, 20, 189, 239, 248, 4, 31, 97, + 215, 190, 113, 34, 137, 110, 183, 119, 239, 221, 165, 99, 199, 107, 124, + 127, 48, 46, 68, 70, 249, 191, 218, 185, 114, 253, 16, 28, 131, 3, 201, + 215, 247, 208, 199, 219, 146, 127, 62, 64, 40, 98, 136, 4, 135, 2, 192, + 164, 107, 116, 8, 189, 84, 190, 104, 113, 230, 191, 200, 18, 186, 215, 32, + 2, 98, 211, 11, 145, 22, 217, 12, 14, 94, 173, 5, 91, 74, 189, 173, 250, + 181, 61, 153, 68, 226, 241, 2, 238, 229, 24, 145, 62, 83, 178, 113, 172, + 86, 43, 105, 153, 25, 117, 254, 244, 155, 111, 212, 187, 23, 109, 232, 188, + 177, 180, 83, 65, 94, 80, 130, 2, 185, 146, 202, 44, 71, 205, 252, 25, 52, + 109, 182, 234, 207, 167, 79, 52, 127, 204, 91, 185, 166, 61, 134, 55, 25, + 139, 177, 92, 131, 213, 118, 61, 123, 237, 80, 107, 153, 77, 218, 197, 212, + 95, 165, 161, 36, 152, 25, 170, 227, 17, 202, 79, 243, 34, 50, 190, 75, 7, + 154, 159, 140, 217, 84, 125, 190, 168, 123, 74, 115, 72, 4, 164, 169, 132, + 85, 169, 20, 212, 183, 164, 115, 9, 91, 33, 95, 184, 26, 61, 155, 243, 158, + 19, 126, 46, 126, 63, 214, 227, 191, 12, 62, 231, 87, 110, 229, 47, 156, + 47, 47, 241, 208, 49, 213, 49, 67, 230, 44, 210, 250, 251, 219, 246, 39, + 153, 249, 226, 166, 228, 3, 41, 36, 114, 82, 242, 73, 40, 54, 12, 1, 221, + 99, 116, 50, 220, 171, 220, 47, 134, 160, 142, 35, 255, 123, 13, 31, 32, + 240, 27, 188, 203, 236, 2, 11, 71, 190, 206, 92, 140, 151, 224, 223, 140, + 97, 98, 172, 180, 170, 56, 168, 32, 170, 5, 142, 36, 75, 6, 164, 73, 23, + 204, 167, 54, 241, 66, 255, 33, 175, 61, 188, 220, 49, 234, 15, 136, 19, + 197, 232, 64, 38, 145, 249, 23, 233, 172, 15, 78, 48, 238, 210, 90, 44, 69, + 110, 221, 36, 239, 28, 162, 203, 103, 213, 44, 255, 88, 168, 254, 236, 86, + 60, 176, 148, 17, 213, 1, 149, 135, 127, 76, 211, 176, 162, 121, 253, 188, + 149, 1, 177, 137, 22, 183, 225, 29, 122, 191, 112, 157, 102, 19, 108, 188, + 227, 38, 48, 101, 213, 88, 12, 227, 6, 73, 185, 13, 194, 206, 75, 181, 243, + 56, 194, 134, 2, 62, 236, 102, 164, 241, 236, 180, 222, 124, 34, 195, 118, + 72, 115, 19, 120, 237, 231, 36, 245, 26, 77, 237, 8, 72, 11, 241, 248, 214, + 248, 153, 80, 2, 13, 49, 125, 116, 159, 11, 95, 23, 248, 66, 197, 122, 47, + 16, 92, 67, 189, 172, 29, 70, 230, 120, 227, 147, 190, 165, 246, 26, 219, + 17, 191, 239, 46, 4, 79, 198, 75, 155, 161, 4, 110, 102, 128, 24, 241, 59, + 249, 124, 148, 75, 136, 144, 88, 59, 235, 103, 46, 222, 255, 198, 233, 229, + 22, 16, 152, 15, 5, 191, 138, 38, 93, 231, 239, 234, 62, 25, 60, 121, 82, + 212, 187, 249, 193, 139, 7, 33, 87, 32, 140, 25, 98, 232, 18, 248, 109, 80, + 193, 8, 94, 26, 178, 198, 50, 106, 153, 198, 252, 165, 231, 196, 224, 160, + 249, 191, 211, 124, 48, 143, 78, 118, 138, 38, 152, 252, 174, 48, 103, 51, + 3, 3, 197, 20, 145, 48, 31, 65, 112, 72, 92, 84, 188, 238, 227, 229, 26, + 57, 97, 90, 254, 53, 44, 79, 217, 252, 73, 173, 32, 237, 70, 140, 212, 3, + 49, 139, 22, 59, 90, 33, 27, 255, 179, 84, 8, 47, 4, 154, 84, 233, 152, + 148, 68, 135, 163, 238, 165, 63, 208, 179, 250, 233, 8, 149, 126, 156, 43, + 82, 179, 60, 121, 230, 109, 173, 14, 166, 81, 212, 101, 58, 152, 229, 62, + 247, 130, 38, 212, 126, 111, 5, 135, 252, 9, 54, 235, 53, 100, 97, 107, + 127, 69, 150, 134, 73, 20, 20, 205, 91, 142, 73, 236, 2, 160, 222, 1, 33, + 39, 72, 144, 230, 218, 217, 1, 58, 223, 70, 123, 123, 214, 248, 207, 213, + 46, 3, 213, 175, 97, 251, 107, 238, 138, 221, 37, 206, 214, 38, 252, 116, + 101, 29, 173, 139, 251, 177, 101, 28, 178, 8, 200, 64, 138, 239, 3, 235, + 160, 228, 94, 235, 54, 164, 147, 178, 107, 64, 249, 165, 228, 18, 225, 94, + 225, 122, 21, 146, 42, 216, 73, 129, 133, 131, 120, 1, 252, 92, 160, 3, + 245, 199, 59, 252, 44, 74, 253, 226, 74, 15, 16, 250, 82, 208, 87, 177, + 131, 232, 142, 230, 99, 97, 138, 14, 72, 249, 82, 248, 85, 60, 63, 238, + 225, 98, 225, 98, 235, 24, 63, 227, 54, 138, 240, 70, 100, 99, 24, 254, + 201, 43, 242, 228, 4, 233, 183, 233, 217, 218, 31, 142, 80, 125, 91, 116, + 165, 173, 222, 241, 132, 3, 1, 121, 180, 82, 106, 242, 48, 21, 82, 156, + 175, 72, 82, 17, 217, 174, 113, 68, 40, 138, 110, 28, 224, 240, 29, 49, + 244, 243, 13, 145, 65, 254, 195, 102, 50, 137, 71, 105, 30, 65, 254, 219, + 22, 70, 61, 65, 92, 200, 149, 218, 198, 2, 84, 143, 33, 35, 175, 25, 2, 98, + 239, 199, 226, 31, 141, 219, 151, 119, 44, 197, 18, 49, 106, 76, 162, 33, + 57, 243, 101, 17, 171, 246, 158, 234, 75, 45, 248, 154, 37, 82, 85, 3, 196, + 158, 115, 164, 194, 75, 242, 246, 54, 129, 109, 89, 59, 120, 37, 249, 127, + 162, 249, 176, 251, 115, 155, 35, 20, 64, 247, 85, 185, 253, 165, 130, 90, + 198, 147, 200, 21, 19, 14, 209, 197, 254, 140, 180, 56, 49, 14, 172, 150, + 19, 78, 255, 199, 21, 145, 123, 138, 232, 188, 95, 65, 78, 167, 116, 67, + 110, 205, 223, 120, 154, 115, 73, 34, 147, 93, 235, 51, 223, 47, 14, 97, + 240, 17, 7, 73, 31, 38, 18, 251, 111, 67, 84, 220, 68, 112, 241, 197, 93, + 28, 234, 198, 206, 226, 59, 23, 227, 195, 70, 242, 161, 157, 232, 149, 2, + 226, 112, 60, 70, 210, 18, 147, 28, 148, 24, 242, 11, 184, 216, 3, 243, + 119, 117, 101, 69, 199, 177, 142, 223, 141, 86, 255, 219, 245, 100, 209, + 76, 30, 157, 70, 209, 146, 169, 137, 9, 87, 128, 162, 241, 182, 113, 65, 2, + 64, 13, 107, 40, 97, 191, 242, 18, 207, 246, 164, 24, 61, 180, 86, 67, 104, + 69, 27, 125, 249, 123, 106, 223, 116, 174, 230, 113, 239, 147, 89, 225, + 143, 7, 6, 126, 174, 164, 32, 149, 3, 124, 198, 75, 75, 21, 8, 95, 107, 83, + 253, 216, 201, 240, 7, 212, 67, 46, 137, 27, 32, 27, 46, 15, 228, 62, 146, + 219, 147, 200, 211, 143, 95, 14, 6, 245, 177, 242, 139, 246, 150, 39, 201, + 1, 58, 23, 188, 104, 232, 227, 252, 21, 96, 100, 118, 216, 227, 49, 99, + 199, 198, 88, 130, 207, 123, 173, 226, 105, 187, 206, 236, 7, 194, 41, 99, + 160, 74, 41, 205, 142, 34, 225, 145, 238, 98, 217, 160, 155, 3, 66, 84, + 146, 173, 203, 14, 252, 236, 17, 103, 239, 44, 241, 80, 24, 176, 176, 197, + 230, 208, 227, 134, 196, 9, 222, 109, 172, 189, 215, 173, 142, 175, 3, 72, + 90, 155, 219, 29, 54, 57, 202, 217, 247, 12, 89, 162, 14, 79, 229, 24, 185, + 238, 80, 139, 45, 150, 48, 136, 192, 49, 82, 241, 0, 23, 114, 122, 107, + 165, 196, 17, 87, 229, 236, 174, 142, 34, 32, 11, 78, 222, 217, 121, 163, + 193, 254, 62, 192, 43, 0, 60, 27, 169, 96, 238, 171, 93, 21, 60, 5, 168, + 23, 27, 130, 142, 19, 102, 245, 16, 21, 85, 131, 212, 96, 179, 215, 173, + 68, 116, 51, 40, 47, 181, 45, 32, 93, 225, 105, 173, 69, 49, 134, 7, 46, + 162, 203, 181, 176, 84, 92, 11, 42, 193, 211, 77, 227, 85, 15, 49, 119, 34, + 64, 148, 51, 117, 37, 205, 70, 40, 39, 85, 239, 3, 139, 100, 67, 163, 137, + 101, 9, 215, 71, 32, 49, 224, 12, 174, 8, 177, 12, 65, 81, 191, 66, 146, + 111, 22, 235, 78, 46, 55, 211, 144, 84, 210, 3, 38, 89, 164, 43, 133, 39, + 109, 147, 152, 162, 133, 50, 56, 88, 229, 35, 90, 77, 171, 99, 158, 132, + 144, 11, 121, 16, 172, 119, 83, 24, 220, 97, 70, 247, 215, 36, 115, 70, 77, + 131, 119, 197, 147, 17, 227, 12, 249, 8, 164, 40, 36, 91, 130, 224, 18, 1, + 169, 248, 118, 100, 211, 1, 135, 81, 163, 216, 71, 73, 57, 85, 72, 116, + 125, 111, 189, 78, 66, 62, 36, 100, 110, 178, 207, 122, 114, 184, 158, 200, + 187, 18, 156, 178, 8, 58, 116, 51, 173, 17, 164, 66, 104, 201, 205, 220, + 20, 59, 211, 118, 167, 217, 13, 246, 228, 105, 74, 93, 211, 243, 65, 54, + 17, 114, 247, 24, 29, 221, 138, 141, 2, 183, 117, 66, 42, 50, 28, 167, 5, + 177, 30, 113, 253, 105, 2, 213, 101, 198, 55, 174, 237, 250, 186, 76, 200, + 11, 42, 142, 163, 69, 107, 82, 74, 3, 11, 94, 150, 3, 252, 176, 128, 53, + 14, 247, 97, 165, 63, 165, 61, 94, 101, 119, 124, 68, 231, 35, 231, 145, 2, + 151, 188, 56, 133, 135, 44, 38, 108, 46, 66, 212, 9, 40, 207, 250, 68, 88, + 212, 141, 195, 240, 204, 114, 49, 175, 98, 32, 19, 153, 75, 104, 170, 204, + 11, 242, 95, 204, 203, 96, 168, 47, 52, 165, 56, 136, 18, 241, 47, 227, + 172, 152, 101, 195, 94, 45, 209, 44, 97, 38, 58, 99, 10, 185, 133, 139, + 117, 12, 30, 23, 229, 155, 203, 77, 143, 248, 50, 113, 18, 56, 166, 214, + 224, 208, 82, 173, 135, 168, 58, 176, 231, 216, 52, 20, 169, 43, 203, 26, + 5, 52, 137, 103, 164, 212, 2, 134, 195, 113, 108, 156, 215, 175, 183, 91, + 144, 145, 235, 172, 118, 252, 59, 248, 135, 173, 164, 27, 32, 220, 234, + 108, 171, 248, 244, 1, 3, 47, 150, 2, 182, 100, 74, 69, 250, 93, 106, 189, + 196, 13, 111, 226, 111, 34, 12, 122, 224, 44, 181, 250, 77, 130, 27, 117, + 50, 44, 89, 239, 128, 224, 151, 31, 135, 61, 106, 197, 85, 179, 159, 18, + 218, 138, 217, 143, 104, 21, 46, 49, 214, 25, 88, 198, 44, 61, 51, 39, 210, + 254, 197, 84, 110, 139, 127, 241, 192, 70, 189, 6, 198, 85, 126, 112, 113, + 125, 70, 16, 246, 214, 222, 83, 46, 26, 221, 236, 207, 1, 251, 232, 147, + 234, 157, 238, 240, 38, 238, 221, 114, 218, 67, 66, 138, 90, 104, 220, 132, + 129, 101, 145, 120, 80, 14, 155, 238, 107, 61, 71, 207, 97, 153, 163, 22, + 111, 117, 137, 9, 226, 124, 183, 2, 170, 68, 187, 8, 4, 86, 191, 230, 90, + 168, 235, 152, 60, 147, 15, 52, 132, 192, 178, 204, 4, 37, 178, 228, 217, + 165, 208, 58, 57, 34, 111, 47, 2, 151, 28, 77, 0, 66, 133, 109, 255, 122, + 243, 25, 174, 204, 220, 52, 171, 207, 48, 239, 127, 243, 74, 173, 155, 89, + 68, 132, 70, 60, 32, 173, 167, 225, 250, 232, 156, 238, 254, 244, 242, 200, + 39, 201, 243, 149, 117, 171, 87, 185, 29, 202, 46, 36, 246, 174, 18, 192, + 87, 243, 219, 124, 70, 165, 208, 20, 186, 42, 238, 62, 200, 171, 191, 94, + 102, 247, 184, 40, 130, 207, 44, 161, 249, 25, 193, 221, 45, 122, 33, 231, + 232, 167, 21, 145, 170, 45, 146, 45, 247, 101, 127, 113, 52, 121, 187, 184, + 136, 206, 238, 133, 10, 137, 103, 79, 84, 179, 239, 140, 123, 100, 7, 108, + 45, 140, 147, 153, 213, 121, 140, 2, 32, 88, 230, 156, 33, 156, 163, 80, + 175, 50, 62, 105, 97, 34, 18, 116, 16, 38, 47, 7, 126, 74, 53, 245, 126, + 37, 221, 70, 185, 90, 204, 156, 2, 226, 39, 53, 68, 47, 39, 21, 108, 228, + 225, 6, 2, 152, 174, 174, 236, 132, 25, 63, 197, 245, 178, 134, 245, 234, + 72, 165, 96, 74, 178, 208, 232, 234, 159, 225, 96, 73, 18, 49, 79, 140, + 199, 126, 70, 159, 146, 72, 255, 152, 154, 149, 77, 161, 73, 64, 248, 201, + 26, 234, 120, 22, 12, 91, 71, 30, 6, 239, 103, 209, 235, 121, 49, 154, 147, + 175, 35, 30, 71, 38, 252, 142, 52, 109, 213, 79, 142, 87, 239, 10, 131, + 201, 193, 28, 106, 221, 206, 221, 33, 188, 167, 254, 14, 145, 151, 210, 4, + 56, 63, 206, 180, 233, 79, 70, 110, 139, 227, 241, 134, 56, 58, 43, 95, + 222, 148, 30, 142, 68, 194, 3, 119, 61, 16, 254, 157, 152, 182, 137, 113, + 177, 225, 2, 223, 217, 201, 186, 156, 103, 184, 99, 226, 121, 197, 236, + 201, 115, 4, 245, 101, 93, 93, 79, 3, 56, 24, 154, 230, 155, 111, 238, 218, + 10, 119, 102, 66, 29, 79, 10, 221, 189, 178, 121, 104, 167, 10, 11, 110, + 203, 186, 94, 224, 233, 175, 1, 180, 206, 23, 70, 195, 79, 152, 205, 178, + 101, 203, 57, 175, 207, 37, 100, 122, 39, 127, 190, 172, 139, 49, 7, 166, + 123, 247, 118, 64, 66, 10, 37, 176, 24, 62, 11, 227, 142, 215, 87, 129, + 154, 203, 245, 205, 54, 219, 89, 169, 8, 103, 248, 1, 170, 215, 80, 243, + 226, 242, 26, 12, 34, 156, 151, 119, 104, 230, 27, 77, 245, 174, 137, 49, + 100, 62, 186, 245, 138, 89, 2, 111, 222, 6, 57, 240, 186, 107, 163, 117, + 204, 200, 70, 111, 80, 205, 94, 193, 3, 166, 14, 57, 212, 55, 190, 119, + 142, 158, 141, 146, 138, 238, 241, 237, 139, 20, 80, 63, 126, 102, 41, 187, + 78, 5, 186, 238, 220, 241, 15, 156, 189, 3, 133, 136, 129, 135, 193, 147, + 187, 100, 217, 172, 175, 58, 73, 87, 126, 148, 108, 130, 37, 201, 254, 95, + 158, 18, 192, 39, 188, 143, 28, 20, 248, 143, 188, 10, 228, 194, 174, 148, + 251, 49, 132, 123, 23, 210, 171, 230, 226, 17, 16, 15, 76, 23, 33, 199, + 207, 181, 224, 171, 3, 71, 7, 90, 180, 164, 60, 21, 117, 69, 120, 199, 143, + 152, 212, 194, 16, 47, 10, 30, 137, 15, 99, 205, 238, 115, 245, 135, 228, + 62, 192, 112, 153, 93, 164, 92, 146, 250, 244, 140, 69, 185, 4, 53, 50, + 221, 29, 1, 195, 198, 246, 189, 230, 82, 60, 164, 21, 86, 111, 157, 211, + 241, 81, 36, 206, 3, 16, 180, 219, 106, 3, 137, 135, 206, 172, 41, 24, 191, + 34, 180, 20, 119, 56, 89, 100, 204, 154, 124, 221, 114, 183, 138, 244, 56, + 94, 8, 174, 114, 251, 97, 82, 191, 16, 3, 108, 181, 118, 79, 173, 119, 142, + 75, 214, 11, 204, 228, 213, 218, 68, 18, 86, 238, 169, 110, 54, 34, 115, + 31, 48, 114, 0, 127, 5, 233, 204, 125, 183, 32, 244, 55, 44, 181, 139, 62, + 212, 116, 117, 142, 58, 168, 18, 189, 78, 131, 128, 93, 68, 125, 52, 245, + 59, 13, 213, 215, 1, 47, 159, 136, 183, 48, 128, 65, 199, 220, 17, 179, + 224, 163, 103, 190, 11, 144, 224, 63, 154, 90, 152, 185, 24, 45, 34, 220, + 72, 252, 62, 154, 250, 55, 218, 29, 221, 51, 78, 104, 228, 161, 34, 33, 15, + 167, 233, 138, 128, 35, 106, 132, 160, 67, 40, 11, 201, 197, 250, 143, 165, + 204, 206, 88, 81, 76, 149, 73, 2, 41, 52, 90, 235, 93, 111, 16, 226, 16, + 245, 231, 250, 18, 205, 174, 171, 113, 229, 92, 146, 107, 186, 148, 195, + 19, 145, 182, 91, 7, 84, 199, 17, 3, 136, 41, 251, 89, 176, 20, 163, 214, + 139, 92, 58, 239, 150, 142, 148, 202, 196, 17, 226, 215, 174, 107, 54, 0, + 205, 104, 140, 150, 177, 34, 132, 216, 101, 159, 85, 255, 135, 85, 45, 220, + 225, 121, 91, 201, 211, 110, 59, 188, 5, 180, 40, 110, 93, 75, 189, 45, + 105, 102, 194, 168, 65, 243, 172, 195, 202, 87, 188, 254, 165, 119, 71, + 102, 115, 33, 15, 219, 209, 207, 172, 148, 56, 141, 248, 137, 83, 88, 29, + 93, 22, 65, 27, 219, 178, 97, 94, 10, 59, 14, 4, 86, 176, 88, 69, 39, 31, + 255, 182, 246, 165, 95, 145, 98, 1, 58, 59, 38, 40, 246, 29, 148, 9, 224, + 10, 210, 31, 91, 229, 116, 3, 172, 73, 107, 120, 189, 191, 17, 71, 160, + 113, 144, 215, 63, 65, 153, 26, 214, 66, 139, 92, 255, 169, 13, 183, 164, + 114, 65, 71, 54, 255, 212, 44, 3, 63, 152, 205, 25, 109, 134, 92, 65, 119, + 194, 97, 177, 51, 201, 113, 123, 33, 18, 231, 154, 235, 171, 205, 70, 164, + 82, 195, 163, 103, 95, 228, 149, 64, 7, 250, 222, 91, 156, 119, 50, 28, + 119, 237, 144, 117, 245, 117, 189, 220, 111, 164, 203, 125, 2, 84, 173, 82, + 176, 170, 167, 138, 42, 159, 51, 74, 178, 61, 30, 61, 85, 220, 197, 12, 11, + 86, 155, 51, 195, 76, 71, 208, 87, 64, 112, 80, 243, 50, 79, 159, 255, 170, + 242, 229, 50, 158, 138, 153, 130, 110, 64, 65, 220, 88, 225, 98, 70, 110, + 206, 141, 25, 211, 186, 225, 226, 186, 148, 7, 88, 57, 136, 171, 50, 40, + 170, 181, 184, 193, 23, 2, 96, 165, 111, 173, 204, 11, 19, 154, 225, 153, + 226, 83, 142, 165, 239, 244, 124, 127, 236, 75, 211, 204, 185, 206, 18, + 238, 213, 193, 28, 5, 250, 99, 3, 98, 177, 180, 173, 234, 91, 28, 192, 226, + 83, 94, 98, 209, 110, 209, 168, 182, 41, 247, 93, 221, 174, 220, 113, 101, + 30, 203, 212, 237, 56, 82, 92, 146, 41, 32, 93, 114, 215, 29, 170, 24, 25, + 136, 253, 247, 132, 234, 242, 44, 219, 11, 192, 105, 37, 95, 87, 68, 206, + 110, 115, 33, 21, 188, 105, 249, 217, 219, 94, 169, 51, 89, 112, 208, 139, + 117, 120, 78, 221, 81, 93, 97, 63, 28, 128, 2, 187, 90, 180, 233, 76, 43, + 226, 70, 40, 75, 214, 153, 149, 18, 197, 35, 209, 36, 69, 45, 134, 74, 143, + 217, 35, 254, 235, 28, 144, 199, 38, 142, 23, 90, 230, 186, 55, 96, 123, + 36, 41, 111, 116, 2, 240, 14, 108, 128, 93, 164, 203, 56, 91, 207, 52, 38, + 116, 87, 95, 217, 166, 50, 184, 138, 61, 68, 154, 158, 255, 50, 235, 243, + 45, 224, 73, 8, 2, 3, 0, 101, 215, 8, 145, 42, 179, 120, 232, 81, 227, 215, + 18, 36, 165, 23, 186, 162, 247, 117, 43, 66, 44, 184, 186, 96, 200, 226, 8, + 113, 124, 163, 12, 76, 220, 50, 215, 243, 209, 40, 139, 201, 129, 68, 226, + 0, 56, 32, 155, 27, 219, 64, 78, 235, 251, 111, 192, 114, 241, 32, 109, + 154, 173, 212, 151, 158, 149, 221, 117, 23, 55, 70, 87, 56, 108, 61, 201, + 232, 25, 51, 189, 71, 189, 101, 115, 25, 240, 125, 210, 155, 99, 253, 242, + 252, 149, 119, 25, 168, 30, 86, 100, 249, 96, 149, 74, 174, 213, 209, 252, + 192, 96, 2, 252, 189, 114, 247, 18, 245, 88, 102, 18, 78, 98, 134, 251, + 213, 249, 3, 195, 109, 118, 163, 224, 75, 149, 66, 242, 231, 160, 19, 250, + 213, 12, 163, 23, 17, 79, 26, 115, 254, 51, 241, 171, 74, 231, 189, 217, + 99, 149, 187, 2, 38, 25, 83, 109, 176, 213, 204, 153, 119, 162, 102, 147, + 245, 77, 92, 83, 11, 216, 100, 175, 122, 73, 151, 108, 106, 18, 74, 105, + 219, 21, 193, 185, 29, 14, 145, 81, 122, 218, 157, 47, 56, 100, 116, 38, + 123, 253, 155, 70, 232, 118, 137, 34, 208, 218, 179, 110, 102, 33, 46, 165, + 120, 173, 212, 123, 90, 34, 167, 206, 94, 12, 233, 25, 102, 64, 148, 145, + 223, 65, 183, 36, 173, 42, 107, 25, 41, 8, 29, 168, 43, 49, 252, 193, 230, + 26, 51, 206, 203, 116, 229, 19, 197, 237, 227, 65, 242, 171, 181, 121, 81, + 123, 244, 188, 201, 138, 77, 137, 190, 206, 5, 97, 69, 181, 171, 65, 1, + 141, 117, 226, 2, 155, 46, 192, 58, 208, 93, 12, 50, 254, 144, 150, 81, + 131, 37, 142, 139, 10, 83, 68, 121, 241, 85, 160, 82, 78, 84, 42, 25, 209, + 82, 59, 249, 2, 15, 3, 143, 35, 91, 114, 100, 116, 227, 180, 80, 23, 2, + 195, 229, 42, 5, 92, 57, 162, 16, 93, 12, 193, 42, 41, 101, 246, 63, 148, + 73, 217, 232, 51, 174, 72, 144, 26, 252, 210, 104, 57, 82, 216, 202, 104, + 187, 97, 23, 95, 25, 155, 244, 61, 60, 29, 3, 19, 76, 226, 62, 48, 34, 62, + 254, 61, 238, 11, 244, 76, 169, 250, 73, 205, 100, 15, 47, 90, 84, 139, + 125, 153, 91, 107, 234, 83, 5, 154, 31, 100, 111, 158, 49, 176, 122, 232, + 204, 86, 154, 5, 187, 171, 59, 112, 242, 9, 52, 78, 166, 224, 91, 51, 164, + 191, 80, 139, 153, 207, 44, 51, 201, 128, 120, 147, 21, 6, 57, 252, 2, 75, + 202, 81, 220, 81, 5, 19, 124, 72, 249, 115, 219, 27, 223, 138, 18, 33, 214, + 173, 44, 67, 25, 223, 104, 143, 197, 252, 155, 95, 168, 74, 49, 3, 23, 48, + 58, 80, 78, 2, 140, 248, 155, 129, 94, 216, 169, 60, 175, 215, 7, 10, 81, + 81, 25, 88, 182, 131, 75, 54, 176, 70, 228, 37, 49, 48, 203, 7, 148, 83, + 243, 125, 122, 107, 35, 23, 228, 45, 61, 108, 169, 241, 129, 163, 57, 247, + 56, 159, 78, 133, 7, 143, 67, 103, 157, 212, 41, 160, 130, 111, 1, 230, 77, + 121, 72, 101, 222, 112, 63, 206, 191, 89, 189, 175, 166, 100, 90, 106, 145, + 186, 0, 179, 155, 136, 204, 141, 130, 57, 91, 30, 196, 233, 201, 168, 7, + 197, 129, 70, 202, 93, 161, 102, 11, 118, 133, 157, 192, 103, 46, 190, 255, + 102, 23, 46, 177, 177, 245, 169, 52, 88, 35, 250, 3, 221, 198, 124, 178, + 160, 234, 147, 15, 21, 56, 47, 56, 220, 186, 139, 49, 181, 4, 15, 100, 126, + 136, 185, 115, 135, 46, 194, 252, 209, 253, 221, 179, 2, 105, 239, 60, 43, + 173, 4, 167, 92, 176, 199, 88, 132, 14, 190, 34, 121, 133, 195, 98, 63, 64, + 194, 192, 37, 129, 138, 223, 33, 128, 72, 21, 77, 169, 100, 106, 25, 96, + 251, 175, 185, 16, 179, 223, 105, 60, 108, 192, 22, 0, 52, 20, 160, 140, + 238, 195, 114, 228, 20, 188, 202, 255, 206, 163, 72, 85, 16, 112, 159, 198, + 85, 7, 44, 106, 77, 144, 105, 131, 188, 218, 111, 65, 56, 35, 67, 224, 203, + 254, 147, 249, 189, 52, 154, 157, 227, 235, 40, 230, 196, 247, 185, 20, + 155, 34, 216, 237, 47, 126, 75, 196, 212, 67, 155, 123, 133, 195, 141, 136, + 78, 202, 175, 203, 175, 215, 50, 92, 157, 18, 115, 3, 29, 171, 180, 93, 0, + 20, 15, 53, 51, 115, 103, 197, 81, 57, 54, 8, 136, 51, 157, 33, 158, 4, + 121, 72, 56, 126, 48, 188, 251, 103, 142, 168, 2, 203, 161, 5, 215, 56, + 191, 166, 251, 223, 204, 76, 224, 59, 50, 68, 113, 210, 52, 60, 242, 238, + 105, 88, 160, 52, 106, 221, 231, 167, 127, 183, 109, 147, 38, 170, 22, 195, + 180, 142, 160, 76, 223, 142, 109, 212, 132, 205, 56, 230, 51, 12, 221, 86, + 129, 244, 116, 2, 98, 68, 36, 40, 196, 109, 1, 39, 20, 84, 202, 242, 32, + 169, 139, 223, 122, 182, 45, 214, 64, 139, 93, 127, 171, 248, 173, 67, 211, + 168, 193, 70, 58, 230, 85, 172, 127, 192, 230, 177, 166, 237, 173, 243, 86, + 53, 43, 182, 119, 229, 174, 2, 133, 199, 214, 151, 130, 190, 110, 176, 35, + 63, 56, 23, 246, 106, 23, 202, 102, 90, 143, 3, 120, 0, 137, 147, 77, 51, + 109, 89, 123, 87, 242, 85, 248, 9, 45, 124, 144, 176, 185, 246, 94, 124, + 241, 183, 218, 250, 54, 216, 97, 224, 37, 111, 3, 174, 59, 122, 158, 226, + 103, 57, 217, 168, 208, 151, 208, 183, 187, 106, 18, 235, 118, 234, 248, + 152, 232, 115, 176, 221, 31, 129, 169, 36, 149, 205, 35, 101, 70, 145, 2, + 149, 171, 84, 41, 229, 26, 73, 52, 233, 43, 10, 101, 82, 222, 214, 88, 239, + 49, 81, 25, 248, 250, 244, 49, 72, 81, 237, 104, 98, 51, 37, 186, 158, 26, + 94, 143, 124, 9, 62, 38, 3, 50, 138, 52, 125, 9, 63, 232, 101, 31, 167, 74, + 189, 102, 190, 129, 115, 167, 25, 192, 223, 217, 117, 182, 51, 182, 151, + 191, 173, 79, 16, 204, 155, 233, 218, 144, 73, 36, 187, 1, 96, 252, 18, 95, + 42, 245, 78, 10, 11, 18, 42, 184, 3, 31, 191, 83, 215, 180, 170, 23, 15, + 64, 169, 203, 190, 151, 254, 199, 97, 23, 158, 207, 11, 131, 112, 49, 45, + 203, 156, 103, 44, 252, 47, 169, 168, 2, 64, 108, 40, 229, 52, 173, 69, 81, + 13, 123, 99, 121, 184, 92, 123, 18, 119, 128, 176, 22, 150, 45, 109, 30, + 141, 85, 229, 183, 226, 193, 149, 26, 228, 153, 104, 230, 41, 81, 177, 52, + 41, 235, 215, 152, 155, 172, 145, 241, 91, 75, 72, 160, 103, 95, 25, 88, + 187, 40, 51, 27, 47, 154, 13, 57, 4, 104, 167, 191, 164, 73, 228, 2, 219, + 224, 122, 93, 201, 133, 221, 201, 213, 178, 50, 123, 203, 178, 173, 205, + 107, 148, 6, 167, 244, 91, 11, 115, 250, 209, 28, 11, 146, 82, 74, 116, + 102, 109, 8, 23, 176, 12, 74, 206, 237, 100, 186, 178, 76, 166, 198, 52, + 225, 18, 9, 254, 184, 245, 224, 155, 2, 10, 75, 56, 236, 73, 233, 240, 19, + 147, 167, 184, 17, 160, 196, 135, 19, 35, 3, 70, 91, 147, 64, 138, 218, + 252, 87, 33, 199, 68, 116, 243, 117, 2, 20, 220, 245, 28, 125, 54, 146, + 163, 183, 115, 120, 67, 155, 244, 51, 198, 220, 116, 48, 120, 186, 90, 168, + 210, 83, 97, 161, 69, 241, 53, 92, 135, 74, 133, 134, 30, 134, 245, 246, + 22, 246, 99, 102, 159, 92, 208, 126, 210, 81, 17, 119, 55, 12, 70, 238, + 226, 69, 176, 22, 23, 5, 204, 140, 217, 33, 220, 223, 218, 201, 23, 68, + 174, 181, 12, 161, 97, 146, 221, 122, 107, 19, 14, 163, 228, 161, 204, 230, + 114, 202, 102, 249, 101, 24, 123, 177, 86, 132, 182, 61, 16, 4, 141, 38, + 96, 222, 151, 181, 40, 252, 3, 195, 46, 194, 251, 185, 122, 238, 78, 196, + 213, 252, 191, 127, 232, 171, 6, 63, 74, 3, 71, 133, 140, 132, 219, 170, + 107, 213, 141, 59, 37, 81, 120, 193, 157, 108, 2, 0, 153, 100, 177, 252, + 152, 6, 213, 194, 175, 135, 73, 145, 34, 94, 3, 164, 94, 46, 14, 108, 180, + 112, 59, 73, 36, 210, 240, 194, 69, 35, 84, 115, 32, 26, 11, 76, 44, 115, + 156, 141, 108, 153, 180, 161, 195, 103, 109, 210, 88, 100, 40, 34, 20, 44, + 94, 51, 107, 104, 51, 190, 207, 128, 254, 221, 16, 76, 211, 182, 183, 181, + 252, 13, 95, 186, 119, 66, 134, 64, 41, 255, 97, 249, 179, 158, 158, 127, + 88, 144, 201, 53, 120, 109, 158, 240, 84, 211, 187, 121, 0, 138, 233, 150, + 200, 11, 181, 220, 15, 43, 111, 139, 241, 187, 143, 36, 120, 193, 228, 238, + 152, 7, 173, 159, 2, 105, 118, 64, 36, 55, 183, 246, 114, 123, 42, 161, 56, + 175, 9, 244, 205, 17, 89, 200, 241, 3, 40, 124, 134, 23, 201, 207, 110, 41, + 97, 152, 89, 32, 113, 74, 107, 172, 96, 244, 131, 213, 91, 206, 61, 107, 7, + 113, 85, 213, 21, 188, 171, 110, 3, 180, 172, 151, 174, 223, 108, 135, 32, + 109, 159, 140, 247, 78, 104, 143, 10, 93, 135, 220, 86, 80, 227, 238, 46, + 142, 28, 174, 90, 180, 120, 55, 196, 113, 54, 129, 48, 112, 92, 72, 187, + 225, 189, 148, 71, 79, 247, 255, 126, 179, 45, 173, 120, 42, 236, 63, 6, + 227, 251, 76, 228, 126, 42, 11, 251, 211, 172, 16, 63, 223, 246, 92, 112, + 123, 184, 114, 62, 203, 150, 112, 17, 128, 114, 156, 207, 224, 235, 199, + 166, 11, 128, 56, 185, 221, 7, 121, 116, 100, 36, 113, 10, 246, 188, 200, + 39, 119, 162, 208, 130, 141, 144, 220, 90, 120, 123, 10, 215, 237, 16, 24, + 18, 219, 252, 115, 11, 2, 244, 166, 142, 3, 10, 190, 25, 117, 3, 60, 91, + 112, 4, 65, 157, 219, 142, 116, 171, 5, 65, 47, 113, 60, 118, 17, 168, 248, + 94, 10, 40, 123, 144, 91, 83, 251, 2, 125, 26, 19, 133, 150, 96, 18, 80, + 135, 194, 169, 210, 174, 140, 225, 173, 47, 52, 230, 75, 219, 37, 122, 38, + 179, 173, 177, 65, 149, 73, 55, 130, 78, 229, 22, 203, 145, 85, 69, 246, + 244, 13, 197, 85, 162, 73, 138, 69, 225, 241, 136, 235, 59, 138, 28, 34, + 171, 34, 77, 88, 52, 141, 98, 70, 50, 137, 73, 31, 214, 43, 58, 219, 156, + 244, 81, 97, 129, 237, 213, 61, 116, 66, 108, 149, 204, 220, 139, 81, 164, + 34, 182, 111, 63, 217, 161, 221, 103, 76, 215, 127, 179, 205, 35, 162, 44, + 76, 66, 216, 85, 97, 108, 193, 12, 140, 68, 21, 210, 236, 129, 236, 91, + 253, 203, 200, 209, 164, 107, 22, 3, 150, 5, 105, 153, 145, 5, 28, 159, + 165, 75, 16, 21, 119, 46, 108, 190, 120, 211, 41, 113, 45, 149, 125, 211, + 22, 39, 197, 61, 220, 39, 225, 111, 2, 236, 83, 224, 157, 212, 158, 87, + 152, 128, 147, 7, 155, 127, 33, 102, 156, 239, 154, 149, 215, 144, 193, + 222, 169, 94, 46, 128, 22, 186, 97, 26, 144, 151, 221, 206, 165, 120, 249, + 235, 145, 2, 144, 86, 77, 23, 163, 108, 225, 244, 198, 209, 119, 101, 147, + 252, 165, 93, 152, 198, 51, 70, 136, 138, 120, 60, 123, 5, 13, 253, 209, + 109, 40, 224, 244, 34, 230, 54, 3, 178, 218, 114, 157, 119, 76, 143, 200, + 58, 96, 35, 220, 113, 171, 175, 118, 172, 21, 159, 252, 64, 32, 2, 189, + 198, 204, 177, 250, 168, 213, 9, 144, 73, 245, 61, 45, 124, 201, 122, 53, + 208, 58, 156, 201, 115, 10, 250, 83, 89, 25, 2, 219, 57, 239, 215, 2, 213, + 220, 92, 248, 192, 67, 54, 241, 155, 181, 85, 58, 113, 125, 200, 151, 54, + 8, 176, 105, 60, 220, 63, 94, 230, 45, 238, 3, 112, 224, 42, 62, 199, 90, + 131, 216, 214, 115, 48, 107, 142, 55, 24, 64, 92, 12, 202, 7, 224, 4, 151, + 175, 167, 184, 109, 11, 185, 30, 165, 4, 202, 124, 233, 119, 48, 63, 50, + 116, 247, 147, 228, 52, 254, 5, 1, 90, 67, 135, 118, 95, 234, 188, 36, 199, + 2, 224, 238, 167, 246, 35, 253, 255, 71, 33, 183, 229, 138, 196, 176, 193, + 2, 54, 141, 47, 72, 22, 49, 160, 86, 246, 101, 186, 180, 52, 45, 41, 218, + 107, 217, 233, 13, 244, 90, 127, 96, 140, 5, 117, 111, 22, 10, 47, 218, 21, + 243, 214, 216, 221, 54, 218, 173, 133, 219, 106, 193, 208, 100, 164, 189, + 140, 209, 21, 186, 90, 214, 67, 2, 135, 201, 111, 252, 43, 141, 171, 22, + 74, 250, 215, 3, 39, 218, 100, 236, 160, 140, 95, 19, 191, 121, 202, 3, + 255, 171, 42, 192, 145, 254, 63, 78, 3, 72, 86, 36, 253, 152, 128, 51, 12, + 223, 60, 253, 221, 229, 117, 100, 123, 116, 236, 111, 95, 70, 102, 21, 197, + 96, 92, 172, 246, 125, 165, 233, 47, 46, 109, 71, 148, 168, 69, 232, 231, + 182, 78, 51, 181, 90, 215, 66, 213, 182, 4, 190, 230, 166, 140, 156, 98, + 50, 72, 167, 187, 149, 109, 85, 38, 204, 82, 125, 224, 14, 122, 91, 10, 35, + 168, 208, 156, 133, 13, 97, 228, 115, 135, 141, 85, 29, 220, 32, 27, 75, + 202, 167, 184, 38, 100, 242, 77, 158, 210, 130, 55, 61, 251, 159, 61, 253, + 162, 7, 222, 83, 188, 200, 216, 106, 207, 44, 142, 60, 178, 82, 8, 106, + 211, 196, 226, 145, 114, 163, 159, 3, 194, 157, 97, 93, 9, 33, 220, 197, + 101, 36, 69, 241, 159, 249, 76, 143, 78, 8, 112, 233, 182, 81, 149, 246, + 32, 114, 20, 161, 150, 86, 10, 77, 3, 20, 87, 56, 63, 21, 115, 40, 103, 33, + 178, 129, 133, 242, 254, 22, 220, 8, 97, 235, 67, 125, 151, 152, 81, 211, + 175, 144, 231, 68, 170, 210, 202, 223, 138, 152, 226, 140, 38, 32, 57, 26, + 178, 97, 14, 96, 69, 134, 60, 111, 243, 118, 254, 31, 84, 139, 42, 2, 183, + 115, 216, 95, 27, 151, 132, 210, 137, 195, 135, 247, 16, 1, 227, 69, 72, + 191, 227, 133, 170, 96, 207, 141, 144, 92, 184, 192, 146, 75, 219, 237, + 155, 122, 190, 225, 116, 67, 255, 96, 166, 171, 149, 64, 140, 30, 38, 154, + 5, 97, 22, 198, 30, 5, 110, 185, 174, 164, 122, 109, 28, 250, 132, 190, 10, + 143, 64, 155, 219, 122, 254, 3, 231, 160, 139, 195, 18, 235, 74, 170, 92, + 199, 143, 113, 182, 180, 106, 215, 210, 121, 214, 149, 118, 253, 224, 140, + 245, 98, 96, 147, 226, 18, 151, 242, 3, 216, 150, 33, 84, 24, 53, 46, 183, + 252, 249, 252, 61, 133, 84, 107, 121, 163, 41, 195, 194, 93, 135, 3, 155, + 36, 173, 0, 56, 118, 210, 60, 22, 250, 215, 156, 79, 233, 159, 176, 191, 2, + 79, 156, 161, 142, 72, 238, 74, 225, 201, 158, 145, 167, 42, 147, 178, 147, + 33, 232, 52, 199, 93, 213, 181, 171, 94, 9, 232, 250, 129, 104, 95, 100, + 212, 29, 210, 197, 147, 119, 168, 217, 20, 112, 126, 244, 150, 91, 76, 54, + 77, 25, 130, 169, 104, 26, 66, 250, 213, 102, 208, 29, 68, 90, 116, 114, + 156, 179, 49, 198, 101, 163, 201, 205, 127, 185, 78, 254, 252, 207, 97, 7, + 79, 92, 153, 124, 47, 174, 85, 2, 73, 8, 68, 163, 224, 117, 215, 32, 163, + 251, 182, 255, 213, 35, 167, 247, 6, 87, 19, 125, 199, 1, 152, 112, 59, 2, + 151, 14, 138, 12, 126, 219, 3, 140, 58, 0, 237, 219, 177, 143, 83, 159, 15, + 245, 209, 125, 208, 112, 80, 74, 205, 230, 112, 1, 129, 37, 31, 87, 108, + 17, 98, 63, 46, 197, 29, 34, 155, 89, 77, 120, 47, 59, 163, 187, 207, 46, + 155, 84, 236, 165, 199, 161, 78, 218, 192, 84, 13, 46, 32, 146, 144, 237, + 182, 217, 151, 255, 11, 51, 51, 172, 44, 203, 166, 232, 228, 50, 174, 113, + 92, 110, 49, 229, 62, 6, 203, 72, 172, 163, 85, 3, 169, 235, 223, 202, 3, + 78, 230, 46, 21, 136, 120, 245, 210, 212, 64, 96, 113, 135, 209, 28, 160, + 174, 109, 222, 87, 72, 7, 10, 27, 23, 46, 143, 75, 74, 211, 135, 37, 38, 8, + 104, 251, 2, 165, 16, 46, 178, 242, 76, 94, 13, 24, 117, 183, 161, 99, 132, + 197, 44, 201, 212, 181, 18, 40, 39, 233, 71, 50, 11, 54, 96, 25, 48, 217, + 208, 3, 106, 171, 156, 174, 81, 143, 144, 58, 193, 96, 124, 254, 76, 250, + 78, 183, 154, 255, 170, 52, 36, 224, 116, 239, 67, 51, 41, 136, 190, 179, + 77, 131, 231, 143, 110, 186, 93, 121, 35, 89, 115, 62, 224, 220, 52, 70, + 26, 13, 208, 206, 162, 106, 160, 111, 162, 40, 11, 96, 85, 124, 44, 246, + 191, 212, 215, 10, 3, 34, 97, 217, 92, 185, 210, 245, 131, 191, 128, 32, + 86, 240, 63, 177, 122, 2, 137, 63, 108, 230, 191, 69, 110, 208, 142, 235, + 110, 71, 131, 184, 234, 19, 19, 63, 183, 166, 170, 6, 70, 213, 227, 233, + 112, 231, 49, 98, 212, 162, 50, 150, 182, 66, 208, 10, 238, 167, 118, 214, + 87, 225, 3, 237, 167, 238, 23, 11, 219, 51, 99, 76, 201, 205, 112, 151, + 248, 43, 218, 66, 117, 143, 176, 74, 227, 184, 194, 103, 137, 208, 80, 222, + 82, 247, 198, 2, 219, 136, 12, 110, 49, 2, 106, 190, 183, 104, 65, 164, + 207, 191, 12, 17, 238, 21, 49, 102, 86, 219, 50, 46, 155, 126, 174, 15, + 200, 144, 248, 148, 61, 33, 206, 170, 6, 100, 228, 22, 244, 79, 140, 153, + 3, 155, 41, 217, 144, 240, 140, 61, 97, 126, 236, 45, 153, 212, 78, 173, + 238, 234, 21, 38, 4, 13, 49, 101, 118, 199, 185, 86, 123, 231, 230, 186, + 175, 151, 140, 123, 3, 210, 14, 105, 79, 228, 67, 187, 173, 6, 70, 186, 43, + 136, 110, 63, 194, 43, 28, 222, 117, 9, 75, 133, 107, 81, 235, 105, 139, + 136, 194, 20, 63, 148, 221, 65, 213, 131, 216, 203, 11, 29, 211, 8, 41, 53, + 184, 225, 2, 253, 171, 247, 242, 164, 21, 132, 222, 106, 215, 58, 116, 234, + 80, 89, 252, 252, 52, 206, 159, 246, 87, 145, 102, 88, 224, 30, 107, 227, + 2, 104, 110, 2, 163, 82, 171, 85, 8, 135, 240, 171, 53, 245, 8, 134, 108, + 4, 176, 99, 236, 88, 130, 194, 201, 166, 231, 251, 142, 19, 152, 77, 111, + 61, 67, 212, 44, 68, 30, 33, 239, 246, 82, 95, 88, 183, 175, 78, 141, 45, + 179, 95, 173, 191, 136, 246, 25, 114, 29, 175, 244, 74, 212, 125, 228, 9, + 166, 37, 89, 224, 170, 100, 118, 203, 33, 186, 221, 91, 223, 87, 228, 237, + 178, 167, 238, 177, 172, 66, 240, 71, 188, 46, 95, 255, 125, 251, 161, 78, + 168, 193, 174, 225, 18, 220, 75, 147, 156, 102, 133, 204, 205, 130, 18, + 242, 113, 172, 26, 108, 106, 17, 162, 241, 187, 178, 211, 218, 174, 136, + 194, 202, 62, 124, 3, 35, 141, 252, 96, 127, 240, 244, 225, 253, 222, 88, + 46, 45, 234, 232, 155, 18, 226, 171, 200, 203, 163, 56, 3, 77, 135, 50, 28, + 229, 175, 124, 182, 2, 91, 28, 238, 131, 167, 82, 51, 76, 132, 243, 122, + 243, 153, 88, 110, 41, 45, 24, 243, 144, 71, 125, 234, 115, 189, 236, 90, + 106, 19, 93, 156, 103, 37, 148, 111, 184, 17, 91, 226, 39, 156, 2, 179, + 205, 185, 161, 58, 113, 119, 86, 108, 74, 149, 17, 116, 201, 255, 6, 223, + 137, 196, 183, 88, 171, 139, 156, 97, 35, 94, 254, 182, 242, 180, 18, 84, + 4, 127, 11, 53, 215, 91, 35, 150, 8, 170, 250, 248, 189, 135, 129, 155, + 184, 236, 203, 162, 161, 94, 231, 19, 8, 12, 83, 168, 120, 79, 28, 159, + 204, 82, 41, 231, 16, 231, 8, 150, 24, 17, 84, 105, 61, 41, 96, 33, 38, + 236, 99, 130, 55, 2, 14, 18, 137, 145, 64, 141, 30, 8, 65, 99, 234, 197, + 231, 156, 145, 192, 215, 58, 189, 234, 101, 77, 111, 174, 151, 198, 179, + 178, 112, 14, 122, 74, 2, 255, 118, 129, 151, 26, 140, 141, 67, 203, 207, + 207, 31, 105, 48, 14, 230, 130, 93, 111, 76, 158, 224, 36, 151, 215, 219, + 220, 248, 13, 147, 196, 9, 218, 203, 102, 66, 125, 252, 116, 48, 197, 70, + 60, 187, 46, 54, 26, 189, 208, 237, 44, 179, 95, 55, 4, 167, 228, 175, 183, + 85, 254, 64, 53, 47, 4, 134, 176, 182, 71, 216, 249, 183, 171, 188, 0, 158, + 1, 20, 199, 10, 75, 180, 225, 48, 73, 207, 104, 219, 146, 193, 74, 252, + 248, 56, 153, 247, 56, 180, 220, 55, 213, 210, 73, 86, 193, 60, 89, 139, + 238, 5, 60, 61, 55, 26, 63, 118, 168, 226, 94, 128, 245, 54, 150, 66, 116, + 134, 177, 174, 3, 175, 84, 216, 8, 42, 65, 162, 196, 119, 113, 66, 52, 219, + 175, 230, 107, 173, 174, 96, 237, 139, 9, 39, 202, 147, 188, 84, 209, 194, + 5, 141, 243, 2, 105, 136, 43, 97, 68, 140, 9, 103, 86, 97, 181, 146, 93, + 203, 82, 225, 173, 213, 118, 152, 121, 194, 255, 61, 235, 46, 163, 221, + 138, 98, 120, 224, 67, 205, 193, 214, 183, 230, 83, 199, 142, 55, 89, 82, + 95, 245, 17, 3, 149, 227, 165, 12, 148, 50, 88, 37, 144, 202, 205, 141, 94, + 85, 227, 100, 9, 18, 78, 20, 189, 95, 244, 92, 205, 165, 11, 6, 252, 93, + 146, 88, 22, 166, 34, 133, 101, 171, 208, 6, 143, 106, 18, 171, 117, 14, + 87, 35, 47, 239, 133, 109, 142, 3, 108, 1, 127, 208, 90, 160, 56, 138, 81, + 126, 62, 229, 149, 213, 10, 103, 94, 24, 167, 216, 239, 85, 91, 19, 200, + 69, 3, 170, 233, 43, 133, 180, 164, 37, 218, 86, 177, 139, 54, 120, 103, + 247, 207, 141, 84, 136, 239, 25, 189, 138, 102, 35, 0, 186, 226, 91, 137, + 220, 253, 2, 80, 70, 174, 240, 67, 32, 5, 3, 219, 139, 216, 221, 246, 145, + 64, 39, 235, 113, 181, 98, 53, 84, 219, 122, 164, 209, 67, 184, 93, 32, 53, + 6, 2, 96, 36, 189, 113, 154, 82, 130, 201, 33, 126, 126, 118, 60, 63, 248, + 240, 35, 123, 37, 31, 187, 41, 8, 96, 193, 127, 167, 85, 253, 111, 135, 62, + 130, 17, 197, 220, 171, 254, 54, 255, 253, 195, 31, 144, 39, 231, 113, 232, + 0, 213, 221, 156, 7, 27, 219, 85, 191, 104, 221, 1, 103, 104, 207, 52, 130, + 100, 69, 177, 0, 57, 92, 226, 82, 249, 155, 129, 47, 79, 21, 115, 177, 142, + 7, 60, 224, 100, 106, 36, 96, 173, 24, 115, 45, 243, 140, 2, 240, 52, 226, + 73, 193, 182, 10, 152, 183, 167, 239, 18, 143, 187, 12, 201, 174, 243, 49, + 185, 208, 63, 132, 112, 128, 189, 156, 15, 179, 132, 122, 60, 2, 159, 39, + 3, 255, 17, 151, 247, 19, 76, 38, 220, 115, 132, 245, 169, 176, 249, 238, + 235, 219, 161, 27, 169, 85, 155, 243, 117, 218, 75, 10, 146, 247, 100, 254, + 215, 193, 155, 225, 29, 119, 115, 38, 95, 241, 148, 224, 151, 21, 208, 2, + 187, 11, 135, 17, 16, 90, 183, 93, 249, 195, 78, 154, 42, 151, 52, 57, 6, + 13, 233, 216, 137, 99, 225, 196, 53, 144, 28, 209, 228, 170, 99, 122, 22, + 4, 206, 100, 87, 108, 16, 192, 64, 179, 159, 229, 231, 59, 79, 252, 109, + 125, 48, 62, 62, 157, 108, 184, 76, 228, 137, 179, 183, 47, 202, 174, 96, + 131, 215, 125, 17, 195, 25, 222, 222, 207, 217, 208, 60, 175, 2, 27, 138, + 0, 8, 207, 249, 186, 139, 17, 183, 176, 61, 248, 22, 251, 170, 131, 172, + 71, 18, 134, 133, 250, 119, 237, 57, 164, 121, 175, 76, 48, 225, 3, 59, + 150, 22, 50, 126, 101, 20, 244, 156, 58, 229, 38, 226, 10, 181, 238, 155, + 67, 141, 131, 56, 134, 89, 33, 248, 37, 210, 110, 235, 14, 169, 241, 136, + 25, 156, 224, 123, 15, 1, 47, 29, 228, 213, 25, 208, 188, 168, 64, 59, 166, + 96, 179, 199, 24, 144, 140, 14, 11, 10, 124, 133, 136, 136, 176, 47, 162, + 204, 189, 118, 31, 72, 22, 193, 237, 221, 39, 95, 15, 159, 160, 30, 55, 27, + 198, 31, 78, 195, 58, 202, 217, 197, 43, 154, 96, 138, 195, 122, 110, 189, + 223, 168, 235, 78, 185, 23, 189, 11, 16, 156, 103, 96, 119, 232, 42, 166, + 165, 72, 209, 72, 77, 227, 181, 196, 49, 188, 77, 73, 25, 2, 4, 4, 154, + 224, 146, 12, 92, 39, 133, 185, 111, 15, 94, 11, 100, 32, 228, 146, 66, 19, + 7, 231, 128, 91, 14, 28, 11, 211, 171, 252, 175, 146, 2, 185, 6, 156, 220, + 158, 103, 111, 111, 94, 103, 203, 251, 118, 109, 239, 68, 39, 246, 214, 74, + 249, 17, 202, 189, 255, 14, 186, 41, 141, 10, 70, 236, 232, 50, 38, 93, 78, + 23, 39, 186, 175, 122, 73, 22, 62, 91, 90, 50, 113, 113, 220, 209, 54, 249, + 196, 18, 74, 117, 220, 78, 121, 230, 217, 35, 164, 101, 213, 43, 133, 170, + 91, 43, 116, 45, 212, 251, 48, 217, 215, 45, 139, 163, 203, 199, 112, 199, + 166, 146, 164, 74, 102, 53, 130, 140, 83, 214, 66, 28, 153, 142, 187, 62, + 234, 235, 31, 242, 28, 159, 172, 115, 98, 155, 21, 197, 81, 230, 231, 57, + 130, 167, 20, 128, 168, 61, 83, 152, 195, 88, 3, 138, 102, 248, 167, 60, + 147, 221, 166, 129, 90, 132, 132, 41, 120, 241, 156, 252, 182, 7, 229, 77, + 193, 137, 45, 253, 20, 239, 210, 172, 115, 1, 149, 2, 96, 255, 140, 199, + 202, 14, 113, 83, 122, 97, 68, 205, 32, 199, 123, 136, 186, 228, 184, 126, + 169, 73, 67, 61, 96, 21, 241, 248, 236, 27, 52, 4, 7, 88, 76, 49, 72, 36, + 251, 251, 113, 165, 99, 167, 237, 238, 34, 30, 214, 55, 160, 181, 197, 56, + 59, 34, 103, 102, 186, 77, 10, 179, 170, 148, 194, 179, 241, 164, 245, 26, + 146, 97, 228, 98, 41, 62, 74, 243, 121, 241, 152, 33, 82, 102, 149, 139, + 49, 19, 122, 193, 246, 163, 229, 189, 162, 32, 184, 251, 205, 170, 23, 250, + 16, 160, 42, 25, 167, 97, 65, 28, 149, 4, 41, 55, 229, 143, 247, 124, 112, + 48, 120, 184, 97, 221, 141, 189, 165, 128, 3, 243, 207, 127, 243, 28, 113, + 18, 45, 249, 161, 44, 54, 172, 57, 223, 211, 10, 96, 3, 47, 22, 11, 28, + 217, 90, 61, 132, 190, 212, 21, 28, 137, 2, 108, 33, 92, 8, 87, 188, 36, 3, + 243, 90, 92, 59, 172, 168, 86, 213, 6, 80, 220, 194, 176, 34, 110, 167, + 189, 192, 205, 147, 82, 222, 210, 241, 252, 176, 41, 182, 136, 143, 64, + 236, 99, 255, 239, 135, 17, 183, 3, 20, 145, 170, 50, 134, 219, 87, 26, + 224, 136, 43, 236, 127, 39, 205, 171, 57, 180, 102, 153, 71, 81, 19, 38, + 86, 241, 222, 150, 252, 91, 22, 108, 77, 140, 90, 212, 87, 241, 186, 212, + 182, 54, 210, 223, 84, 182, 182, 148, 74, 198, 174, 141, 119, 72, 111, 152, + 223, 193, 96, 242, 159, 64, 141, 207, 215, 221, 181, 60, 182, 69, 108, 136, + 200, 167, 69, 40, 184, 150, 19, 40, 212, 3, 184, 59, 234, 214, 68, 66, 11, + 223, 136, 61, 174, 129, 28, 48, 221, 47, 125, 207, 7, 99, 191, 116, 143, + 235, 105, 92, 245, 27, 95, 146, 242, 181, 2, 177, 48, 195, 29, 237, 14, 99, + 40, 222, 90, 223, 62, 28, 22, 149, 69, 210, 6, 32, 45, 224, 15, 29, 134, + 102, 30, 157, 60, 182, 88, 39, 82, 69, 236, 4, 120, 191, 195, 66, 26, 158, + 12, 139, 187, 83, 114, 218, 13, 65, 12, 108, 132, 32, 162, 221, 70, 0, 35, + 69, 164, 210, 108, 127, 255, 79, 156, 179, 157, 32, 142, 235, 92, 37, 51, + 133, 217, 236, 216, 173, 108, 59, 136, 67, 8, 50, 2, 142, 61, 3, 182, 47, + 81, 212, 162, 32, 149, 212, 33, 76, 118, 129, 80, 193, 155, 137, 208, 253, + 28, 87, 134, 226, 59, 82, 207, 200, 213, 34, 143, 22, 255, 126, 217, 241, + 38, 193, 46, 29, 104, 3, 88, 100, 208, 7, 114, 155, 43, 160, 180, 254, 201, + 36, 83, 254, 106, 206, 234, 127, 154, 240, 200, 36, 98, 195, 88, 193, 167, + 181, 169, 35, 84, 48, 3, 127, 144, 78, 165, 1, 218, 18, 52, 139, 157, 138, + 19, 10, 197, 241, 111, 134, 61, 196, 2, 214, 130, 120, 246, 119, 129, 45, + 11, 100, 0, 239, 227, 46, 156, 20, 135, 201, 159, 48, 48, 198, 15, 44, 59, + 237, 5, 49, 85, 238, 206, 179, 208, 233, 193, 151, 92, 22, 99, 209, 20, + 161, 210, 28, 73, 247, 154, 121, 78, 114, 12, 233, 88, 128, 236, 244, 230, + 153, 129, 218, 15, 106, 247, 43, 5, 245, 126, 113, 235, 196, 114, 4, 59, + 70, 47, 203, 92, 229, 238, 132, 207, 250, 14, 28, 211, 232, 64, 218, 206, + 158, 44, 186, 210, 38, 147, 1, 71, 130, 188, 0, 179, 129, 97, 208, 127, + 147, 181, 121, 39, 3, 131, 101, 131, 55, 87, 237, 91, 22, 12, 69, 150, 243, + 43, 179, 220, 133, 209, 223, 58, 200, 220, 43, 59, 19, 255, 200, 235, 192, + 169, 112, 87, 0, 2, 169, 50, 86, 16, 107, 13, 254, 105, 160, 141, 104, 220, + 75, 141, 159, 73, 148, 175, 222, 228, 50, 64, 155, 47, 111, 226, 36, 61, + 47, 246, 80, 108, 221, 68, 191, 82, 141, 161, 177, 69, 112, 40, 11, 55, + 196, 56, 83, 6, 42, 48, 241, 65, 155, 151, 107, 54, 71, 229, 49, 186, 93, + 241, 63, 59, 114, 96, 235, 99, 193, 166, 13, 101, 150, 21, 131, 59, 142, + 22, 150, 97, 112, 251, 193, 147, 115, 82, 212, 254, 232, 106, 25, 128, 213, + 122, 84, 203, 253, 164, 5, 246, 246, 19, 152, 57, 168, 236, 132, 19, 71, + 168, 240, 201, 188, 30, 250, 123, 0, 238, 98, 214, 189, 56, 248, 38, 229, + 87, 105, 74, 2, 162, 178, 216, 92, 72, 17, 249, 95, 121, 244, 52, 87, 133, + 198, 30, 41, 16, 191, 84, 137, 160, 83, 179, 47, 31, 157, 195, 76, 121, + 155, 118, 203, 3, 156, 214, 171, 235, 184, 45, 229, 97, 26, 190, 238, 3, + 61, 169, 164, 47, 14, 147, 90, 175, 74, 96, 73, 77, 29, 31, 155, 42, 145, + 70, 58, 147, 43, 13, 126, 111, 41, 38, 221, 233, 84, 170, 170, 230, 245, + 12, 237, 151, 75, 191, 197, 224, 222, 123, 94, 141, 170, 119, 214, 24, 73, + 169, 151, 81, 171, 42, 187, 216, 233, 170, 67, 5, 4, 76, 119, 195, 180, + 184, 175, 30, 34, 21, 34, 160, 143, 139, 1, 58, 193, 70, 150, 179, 11, 54, + 103, 230, 205, 164, 2, 211, 38, 53, 235, 117, 253, 55, 57, 118, 91, 25, + 161, 146, 164, 236, 179, 32, 66, 36, 86, 161, 228, 210, 89, 202, 1, 85, 91, + 41, 2, 55, 230, 49, 73, 183, 248, 124, 58, 175, 131, 69, 253, 170, 146, + 210, 57, 251, 211, 196, 174, 35, 157, 96, 75, 26, 89, 169, 14, 72, 235, 25, + 55, 2, 149, 251, 180, 183, 200, 56, 233, 218, 117, 9, 68, 199, 54, 183, 5, + 197, 73, 134, 66, 181, 92, 95, 145, 144, 199, 234, 182, 133, 226, 46, 219, + 84, 172, 153, 77, 217, 138, 178, 157, 235, 156, 190, 140, 189, 207, 37, + 152, 117, 63, 175, 140, 201, 70, 35, 196, 75, 30, 119, 160, 149, 77, 195, + 118, 148, 235, 238, 83, 44, 63, 34, 12, 164, 125, 34, 213, 16, 102, 175, + 231, 253, 167, 33, 177, 70, 149, 223, 118, 235, 189, 175, 88, 27, 213, 42, + 37, 27, 139, 71, 6, 160, 214, 34, 194, 40, 53, 188, 44, 14, 68, 107, 80, + 216, 181, 117, 126, 109, 147, 92, 28, 207, 84, 124, 196, 180, 131, 78, 125, + 224, 3, 99, 149, 79, 245, 237, 15, 157, 199, 231, 71, 212, 237, 203, 137, + 153, 71, 161, 241, 154, 47, 46, 63, 202, 90, 202, 246, 87, 197, 13, 218, + 213, 127, 2, 127, 57, 191, 106, 22, 32, 84, 93, 233, 39, 231, 172, 117, + 191, 221, 55, 134, 93, 118, 82, 95, 117, 27, 180, 241, 43, 172, 15, 146, + 35, 96, 224, 175, 160, 56, 10, 3, 134, 55, 254, 201, 159, 49, 65, 237, 160, + 121, 118, 105, 46, 32, 27, 6, 228, 110, 63, 254, 133, 25, 24, 209, 162, + 166, 46, 90, 22, 28, 214, 63, 111, 25, 54, 54, 127, 94, 250, 196, 14, 136, + 102, 3, 225, 184, 197, 226, 53, 113, 43, 83, 94, 3, 111, 188, 170, 248, 16, + 186, 9, 152, 130, 51, 34, 60, 160, 55, 230, 2, 188, 118, 66, 147, 220, 138, + 31, 224, 251, 52, 224, 219, 193, 187, 150, 84, 108, 129, 224, 6, 206, 3, + 163, 15, 107, 44, 149, 151, 255, 215, 42, 30, 80, 34, 64, 135, 220, 172, + 58, 73, 255, 183, 194, 146, 91, 182, 154, 0, 123, 152, 115, 98, 39, 24, 2, + 219, 167, 33, 215, 119, 226, 113, 13, 175, 243, 75, 35, 186, 219, 81, 193, + 157, 77, 144, 137, 93, 19, 197, 192, 141, 166, 6, 148, 131, 237, 181, 66, + 173, 55, 86, 158, 44, 253, 176, 20, 109, 164, 170, 16, 247, 20, 121, 245, + 105, 56, 182, 65, 228, 43, 96, 28, 42, 219, 73, 158, 69, 254, 178, 190, + 129, 245, 144, 111, 34, 114, 5, 24, 120, 148, 123, 149, 131, 138, 246, 29, + 111, 146, 225, 185, 242, 212, 246, 90, 143, 59, 65, 152, 72, 59, 146, 70, + 221, 239, 92, 254, 167, 19, 164, 122, 200, 195, 166, 207, 251, 108, 243, + 181, 200, 235, 71, 86, 226, 117, 121, 92, 201, 74, 156, 225, 140, 113, 17, + 163, 2, 232, 116, 10, 51, 230, 92, 2, 18, 146, 224, 197, 54, 179, 162, 133, + 0, 197, 7, 218, 189, 191, 170, 49, 206, 12, 247, 240, 6, 253, 177, 66, 67, + 3, 212, 143, 104, 25, 164, 91, 34, 50, 20, 13, 165, 240, 214, 0, 64, 252, + 183, 240, 74, 118, 185, 113, 113, 103, 169, 36, 34, 84, 192, 234, 7, 91, + 202, 254, 121, 99, 231, 13, 204, 131, 53, 17, 201, 131, 83, 205, 74, 43, + 129, 16, 82, 200, 0, 108, 107, 30, 150, 105, 224, 245, 221, 222, 209, 122, + 20, 214, 192, 17, 191, 120, 189, 114, 202, 121, 74, 238, 24, 28, 188, 8, + 199, 75, 130, 153, 215, 243, 83, 175, 195, 20, 156, 181, 78, 112, 84, 152, + 232, 126, 116, 191, 52, 173, 235, 238, 123, 197, 198, 78, 166, 142, 134, + 102, 141, 18, 145, 236, 42, 160, 37, 101, 139, 224, 40, 195, 177, 0, 155, + 7, 3, 12, 24, 215, 87, 215, 161, 169, 188, 224, 171, 5, 235, 55, 103, 144, + 250, 211, 156, 165, 75, 53, 42, 111, 163, 115, 124, 5, 177, 107, 199, 176, + 205, 3, 16, 143, 36, 132, 136, 52, 12, 109, 178, 238, 64, 201, 219, 11, 20, + 152, 164, 99, 65, 118, 98, 186, 53, 50, 103, 118, 83, 96, 21, 119, 68, 6, + 244, 192, 71, 182, 94, 177, 138, 118, 42, 255, 157, 103, 239, 38, 181, 238, + 201, 173, 77, 178, 19, 34, 22, 203, 56, 166, 205, 183, 120, 180, 187, 231, + 94, 253, 18, 231, 117, 90, 175, 103, 137, 192, 201, 13, 115, 71, 190, 105, + 49, 103, 134, 32, 191, 101, 190, 214, 187, 110, 86, 64, 254, 44, 176, 160, + 4, 250, 10, 165, 237, 185, 198, 181, 30, 52, 84, 53, 93, 14, 125, 81, 136, + 115, 96, 113, 36, 11, 51, 43, 183, 50, 65, 217, 231, 212, 200, 233, 2, 23, + 30, 93, 12, 207, 210, 225, 120, 126, 239, 55, 216, 130, 219, 124, 10, 27, + 160, 147, 94, 195, 81, 110, 187, 231, 63, 60, 137, 112, 32, 190, 237, 2, + 148, 237, 213, 57, 112, 66, 22, 64, 189, 10, 183, 128, 72, 127, 175, 60, + 197, 28, 46, 228, 110, 231, 181, 124, 123, 143, 110, 23, 48, 162, 217, 154, + 250, 152, 28, 4, 1, 141, 123, 125, 212, 22, 252, 253, 72, 196, 144, 92, + 118, 98, 59, 86, 73, 162, 29, 244, 91, 98, 80, 137, 201, 251, 43, 12, 158, + 219, 8, 141, 195, 113, 140, 93, 140, 183, 47, 106, 178, 8, 174, 43, 157, + 126, 124, 118, 128, 230, 98, 169, 201, 233, 253, 196, 149, 37, 134, 145, + 63, 203, 101, 131, 82, 57, 251, 247, 142, 38, 193, 183, 232, 243, 188, 246, + 221, 1, 23, 131, 74, 102, 199, 241, 159, 113, 126, 140, 195, 50, 37, 56, 3, + 205, 120, 17, 232, 168, 140, 70, 18, 237, 61, 135, 48, 126, 187, 222, 22, + 237, 66, 69, 165, 23, 43, 227, 173, 224, 82, 239, 138, 8, 74, 180, 36, 3, + 45, 113, 25, 173, 86, 7, 12, 105, 139, 153, 164, 251, 179, 139, 130, 186, + 23, 116, 221, 80, 231, 53, 202, 40, 56, 65, 121, 193, 238, 32, 95, 134, + 211, 19, 75, 222, 3, 116, 167, 51, 138, 199, 129, 136, 155, 180, 234, 163, + 98, 82, 83, 152, 105, 152, 249, 55, 101, 222, 202, 192, 164, 15, 250, 172, + 45, 46, 14, 206, 123, 246, 111, 164, 231, 81, 106, 219, 224, 241, 96, 233, + 196, 230, 81, 132, 21, 74, 100, 27, 140, 138, 243, 63, 177, 171, 58, 215, + 153, 67, 165, 95, 101, 68, 164, 161, 38, 245, 173, 149, 152, 69, 131, 30, + 128, 48, 0, 8, 173, 130, 147, 164, 71, 206, 88, 83, 3, 131, 241, 202, 3, + 183, 141, 162, 206, 42, 78, 181, 47, 253, 81, 80, 159, 225, 44, 83, 160, + 190, 115, 112, 244, 194, 78, 157, 149, 224, 122, 52, 173, 40, 160, 93, 13, + 2, 87, 237, 28, 63, 238, 189, 94, 215, 201, 116, 92, 71, 38, 193, 1, 198, + 43, 195, 228, 79, 34, 243, 225, 110, 187, 129, 25, 26, 76, 245, 17, 33, + 127, 90, 31, 65, 181, 78, 192, 173, 91, 156, 87, 94, 132, 86, 199, 50, 239, + 210, 165, 232, 153, 58, 243, 123, 52, 163, 60, 18, 203, 50, 65, 152, 219, + 146, 89, 240, 70, 102, 37, 138, 52, 120, 67, 127, 240, 173, 14, 134, 4, 31, + 238, 149, 199, 158, 49, 188, 67, 252, 88, 196, 186, 64, 6, 80, 180, 6, 77, + 92, 82, 232, 111, 183, 134, 149, 128, 203, 238, 35, 162, 75, 135, 142, 30, + 193, 132, 132, 49, 130, 157, 95, 104, 66, 195, 206, 169, 99, 3, 44, 61, + 182, 202, 64, 4, 159, 39, 67, 113, 30, 188, 253, 131, 142, 90, 100, 115, + 185, 174, 19, 195, 246, 92, 203, 45, 64, 128, 2, 83, 251, 189, 2, 62, 185, + 176, 48, 41, 244, 162, 10, 20, 81, 229, 128, 44, 253, 124, 41, 41, 98, 112, + 154, 228, 184, 172, 244, 184, 234, 230, 183, 148, 242, 243, 106, 252, 47, + 33, 68, 4, 191, 162, 44, 139, 29, 138, 188, 51, 2, 223, 185, 185, 27, 26, + 227, 28, 189, 96, 241, 213, 230, 64, 28, 187, 194, 204, 192, 49, 5, 77, + 201, 49, 162, 16, 47, 81, 194, 202, 61, 39, 168, 178, 122, 28, 208, 244, + 61, 134, 5, 197, 45, 136, 242, 19, 153, 119, 64, 42, 204, 21, 231, 101, 66, + 208, 151, 239, 146, 140, 81, 80, 42, 32, 41, 205, 137, 175, 41, 97, 162, + 17, 187, 220, 225, 93, 97, 41, 107, 16, 132, 118, 138, 3, 53, 163, 140, 41, + 222, 223, 240, 36, 92, 98, 103, 245, 194, 219, 171, 24, 197, 65, 115, 11, + 243, 90, 7, 33, 157, 159, 84, 127, 101, 63, 210, 239, 2, 188, 116, 130, + 188, 131, 140, 123, 115, 205, 204, 111, 168, 167, 130, 94, 52, 158, 5, 6, + 83, 240, 1, 192, 27, 47, 48, 102, 104, 0, 51, 83, 30, 57, 82, 85, 170, 0, + 9, 123, 127, 63, 249, 118, 232, 67, 127, 64, 20, 125, 203, 186, 189, 81, + 55, 64, 27, 27, 1, 22, 109, 123, 65, 180, 59, 186, 47, 74, 34, 222, 47, 75, + 224, 7, 76, 26, 63, 133, 106, 200, 91, 65, 168, 137, 18, 243, 130, 250, 76, + 37, 163, 96, 92, 47, 93, 255, 73, 119, 106, 208, 255, 67, 74, 71, 74, 215, + 153, 136, 229, 246, 47, 31, 147, 128, 48, 72, 252, 5, 250, 216, 146, 144, + 94, 230, 17, 136, 253, 207, 54, 2, 125, 154, 15, 126, 170, 99, 219, 15, 45, + 241, 186, 42, 209, 184, 198, 233, 27, 141, 0, 107, 19, 181, 175, 213, 202, + 141, 205, 5, 56, 185, 247, 250, 3, 48, 129, 198, 138, 234, 83, 78, 182, + 116, 6, 84, 21, 193, 225, 185, 85, 24, 251, 74, 0, 15, 43, 110, 149, 34, + 40, 132, 223, 191, 251, 158, 129, 29, 13, 22, 35, 86, 143, 177, 250, 7, 89, + 31, 254, 98, 223, 0, 48, 212, 107, 160, 245, 63, 86, 246, 145, 208, 86, + 228, 33, 10, 243, 91, 118, 55, 167, 216, 69, 117, 70, 71, 214, 26, 190, 55, + 43, 138, 168, 203, 123, 3, 185, 91, 218, 197, 150, 110, 187, 77, 47, 250, + 119, 225, 6, 214, 102, 110, 188, 199, 218, 142, 253, 235, 221, 149, 190, + 119, 99, 104, 26, 139, 215, 231, 162, 216, 245, 213, 219, 240, 161, 63, + 141, 173, 19, 4, 169, 148, 244, 2, 97, 6, 52, 28, 159, 80, 243, 93, 57, + 130, 24, 146, 227, 102, 176, 232, 185, 202, 132, 253, 127, 108, 213, 128, + 194, 73, 238, 125, 217, 222, 202, 126, 2, 146, 76, 244, 204, 147, 174, 55, + 192, 205, 240, 176, 14, 76, 127, 205, 198, 64, 173, 77, 255, 107, 186, 124, + 178, 39, 232, 245, 216, 97, 192, 36, 58, 87, 186, 103, 200, 87, 210, 132, + 146, 74, 104, 194, 123, 32, 191, 84, 46, 63, 30, 119, 202, 66, 136, 206, + 92, 11, 214, 144, 104, 173, 6, 146, 109, 71, 254, 86, 211, 16, 158, 84, + 161, 90, 221, 208, 227, 166, 71, 190, 212, 96, 186, 39, 165, 203, 24, 109, + 9, 125, 69, 147, 55, 14, 187, 75, 67, 146, 210, 57, 91, 13, 247, 164, 133, + 64, 134, 227, 188, 91, 207, 141, 135, 255, 94, 254, 8, 214, 101, 66, 136, + 233, 11, 193, 236, 159, 204, 221, 238, 2, 253, 64, 178, 175, 151, 199, 42, + 52, 8, 217, 129, 74, 15, 141, 85, 108, 233, 157, 203, 164, 239, 65, 182, + 23, 23, 61, 218, 87, 84, 2, 81, 149, 2, 84, 164, 33, 145, 200, 32, 73, 172, + 159, 158, 128, 194, 229, 7, 40, 155, 209, 154, 147, 139, 170, 72, 176, 129, + 100, 142, 20, 168, 115, 22, 247, 185, 249, 45, 221, 50, 99, 5, 75, 203, + 159, 100, 100, 123, 188, 125, 239, 77, 255, 55, 15, 253, 13, 121, 110, 30, + 182, 212, 247, 241, 92, 94, 99, 77, 7, 210, 180, 37, 239, 180, 196, 125, + 236, 13, 109, 50, 50, 86, 214, 55, 72, 188, 40, 67, 234, 81, 80, 10, 89, + 18, 144, 174, 239, 42, 53, 197, 65, 57, 132, 10, 221, 114, 170, 219, 45, + 165, 26, 148, 165, 11, 21, 151, 91, 220, 13, 209, 172, 14, 68, 55, 232, + 177, 229, 114, 15, 206, 255, 196, 2, 236, 195, 166, 244, 212, 95, 184, 166, + 89, 185, 72, 47, 62, 65, 137, 13, 142, 63, 62, 116, 31, 160, 122, 110, 223, + 205, 116, 225, 101, 71, 27, 247, 3, 68, 46, 147, 195, 1, 27, 124, 195, 164, + 85, 158, 122, 54, 98, 210, 153, 188, 12, 120, 161, 157, 13, 19, 42, 41, + 120, 173, 206, 180, 193, 178, 217, 48, 198, 23, 80, 34, 229, 93, 177, 15, + 34, 112, 43, 63, 200, 254, 157, 129, 132, 46, 192, 231, 209, 137, 171, 154, + 175, 130, 149, 252, 27, 44, 178, 36, 224, 224, 86, 194, 104, 30, 63, 77, + 135, 77, 233, 224, 98, 76, 91, 59, 206, 133, 202, 212, 255, 226, 76, 150, + 229, 88, 156, 91, 243, 19, 41, 252, 51, 117, 181, 78, 32, 35, 103, 193, 50, + 69, 9, 118, 37, 164, 174, 212, 7, 113, 29, 30, 55, 206, 16, 22, 78, 124, + 119, 159, 79, 184, 255, 2, 151, 165, 54, 161, 6, 238, 85, 200, 233, 199, + 59, 115, 26, 55, 127, 20, 89, 171, 255, 19, 16, 96, 143, 2, 185, 133, 217, + 149, 10, 37, 188, 180, 3, 188, 115, 49, 176, 182, 203, 254, 79, 1, 36, 178, + 59, 211, 209, 180, 83, 251, 239, 196, 254, 142, 60, 138, 169, 56, 18, 86, + 236, 42, 80, 72, 154, 114, 212, 226, 58, 254, 203, 107, 146, 12, 36, 40, + 217, 3, 199, 124, 89, 116, 142, 4, 2, 225, 239, 6, 89, 123, 44, 249, 245, + 47, 229, 121, 43, 187, 236, 152, 162, 9, 42, 242, 162, 196, 112, 213, 63, + 132, 93, 243, 60, 29, 220, 99, 155, 164, 232, 110, 18, 180, 175, 220, 99, + 176, 181, 159, 56, 77, 8, 90, 133, 20, 212, 170, 18, 124, 109, 33, 201, + 133, 56, 255, 202, 222, 193, 62, 243, 233, 71, 218, 119, 157, 32, 166, 161, + 165, 106, 242, 163, 2, 211, 199, 180, 135, 21, 64, 133, 133, 87, 12, 252, + 136, 67, 28, 42, 11, 190, 71, 50, 213, 13, 234, 89, 55, 63, 244, 73, 80, + 12, 17, 236, 183, 2, 131, 0, 124, 150, 134, 248, 209, 15, 221, 26, 178, 42, + 215, 177, 143, 86, 19, 67, 128, 191, 135, 171, 110, 233, 64, 113, 198, 115, + 43, 92, 38, 203, 162, 50, 191, 59, 230, 187, 77, 8, 216, 167, 198, 149, + 104, 61, 82, 249, 22, 102, 10, 199, 96, 106, 61, 133, 215, 134, 52, 128, + 146, 63, 84, 206, 227, 213, 103, 57, 1, 14, 192, 103, 81, 251, 27, 155, + 173, 186, 6, 45, 12, 236, 8, 188, 227, 13, 71, 79, 172, 252, 86, 254, 9, + 89, 5, 136, 58, 178, 124, 56, 204, 118, 26, 217, 145, 72, 110, 163, 79, + 241, 135, 77, 3, 183, 15, 95, 38, 142, 197, 93, 195, 146, 245, 117, 42, + 104, 205, 210, 2, 80, 188, 125, 114, 134, 48, 12, 244, 91, 173, 150, 170, + 244, 180, 208, 215, 116, 205, 127, 183, 175, 25, 89, 47, 168, 180, 35, 16, + 145, 222, 71, 167, 2, 180, 139, 17, 204, 195, 220, 229, 37, 97, 126, 152, + 25, 128, 152, 123, 0, 143, 113, 69, 34, 83, 228, 45, 112, 26, 98, 186, 110, + 131, 156, 45, 206, 179, 110, 12, 49, 127, 247, 202, 200, 209, 91, 3, 195, + 239, 66, 147, 87, 254, 180, 103, 208, 70, 89, 253, 71, 221, 200, 121, 211, + 3, 180, 4, 186, 24, 89, 58, 27, 192, 26, 108, 25, 195, 106, 69, 239, 32, + 130, 127, 187, 127, 26, 107, 82, 117, 35, 50, 118, 11, 39, 85, 49, 14, 151, + 123, 144, 234, 45, 71, 196, 37, 179, 232, 156, 229, 53, 47, 128, 20, 4, + 139, 132, 68, 142, 225, 251, 58, 155, 36, 29, 173, 194, 254, 26, 199, 140, + 46, 122, 2, 230, 117, 112, 106, 101, 157, 97, 19, 151, 51, 37, 33, 235, 56, + 5, 157, 43, 210, 13, 154, 71, 65, 114, 178, 178, 246, 140, 206, 96, 199, + 114, 85, 3, 133, 242, 37, 107, 159, 224, 241, 131, 101, 51, 211, 128, 95, + 192, 223, 112, 117, 126, 73, 149, 193, 14, 133, 170, 52, 215, 184, 84, 25, + 22, 23, 75, 41, 245, 227, 195, 197, 22, 44, 72, 185, 45, 175, 217, 192, + 136, 32, 131, 178, 40, 121, 10, 89, 241, 55, 58, 246, 177, 197, 238, 40, + 160, 210, 247, 75, 76, 13, 120, 252, 166, 131, 104, 50, 135, 120, 134, 204, + 117, 191, 51, 63, 190, 161, 48, 143, 66, 115, 216, 35, 46, 241, 68, 95, + 202, 118, 101, 238, 25, 247, 114, 141, 223, 87, 103, 139, 126, 164, 64, + 150, 177, 252, 16, 216, 98, 250, 0, 254, 229, 50, 71, 123, 16, 2, 125, 212, + 154, 143, 127, 2, 106, 24, 181, 215, 119, 124, 43, 48, 207, 35, 19, 123, + 71, 92, 145, 253, 247, 212, 105, 103, 5, 235, 91, 208, 213, 94, 69, 250, 2, + 187, 148, 90, 2, 241, 246, 82, 3, 64, 201, 110, 50, 167, 91, 153, 224, 213, + 71, 126, 180, 189, 189, 150, 156, 237, 7, 217, 224, 229, 215, 51, 206, 117, + 65, 105, 36, 108, 124, 240, 90, 0, 176, 193, 64, 202, 134, 7, 100, 123, 60, + 147, 2, 207, 139, 235, 207, 124, 225, 171, 109, 137, 59, 52, 176, 120, 242, + 80, 8, 235, 62, 88, 55, 243, 173, 131, 28, 204, 32, 213, 155, 203, 27, 144, + 229, 123, 112, 161, 63, 63, 173, 118, 160, 84, 31, 160, 1, 249, 242, 215, + 204, 99, 181, 183, 189, 12, 251, 134, 31, 146, 19, 148, 233, 56, 234, 151, + 186, 5, 106, 194, 156, 118, 124, 51, 207, 54, 230, 105, 158, 182, 123, 237, + 114, 2, 59, 210, 93, 188, 8, 123, 247, 224, 173, 148, 251, 22, 165, 4, 246, + 185, 144, 98, 136, 198, 188, 100, 6, 226, 147, 194, 0, 129, 155, 17, 5, + 177, 3, 189, 60, 190, 178, 238, 190, 26, 7, 84, 93, 96, 133, 36, 213, 220, + 236, 51, 120, 6, 245, 104, 20, 24, 36, 226, 31, 230, 102, 86, 11, 119, 154, + 152, 104, 212, 11, 128, 123, 193, 239, 17, 30, 63, 88, 235, 1, 79, 190, 54, + 68, 118, 199, 220, 156, 36, 107, 113, 43, 183, 119, 67, 249, 195, 69, 29, + 39, 95, 21, 201, 76, 202, 43, 171, 140, 93, 13, 156, 93, 70, 238, 112, 215, + 30, 175, 41, 134, 23, 45, 90, 2, 29, 69, 157, 212, 88, 138, 6, 54, 2, 39, + 132, 50, 139, 243, 98, 68, 172, 91, 24, 115, 64, 64, 195, 193, 173, 156, + 25, 117, 33, 253, 202, 174, 219, 225, 29, 190, 96, 233, 3, 86, 96, 77, 122, + 18, 63, 98, 30, 108, 113, 224, 86, 180, 116, 135, 145, 217, 90, 224, 2, 68, + 174, 15, 90, 119, 252, 99, 13, 72, 72, 74, 16, 2, 167, 94, 138, 165, 16, + 164, 144, 77, 39, 89, 119, 136, 65, 209, 61, 184, 212, 81, 103, 13, 199, + 192, 77, 196, 222, 62, 120, 133, 193, 87, 39, 128, 120, 100, 84, 156, 168, + 21, 169, 172, 204, 153, 138, 49, 189, 122, 182, 228, 94, 62, 79, 151, 81, + 50, 225, 195, 167, 231, 46, 61, 172, 57, 232, 216, 58, 248, 45, 95, 210, + 58, 2, 6, 50, 213, 229, 24, 79, 173, 144, 113, 9, 233, 67, 248, 12, 155, + 233, 197, 80, 61, 255, 30, 194, 92, 22, 45, 175, 146, 223, 197, 16, 169, + 172, 190, 92, 181, 20, 110, 64, 131, 235, 165, 98, 51, 21, 36, 117, 95, + 183, 122, 2, 182, 59, 212, 186, 100, 32, 16, 3, 231, 112, 111, 135, 159, + 124, 20, 63, 24, 52, 229, 52, 56, 186, 160, 135, 251, 51, 174, 45, 235, + 176, 164, 139, 133, 107, 59, 180, 245, 55, 170, 202, 3, 251, 97, 158, 36, + 237, 144, 202, 233, 187, 145, 108, 22, 140, 190, 241, 247, 114, 150, 162, + 177, 80, 149, 189, 234, 36, 107, 243, 95, 86, 33, 181, 7, 88, 4, 81, 16, + 55, 131, 19, 206, 212, 90, 13, 44, 35, 34, 13, 250, 173, 37, 107, 126, 178, + 118, 143, 203, 213, 172, 168, 192, 18, 149, 169, 157, 242, 97, 231, 107, + 124, 21, 231, 88, 71, 53, 110, 33, 60, 23, 179, 4, 141, 213, 146, 16, 111, + 255, 179, 34, 96, 211, 195, 188, 207, 1, 87, 116, 65, 140, 199, 17, 236, + 51, 107, 55, 173, 67, 75, 120, 202, 179, 61, 138, 247, 56, 195, 108, 206, + 142, 6, 81, 166, 48, 28, 101, 127, 57, 24, 236, 3, 170, 220, 24, 1, 136, + 159, 152, 85, 180, 207, 12, 14, 37, 198, 202, 144, 189, 76, 68, 47, 252, + 51, 17, 189, 10, 73, 86, 199, 105, 47, 101, 15, 2, 13, 99, 27, 132, 33, 85, + 0, 74, 211, 4, 145, 22, 146, 20, 112, 79, 224, 112, 244, 16, 107, 177, 50, + 151, 108, 119, 67, 3, 47, 217, 210, 210, 31, 106, 229, 43, 53, 172, 231, 7, + 137, 78, 67, 89, 221, 174, 200, 48, 191, 246, 122, 116, 195, 94, 35, 76, + 44, 217, 98, 72, 255, 75, 47, 109, 187, 127, 26, 221, 65, 77, 100, 85, 253, + 194, 98, 76, 54, 186, 25, 101, 35, 209, 222, 111, 96, 67, 214, 58, 133, 76, + 134, 66, 161, 198, 137, 39, 234, 230, 171, 13, 97, 122, 46, 71, 168, 7, 2, + 221, 42, 131, 119, 50, 212, 209, 16, 40, 141, 72, 110, 30, 38, 248, 207, + 170, 182, 75, 31, 53, 2, 176, 171, 126, 149, 231, 99, 212, 44, 98, 221, + 133, 116, 69, 214, 202, 13, 6, 7, 87, 50, 146, 209, 143, 39, 207, 232, 180, + 49, 226, 17, 18, 137, 3, 75, 141, 216, 19, 141, 212, 84, 132, 41, 70, 88, + 49, 75, 103, 37, 3, 150, 174, 228, 95, 116, 194, 169, 132, 78, 149, 219, + 97, 57, 172, 252, 1, 106, 253, 41, 151, 132, 100, 245, 233, 32, 59, 210, + 233, 6, 117, 214, 218, 25, 106, 20, 201, 60, 83, 239, 207, 78, 114, 244, + 59, 145, 90, 130, 47, 137, 221, 222, 88, 34, 74, 222, 250, 124, 203, 210, + 56, 25, 215, 121, 207, 170, 62, 129, 163, 61, 166, 57, 204, 79, 104, 232, + 169, 126, 247, 6, 243, 64, 16, 131, 184, 182, 243, 244, 194, 181, 135, 137, + 1, 11, 178, 247, 248, 247, 74, 163, 70, 136, 39, 30, 112, 86, 204, 148, + 162, 167, 143, 206, 25, 3, 53, 170, 62, 228, 6, 13, 204, 113, 152, 70, 157, + 165, 45, 187, 62, 101, 17, 8, 170, 174, 32, 144, 117, 117, 87, 103, 50, + 109, 178, 182, 27, 147, 3, 109, 89, 16, 174, 194, 45, 122, 128, 160, 66, + 165, 251, 254, 146, 119, 225, 159, 191, 61, 68, 60, 240, 9, 175, 239, 13, + 129, 217, 27, 110, 65, 213, 97, 158, 116, 172, 100, 246, 249, 234, 89, 67, + 115, 192, 197, 126, 138, 11, 100, 243, 79, 76, 190, 195, 160, 160, 195, 14, + 253, 169, 89, 138, 4, 238, 35, 151, 195, 81, 102, 132, 253, 158, 63, 110, + 190, 77, 140, 128, 37, 85, 137, 210, 156, 198, 223, 170, 46, 180, 15, 59, + 161, 9, 188, 239, 86, 250, 205, 89, 116, 9, 31, 243, 165, 168, 143, 66, + 169, 211, 199, 38, 136, 214, 121, 24, 89, 233, 35, 255, 213, 71, 120, 32, + 189, 72, 218, 189, 1, 96, 3, 93, 219, 192, 224, 14, 83, 127, 226, 219, 226, + 6, 159, 151, 196, 127, 205, 236, 197, 16, 60, 245, 31, 18, 93, 97, 177, + 211, 125, 82, 54, 212, 61, 3, 242, 178, 38, 99, 1, 72, 166, 94, 88, 243, + 238, 15, 109, 58, 135, 98, 146, 222, 103, 159, 109, 176, 85, 63, 71, 247, + 47, 228, 216, 147, 128, 47, 22, 147, 170, 173, 171, 123, 70, 88, 213, 173, + 180, 197, 118, 55, 203, 22, 138, 46, 76, 112, 35, 98, 94, 140, 135, 204, + 145, 97, 183, 33, 44, 27, 15, 35, 235, 186, 182, 19, 203, 217, 33, 153, + 171, 36, 185, 174, 58, 178, 29, 31, 32, 21, 213, 140, 250, 116, 121, 37, + 135, 190, 33, 212, 31, 131, 173, 236, 196, 94, 131, 1, 9, 65, 122, 236, 95, + 97, 40, 53, 111, 145, 254, 215, 113, 155, 196, 228, 125, 184, 85, 196, 64, + 95, 110, 218, 132, 73, 2, 226, 171, 5, 101, 229, 254, 51, 253, 64, 131, 56, + 147, 86, 157, 242, 240, 103, 63, 253, 9, 103, 179, 57, 92, 131, 8, 126, + 106, 54, 5, 69, 82, 2, 179, 200, 64, 245, 245, 176, 42, 241, 78, 251, 150, + 217, 180, 21, 187, 39, 30, 158, 82, 211, 99, 47, 243, 176, 177, 129, 129, + 182, 91, 71, 9, 134, 255, 64, 174, 52, 111, 184, 199, 178, 95, 26, 195, 28, + 255, 64, 218, 64, 34, 127, 3, 21, 62, 237, 175, 255, 169, 58, 115, 205, + 139, 87, 56, 31, 207, 129, 170, 164, 237, 58, 15, 0, 55, 209, 245, 34, 221, + 239, 136, 255, 209, 30, 198, 82, 27, 207, 118, 39, 162, 129, 243, 134, 206, + 10, 218, 237, 242, 236, 202, 74, 218, 248, 192, 116, 201, 118, 206, 221, + 63, 151, 216, 87, 13, 202, 10, 173, 120, 218, 233, 133, 111, 22, 250, 226, + 174, 213, 168, 21, 3, 210, 195, 27, 206, 137, 111, 99, 133, 196, 250, 90, + 18, 44, 123, 19, 178, 225, 177, 134, 100, 51, 226, 43, 19, 93, 50, 253, + 172, 77, 51, 71, 49, 3, 160, 58, 151, 31, 198, 129, 118, 138, 215, 226, + 107, 48, 182, 130, 225, 136, 21, 22, 23, 120, 234, 7, 89, 203, 58, 182, + 221, 88, 127, 213, 174, 232, 251, 182, 57, 156, 32, 70, 35, 44, 98, 203, + 106, 148, 6, 109, 94, 136, 198, 232, 186, 142, 241, 217, 96, 206, 29, 44, + 177, 89, 190, 70, 201, 37, 172, 157, 3, 8, 13, 229, 26, 5, 178, 12, 8, 5, + 126, 57, 189, 144, 228, 2, 39, 147, 241, 217, 219, 23, 63, 125, 189, 106, + 226, 3, 145, 10, 198, 76, 123, 3, 68, 239, 154, 204, 90, 222, 197, 61, 215, + 43, 7, 59, 0, 235, 80, 159, 66, 121, 66, 63, 13, 214, 30, 96, 147, 110, 55, + 79, 3, 219, 62, 100, 211, 205, 34, 48, 168, 196, 45, 70, 86, 25, 241, 31, + 12, 135, 249, 75, 26, 42, 160, 76, 82, 17, 87, 127, 247, 226, 107, 115, + 158, 2, 3, 181, 62, 87, 165, 131, 167, 178, 109, 90, 205, 185, 169, 216, 5, + 139, 136, 154, 154, 126, 74, 69, 11, 46, 142, 231, 183, 41, 161, 157, 86, + 145, 42, 127, 126, 76, 112, 44, 158, 206, 77, 47, 115, 204, 18, 150, 206, + 68, 57, 251, 20, 188, 135, 243, 2, 108, 97, 94, 5, 148, 251, 159, 229, 198, + 86, 197, 223, 200, 240, 245, 203, 198, 52, 158, 219, 78, 40, 2, 184, 11, + 136, 249, 49, 14, 146, 199, 129, 130, 210, 221, 195, 188, 35, 107, 251, + 127, 106, 205, 232, 144, 206, 210, 19, 27, 33, 75, 65, 106, 36, 240, 109, + 183, 6, 110, 218, 38, 121, 95, 58, 94, 32, 182, 91, 165, 135, 81, 12, 2, 3, + 87, 92, 25, 51, 39, 51, 231, 183, 34, 73, 208, 52, 81, 14, 186, 101, 211, + 137, 203, 48, 22, 54, 119, 177, 55, 170, 22, 234, 42, 170, 173, 228, 3, 67, + 3, 9, 94, 164, 163, 27, 183, 222, 121, 141, 29, 40, 72, 252, 96, 73, 133, + 247, 240, 95, 143, 57, 167, 91, 222, 223, 140, 87, 89, 165, 16, 225, 198, + 195, 189, 54, 117, 109, 182, 202, 218, 4, 236, 31, 232, 43, 62, 112, 214, + 49, 170, 45, 204, 5, 180, 105, 240, 119, 165, 59, 47, 199, 225, 111, 202, + 229, 44, 140, 56, 225, 92, 91, 38, 35, 203, 39, 109, 55, 187, 85, 85, 194, + 212, 101, 251, 128, 232, 167, 109, 69, 113, 4, 254, 74, 170, 58, 212, 190, + 52, 236, 105, 65, 95, 245, 169, 65, 124, 234, 77, 53, 169, 234, 90, 94, + 140, 26, 77, 196, 197, 115, 208, 7, 244, 46, 202, 116, 168, 3, 224, 36, + 216, 206, 135, 111, 74, 157, 66, 20, 9, 117, 154, 139, 129, 43, 75, 96, 96, + 186, 126, 217, 82, 130, 73, 239, 43, 81, 184, 147, 219, 14, 2, 198, 245, + 128, 42, 61, 252, 118, 187, 117, 77, 250, 117, 181, 84, 168, 107, 215, 64, + 137, 178, 247, 135, 91, 44, 9, 189, 0, 73, 80, 226, 83, 253, 130, 49, 198, + 25, 119, 248, 11, 232, 1, 198, 143, 160, 107, 192, 49, 36, 34, 195, 51, + 154, 231, 165, 51, 206, 162, 120, 141, 119, 153, 66, 190, 49, 114, 213, 14, + 18, 176, 108, 184, 122, 145, 252, 35, 250, 12, 200, 53, 43, 58, 26, 182, + 132, 159, 19, 111, 59, 222, 158, 96, 18, 78, 202, 229, 194, 11, 204, 148, + 42, 63, 112, 4, 48, 81, 179, 229, 187, 190, 202, 52, 1, 221, 205, 237, 37, + 155, 5, 187, 83, 252, 101, 118, 153, 68, 115, 225, 49, 2, 127, 68, 255, 18, + 45, 117, 85, 194, 86, 49, 114, 214, 222, 164, 210, 237, 181, 202, 240, 91, + 240, 21, 37, 209, 59, 117, 185, 160, 251, 39, 98, 205, 3, 122, 92, 233, + 243, 78, 210, 199, 119, 211, 90, 242, 21, 0, 221, 246, 41, 226, 90, 167, + 54, 72, 216, 174, 236, 141, 167, 43, 237, 87, 12, 174, 171, 191, 31, 174, + 74, 77, 113, 142, 5, 28, 102, 52, 187, 8, 167, 118, 84, 167, 12, 56, 244, + 16, 221, 145, 18, 12, 92, 227, 86, 13, 174, 88, 241, 146, 121, 123, 158, + 234, 63, 208, 76, 169, 67, 135, 242, 103, 28, 207, 116, 234, 197, 121, 37, + 26, 161, 185, 201, 149, 165, 77, 186, 4, 53, 107, 115, 105, 35, 51, 208, + 188, 144, 163, 178, 74, 154, 10, 20, 32, 190, 90, 109, 168, 151, 44, 221, + 47, 227, 53, 48, 130, 73, 159, 25, 157, 203, 79, 236, 2, 220, 159, 163, 70, + 36, 2, 36, 7, 67, 148, 22, 153, 84, 106, 13, 210, 43, 228, 79, 151, 118, + 84, 15, 217, 33, 182, 82, 39, 105, 78, 36, 218, 2, 208, 45, 91, 187, 18, + 63, 230, 200, 141, 77, 89, 60, 235, 235, 123, 51, 108, 207, 42, 74, 201, + 29, 233, 234, 86, 35, 225, 247, 106, 57, 174, 250, 3, 32, 228, 92, 219, + 183, 95, 170, 253, 255, 141, 93, 145, 2, 14, 90, 56, 93, 15, 139, 19, 233, + 225, 45, 115, 210, 176, 44, 79, 2, 137, 152, 32, 180, 180, 130, 148, 181, + 229, 254, 169, 67, 44, 178, 81, 142, 123, 34, 106, 114, 57, 107, 107, 63, + 30, 138, 140, 107, 124, 5, 196, 253, 99, 60, 220, 3, 55, 217, 133, 137, + 210, 75, 154, 196, 48, 123, 109, 156, 229, 38, 193, 213, 138, 95, 110, 13, + 153, 252, 40, 90, 255, 24, 232, 249, 60, 19, 2, 42, 114, 90, 4, 224, 224, + 52, 146, 44, 223, 79, 214, 255, 118, 180, 119, 252, 116, 84, 100, 236, 196, + 151, 141, 243, 4, 222, 54, 132, 90, 45, 159, 3, 164, 170, 41, 37, 99, 29, + 111, 92, 110, 247, 18, 239, 207, 245, 220, 52, 236, 101, 70, 58, 251, 73, + 140, 66, 7, 84, 184, 75, 63, 245, 19, 193, 159, 102, 26, 121, 152, 200, 78, + 203, 234, 22, 0, 84, 220, 118, 241, 186, 21, 19, 193, 108, 41, 194, 93, 76, + 220, 13, 57, 66, 199, 156, 189, 149, 59, 106, 209, 242, 53, 115, 55, 62, + 211, 117, 138, 130, 243, 47, 154, 33, 92, 219, 185, 7, 58, 116, 207, 73, + 163, 105, 87, 5, 61, 77, 95, 61, 158, 205, 144, 57, 190, 210, 13, 134, 234, + 144, 203, 77, 87, 6, 175, 230, 146, 9, 114, 207, 77, 141, 98, 224, 116, + 241, 166, 72, 71, 227, 13, 140, 2, 62, 207, 252, 15, 181, 153, 142, 244, + 251, 41, 90, 76, 31, 33, 101, 156, 61, 85, 115, 66, 77, 140, 89, 242, 84, + 57, 26, 219, 246, 27, 219, 174, 3, 49, 47, 233, 188, 22, 51, 95, 56, 253, + 55, 107, 151, 209, 94, 104, 217, 65, 163, 26, 232, 246, 99, 70, 105, 84, + 16, 252, 217, 65, 79, 120, 185, 24, 49, 166, 26, 174, 26, 5, 112, 19, 48, + 208, 28, 97, 223, 181, 38, 187, 94, 10, 252, 97, 83, 20, 218, 239, 178, + 164, 20, 216, 154, 70, 132, 91, 163, 133, 173, 60, 65, 12, 134, 166, 246, + 145, 158, 17, 55, 38, 156, 69, 253, 111, 162, 145, 249, 204, 162, 157, 56, + 240, 67, 23, 54, 78, 77, 174, 29, 192, 184, 224, 97, 18, 35, 143, 80, 216, + 151, 135, 28, 47, 220, 87, 70, 241, 50, 151, 79, 35, 213, 165, 51, 206, + 255, 250, 154, 98, 161, 3, 38, 165, 32, 90, 168, 252, 99, 165, 218, 5, 66, + 119, 39, 213, 252, 161, 237, 94, 36, 227, 150, 46, 178, 78, 55, 230, 180, + 127, 25, 70, 150, 113, 3, 225, 200, 130, 142, 221, 185, 75, 234, 85, 37, + 239, 118, 207, 99, 0, 180, 120, 82, 110, 179, 20, 202, 179, 189, 236, 89, + 212, 239, 236, 33, 35, 195, 83, 117, 113, 141, 170, 67, 129, 150, 94, 32, + 169, 66, 149, 7, 220, 37, 4, 3, 85, 27, 13, 30, 24, 234, 24, 104, 164, 185, + 54, 34, 48, 126, 255, 134, 183, 202, 149, 3, 247, 28, 252, 145, 36, 102, + 182, 232, 37, 129, 125, 132, 46, 158, 124, 131, 31, 166, 86, 28, 154, 210, + 127, 193, 58, 196, 38, 98, 165, 83, 73, 200, 111, 234, 255, 172, 134, 161, + 215, 127, 27, 78, 200, 217, 188, 143, 152, 196, 186, 118, 88, 204, 179, 16, + 162, 197, 17, 213, 2, 128, 177, 203, 53, 249, 119, 216, 146, 102, 56, 106, + 95, 249, 207, 128, 36, 196, 129, 159, 13, 13, 64, 33, 97, 133, 102, 35, + 101, 1, 36, 192, 207, 2, 168, 39, 27, 118, 218, 211, 3, 209, 199, 45, 165, + 160, 219, 98, 86, 112, 99, 236, 220, 17, 81, 210, 31, 51, 245, 34, 65, 207, + 32, 153, 64, 142, 202, 109, 103, 20, 245, 39, 37, 191, 94, 57, 45, 18, 194, + 34, 83, 19, 124, 166, 30, 238, 184, 170, 221, 149, 11, 130, 174, 225, 78, + 239, 186, 17, 32, 25, 244, 19, 135, 125, 83, 98, 75, 166, 172, 60, 1, 244, + 102, 163, 133, 176, 208, 171, 52, 231, 173, 0, 173, 185, 190, 251, 6, 54, + 21, 118, 65, 63, 201, 55, 68, 91, 203, 176, 18, 70, 119, 90, 229, 220, 195, + 49, 45, 197, 49, 172, 179, 196, 186, 41, 38, 234, 118, 214, 35, 9, 111, + 232, 2, 180, 86, 117, 22, 87, 167, 53, 40, 249, 97, 103, 127, 182, 131, + 203, 54, 2, 214, 88, 217, 208, 67, 80, 253, 182, 193, 6, 61, 186, 66, 123, + 109, 3, 31, 146, 156, 170, 252, 113, 44, 16, 5, 54, 172, 10, 255, 47, 197, + 159, 197, 129, 199, 159, 2, 103, 40, 31, 76, 99, 115, 163, 190, 19, 90, + 176, 80, 183, 210, 85, 54, 78, 46, 85, 26, 18, 78, 247, 98, 211, 118, 22, + 162, 201, 197, 70, 6, 217, 106, 111, 20, 28, 124, 130, 221, 107, 251, 210, + 64, 205, 196, 66, 195, 122, 145, 121, 175, 91, 212, 93, 123, 31, 38, 84, + 248, 159, 119, 68, 186, 183, 184, 239, 78, 105, 83, 33, 103, 163, 49, 140, + 163, 133, 158, 207, 177, 116, 152, 132, 211, 202, 23, 221, 62, 136, 188, + 165, 192, 251, 30, 0, 190, 56, 214, 35, 127, 110, 206, 1, 30, 122, 11, 186, + 2, 107, 160, 53, 211, 239, 58, 95, 99, 129, 163, 200, 15, 68, 199, 212, 97, + 0, 230, 87, 84, 180, 22, 136, 218, 159, 131, 73, 201, 70, 133, 21, 61, 3, + 239, 65, 72, 158, 123, 4, 222, 223, 23, 15, 54, 68, 128, 116, 187, 173, + 189, 19, 35, 88, 98, 230, 52, 253, 110, 62, 144, 211, 13, 204, 167, 34, + 135, 253, 234, 127, 105, 236, 115, 111, 97, 199, 166, 119, 161, 179, 174, + 217, 229, 184, 176, 108, 199, 134, 137, 138, 18, 80, 97, 243, 227, 166, 72, + 116, 149, 212, 255, 140, 23, 178, 118, 240, 162, 176, 190, 177, 185, 32, + 195, 166, 99, 246, 45, 81, 36, 133, 56, 38, 55, 219, 217, 38, 144, 107, 82, + 40, 90, 103, 91, 171, 87, 75, 244, 238, 60, 64, 205, 42, 251, 247, 6, 155, + 115, 149, 137, 236, 137, 179, 119, 118, 47, 139, 175, 23, 9, 91, 12, 236, + 2, 203, 129, 186, 96, 102, 2, 218, 15, 122, 101, 36, 219, 137, 217, 133, + 123, 210, 151, 172, 205, 141, 164, 119, 21, 29, 128, 123, 227, 172, 145, + 166, 251, 3, 52, 139, 107, 102, 238, 147, 95, 169, 60, 52, 162, 76, 185, + 61, 192, 213, 35, 151, 205, 50, 238, 24, 244, 55, 98, 147, 58, 116, 45, + 219, 129, 46, 95, 67, 75, 190, 243, 200, 103, 195, 246, 75, 87, 222, 220, + 132, 76, 112, 30, 74, 214, 80, 17, 11, 85, 138, 22, 125, 38, 137, 33, 183, + 91, 29, 103, 213, 246, 244, 215, 92, 234, 208, 204, 242, 214, 241, 193, + 253, 158, 9, 30, 115, 129, 12, 37, 83, 217, 230, 141, 234, 161, 147, 233, + 181, 87, 209, 236, 243, 42, 55, 158, 117, 234, 85, 95, 104, 242, 69, 240, + 190, 110, 73, 32, 207, 82, 173, 49, 26, 28, 240, 40, 147, 81, 170, 203, 43, + 242, 92, 2, 227, 144, 235, 119, 166, 73, 103, 152, 44, 164, 172, 255, 111, + 99, 39, 66, 202, 245, 3, 6, 137, 235, 128, 87, 173, 82, 10, 77, 105, 157, + 156, 110, 2, 43, 75, 114, 0, 163, 33, 199, 98, 197, 1, 104, 69, 207, 200, + 170, 226, 52, 80, 67, 48, 67, 253, 91, 185, 118, 167, 169, 219, 62, 177, + 163, 98, 220, 26, 94, 205, 195, 178, 219, 175, 89, 125, 175, 11, 246, 158, + 118, 18, 45, 231, 213, 240, 216, 46, 47, 136, 42, 201, 27, 240, 168, 79, + 60, 109, 231, 220, 167, 82, 194, 195, 159, 48, 45, 63, 202, 192, 34, 124, + 64, 83, 41, 141, 61, 150, 191, 23, 54, 192, 237, 64, 105, 33, 93, 157, 244, + 155, 136, 195, 77, 182, 250, 79, 26, 52, 3, 180, 55, 177, 206, 72, 157, + 138, 72, 171, 137, 174, 222, 187, 188, 126, 30, 6, 71, 215, 189, 218, 59, + 180, 2, 221, 208, 190, 34, 172, 210, 43, 89, 207, 233, 62, 123, 18, 44, + 115, 169, 63, 30, 2, 244, 44, 28, 107, 195, 179, 36, 111, 27, 177, 143, 43, + 179, 2, 2, 43, 167, 75, 86, 250, 162, 20, 118, 198, 211, 38, 87, 101, 235, + 171, 143, 104, 244, 79, 23, 73, 34, 68, 141, 251, 31, 30, 224, 203, 165, + 181, 21, 165, 18, 9, 94, 9, 146, 104, 20, 81, 196, 79, 26, 144, 21, 134, 0, + 48, 93, 131, 101, 51, 163, 174, 34, 167, 161, 171, 135, 55, 241, 161, 141, + 232, 244, 108, 242, 111, 227, 105, 246, 49, 223, 70, 213, 173, 255, 246, + 132, 252, 209, 37, 13, 202, 32, 141, 16, 250, 57, 146, 237, 166, 112, 78, + 166, 199, 237, 145, 218, 175, 219, 168, 4, 209, 217, 7, 211, 12, 102, 253, + 18, 125, 144, 13, 108, 78, 41, 133, 82, 161, 254, 237, 216, 90, 222, 34, 2, + 46, 161, 122, 252, 159, 231, 155, 94, 52, 171, 84, 217, 215, 72, 18, 49, + 252, 168, 217, 45, 213, 86, 41, 81, 227, 165, 174, 141, 38, 176, 83, 44, 2, + 54, 204, 22, 162, 39, 179, 62, 76, 230, 61, 24, 236, 135, 91, 193, 222, 65, + 64, 123, 162, 166, 225, 49, 228, 88, 236, 141, 96, 138, 91, 5, 84, 54, 118, + 130, 70, 42, 208, 149, 250, 193, 212, 119, 199, 226, 77, 91, 211, 194, 0, + 55, 15, 23, 183, 218, 181, 71, 31, 100, 70, 35, 50, 141, 150, 11, 147, 250, + 174, 244, 51, 58, 189, 233, 246, 22, 149, 239, 72, 104, 121, 5, 79, 87, 2, + 200, 164, 90, 237, 157, 251, 248, 85, 229, 103, 217, 59, 100, 189, 223, + 240, 125, 30, 25, 193, 57, 206, 191, 170, 148, 73, 177, 188, 13, 245, 211, + 75, 2, 10, 204, 243, 79, 162, 152, 116, 3, 240, 151, 9, 2, 38, 96, 98, 225, + 2, 242, 50, 65, 161, 113, 76, 116, 36, 162, 235, 224, 230, 154, 37, 103, + 205, 187, 207, 176, 231, 87, 57, 206, 26, 51, 39, 230, 3, 151, 205, 62, + 166, 250, 67, 74, 254, 37, 157, 107, 246, 13, 114, 147, 49, 214, 35, 107, + 41, 145, 37, 44, 114, 4, 143, 171, 105, 246, 212, 166, 223, 153, 177, 245, + 158, 67, 244, 63, 60, 43, 7, 64, 154, 88, 32, 124, 101, 232, 242, 68, 192, + 57, 230, 193, 181, 57, 235, 142, 76, 134, 233, 124, 122, 72, 79, 116, 238, + 12, 122, 234, 228, 85, 66, 64, 170, 57, 78, 109, 232, 230, 49, 218, 165, + 58, 137, 102, 115, 105, 18, 73, 203, 99, 137, 172, 180, 169, 206, 3, 169, + 78, 94, 74, 160, 41, 33, 131, 60, 192, 134, 134, 88, 149, 55, 32, 112, 113, + 106, 28, 40, 115, 197, 227, 140, 160, 63, 38, 84, 3, 11, 73, 8, 230, 174, + 47, 12, 144, 183, 97, 34, 118, 179, 105, 37, 42, 93, 26, 1, 233, 197, 166, + 193, 219, 50, 215, 222, 10, 218, 78, 222, 156, 3, 87, 236, 202, 134, 117, + 216, 156, 27, 205, 88, 43, 53, 135, 200, 142, 21, 135, 205, 150, 87, 191, + 32, 221, 41, 84, 221, 156, 253, 239, 205, 123, 223, 249, 38, 201, 55, 84, + 128, 143, 99, 7, 35, 242, 172, 216, 28, 63, 231, 145, 252, 112, 225, 14, + 175, 37, 196, 124, 214, 17, 52, 116, 81, 86, 209, 69, 223, 5, 159, 150, + 111, 201, 77, 219, 60, 160, 30, 51, 109, 120, 96, 157, 232, 161, 141, 105, + 73, 4, 86, 54, 121, 236, 245, 133, 126, 21, 174, 172, 34, 165, 222, 181, + 234, 42, 133, 206, 170, 202, 196, 249, 100, 146, 208, 60, 128, 205, 12, + 216, 187, 112, 50, 100, 245, 247, 189, 155, 252, 248, 3, 3, 101, 25, 33, + 106, 42, 215, 190, 191, 30, 112, 177, 45, 152, 227, 193, 107, 243, 38, 244, + 78, 27, 28, 105, 210, 49, 233, 165, 209, 160, 182, 211, 142, 2, 123, 160, + 233, 134, 79, 57, 71, 111, 7, 110, 244, 236, 17, 170, 27, 33, 177, 239, 83, + 145, 239, 76, 140, 99, 238, 211, 23, 83, 85, 26, 8, 22, 253, 131, 154, 128, + 100, 143, 242, 243, 165, 9, 48, 239, 132, 23, 91, 22, 59, 214, 145, 37, + 255, 218, 154, 219, 227, 89, 12, 110, 169, 178, 108, 31, 116, 241, 42, 49, + 178, 247, 209, 85, 67, 110, 149, 184, 109, 210, 177, 251, 234, 98, 238, 38, + 130, 241, 66, 143, 28, 141, 95, 83, 12, 213, 195, 75, 50, 92, 164, 248, 89, + 108, 12, 248, 119, 153, 155, 234, 224, 29, 90, 158, 153, 16, 242, 20, 66, + 99, 195, 58, 37, 11, 187, 65, 81, 249, 27, 236, 2, 36, 120, 39, 191, 248, + 252, 240, 104, 232, 136, 115, 141, 9, 190, 51, 15, 189, 10, 194, 118, 7, + 183, 71, 110, 106, 68, 7, 52, 6, 157, 214, 105, 3, 100, 160, 238, 83, 207, + 160, 223, 84, 204, 166, 143, 30, 18, 203, 146, 144, 15, 109, 232, 31, 126, + 12, 245, 25, 141, 244, 47, 55, 74, 239, 136, 177, 188, 165, 132, 30, 97, + 209, 159, 221, 9, 68, 240, 28, 243, 140, 8, 51, 124, 242, 158, 198, 3, 66, + 21, 68, 220, 130, 251, 128, 88, 1, 76, 206, 240, 165, 254, 6, 12, 186, 30, + 66, 73, 71, 87, 30, 29, 236, 229, 15, 18, 83, 138, 117, 118, 149, 17, 78, + 188, 215, 173, 34, 60, 101, 4, 71, 222, 252, 67, 175, 119, 7, 161, 220, + 117, 8, 37, 170, 220, 249, 37, 219, 174, 93, 189, 31, 41, 229, 22, 202, + 159, 100, 1, 3, 100, 196, 110, 239, 3, 223, 1, 199, 135, 54, 48, 193, 117, + 136, 98, 121, 104, 215, 252, 184, 194, 128, 247, 160, 135, 79, 185, 4, 4, + 155, 165, 250, 117, 94, 152, 104, 30, 3, 126, 243, 107, 47, 216, 59, 152, + 186, 198, 153, 14, 109, 82, 239, 85, 95, 59, 139, 172, 237, 31, 75, 34, + 146, 5, 77, 118, 118, 142, 3, 93, 64, 126, 88, 138, 237, 145, 228, 245, + 155, 178, 12, 30, 42, 209, 78, 236, 26, 218, 143, 160, 62, 235, 18, 205, + 144, 136, 132, 42, 179, 149, 132, 93, 49, 249, 152, 180, 131, 115, 163, + 139, 50, 60, 68, 202, 26, 87, 217, 185, 1, 64, 57, 222, 136, 178, 21, 245, + 181, 78, 232, 23, 15, 174, 39, 153, 22, 117, 242, 219, 54, 115, 55, 27, + 236, 133, 52, 235, 99, 13, 119, 77, 19, 5, 7, 41, 22, 3, 140, 202, 138, + 160, 161, 116, 5, 65, 254, 148, 58, 3, 91, 143, 120, 167, 106, 231, 176, + 62, 143, 70, 111, 25, 153, 152, 36, 146, 96, 152, 50, 128, 62, 38, 219, + 243, 217, 125, 182, 182, 46, 184, 71, 7, 3, 117, 128, 110, 101, 98, 68, + 123, 192, 34, 18, 35, 137, 105, 108, 131, 125, 137, 8, 147, 61, 61, 133, + 113, 111, 81, 148, 14, 117, 79, 54, 108, 202, 116, 144, 66, 25, 226, 231, + 7, 233, 114, 3, 4, 186, 209, 157, 66, 64, 29, 110, 227, 193, 214, 215, 74, + 102, 101, 109, 141, 240, 91, 196, 5, 118, 202, 108, 23, 72, 66, 121, 210, + 145, 160, 248, 225, 143, 152, 49, 75, 151, 196, 174, 225, 204, 33, 255, 91, + 182, 8, 75, 186, 9, 119, 36, 203, 173, 149, 9, 30, 119, 57, 42, 80, 112, + 156, 160, 186, 57, 134, 113, 73, 127, 132, 245, 12, 248, 15, 106, 90, 61, + 118, 63, 18, 154, 79, 35, 122, 148, 3, 77, 55, 85, 27, 190, 211, 198, 66, + 203, 31, 19, 206, 21, 27, 7, 243, 197, 98, 122, 187, 215, 234, 130, 53, 23, + 166, 117, 50, 213, 241, 177, 37, 3, 64, 96, 44, 60, 99, 28, 13, 2, 153, + 119, 119, 18, 238, 3, 187, 2, 70, 229, 131, 159, 10, 79, 196, 196, 26, 199, + 80, 40, 63, 29, 21, 127, 183, 80, 12, 20, 62, 57, 14, 205, 239, 234, 146, + 136, 142, 32, 164, 135, 194, 34, 58, 152, 29, 210, 62, 115, 255, 237, 235, + 157, 153, 244, 126, 92, 231, 95, 43, 73, 45, 143, 19, 147, 16, 76, 102, 85, + 233, 231, 58, 166, 33, 241, 42, 56, 217, 246, 94, 34, 210, 83, 155, 241, + 197, 87, 17, 33, 62, 59, 173, 119, 102, 141, 46, 130, 234, 42, 7, 16, 188, + 128, 94, 185, 35, 184, 179, 153, 89, 243, 240, 50, 227, 243, 111, 64, 121, + 39, 139, 200, 3, 37, 40, 197, 126, 227, 58, 76, 111, 141, 176, 50, 126, + 146, 247, 210, 117, 249, 108, 251, 211, 184, 99, 52, 81, 183, 163, 196, 25, + 214, 119, 75, 71, 3, 34, 111, 241, 99, 183, 134, 212, 75, 163, 95, 173, + 128, 38, 240, 179, 96, 64, 204, 147, 124, 181, 8, 85, 107, 227, 148, 59, + 246, 155, 23, 11, 149, 142, 91, 240, 52, 180, 209, 78, 217, 19, 85, 56, 93, + 17, 109, 119, 107, 117, 188, 96, 180, 41, 178, 127, 210, 252, 237, 188, + 101, 158, 248, 210, 206, 55, 88, 153, 241, 189, 198, 60, 98, 26, 151, 150, + 192, 51, 191, 21, 99, 2, 178, 45, 10, 235, 222, 190, 44, 241, 100, 215, + 158, 133, 57, 162, 105, 131, 7, 27, 132, 122, 228, 197, 104, 50, 246, 192, + 47, 63, 168, 56, 58, 239, 69, 152, 95, 61, 50, 77, 22, 174, 128, 169, 85, + 139, 169, 120, 6, 3, 176, 99, 215, 140, 5, 144, 103, 214, 80, 77, 90, 116, + 26, 254, 66, 137, 234, 35, 10, 8, 166, 200, 144, 0, 89, 212, 212, 30, 34, + 27, 43, 192, 3, 136, 170, 251, 184, 203, 74, 221, 54, 30, 152, 0, 26, 189, + 147, 128, 64, 71, 17, 84, 205, 248, 171, 215, 156, 214, 16, 97, 17, 12, + 199, 230, 237, 47, 129, 76, 127, 189, 94, 187, 146, 58, 5, 70, 26, 118, + 180, 80, 136, 1, 240, 34, 191, 84, 141, 11, 54, 152, 209, 20, 17, 60, 228, + 74, 59, 13, 24, 175, 7, 35, 151, 93, 242, 9, 80, 152, 107, 32, 192, 184, + 51, 41, 42, 40, 73, 14, 110, 147, 47, 241, 190, 169, 177, 207, 207, 169, + 97, 171, 22, 186, 105, 125, 134, 34, 237, 156, 54, 126, 50, 195, 174, 138, + 0, 191, 71, 95, 31, 112, 69, 204, 154, 177, 22, 176, 19, 126, 105, 181, + 228, 2, 65, 92, 229, 92, 37, 133, 150, 72, 76, 255, 251, 240, 207, 219, + 148, 134, 94, 40, 14, 182, 25, 18, 129, 16, 109, 61, 35, 247, 92, 35, 124, + 252, 3, 176, 195, 143, 171, 181, 38, 115, 205, 146, 141, 6, 231, 173, 89, + 199, 101, 9, 190, 231, 3, 221, 229, 7, 209, 195, 233, 120, 132, 158, 188, + 20, 251, 191, 16, 64, 141, 74, 228, 144, 128, 154, 24, 223, 12, 94, 46, + 119, 189, 233, 25, 77, 224, 122, 86, 95, 186, 95, 158, 57, 51, 192, 155, 2, + 178, 91, 173, 97, 97, 23, 124, 134, 210, 40, 11, 213, 57, 186, 75, 46, 0, + 48, 98, 161, 185, 221, 74, 184, 107, 176, 153, 119, 106, 191, 166, 239, + 123, 184, 128, 124, 106, 161, 182, 245, 72, 61, 13, 157, 151, 240, 217, + 112, 35, 166, 79, 206, 113, 137, 46, 209, 209, 219, 143, 92, 15, 54, 247, + 182, 242, 2, 4, 188, 230, 11, 170, 51, 28, 95, 241, 230, 251, 125, 12, 215, + 51, 201, 167, 91, 160, 178, 162, 119, 178, 186, 93, 228, 218, 219, 205, 22, + 210, 233, 3, 91, 77, 199, 239, 143, 154, 63, 131, 135, 141, 138, 30, 66, 3, + 240, 207, 248, 134, 68, 200, 80, 69, 183, 81, 182, 20, 13, 247, 10, 17, 99, + 60, 157, 145, 66, 187, 225, 225, 141, 228, 54, 212, 108, 220, 85, 102, 90, + 216, 199, 62, 191, 73, 130, 222, 153, 124, 216, 242, 2, 13, 47, 89, 217, + 119, 52, 143, 220, 178, 254, 186, 130, 248, 45, 155, 213, 10, 6, 174, 146, + 77, 65, 219, 232, 93, 162, 171, 37, 154, 172, 198, 51, 241, 172, 120, 16, + 153, 205, 168, 157, 226, 82, 222, 121, 131, 76, 43, 216, 228, 165, 250, + 177, 193, 62, 37, 142, 150, 176, 219, 10, 221, 53, 171, 30, 46, 250, 208, + 146, 90, 3, 185, 199, 156, 161, 216, 26, 58, 120, 71, 38, 23, 159, 78, 44, + 88, 174, 255, 198, 116, 86, 142, 195, 218, 93, 116, 225, 227, 159, 148, 66, + 220, 18, 2, 222, 169, 83, 234, 253, 91, 165, 204, 138, 39, 217, 16, 210, + 101, 224, 114, 217, 80, 166, 16, 66, 44, 247, 188, 185, 62, 65, 122, 182, + 142, 115, 79, 167, 186, 99, 175, 34, 70, 20, 14, 177, 77, 151, 105, 151, + 216, 140, 64, 152, 20, 78, 190, 230, 180, 183, 185, 165, 137, 78, 132, 32, + 186, 221, 171, 138, 38, 98, 61, 118, 196, 28, 152, 236, 157, 110, 73, 189, + 196, 45, 137, 74, 100, 95, 237, 164, 84, 219, 229, 10, 79, 90, 101, 24, + 194, 64, 222, 167, 19, 205, 61, 88, 49, 144, 157, 30, 196, 205, 95, 84, 68, + 247, 229, 191, 104, 140, 210, 108, 115, 206, 114, 195, 49, 44, 4, 202, 52, + 233, 114, 2, 189, 174, 75, 47, 108, 122, 87, 40, 217, 86, 111, 240, 62, + 129, 190, 206, 251, 107, 12, 150, 242, 126, 238, 35, 167, 72, 136, 39, 255, + 9, 108, 169, 3, 5, 219, 220, 213, 69, 80, 63, 70, 149, 30, 28, 155, 81, + 118, 82, 155, 40, 49, 228, 99, 54, 72, 229, 36, 36, 243, 36, 26, 206, 245, + 56, 76, 210, 18, 184, 242, 174, 151, 124, 36, 25, 151, 185, 64, 230, 45, + 55, 47, 26, 20, 226, 86, 134, 225, 125, 251, 83, 162, 167, 77, 138, 41, 88, + 18, 225, 121, 226, 250, 61, 6, 221, 121, 80, 135, 191, 146, 186, 170, 55, + 158, 46, 120, 136, 160, 202, 234, 252, 207, 192, 192, 70, 46, 9, 85, 94, + 14, 62, 142, 112, 97, 154, 190, 76, 36, 47, 231, 86, 246, 175, 216, 3, 18, + 58, 76, 150, 196, 4, 105, 95, 195, 39, 128, 37, 152, 128, 22, 1, 35, 3, 69, + 251, 3, 198, 249, 241, 148, 72, 89, 211, 225, 73, 124, 106, 150, 52, 173, + 199, 115, 221, 18, 22, 207, 248, 129, 70, 19, 115, 89, 66, 99, 123, 3, 150, + 106, 157, 45, 111, 123, 252, 217, 81, 60, 0, 184, 227, 242, 218, 138, 240, + 195, 113, 255, 58, 78, 118, 156, 172, 207, 154, 188, 16, 72, 204, 254, 231, + 226, 180, 97, 242, 228, 42, 155, 79, 200, 159, 131, 164, 207, 240, 177, 28, + 244, 226, 62, 157, 27, 8, 8, 209, 132, 212, 21, 130, 128, 192, 63, 167, + 255, 106, 66, 71, 211, 194, 126, 114, 207, 236, 85, 165, 108, 139, 161, 20, + 154, 21, 186, 212, 74, 182, 205, 121, 53, 179, 228, 108, 152, 163, 204, 40, + 28, 105, 45, 134, 124, 21, 252, 82, 234, 112, 98, 167, 119, 155, 247, 110, + 13, 99, 200, 232, 25, 224, 179, 138, 114, 238, 89, 247, 41, 8, 156, 3, 132, + 69, 230, 128, 1, 162, 155, 34, 109, 129, 37, 175, 4, 118, 41, 143, 31, 5, + 183, 35, 198, 58, 117, 205, 27, 165, 87, 33, 184, 106, 237, 26, 3, 26, 203, + 24, 24, 157, 198, 40, 78, 56, 130, 0, 53, 234, 118, 48, 246, 56, 3, 52, + 124, 199, 181, 207, 244, 116, 234, 98, 133, 9, 102, 215, 163, 218, 135, 75, + 43, 74, 5, 188, 159, 67, 214, 159, 160, 126, 233, 247, 230, 108, 22, 163, + 197, 4, 241, 156, 33, 114, 46, 197, 95, 125, 138, 109, 196, 108, 192, 157, + 51, 57, 193, 169, 188, 170, 208, 69, 254, 246, 178, 249, 108, 113, 223, 57, + 35, 167, 57, 95, 128, 150, 212, 41, 35, 187, 118, 51, 86, 53, 238, 203, + 173, 224, 120, 212, 112, 219, 137, 174, 8, 177, 206, 101, 178, 78, 117, + 241, 238, 218, 190, 75, 153, 29, 137, 162, 140, 59, 181, 173, 150, 2, 126, + 165, 2, 208, 98, 41, 248, 136, 242, 145, 167, 16, 233, 179, 191, 222, 83, + 253, 183, 89, 216, 94, 222, 24, 72, 29, 55, 4, 222, 120, 219, 55, 2, 221, + 127, 182, 93, 101, 220, 112, 224, 164, 2, 159, 43, 57, 198, 48, 115, 130, + 126, 169, 11, 75, 185, 75, 210, 185, 26, 160, 15, 217, 194, 131, 211, 233, + 196, 68, 76, 169, 115, 127, 205, 131, 222, 169, 60, 150, 127, 242, 210, + 255, 35, 71, 228, 159, 167, 208, 207, 97, 241, 56, 165, 236, 146, 12, 138, + 19, 216, 235, 120, 48, 231, 55, 244, 166, 144, 79, 186, 103, 193, 37, 212, + 216, 81, 238, 230, 94, 63, 116, 0, 112, 5, 129, 68, 191, 156, 140, 160, 80, + 46, 33, 80, 1, 96, 253, 222, 63, 142, 27, 74, 140, 112, 64, 0, 24, 121, + 158, 100, 192, 80, 182, 62, 233, 89, 59, 121, 35, 45, 41, 94, 2, 177, 101, + 72, 9, 103, 33, 218, 24, 114, 86, 198, 222, 89, 181, 6, 237, 46, 6, 192, + 175, 171, 205, 251, 81, 34, 45, 150, 185, 215, 85, 250, 188, 3, 45, 174, + 19, 47, 46, 142, 164, 146, 87, 253, 174, 150, 166, 90, 28, 144, 183, 168, + 217, 65, 7, 181, 207, 243, 96, 84, 26, 118, 96, 101, 134, 183, 93, 15, 212, + 245, 218, 121, 102, 135, 216, 18, 167, 177, 183, 188, 208, 77, 86, 80, 172, + 235, 101, 239, 166, 66, 162, 16, 208, 170, 248, 2, 242, 171, 169, 245, 192, + 29, 149, 13, 172, 171, 117, 237, 22, 224, 103, 158, 201, 107, 65, 14, 170, + 230, 195, 181, 198, 17, 69, 6, 127, 136, 56, 196, 176, 232, 236, 210, 111, + 164, 150, 136, 232, 152, 99, 51, 235, 29, 125, 76, 181, 71, 201, 216, 1, + 85, 135, 195, 71, 49, 193, 36, 200, 34, 249, 23, 77, 170, 3, 87, 89, 78, + 24, 149, 235, 249, 80, 88, 139, 87, 91, 152, 191, 245, 115, 22, 228, 153, + 99, 125, 5, 100, 147, 249, 23, 241, 217, 129, 124, 151, 145, 2, 57, 153, + 76, 147, 152, 100, 99, 158, 173, 20, 0, 205, 75, 83, 6, 24, 52, 224, 55, + 189, 160, 15, 237, 187, 25, 53, 89, 2, 35, 196, 173, 77, 97, 132, 27, 239, + 84, 199, 189, 37, 90, 153, 188, 181, 93, 122, 180, 123, 113, 210, 223, 253, + 214, 210, 41, 221, 56, 79, 36, 84, 26, 238, 203, 72, 196, 171, 0, 20, 34, + 20, 111, 106, 7, 34, 155, 10, 171, 135, 100, 235, 245, 10, 134, 91, 39, + 187, 204, 109, 99, 213, 210, 19, 54, 67, 47, 243, 118, 165, 124, 237, 63, + 94, 181, 37, 141, 193, 237, 133, 254, 142, 238, 65, 115, 104, 176, 172, + 128, 232, 36, 239, 51, 50, 54, 55, 77, 37, 3, 105, 2, 176, 118, 91, 176, + 152, 195, 104, 22, 42, 118, 192, 246, 201, 115, 73, 196, 132, 157, 132, + 108, 60, 105, 186, 23, 190, 109, 1, 40, 143, 60, 54, 91, 2, 60, 234, 180, + 209, 30, 184, 41, 207, 241, 67, 80, 209, 191, 112, 156, 143, 244, 158, 24, + 51, 173, 253, 38, 229, 252, 80, 100, 51, 48, 57, 139, 61, 142, 3, 76, 148, + 253, 220, 147, 169, 127, 230, 253, 172, 178, 99, 94, 203, 210, 126, 192, + 17, 74, 195, 87, 199, 161, 33, 237, 146, 95, 126, 6, 241, 94, 55, 96, 45, + 80, 26, 254, 238, 61, 171, 120, 155, 244, 81, 34, 45, 50, 111, 95, 151, + 152, 172, 242, 75, 151, 252, 251, 206, 248, 78, 36, 101, 77, 149, 249, 30, + 175, 225, 155, 192, 240, 123, 138, 119, 254, 34, 222, 129, 201, 49, 101, + 210, 209, 103, 24, 31, 189, 31, 214, 193, 253, 75, 45, 63, 2, 31, 35, 86, + 67, 203, 217, 57, 101, 202, 105, 54, 35, 95, 107, 89, 113, 216, 198, 224, + 95, 31, 9, 195, 157, 10, 140, 103, 40, 75, 141, 21, 86, 2, 138, 114, 9, 51, + 127, 210, 226, 178, 15, 15, 174, 125, 23, 77, 190, 245, 190, 208, 34, 160, + 199, 99, 72, 247, 75, 92, 201, 227, 253, 9, 130, 109, 159, 65, 47, 67, 253, + 56, 118, 47, 185, 181, 2, 20, 146, 212, 19, 221, 51, 35, 117, 22, 193, 29, + 103, 140, 248, 101, 194, 223, 107, 180, 248, 127, 222, 192, 112, 106, 4, + 250, 167, 32, 128, 19, 250, 123, 148, 208, 243, 86, 159, 11, 164, 5, 214, + 246, 8, 83, 126, 11, 126, 251, 205, 122, 184, 184, 247, 46, 3, 224, 149, + 209, 231, 142, 135, 61, 68, 1, 98, 139, 121, 9, 27, 19, 14, 83, 194, 83, + 27, 23, 111, 105, 217, 11, 11, 147, 140, 36, 3, 190, 148, 22, 115, 42, 134, + 88, 58, 203, 242, 119, 212, 233, 106, 115, 69, 7, 92, 85, 107, 30, 10, 203, + 16, 150, 191, 188, 61, 150, 169, 131, 16, 3, 173, 89, 28, 38, 238, 14, 161, + 230, 85, 54, 232, 236, 40, 248, 50, 237, 60, 166, 156, 215, 27, 4, 135, 15, + 173, 101, 18, 212, 24, 246, 25, 203, 194, 249, 223, 230, 28, 154, 219, 199, + 202, 197, 163, 81, 192, 112, 82, 138, 36, 214, 140, 7, 49, 2, 166, 254, + 199, 12, 135, 102, 125, 17, 37, 3, 164, 86, 25, 43, 97, 231, 36, 119, 191, + 21, 186, 129, 196, 228, 96, 75, 187, 190, 252, 250, 73, 25, 58, 17, 10, + 104, 116, 100, 75, 215, 162, 21, 11, 201, 181, 15, 106, 135, 96, 21, 152, + 160, 218, 53, 123, 254, 91, 190, 239, 156, 143, 125, 186, 177, 165, 181, + 34, 163, 62, 138, 204, 57, 102, 76, 2, 210, 64, 211, 20, 101, 233, 113, 18, + 36, 132, 201, 33, 173, 229, 240, 163, 206, 43, 234, 87, 151, 23, 17, 85, 0, + 189, 1, 255, 103, 160, 138, 160, 2, 218, 234, 184, 205, 152, 192, 81, 196, + 29, 52, 94, 53, 180, 110, 139, 222, 21, 27, 54, 114, 81, 40, 39, 225, 28, + 169, 211, 193, 118, 44, 38, 62, 201, 25, 215, 110, 88, 5, 142, 116, 224, + 54, 130, 45, 230, 246, 104, 251, 172, 159, 50, 212, 46, 171, 21, 213, 200, + 189, 6, 226, 234, 238, 226, 241, 219, 85, 8, 47, 152, 11, 238, 0, 132, 194, + 254, 135, 15, 85, 110, 31, 243, 54, 235, 240, 5, 19, 85, 176, 130, 224, + 127, 183, 83, 93, 179, 217, 185, 126, 52, 10, 14, 113, 19, 5, 201, 201, + 161, 30, 176, 132, 72, 179, 9, 110, 68, 87, 203, 201, 160, 111, 163, 35, + 247, 13, 132, 176, 214, 63, 3, 193, 251, 139, 79, 215, 178, 218, 56, 222, + 162, 33, 46, 57, 4, 129, 65, 166, 110, 237, 23, 186, 226, 100, 133, 187, + 151, 155, 217, 238, 252, 2, 147, 3, 213, 55, 166, 184, 148, 152, 194, 230, + 97, 203, 161, 191, 127, 213, 240, 121, 99, 70, 171, 83, 155, 88, 91, 200, + 26, 92, 3, 218, 233, 23, 215, 63, 47, 55, 133, 185, 189, 223, 135, 202, + 182, 237, 107, 248, 219, 138, 158, 2, 153, 236, 98, 18, 135, 141, 243, 120, + 195, 213, 169, 176, 218, 241, 58, 175, 238, 121, 218, 175, 8, 246, 18, 217, + 58, 154, 67, 164, 25, 76, 222, 47, 227, 62, 136, 20, 215, 46, 163, 42, 188, + 109, 9, 122, 76, 221, 165, 150, 201, 9, 246, 100, 88, 184, 219, 129, 43, + 143, 45, 91, 21, 89, 118, 27, 131, 253, 41, 20, 67, 55, 252, 90, 98, 197, + 123, 169, 120, 202, 168, 239, 3, 23, 28, 110, 164, 201, 219, 123, 239, 64, + 146, 50, 185, 241, 47, 17, 27, 201, 87, 156, 104, 89, 114, 165, 71, 26, + 121, 88, 231, 5, 215, 72, 204, 3, 121, 57, 23, 165, 63, 43, 115, 232, 182, + 37, 41, 67, 229, 131, 139, 249, 101, 17, 147, 225, 125, 170, 4, 19, 174, + 188, 237, 110, 18, 155, 113, 45, 107, 8, 108, 20, 189, 239, 248, 4, 31, 97, + 215, 190, 113, 34, 137, 110, 183, 119, 239, 221, 165, 99, 199, 107, 124, + 127, 48, 46, 68, 70, 249, 191, 218, 185, 114, 253, 16, 28, 131, 3, 201, + 215, 247, 208, 199, 219, 146, 127, 62, 64, 40, 98, 136, 4, 135, 2, 192, + 164, 107, 116, 8, 189, 84, 190, 104, 113, 230, 191, 200, 18, 186, 215, 32, + 2, 98, 211, 11, 145, 22, 217, 12, 14, 94, 173, 5, 91, 74, 189, 173, 250, + 181, 61, 153, 68, 226, 241, 2, 238, 229, 24, 145, 62, 83, 178, 113, 172, + 86, 43, 105, 153, 25, 117, 254, 244, 155, 111, 212, 187, 23, 109, 232, 188, + 177, 180, 83, 65, 94, 80, 130, 2, 185, 146, 202, 44, 71, 205, 252, 25, 52, + 109, 182, 234, 207, 167, 79, 52, 127, 204, 91, 185, 166, 61, 134, 55, 25, + 139, 177, 92, 131, 213, 118, 61, 123, 237, 80, 107, 153, 77, 218, 197, 212, + 95, 165, 161, 36, 152, 25, 170, 227, 17, 202, 79, 243, 34, 50, 190, 75, 7, + 154, 159, 140, 217, 84, 125, 190, 168, 123, 74, 115, 72, 4, 164, 169, 132, + 85, 169, 20, 212, 183, 164, 115, 9, 91, 33, 95, 184, 26, 61, 155, 243, 158, + 19, 126, 46, 126, 63, 214, 227, 191, 12, 62, 231, 87, 110, 229, 47, 156, + 47, 47, 241, 208, 49, 213, 49, 67, 230, 44, 210, 250, 251, 219, 246, 39, + 153, 249, 226, 166, 228, 3, 41, 36, 114, 82, 242, 73, 40, 54, 12, 1, 221, + 99, 116, 50, 220, 171, 220, 47, 134, 160, 142, 35, 255, 123, 13, 31, 32, + 240, 27, 188, 203, 236, 2, 11, 71, 190, 206, 92, 140, 151, 224, 223, 140, + 97, 98, 172, 180, 170, 56, 168, 32, 170, 5, 142, 36, 75, 6, 164, 73, 23, + 204, 167, 54, 241, 66, 255, 33, 175, 61, 188, 220, 49, 234, 15, 136, 19, + 197, 232, 64, 38, 145, 249, 23, 233, 172, 15, 78, 48, 238, 210, 90, 44, 69, + 110, 221, 36, 239, 28, 162, 203, 103, 213, 44, 255, 88, 168, 254, 236, 86, + 60, 176, 148, 17, 213, 1, 149, 135, 127, 76, 211, 176, 162, 121, 253, 188, + 149, 1, 177, 137, 22, 183, 225, 29, 122, 191, 112, 157, 102, 19, 108, 188, + 227, 38, 48, 101, 213, 88, 12, 227, 6, 73, 185, 13, 194, 206, 75, 181, 243, + 56, 194, 134, 2, 62, 236, 102, 164, 241, 236, 180, 222, 124, 34, 195, 118, + 72, 115, 19, 120, 237, 231, 36, 245, 26, 77, 237, 8, 72, 11, 241, 248, 214, + 248, 153, 80, 2, 13, 49, 125, 116, 159, 11, 95, 23, 248, 66, 197, 122, 47, + 16, 92, 67, 189, 172, 29, 70, 230, 120, 227, 147, 190, 165, 246, 26, 219, + 17, 191, 239, 46, 4, 79, 198, 75, 155, 161, 4, 110, 102, 128, 24, 241, 59, + 249, 124, 148, 75, 136, 144, 88, 59, 235, 103, 46, 222, 255, 198, 233, 229, + 22, 16, 152, 15, 5, 191, 138, 38, 93, 231, 239, 234, 62, 25, 60, 121, 82, + 212, 187, 249, 193, 139, 7, 33, 87, 32, 140, 25, 98, 232, 18, 248, 109, 80, + 193, 8, 94, 26, 178, 198, 50, 106, 153, 198, 252, 165, 231, 196, 224, 160, + 249, 191, 211, 124, 48, 143, 78, 118, 138, 38, 152, 252, 174, 48, 103, 51, + 3, 3, 197, 20, 145, 48, 31, 65, 112, 72, 92, 84, 188, 238, 227, 229, 26, + 57, 97, 90, 254, 53, 44, 79, 217, 252, 73, 173, 32, 237, 70, 140, 212, 3, + 49, 139, 22, 59, 90, 33, 27, 255, 179, 84, 8, 47, 4, 154, 84, 233, 152, + 148, 68, 135, 163, 238, 165, 63, 208, 179, 250, 233, 8, 149, 126, 156, 43, + 82, 179, 60, 121, 230, 109, 173, 14, 166, 81, 212, 101, 58, 152, 229, 62, + 247, 130, 38, 212, 126, 111, 5, 135, 252, 9, 54, 235, 53, 100, 97, 107, + 127, 69, 150, 134, 73, 20, 20, 205, 91, 142, 73, 236, 2, 160, 222, 1, 33, + 39, 72, 144, 230, 218, 217, 1, 58, 223, 70, 123, 123, 214, 248, 207, 213, + 46, 3, 213, 175, 97, 251, 107, 238, 138, 221, 37, 206, 214, 38, 252, 116, + 101, 29, 173, 139, 251, 177, 101, 28, 178, 8, 200, 64, 138, 239, 3, 235, + 160, 228, 94, 235, 54, 164, 147, 178, 107, 64, 249, 165, 228, 18, 225, 94, + 225, 122, 21, 146, 42, 216, 73, 129, 133, 131, 120, 1, 252, 92, 160, 3, + 245, 199, 59, 252, 44, 74, 253, 226, 74, 15, 16, 250, 82, 208, 87, 177, + 131, 232, 142, 230, 99, 97, 138, 14, 72, 249, 82, 248, 85, 60, 63, 238, + 225, 98, 225, 98, 235, 24, 63, 227, 54, 138, 240, 70, 100, 99, 24, 254, + 201, 43, 242, 228, 4, 233, 183, 233, 217, 218, 31, 142, 80, 125, 91, 116, + 165, 173, 222, 241, 132, 3, 1, 121, 180, 82, 106, 242, 48, 21, 82, 156, + 175, 72, 82, 17, 217, 174, 113, 68, 40, 138, 110, 28, 224, 240, 29, 49, + 244, 243, 13, 145, 65, 254, 195, 102, 50, 137, 71, 105, 30, 65, 254, 219, + 22, 70, 61, 65, 92, 200, 149, 218, 198, 2, 84, 143, 33, 35, 175, 25, 2, 98, + 239, 199, 226, 31, 141, 219, 151, 119, 44, 197, 18, 49, 106, 76, 162, 33, + 57, 243, 101, 17, 171, 246, 158, 234, 75, 45, 248, 154, 37, 82, 85, 3, 196, + 158, 115, 164, 194, 75, 242, 246, 54, 129, 109, 89, 59, 120, 37, 249, 127, + 162, 249, 176, 251, 115, 155, 35, 20, 64, 247, 85, 185, 253, 165, 130, 90, + 198, 147, 200, 21, 19, 14, 209, 197, 254, 140, 180, 56, 49, 14, 172, 150, + 19, 78, 255, 199, 21, 145, 123, 138, 232, 188, 95, 65, 78, 167, 116, 67, + 110, 205, 223, 120, 154, 115, 73, 34, 147, 93, 235, 51, 223, 47, 14, 97, + 240, 17, 7, 73, 31, 38, 18, 251, 111, 67, 84, 220, 68, 112, 241, 197, 93, + 28, 234, 198, 206, 226, 59, 23, 227, 195, 70, 242, 161, 157, 232, 149, 2, + 226, 112, 60, 70, 210, 18, 147, 28, 148, 24, 242, 11, 184, 216, 3, 243, + 119, 117, 101, 69, 199, 177, 142, 223, 141, 86, 255, 219, 245, 100, 209, + 76, 30, 157, 70, 209, 146, 169, 137, 9, 87, 128, 162, 241, 182, 113, 65, 2, + 64, 13, 107, 40, 97, 191, 242, 18, 207, 246, 164, 24, 61, 180, 86, 67, 104, + 69, 27, 125, 249, 123, 106, 223, 116, 174, 230, 113, 239, 147, 89, 225, + 143, 7, 6, 126, 174, 164, 32, 149, 3, 124, 198, 75, 75, 21, 8, 95, 107, 83, + 253, 216, 201, 240, 7, 212, 67, 46, 137, 27, 32, 27, 46, 15, 228, 62, 146, + 219, 147, 200, 211, 143, 95, 14, 6, 245, 177, 242, 139, 246, 150, 39, 201, + 1, 58, 23, 188, 104, 232, 227, 252, 21, 96, 100, 118, 216, 227, 49, 99, + 199, 198, 88, 130, 207, 123, 173, 226, 105, 187, 206, 236, 7, 194, 41, 99, + 160, 74, 41, 205, 142, 34, 225, 145, 238, 98, 217, 160, 155, 3, 66, 84, + 146, 173, 203, 14, 252, 236, 17, 103, 239, 44, 241, 80, 24, 176, 176, 197, + 230, 208, 227, 134, 196, 9, 222, 109, 172, 189, 215, 173, 142, 175, 3, 72, + 90, 155, 219, 29, 54, 57, 202, 217, 247, 12, 89, 162, 14, 79, 229, 24, 185, + 238, 80, 139, 45, 150, 48, 136, 192, 49, 82, 241, 0, 23, 114, 122, 107, + 165, 196, 17, 87, 229, 236, 174, 142, 34, 32, 11, 78, 222, 217, 121, 163, + 193, 254, 62, 192, 43, 0, 60, 27, 169, 96, 238, 171, 93, 21, 60, 5, 168, + 23, 27, 130, 142, 19, 102, 245, 16, 21, 85, 131, 212, 96, 179, 215, 173, + 68, 116, 51, 40, 47, 181, 45, 32, 93, 225, 105, 173, 69, 49, 134, 7, 46, + 162, 203, 181, 176, 84, 92, 11, 42, 193, 211, 77, 227, 85, 15, 49, 119, 34, + 64, 148, 51, 117, 37, 205, 70, 40, 39, 85, 239, 3, 139, 100, 67, 163, 137, + 101, 9, 215, 71, 32, 49, 224, 12, 174, 8, 177, 12, 65, 81, 191, 66, 146, + 111, 22, 235, 78, 46, 55, 211, 144, 84, 210, 3, 38, 89, 164, 43, 133, 39, + 109, 147, 152, 162, 133, 50, 56, 88, 229, 35, 90, 77, 171, 99, 158, 132, + 144, 11, 121, 16, 172, 119, 83, 24, 220, 97, 70, 247, 215, 36, 115, 70, 77, + 131, 119, 197, 147, 17, 227, 12, 249, 8, 164, 40, 36, 91, 130, 224, 18, 1, + 169, 248, 118, 100, 211, 1, 135, 81, 163, 216, 71, 73, 57, 85, 72, 116, + 125, 111, 189, 78, 66, 62, 36, 100, 110, 178, 207, 122, 114, 184, 158, 200, + 187, 18, 156, 178, 8, 58, 116, 51, 173, 17, 164, 66, 104, 201, 205, 220, + 20, 59, 211, 118, 167, 217, 13, 246, 228, 105, 74, 93, 211, 243, 65, 54, + 17, 114, 247, 24, 29, 221, 138, 141, 2, 183, 117, 66, 42, 50, 28, 167, 5, + 177, 30, 113, 253, 105, 2, 213, 101, 198, 55, 174, 237, 250, 186, 76, 200, + 11, 42, 142, 163, 69, 107, 82, 74, 3, 11, 94, 150, 3, 252, 176, 128, 53, + 14, 247, 97, 165, 63, 165, 61, 94, 101, 119, 124, 68, 231, 35, 231, 145, 2, + 151, 188, 56, 133, 135, 44, 38, 108, 46, 66, 212, 9, 40, 207, 250, 68, 88, + 212, 141, 195, 240, 204, 114, 49, 175, 98, 32, 19, 153, 75, 104, 170, 204, + 11, 242, 95, 204, 203, 96, 168, 47, 52, 165, 56, 136, 18, 241, 47, 227, + 172, 152, 101, 195, 94, 45, 209, 44, 97, 38, 58, 99, 10, 185, 133, 139, + 117, 12, 30, 23, 229, 155, 203, 77, 143, 248, 50, 113, 18, 56, 166, 214, + 224, 208, 82, 173, 135, 168, 58, 176, 231, 216, 52, 20, 169, 43, 203, 26, + 5, 52, 137, 103, 164, 212, 2, 134, 195, 113, 108, 156, 215, 175, 183, 91, + 144, 145, 235, 172, 118, 252, 59, 248, 135, 173, 164, 27, 32, 220, 234, + 108, 171, 248, 244, 1, 3, 47, 150, 2, 182, 100, 74, 69, 250, 93, 106, 189, + 196, 13, 111, 226, 111, 34, 12, 122, 224, 44, 181, 250, 77, 130, 27, 117, + 50, 44, 89, 239, 128, 224, 151, 31, 135, 61, 106, 197, 85, 179, 159, 18, + 218, 138, 217, 143, 104, 21, 46, 49, 214, 25, 88, 198, 44, 61, 51, 39, 210, + 254, 197, 84, 110, 139, 127, 241, 192, 70, 189, 6, 198, 85, 126, 112, 113, + 125, 70, 16, 246, 214, 222, 83, 46, 26, 221, 236, 207, 1, 251, 232, 147, + 234, 157, 238, 240, 38, 238, 221, 114, 218, 67, 66, 138, 90, 104, 220, 132, + 129, 101, 145, 120, 80, 14, 155, 238, 107, 61, 71, 207, 97, 153, 163, 22, + 111, 117, 137, 9, 226, 124, 183, 2, 170, 68, 187, 8, 4, 86, 191, 230, 90, + 168, 235, 152, 60, 147, 15, 52, 132, 192, 178, 204, 4, 37, 178, 228, 217, + 165, 208, 58, 57, 34, 111, 47, 2, 151, 28, 77, 0, 66, 133, 109, 255, 122, + 243, 25, 174, 204, 220, 52, 171, 207, 48, 239, 127, 243, 74, 173, 155, 89, + 68, 132, 70, 60, 32, 173, 167, 225, 250, 232, 156, 238, 254, 244, 242, 200, + 39, 201, 243, 149, 117, 171, 87, 185, 29, 202, 46, 36, 246, 174, 18, 192, + 87, 243, 219, 124, 70, 165, 208, 20, 186, 42, 238, 62, 200, 171, 191, 94, + 102, 247, 184, 40, 130, 207, 44, 161, 249, 25, 193, 221, 45, 122, 33, 231, + 232, 167, 21, 145, 170, 45, 146, 45, 247, 101, 127, 113, 52, 121, 187, 184, + 136, 206, 238, 133, 10, 137, 103, 79, 84, 179, 239, 140, 123, 100, 7, 108, + 45, 140, 147, 153, 213, 121, 140, 2, 32, 88, 230, 156, 33, 156, 163, 80, + 175, 50, 62, 105, 97, 34, 18, 116, 16, 38, 47, 7, 126, 74, 53, 245, 126, + 37, 221, 70, 185, 90, 204, 156, 2, 226, 39, 53, 68, 47, 39, 21, 108, 228, + 225, 6, 2, 152, 174, 174, 236, 132, 25, 63, 197, 245, 178, 134, 245, 234, + 72, 165, 96, 74, 178, 208, 232, 234, 159, 225, 96, 73, 18, 49, 79, 140, + 199, 126, 70, 159, 146, 72, 255, 152, 154, 149, 77, 161, 73, 64, 248, 201, + 26, 234, 120, 22, 12, 91, 71, 30, 6, 239, 103, 209, 235, 121, 49, 154, 147, + 175, 35, 30, 71, 38, 252, 142, 52, 109, 213, 79, 142, 87, 239, 10, 131, + 201, 193, 28, 106, 221, 206, 221, 33, 188, 167, 254, 14, 145, 151, 210, 4, + 56, 63, 206, 180, 233, 79, 70, 110, 139, 227, 241, 134, 56, 58, 43, 95, + 222, 148, 30, 142, 68, 194, 3, 119, 61, 16, 254, 157, 152, 182, 137, 113, + 177, 225, 2, 223, 217, 201, 186, 156, 103, 184, 99, 226, 121, 197, 236, + 201, 115, 4, 245, 101, 93, 93, 79, 3, 56, 24, 154, 230, 155, 111, 238, 218, + 10, 119, 102, 66, 29, 79, 10, 221, 189, 178, 121, 104, 167, 10, 11, 110, + 203, 186, 94, 224, 233, 175, 1, 180, 206, 23, 70, 195, 79, 152, 205, 178, + 101, 203, 57, 175, 207, 37, 100, 122, 39, 127, 190, 172, 139, 49, 7, 166, + 123, 247, 118, 64, 66, 10, 37, 176, 24, 62, 11, 227, 142, 215, 87, 129, + 154, 203, 245, 205, 54, 219, 89, 169, 8, 103, 248, 1, 170, 215, 80, 243, + 226, 242, 26, 12, 34, 156, 151, 119, 104, 230, 27, 77, 245, 174, 137, 49, + 100, 62, 186, 245, 138, 89, 2, 111, 222, 6, 57, 240, 186, 107, 163, 117, + 204, 200, 70, 111, 80, 205, 94, 193, 3, 166, 14, 57, 212, 55, 190, 119, + 142, 158, 141, 146, 138, 238, 241, 237, 139, 20, 80, 63, 126, 102, 41, 187, + 78, 5, 186, 238, 220, 241, 15, 156, 189, 3, 133, 136, 129, 135, 193, 147, + 187, 100, 217, 172, 175, 58, 73, 87, 126, 148, 108, 130, 37, 201, 254, 95, + 158, 18, 192, 39, 188, 143, 28, 20, 248, 143, 188, 10, 228, 194, 174, 148, + 251, 49, 132, 123, 23, 210, 171, 230, 226, 17, 16, 15, 76, 23, 33, 199, + 207, 181, 224, 171, 3, 71, 7, 90, 180, 164, 60, 21, 117, 69, 120, 199, 143, + 152, 212, 194, 16, 47, 10, 30, 137, 15, 99, 205, 238, 115, 245, 135, 228, + 62, 192, 112, 153, 93, 164, 92, 146, 250, 244, 140, 69, 185, 4, 53, 50, + 221, 29, 1, 195, 198, 246, 189, 230, 82, 60, 164, 21, 86, 111, 157, 211, + 241, 81, 36, 206, 3, 16, 180, 219, 106, 3, 137, 135, 206, 172, 41, 24, 191, + 34, 180, 20, 119, 56, 89, 100, 204, 154, 124, 221, 114, 183, 138, 244, 56, + 94, 8, 174, 114, 251, 97, 82, 191, 16, 3, 108, 181, 118, 79, 173, 119, 142, + 75, 214, 11, 204, 228, 213, 218, 68, 18, 86, 238, 169, 110, 54, 34, 115, + 31, 48, 114, 0, 127, 5, 233, 204, 125, 183, 32, 244, 55, 44, 181, 139, 62, + 212, 116, 117, 142, 58, 168, 18, 189, 78, 131, 128, 93, 68, 125, 52, 245, + 59, 13, 213, 215, 1, 47, 159, 136, 183, 48, 128, 65, 199, 220, 17, 179, + 224, 163, 103, 190, 11, 144, 224, 63, 154, 90, 152, 185, 24, 45, 34, 220, + 72, 252, 62, 154, 250, 55, 218, 29, 221, 51, 78, 104, 228, 161, 34, 33, 15, + 167, 233, 138, 128, 35, 106, 132, 160, 67, 40, 11, 201, 197, 250, 143, 165, + 204, 206, 88, 81, 76, 149, 73, 2, 41, 52, 90, 235, 93, 111, 16, 226, 16, + 245, 231, 250, 18, 205, 174, 171, 113, 229, 92, 146, 107, 186, 148, 195, + 19, 145, 182, 91, 7, 84, 199, 17, 3, 136, 41, 251, 89, 176, 20, 163, 214, + 139, 92, 58, 239, 150, 142, 148, 202, 196, 17, 226, 215, 174, 107, 54, 0, + 205, 104, 140, 150, 177, 34, 132, 216, 101, 159, 85, 255, 135, 85, 45, 220, + 225, 121, 91, 201, 211, 110, 59, 188, 5, 180, 40, 110, 93, 75, 189, 45, + 105, 102, 194, 168, 65, 243, 172, 195, 202, 87, 188, 254, 165, 119, 71, + 102, 115, 33, 15, 219, 209, 207, 172, 148, 56, 141, 248, 137, 83, 88, 29, + 93, 22, 65, 27, 219, 178, 97, 94, 10, 59, 14, 4, 86, 176, 88, 69, 39, 31, + 255, 182, 246, 165, 95, 145, 98, 1, 58, 59, 38, 40, 246, 29, 148, 9, 224, + 10, 210, 31, 91, 229, 116, 3, 172, 73, 107, 120, 189, 191, 17, 71, 160, + 113, 144, 215, 63, 65, 153, 26, 214, 66, 139, 92, 255, 169, 13, 183, 164, + 114, 65, 71, 54, 255, 212, 44, 3, 63, 152, 205, 25, 109, 134, 92, 65, 119, + 194, 97, 177, 51, 201, 113, 123, 33, 18, 231, 154, 235, 171, 205, 70, 164, + 82, 195, 163, 103, 95, 228, 149, 64, 7, 250, 222, 91, 156, 119, 50, 28, + 119, 237, 144, 117, 245, 117, 189, 220, 111, 164, 203, 125, 2, 84, 173, 82, + 176, 170, 167, 138, 42, 159, 51, 74, 178, 61, 30, 61, 85, 220, 197, 12, 11, + 86, 155, 51, 195, 76, 71, 208, 87, 64, 112, 80, 243, 50, 79, 159, 255, 170, + 242, 229, 50, 158, 138, 153, 130, 110, 64, 65, 220, 88, 225, 98, 70, 110, + 206, 141, 25, 211, 186, 225, 226, 186, 148, 7, 88, 57, 136, 171, 50, 40, + 170, 181, 184, 193, 23, 2, 96, 165, 111, 173, 204, 11, 19, 154, 225, 153, + 226, 83, 142, 165, 239, 244, 124, 127, 236, 75, 211, 204, 185, 206, 18, + 238, 213, 193, 28, 5, 250, 99, 3, 98, 177, 180, 173, 234, 91, 28, 192, 226, + 83, 94, 98, 209, 110, 209, 168, 182, 41, 247, 93, 221, 174, 220, 113, 101, + 30, 203, 212, 237, 56, 82, 92, 146, 41, 32, 93, 114, 215, 29, 170, 24, 25, + 136, 253, 247, 132, 234, 242, 44, 219, 11, 192, 105, 37, 95, 87, 68, 206, + 110, 115, 33, 21, 188, 105, 249, 217, 219, 94, 169, 51, 89, 112, 208, 139, + 117, 120, 78, 221, 81, 93, 97, 63, 28, 128, 2, 187, 90, 180, 233, 76, 43, + 226, 70, 40, 75, 214, 153, 149, 18, 197, 35, 209, 36, 69, 45, 134, 74, 143, + 217, 35, 254, 235, 28, 144, 199, 38, 142, 23, 90, 230, 186, 55, 96, 123, + 36, 41, 111, 116, 2, 240, 14, 108, 128, 93, 164, 203, 56, 91, 207, 52, 38, + 116, 87, 95, 217, 166, 50, 184, 138, 61, 68, 154, 158, 255, 50, 235, 243, + 45, 224, 73, 8, 2, 3, 0, 101, 215, 8, 145, 42, 179, 120, 232, 81, 227, 215, + 18, 36, 165, 23, 186, 162, 247, 117, 43, 66, 44, 184, 186, 96, 200, 226, 8, + 113, 124, 163, 12, 76, 220, 50, 215, 243, 209, 40, 139, 201, 129, 68, 226, + 0, 56, 32, 155, 27, 219, 64, 78, 235, 251, 111, 192, 114, 241, 32, 109, + 154, 173, 212, 151, 158, 149, 221, 117, 23, 55, 70, 87, 56, 108, 61, 201, + 232, 25, 51, 189, 71, 189, 101, 115, 25, 240, 125, 210, 155, 99, 253, 242, + 252, 149, 119, 25, 168, 30, 86, 100, 249, 96, 149, 74, 174, 213, 209, 252, + 192, 96, 2, 252, 189, 114, 247, 18, 245, 88, 102, 18, 78, 98, 134, 251, + 213, 249, 3, 195, 109, 118, 163, 224, 75, 149, 66, 242, 231, 160, 19, 250, + 213, 12, 163, 23, 17, 79, 26, 115, 254, 51, 241, 171, 74, 231, 189, 217, + 99, 149, 187, 2, 38, 25, 83, 109, 176, 213, 204, 153, 119, 162, 102, 147, + 245, 77, 92, 83, 11, 216, 100, 175, 122, 73, 151, 108, 106, 18, 74, 105, + 219, 21, 193, 185, 29, 14, 145, 81, 122, 218, 157, 47, 56, 100, 116, 38, + 123, 253, 155, 70, 232, 118, 137, 34, 208, 218, 179, 110, 102, 33, 46, 165, + 120, 173, 212, 123, 90, 34, 167, 206, 94, 12, 233, 25, 102, 64, 148, 145, + 223, 65, 183, 36, 173, 42, 107, 25, 41, 8, 29, 168, 43, 49, 252, 193, 230, + 26, 51, 206, 203, 116, 229, 19, 197, 237, 227, 65, 242, 171, 181, 121, 81, + 123, 244, 188, 201, 138, 77, 137, 190, 206, 5, 97, 69, 181, 171, 65, 1, + 141, 117, 226, 2, 155, 46, 192, 58, 208, 93, 12, 50, 254, 144, 150, 81, + 131, 37, 142, 139, 10, 83, 68, 121, 241, 85, 160, 82, 78, 84, 42, 25, 209, + 82, 59, 249, 2, 15, 3, 143, 35, 91, 114, 100, 116, 227, 180, 80, 23, 2, + 195, 229, 42, 5, 92, 57, 162, 16, 93, 12, 193, 42, 41, 101, 246, 63, 148, + 73, 217, 232, 51, 174, 72, 144, 26, 252, 210, 104, 57, 82, 216, 202, 104, + 187, 97, 23, 95, 25, 155, 244, 61, 60, 29, 3, 19, 76, 226, 62, 48, 34, 62, + 254, 61, 238, 11, 244, 76, 169, 250, 73, 205, 100, 15, 47, 90, 84, 139, + 125, 153, 91, 107, 234, 83, 5, 154, 31, 100, 111, 158, 49, 176, 122, 232, + 204, 86, 154, 5, 187, 171, 59, 112, 242, 9, 52, 78, 166, 224, 91, 51, 164, + 191, 80, 139, 153, 207, 44, 51, 201, 128, 120, 147, 21, 6, 57, 252, 2, 75, + 202, 81, 220, 81, 5, 19, 124, 72, 249, 115, 219, 27, 223, 138, 18, 33, 214, + 173, 44, 67, 25, 223, 104, 143, 197, 252, 155, 95, 168, 74, 49, 3, 23, 48, + 58, 80, 78, 2, 140, 248, 155, 129, 94, 216, 169, 60, 175, 215, 7, 10, 81, + 81, 25, 88, 182, 131, 75, 54, 176, 70, 228, 37, 49, 48, 203, 7, 148, 83, + 243, 125, 122, 107, 35, 23, 228, 45, 61, 108, 169, 241, 129, 163, 57, 247, + 56, 159, 78, 133, 7, 143, 67, 103, 157, 212, 41, 160, 130, 111, 1, 230, 77, + 121, 72, 101, 222, 112, 63, 206, 191, 89, 189, 175, 166, 100, 90, 106, 145, + 186, 0, 179, 155, 136, 204, 141, 130, 57, 91, 30, 196, 233, 201, 168, 7, + 197, 129, 70, 202, 93, 161, 102, 11, 118, 133, 157, 192, 103, 46, 190, 255, + 102, 23, 46, 177, 177, 245, 169, 52, 88, 35, 250, 3, 221, 198, 124, 178, + 160, 234, 147, 15, 21, 56, 47, 56, 220, 186, 139, 49, 181, 4, 15, 100, 126, + 136, 185, 115, 135, 46, 194, 252, 209, 253, 221, 179, 2, 105, 239, 60, 43, + 173, 4, 167, 92, 176, 199, 88, 132, 14, 190, 34, 121, 133, 195, 98, 63, 64, + 194, 192, 37, 129, 138, 223, 33, 128, 72, 21, 77, 169, 100, 106, 25, 96, + 251, 175, 185, 16, 179, 223, 105, 60, 108, 192, 22, 0, 52, 20, 160, 140, + 238, 195, 114, 228, 20, 188, 202, 255, 206, 163, 72, 85, 16, 112, 159, 198, + 85, 7, 44, 106, 77, 144, 105, 131, 188, 218, 111, 65, 56, 35, 67, 224, 203, + 254, 147, 249, 189, 52, 154, 157, 227, 235, 40, 230, 196, 247, 185, 20, + 155, 34, 216, 237, 47, 126, 75, 196, 212, 67, 155, 123, 133, 195, 141, 136, + 78, 202, 175, 203, 175, 215, 50, 92, 157, 18, 115, 3, 29, 171, 180, 93, 0, + 20, 15, 53, 51, 115, 103, 197, 81, 57, 54, 8, 136, 51, 157, 33, 158, 4, + 121, 72, 56, 126, 48, 188, 251, 103, 142, 168, 2, 203, 161, 5, 215, 56, + 191, 166, 251, 223, 204, 76, 224, 59, 50, 68, 113, 210, 52, 60, 242, 238, + 105, 88, 160, 52, 106, 221, 231, 167, 127, 183, 109, 147, 38, 170, 22, 195, + 180, 142, 160, 76, 223, 142, 109, 212, 132, 205, 56, 230, 51, 12, 221, 86, + 129, 244, 116, 2, 98, 68, 36, 40, 196, 109, 1, 39, 20, 84, 202, 242, 32, + 169, 139, 223, 122, 182, 45, 214, 64, 139, 93, 127, 171, 248, 173, 67, 211, + 168, 193, 70, 58, 230, 85, 172, 127, 192, 230, 177, 166, 237, 173, 243, 86, + 53, 43, 182, 119, 229, 174, 2, 133, 199, 214, 151, 130, 190, 110, 176, 35, + 63, 56, 23, 246, 106, 23, 202, 102, 90, 143, 3, 120, 0, 137, 147, 77, 51, + 109, 89, 123, 87, 242, 85, 248, 9, 45, 124, 144, 176, 185, 246, 94, 124, + 241, 183, 218, 250, 54, 216, 97, 224, 37, 111, 3, 174, 59, 122, 158, 226, + 103, 57, 217, 168, 208, 151, 208, 183, 187, 106, 18, 235, 118, 234, 248, + 152, 232, 115, 176, 221, 31, 129, 169, 36, 149, 205, 35, 101, 70, 145, 2, + 149, 171, 84, 41, 229, 26, 73, 52, 233, 43, 10, 101, 82, 222, 214, 88, 239, + 49, 81, 25, 248, 250, 244, 49, 72, 81, 237, 104, 98, 51, 37, 186, 158, 26, + 94, 143, 124, 9, 62, 38, 3, 50, 138, 52, 125, 9, 63, 232, 101, 31, 167, 74, + 189, 102, 190, 129, 115, 167, 25, 192, 223, 217, 117, 182, 51, 182, 151, + 191, 173, 79, 16, 204, 155, 233, 218, 144, 73, 36, 187, 1, 96, 252, 18, 95, + 42, 245, 78, 10, 11, 18, 42, 184, 3, 31, 191, 83, 215, 180, 170, 23, 15, + 64, 169, 203, 190, 151, 254, 199, 97, 23, 158, 207, 11, 131, 112, 49, 45, + 203, 156, 103, 44, 252, 47, 169, 168, 2, 64, 108, 40, 229, 52, 173, 69, 81, + 13, 123, 99, 121, 184, 92, 123, 18, 119, 128, 176, 22, 150, 45, 109, 30, + 141, 85, 229, 183, 226, 193, 149, 26, 228, 153, 104, 230, 41, 81, 177, 52, + 41, 235, 215, 152, 155, 172, 145, 241, 91, 75, 72, 160, 103, 95, 25, 88, + 187, 40, 51, 27, 47, 154, 13, 57, 4, 104, 167, 191, 164, 73, 228, 2, 219, + 224, 122, 93, 201, 133, 221, 201, 213, 178, 50, 123, 203, 178, 173, 205, + 107, 148, 6, 167, 244, 91, 11, 115, 250, 209, 28, 11, 146, 82, 74, 116, + 102, 109, 8, 23, 176, 12, 74, 206, 237, 100, 186, 178, 76, 166, 198, 52, + 225, 18, 9, 254, 184, 245, 224, 155, 2, 10, 75, 56, 236, 73, 233, 240, 19, + 147, 167, 184, 17, 160, 196, 135, 19, 35, 3, 70, 91, 147, 64, 138, 218, + 252, 87, 33, 199, 68, 116, 243, 117, 2, 20, 220, 245, 28, 125, 54, 146, + 163, 183, 115, 120, 67, 155, 244, 51, 198, 220, 116, 48, 120, 186, 90, 168, + 210, 83, 97, 161, 69, 241, 53, 92, 135, 74, 133, 134, 30, 134, 245, 246, + 22, 246, 99, 102, 159, 92, 208, 126, 210, 81, 17, 119, 55, 12, 70, 238, + 226, 69, 176, 22, 23, 5, 204, 140, 217, 33, 220, 223, 218, 201, 23, 68, + 174, 181, 12, 161, 97, 146, 221, 122, 107, 19, 14, 163, 228, 161, 204, 230, + 114, 202, 102, 249, 101, 24, 123, 177, 86, 132, 182, 61, 16, 4, 141, 38, + 96, 222, 151, 181, 40, 252, 3, 195, 46, 194, 251, 185, 122, 238, 78, 196, + 213, 252, 191, 127, 232, 171, 6, 63, 74, 3, 71, 133, 140, 132, 219, 170, + 107, 213, 141, 59, 37, 81, 120, 193, 157, 108, 2, 0, 153, 100, 177, 252, + 152, 6, 213, 194, 175, 135, 73, 145, 34, 94, 3, 164, 94, 46, 14, 108, 180, + 112, 59, 73, 36, 210, 240, 194, 69, 35, 84, 115, 32, 26, 11, 76, 44, 115, + 156, 141, 108, 153, 180, 161, 195, 103, 109, 210, 88, 100, 40, 34, 20, 44, + 94, 51, 107, 104, 51, 190, 207, 128, 254, 221, 16, 76, 211, 182, 183, 181, + 252, 13, 95, 186, 119, 66, 134, 64, 41, 255, 97, 249, 179, 158, 158, 127, + 88, 144, 201, 53, 120, 109, 158, 240, 84, 211, 187, 121, 0, 138, 233, 150, + 200, 11, 181, 220, 15, 43, 111, 139, 241, 187, 143, 36, 120, 193, 228, 238, + 152, 7, 173, 159, 2, 105, 118, 64, 36, 55, 183, 246, 114, 123, 42, 161, 56, + 175, 9, 244, 205, 17, 89, 200, 241, 3, 40, 124, 134, 23, 201, 207, 110, 41, + 97, 152, 89, 32, 113, 74, 107, 172, 96, 244, 131, 213, 91, 206, 61, 107, 7, + 113, 85, 213, 21, 188, 171, 110, 3, 180, 172, 151, 174, 223, 108, 135, 32, + 109, 159, 140, 247, 78, 104, 143, 10, 93, 135, 220, 86, 80, 227, 238, 46, + 142, 28, 174, 90, 180, 120, 55, 196, 113, 54, 129, 48, 112, 92, 72, 187, + 225, 189, 148, 71, 79, 247, 255, 126, 179, 45, 173, 120, 42, 236, 63, 6, + 227, 251, 76, 228, 126, 42, 11, 251, 211, 172, 16, 63, 223, 246, 92, 112, + 123, 184, 114, 62, 203, 150, 112, 17, 128, 114, 156, 207, 224, 235, 199, + 166, 11, 128, 56, 185, 221, 7, 121, 116, 100, 36, 113, 10, 246, 188, 200, + 39, 119, 162, 208, 130, 141, 144, 220, 90, 120, 123, 10, 215, 237, 16, 24, + 18, 219, 252, 115, 11, 2, 244, 166, 142, 3, 10, 190, 25, 117, 3, 60, 91, + 112, 4, 65, 157, 219, 142, 116, 171, 5, 65, 47, 113, 60, 118, 17, 168, 248, + 94, 10, 40, 123, 144, 91, 83, 251, 2, 125, 26, 19, 133, 150, 96, 18, 80, + 135, 194, 169, 210, 174, 140, 225, 173, 47, 52, 230, 75, 219, 37, 122, 38, + 179, 173, 177, 65, 149, 73, 55, 130, 78, 229, 22, 203, 145, 85, 69, 246, + 244, 13, 197, 85, 162, 73, 138, 69, 225, 241, 136, 235, 59, 138, 28, 34, + 171, 34, 77, 88, 52, 141, 98, 70, 50, 137, 73, 31, 214, 43, 58, 219, 156, + 244, 81, 97, 129, 237, 213, 61, 116, 66, 108, 149, 204, 220, 139, 81, 164, + 34, 182, 111, 63, 217, 161, 221, 103, 76, 215, 127, 179, 205, 35, 162, 44, + 76, 66, 216, 85, 97, 108, 193, 12, 140, 68, 21, 210, 236, 129, 236, 91, + 253, 203, 200, 209, 164, 107, 22, 3, 150, 5, 105, 153, 145, 5, 28, 159, + 165, 75, 16, 21, 119, 46, 108, 190, 120, 211, 41, 113, 45, 149, 125, 211, + 22, 39, 197, 61, 220, 39, 225, 111, 2, 236, 83, 224, 157, 212, 158, 87, + 152, 128, 147, 7, 155, 127, 33, 102, 156, 239, 154, 149, 215, 144, 193, + 222, 169, 94, 46, 128, 22, 186, 97, 26, 144, 151, 221, 206, 165, 120, 249, + 235, 145, 2, 144, 86, 77, 23, 163, 108, 225, 244, 198, 209, 119, 101, 147, + 252, 165, 93, 152, 198, 51, 70, 136, 138, 120, 60, 123, 5, 13, 253, 209, + 109, 40, 224, 244, 34, 230, 54, 3, 178, 218, 114, 157, 119, 76, 143, 200, + 58, 96, 35, 220, 113, 171, 175, 118, 172, 21, 159, 252, 64, 32, 2, 189, + 198, 204, 177, 250, 168, 213, 9, 144, 73, 245, 61, 45, 124, 201, 122, 53, + 208, 58, 156, 201, 115, 10, 250, 83, 89, 25, 2, 219, 57, 239, 215, 2, 213, + 220, 92, 248, 192, 67, 54, 241, 155, 181, 85, 58, 113, 125, 200, 151, 54, + 8, 176, 105, 60, 220, 63, 94, 230, 45, 238, 3, 112, 224, 42, 62, 199, 90, + 131, 216, 214, 115, 48, 107, 142, 55, 24, 64, 92, 12, 202, 7, 224, 4, 151, + 175, 167, 184, 109, 11, 185, 30, 165, 4, 202, 124, 233, 119, 48, 63, 50, + 116, 247, 147, 228, 52, 254, 5, 1, 90, 67, 135, 118, 95, 234, 188, 36, 199, + 2, 224, 238, 167, 246, 35, 253, 255, 71, 33, 183, 229, 138, 196, 176, 193, + 2, 54, 141, 47, 72, 22, 49, 160, 86, 246, 101, 186, 180, 52, 45, 41, 218, + 107, 217, 233, 13, 244, 90, 127, 96, 140, 5, 117, 111, 22, 10, 47, 218, 21, + 243, 214, 216, 221, 54, 218, 173, 133, 219, 106, 193, 208, 100, 164, 189, + 140, 209, 21, 186, 90, 214, 67, 2, 135, 201, 111, 252, 43, 141, 171, 22, + 74, 250, 215, 3, 39, 218, 100, 236, 160, 140, 95, 19, 191, 121, 202, 3, + 255, 171, 42, 192, 145, 254, 63, 78, 3, 72, 86, 36, 253, 152, 128, 51, 12, + 223, 60, 253, 221, 229, 117, 100, 123, 116, 236, 111, 95, 70, 102, 21, 197, + 96, 92, 172, 246, 125, 165, 233, 47, 46, 109, 71, 148, 168, 69, 232, 231, + 182, 78, 51, 181, 90, 215, 66, 213, 182, 4, 190, 230, 166, 140, 156, 98, + 50, 72, 167, 187, 149, 109, 85, 38, 204, 82, 125, 224, 14, 122, 91, 10, 35, + 168, 208, 156, 133, 13, 97, 228, 115, 135, 141, 85, 29, 220, 32, 27, 75, + 202, 167, 184, 38, 100, 242, 77, 158, 210, 130, 55, 61, 251, 159, 61, 253, + 162, 7, 222, 83, 188, 200, 216, 106, 207, 44, 142, 60, 178, 82, 8, 106, + 211, 196, 226, 145, 114, 163, 159, 3, 194, 157, 97, 93, 9, 33, 220, 197, + 101, 36, 69, 241, 159, 249, 76, 143, 78, 8, 112, 233, 182, 81, 149, 246, + 32, 114, 20, 161, 150, 86, 10, 77, 3, 20, 87, 56, 63, 21, 115, 40, 103, 33, + 178, 129, 133, 242, 254, 22, 220, 8, 97, 235, 67, 125, 151, 152, 81, 211, + 175, 144, 231, 68, 170, 210, 202, 223, 138, 152, 226, 140, 38, 32, 57, 26, + 178, 97, 14, 96, 69, 134, 60, 111, 243, 118, 254, 31, 84, 139, 42, 2, 183, + 115, 216, 95, 27, 151, 132, 210, 137, 195, 135, 247, 16, 1, 227, 69, 72, + 191, 227, 133, 170, 96, 207, 141, 144, 92, 184, 192, 146, 75, 219, 237, + 155, 122, 190, 225, 116, 67, 255, 96, 166, 171, 149, 64, 140, 30, 38, 154, + 5, 97, 22, 198, 30, 5, 110, 185, 174, 164, 122, 109, 28, 250, 132, 190, 10, + 143, 64, 155, 219, 122, 254, 3, 231, 160, 139, 195, 18, 235, 74, 170, 92, + 199, 143, 113, 182, 180, 106, 215, 210, 121, 214, 149, 118, 253, 224, 140, + 245, 98, 96, 147, 226, 18, 151, 242, 3, 216, 150, 33, 84, 24, 53, 46, 183, + 252, 249, 252, 61, 133, 84, 107, 121, 163, 41, 195, 194, 93, 135, 3, 155, + 36, 173, 0, 56, 118, 210, 60, 22, 250, 215, 156, 79, 233, 159, 176, 191, 2, + 79, 156, 161, 142, 72, 238, 74, 225, 201, 158, 145, 167, 42, 147, 178, 147, + 33, 232, 52, 199, 93, 213, 181, 171, 94, 9, 232, 250, 129, 104, 95, 100, + 212, 29, 210, 197, 147, 119, 168, 217, 20, 112, 126, 244, 150, 91, 76, 54, + 77, 25, 130, 169, 104, 26, 66, 250, 213, 102, 208, 29, 68, 90, 116, 114, + 156, 179, 49, 198, 101, 163, 201, 205, 127, 185, 78, 254, 252, 207, 97, 7, + 79, 92, 153, 124, 47, 174, 85, 2, 73, 8, 68, 163, 224, 117, 215, 32, 163, + 251, 182, 255, 213, 35, 167, 247, 6, 87, 19, 125, 199, 1, 152, 112, 59, 2, + 151, 14, 138, 12, 126, 219, 3, 140, 58, 0, 237, 219, 177, 143, 83, 159, 15, + 245, 209, 125, 208, 112, 80, 74, 205, 230, 112, 1, 129, 37, 31, 87, 108, + 17, 98, 63, 46, 197, 29, 34, 155, 89, 77, 120, 47, 59, 163, 187, 207, 46, + 155, 84, 236, 165, 199, 161, 78, 218, 192, 84, 13, 46, 32, 146, 144, 237, + 182, 217, 151, 255, 11, 51, 51, 172, 44, 203, 166, 232, 228, 50, 174, 113, + 92, 110, 49, 229, 62, 6, 203, 72, 172, 163, 85, 3, 169, 235, 223, 202, 3, + 78, 230, 46, 21, 136, 120, 245, 210, 212, 64, 96, 113, 135, 209, 28, 160, + 174, 109, 222, 87, 72, 7, 10, 27, 23, 46, 143, 75, 74, 211, 135, 37, 38, 8, + 104, 251, 2, 165, 16, 46, 178, 242, 76, 94, 13, 24, 117, 183, 161, 99, 132, + 197, 44, 201, 212, 181, 18, 40, 39, 233, 71, 50, 11, 54, 96, 25, 48, 217, + 208, 3, 106, 171, 156, 174, 81, 143, 144, 58, 193, 96, 124, 254, 76, 250, + 78, 183, 154, 255, 170, 52, 36, 224, 116, 239, 67, 51, 41, 136, 190, 179, + 77, 131, 231, 143, 110, 186, 93, 121, 35, 89, 115, 62, 224, 220, 52, 70, + 26, 13, 208, 206, 162, 106, 160, 111, 162, 40, 11, 96, 85, 124, 44, 246, + 191, 212, 215, 10, 3, 34, 97, 217, 92, 185, 210, 245, 131, 191, 128, 32, + 86, 240, 63, 177, 122, 2, 137, 63, 108, 230, 191, 69, 110, 208, 142, 235, + 110, 71, 131, 184, 234, 19, 19, 63, 183, 166, 170, 6, 70, 213, 227, 233, + 112, 231, 49, 98, 212, 162, 50, 150, 182, 66, 208, 10, 238, 167, 118, 214, + 87, 225, 3, 237, 167, 238, 23, 11, 219, 51, 99, 76, 201, 205, 112, 151, + 248, 43, 218, 66, 117, 143, 176, 74, 227, 184, 194, 103, 137, 208, 80, 222, + 82, 247, 198, 2, 219, 136, 12, 110, 49, 2, 106, 190, 183, 104, 65, 164, + 207, 191, 12, 17, 238, 21, 49, 102, 86, 219, 50, 46, 155, 126, 174, 15, + 200, 144, 248, 148, 61, 33, 206, 170, 6, 100, 228, 22, 244, 79, 140, 153, + 3, 155, 41, 217, 144, 240, 140, 61, 97, 126, 236, 45, 153, 212, 78, 173, + 238, 234, 21, 38, 4, 13, 49, 101, 118, 199, 185, 86, 123, 231, 230, 186, + 175, 151, 140, 123, 3, 210, 14, 105, 79, 228, 67, 187, 173, 6, 70, 186, 43, + 136, 110, 63, 194, 43, 28, 222, 117, 9, 75, 133, 107, 81, 235, 105, 139, + 136, 194, 20, 63, 148, 221, 65, 213, 131, 216, 203, 11, 29, 211, 8, 41, 53, + 184, 225, 2, 253, 171, 247, 242, 164, 21, 132, 222, 106, 215, 58, 116, 234, + 80, 89, 252, 252, 52, 206, 159, 246, 87, 145, 102, 88, 224, 30, 107, 227, + 2, 104, 110, 2, 163, 82, 171, 85, 8, 135, 240, 171, 53, 245, 8, 134, 108, + 4, 176, 99, 236, 88, 130, 194, 201, 166, 231, 251, 142, 19, 152, 77, 111, + 61, 67, 212, 44, 68, 30, 33, 239, 246, 82, 95, 88, 183, 175, 78, 141, 45, + 179, 95, 173, 191, 136, 246, 25, 114, 29, 175, 244, 74, 212, 125, 228, 9, + 166, 37, 89, 224, 170, 100, 118, 203, 33, 186, 221, 91, 223, 87, 228, 237, + 178, 167, 238, 177, 172, 66, 240, 71, 188, 46, 95, 255, 125, 251, 161, 78, + 168, 193, 174, 225, 18, 220, 75, 147, 156, 102, 133, 204, 205, 130, 18, + 242, 113, 172, 26, 108, 106, 17, 162, 241, 187, 178, 211, 218, 174, 136, + 194, 202, 62, 124, 3, 35, 141, 252, 96, 127, 240, 244, 225, 253, 222, 88, + 46, 45, 234, 232, 155, 18, 226, 171, 200, 203, 163, 56, 3, 77, 135, 50, 28, + 229, 175, 124, 182, 2, 91, 28, 238, 131, 167, 82, 51, 76, 132, 243, 122, + 243, 153, 88, 110, 41, 45, 24, 243, 144, 71, 125, 234, 115, 189, 236, 90, + 106, 19, 93, 156, 103, 37, 148, 111, 184, 17, 91, 226, 39, 156, 2, 179, + 205, 185, 161, 58, 113, 119, 86, 108, 74, 149, 17, 116, 201, 255, 6, 223, + 137, 196, 183, 88, 171, 139, 156, 97, 35, 94, 254, 182, 242, 180, 18, 84, + 4, 127, 11, 53, 215, 91, 35, 150, 8, 170, 250, 248, 189, 135, 129, 155, + 184, 236, 203, 162, 161, 94, 231, 19, 8, 12, 83, 168, 120, 79, 28, 159, + 204, 82, 41, 231, 16, 231, 8, 150, 24, 17, 84, 105, 61, 41, 96, 33, 38, + 236, 99, 130, 55, 2, 14, 18, 137, 145, 64, 141, 30, 8, 65, 99, 234, 197, + 231, 156, 145, 192, 215, 58, 189, 234, 101, 77, 111, 174, 151, 198, 179, + 178, 112, 14, 122, 74, 2, 255, 118, 129, 151, 26, 140, 141, 67, 203, 207, + 207, 31, 105, 48, 14, 230, 130, 93, 111, 76, 158, 224, 36, 151, 215, 219, + 220, 248, 13, 147, 196, 9, 218, 203, 102, 66, 125, 252, 116, 48, 197, 70, + 60, 187, 46, 54, 26, 189, 208, 237, 44, 179, 95, 55, 4, 167, 228, 175, 183, + 85, 254, 64, 53, 47, 4, 134, 176, 182, 71, 216, 249, 183, 171, 188, 0, 158, + 1, 20, 199, 10, 75, 180, 225, 48, 73, 207, 104, 219, 146, 193, 74, 252, + 248, 56, 153, 247, 56, 180, 220, 55, 213, 210, 73, 86, 193, 60, 89, 139, + 238, 5, 60, 61, 55, 26, 63, 118, 168, 226, 94, 128, 245, 54, 150, 66, 116, + 134, 177, 174, 3, 175, 84, 216, 8, 42, 65, 162, 196, 119, 113, 66, 52, 219, + 175, 230, 107, 173, 174, 96, 237, 139, 9, 39, 202, 147, 188, 84, 209, 194, + 5, 141, 243, 2, 105, 136, 43, 97, 68, 140, 9, 103, 86, 97, 181, 146, 93, + 203, 82, 225, 173, 213, 118, 152, 121, 194, 255, 61, 235, 46, 163, 221, + 138, 98, 120, 224, 67, 205, 193, 214, 183, 230, 83, 199, 142, 55, 89, 82, + 95, 245, 17, 3, 149, 227, 165, 12, 148, 50, 88, 37, 144, 202, 205, 141, 94, + 85, 227, 100, 9, 18, 78, 20, 189, 95, 244, 92, 205, 165, 11, 6, 252, 93, + 146, 88, 22, 166, 34, 133, 101, 171, 208, 6, 143, 106, 18, 171, 117, 14, + 87, 35, 47, 239, 133, 109, 142, 3, 108, 1, 127, 208, 90, 160, 56, 138, 81, + 126, 62, 229, 149, 213, 10, 103, 94, 24, 167, 216, 239, 85, 91, 19, 200, + 69, 3, 170, 233, 43, 133, 180, 164, 37, 218, 86, 177, 139, 54, 120, 103, + 247, 207, 141, 84, 136, 239, 25, 189, 138, 102, 35, 0, 186, 226, 91, 137, + 220, 253, 2, 80, 70, 174, 240, 67, 32, 5, 3, 219, 139, 216, 221, 246, 145, + 64, 39, 235, 113, 181, 98, 53, 84, 219, 122, 164, 209, 67, 184, 93, 32, 53, + 6, 2, 96, 36, 189, 113, 154, 82, 130, 201, 33, 126, 126, 118, 60, 63, 248, + 240, 35, 123, 37, 31, 187, 41, 8, 96, 193, 127, 167, 85, 253, 111, 135, 62, + 130, 17, 197, 220, 171, 254, 54, 255, 253, 195, 31, 144, 39, 231, 113, 232, + 0, 213, 221, 156, 7, 27, 219, 85, 191, 104, 221, 1, 103, 104, 207, 52, 130, + 100, 69, 177, 0, 57, 92, 226, 82, 249, 155, 129, 47, 79, 21, 115, 177, 142, + 7, 60, 224, 100, 106, 36, 96, 173, 24, 115, 45, 243, 140, 2, 240, 52, 226, + 73, 193, 182, 10, 152, 183, 167, 239, 18, 143, 187, 12, 201, 174, 243, 49, + 185, 208, 63, 132, 112, 128, 189, 156, 15, 179, 132, 122, 60, 2, 159, 39, + 3, 255, 17, 151, 247, 19, 76, 38, 220, 115, 132, 245, 169, 176, 249, 238, + 235, 219, 161, 27, 169, 85, 155, 243, 117, 218, 75, 10, 146, 247, 100, 254, + 215, 193, 155, 225, 29, 119, 115, 38, 95, 241, 148, 224, 151, 21, 208, 2, + 187, 11, 135, 17, 16, 90, 183, 93, 249, 195, 78, 154, 42, 151, 52, 57, 6, + 13, 233, 216, 137, 99, 225, 196, 53, 144, 28, 209, 228, 170, 99, 122, 22, + 4, 206, 100, 87, 108, 16, 192, 64, 179, 159, 229, 231, 59, 79, 252, 109, + 125, 48, 62, 62, 157, 108, 184, 76, 228, 137, 179, 183, 47, 202, 174, 96, + 131, 215, 125, 17, 195, 25, 222, 222, 207, 217, 208, 60, 175, 2, 27, 138, + 0, 8, 207, 249, 186, 139, 17, 183, 176, 61, 248, 22, 251, 170, 131, 172, + 71, 18, 134, 133, 250, 119, 237, 57, 164, 121, 175, 76, 48, 225, 3, 59, + 150, 22, 50, 126, 101, 20, 244, 156, 58, 229, 38, 226, 10, 181, 238, 155, + 67, 141, 131, 56, 134, 89, 33, 248, 37, 210, 110, 235, 14, 169, 241, 136, + 25, 156, 224 + ] +} diff --git a/dlc-messages/src/test_inputs/sign_msg.json b/dlc-messages/src/test_inputs/sign_msg.json new file mode 100644 index 00000000..f08dc373 --- /dev/null +++ b/dlc-messages/src/test_inputs/sign_msg.json @@ -0,0 +1,383 @@ +{ + "protocolVersion": 1, + "contractId": "a5808cf4f1e2bb638e33a043cdba1de2fef1344788e431c817677a22597833ab", + "cetAdaptorSignatures": { + "ecdsaAdaptorSignatures": [ + { + "signature": "0264f35bb5541a06b53343f20051cd91f80754b1c6edaef29999deb1677187581a022424fa102051f0bf76b143ff85edcf6472cc377a5be98b3603740c5801b80b2255728764d80400b61aaa37e15b4e6fcb96cfb7186ccb5c6fe27a7b14c80f1407b4a7ecfa6986c934eb7f43fdae874cb3341341bd81211254aeb19a2d25f3e08390d1481de0fe5c960fc12d988a81507fbed45dffaf66f6a2b7f87ef0c28f6408" + }, + { + "signature": "02d80d53dc671ce06b91b2eff2686a9aae678536a34a8d060acdeb29760316eae602564bc71513445bdb1350af3b05081743b5a9af10eca2fccfad8f25ad17d820c2ac1ec2661d90c30a214cea8710c0f14ac5b90b763a7fbb344750ddadd00d20aedbe384d696eb4b6c896207b42e7a81d3285f56efeb46633b2d6d10b5e992a66d19bfa47c34b52fba59f0a9e78eaf43d2e94e0cad58aab3ef6e4b2dfb79f9b4cb" + }, + { + "signature": "028ad28c2fce01c309967aeefcadd308f810e2eb2aaa7efed6ef8b1a9637e8dc6a03ba18f2901e8022be1cefacf432008af478d17a151f1a04fe4c3da29224f300cf08f07aee82bf254c31aa3c9da0a405b379f1ce0ed01d3242788a12009af0dd6e907bb198bcad730db1eea80ae8794a6cdd36914400d2741b37e2432c3730fe243fa16b2b15578c91479b569fa27ae4d5f08620ec6e17f70eb82bc155cc072327" + }, + { + "signature": "023f4df3c6665f29425ced7c62e52fe5fda51fd1cc63e45cbb03ad05fd48989d10038f0f91878fe6cf2df84763e1aa7355710e6f3e334f11ddb80550118da744c28b1a0012faae07c35b570b095a9e3542b061a79c98aafe7d25c016c6ffb756aa51b9401ee3ed71d29a1fb9e427f84181e367923e4d1bece850d0be30f63a3e3d29314f38d679724e27b4cb88412eb302809927fc2a2226aec4cf2127136a659d84" + }, + { + "signature": "0328d9e463f06cdb9747bc2b9b4d116c49a335133b0e2bdb7f26576d020b65387d03a5c5fb3abcec79f05c464915f866ca874e00832cc0077899429bd4a44ec874c179379c2fab34f48b1a1794943b06559b9a37cfd7a43fcae5fb3b1ae0868f3685ad52234bc61ba6f8e3eb63f385a1feb43ed1bbbf4a7dce333455c195ccc0f5393616d8bd0a9b8e324614bdfe762f84b2e7c53bebd555d06b453925f33f67b28d" + }, + { + "signature": "03e4d30b97ff66f1072f944bbf0e03bc3ac42752d28220de0299f8eccd8d6225790331fd9e69bef9730ef1a9f38d8a532217259f7984b3c0945f67d0e272385868d17c51af3123b0bc5573a7277556aa3d5757cd329f49064540a936920f382c25b2c390532a1bbe2b3264e18e588242240d02d0d343ea0c3960974d428fc04e35413cdfafaa92bc0ade28b1bd33a2654a667ae23969995b8cdbac662d1b30a9040c" + }, + { + "signature": "0272c845099cd3c1cc505f52f9bd3065f48f73bdb1ddc8d02ba40bcc2466878dcb03ab42480efe48bb62790ac4f4ccd2ad8b34941e86b533f56533891d3337f0994e01ed5301f3516d5065444b0119560e01ac91aa527dbfa1568cb4a52d32844a75725a9ce3cb634530a0184618fde035e7ad32f14103abbd4b64d7d7d3ec79bd7a340b1890502d77ea68251d90e0e61885540f6fa2fbd97473ac08bf7eb003d5eb" + }, + { + "signature": "0261d88c6061094290529c6646aa0f0afcfeed994146a31242859541a78624c913036d6bcb4df68ffa29cb49e2f7abb0fadfb58e1b2a01cd23573120ca6318e93f9ee701b66409242a993aedc270055a366464de18b12fd702e4fc9e713937dc0e894ee114eefebef438ca2b0c46a2c40b8231d0dc0b85acb4ef7685449a506609c59798e8fe89d2d645c631462182bb8ceb1bf681b6406e039ac48898ffa9d15bae" + }, + { + "signature": "03bbb7cc7227bee040ffb82cec4c53ef3ee3311cedd29d75ddf46a596c3eea0ae403bdee34e90aaafdd77a679b34c59c343aec0f4d32b1c72b13b21d0a3003008a2d675099c6f69a494280d166a2b4469832c160157283188fcb158c9940823be8e74d680123d832a7d560620487f76e83036e74831309b9698c809da1def8b17f41e96315bb4e277f8445623affc8241ce4260833f637109d5db7f2649a4f0c7c07" + }, + { + "signature": "03e7bbcb650e07c043ef5ba5d3ca8056998c6fb2638f32033ad93e747d5fb25fcb02500e3a812cef87fcda110204b4be2313dfa0992264d9dc6f241cdaa03d7151180a77adbfee5ff6a16e50071f3ab7d813995ed7cfa49a2d85b4d50a245773435dc3fab0b97d8b9b5321b7f0c635e27ddc820c0643d45955e1456323146eab8b46567811dc071e6097464b3836dd39c11126bc1ca69dc0af465d339003ad771989" + }, + { + "signature": "030fdd0a8f82255acdf1b404bdcae3da40d09996d2260cf4f4d32fddba7466549402e154dbe716b941b6cf8c77537e39c775fe05255f411f3e04ad4b549195788bf04a54b8c783982ec61462af81a2d8308960238233fcfffbb22b77548de90dbeeda9dd4629b0a63dcdfc4f428243fa22cc99e3d6915c5e31d36f0cf84247765938abef179208fece32df64d1340cfc959c35e2c7dffafb484f5bd9cae94f87e8de" + }, + { + "signature": "03e2e6d10b2a7c375bd9a2771d333dd020879389eb42112a8b2e0dce2e6e61537c02354c82793b92732dd161a3bc3cbc5103519bd34a0e37c6a8126a7129a3d9258fa968ba0224fc4ae05740cbdd3a50fea4fffbfd8d0cbbd3995779b44f1824aa4c54c08d069f1ba08fb05c1c598040f86cc9ce76afdb596a13e16c104cd80b3330c0bde85660644de27bff9c8e9975917744076af0bea2728bc612b701ed50eb82" + }, + { + "signature": "02c84685e39c594ff70926989e79cb20573170d12f054fb04ebd38f74bb1edca9e032258bbdb6ba3cfc995e08d0c916d0b4131339e725c87a0fbdba8a84f31f1aa3ede388ee4d36835017b99edfed7b739db16e492e0ca7626634c9a2507aebfee1da1843c83a01c48392b74007ffc5b80392a1986caeb9df504548857327f54bd73b9f040007c6cc0ba79943672c1b96c79a0b8e351d782996437d389f7b37ea612" + }, + { + "signature": "03e001b9bf190ad00b0bd6dfd303c124d8e9562538a60a1c373f55daf6bb8ab41302a74a1cc2cd0c92cbf0cea417bbd84900d59dba7536e94a900aba4d313d25ee9923eaf271908076288bf863972bac098a8727d68d8c946a04c90330e5922d2337e436c8359a5352fc977e595032f29657ac0ae0a0ced90219937d41473975a282f1f5b4d0d71f2fbc8b24e90ec18e6be80ac0dda7bb5f183086cccea0e4bf40ec" + }, + { + "signature": "0318baa61d5bf797cb37d9985144f0882d65158134ca01c5cb468082f7356660150383a999bd01a6e36a17622d54acb321b9c0d40a229b3bb66eab414d3c748882f9e4b220aad9ea1a149e4736606b465400eaeeef80f054eab1c3a2fc0222045ce37cb43e97352da3708d41009b9509bd0e0a22c63142e0b0f59f1eded21931c12192e52e2979ac28674e371c10aed2e3bd07eb1611933ec7824c4ec1e53e5ac00a" + }, + { + "signature": "03ad32c56ce9014f530dfdb6fd649f45457d5142b6fcd67638394628ab05384bba023c853235dd5992a787edf90e46390d63cb331032c08c4b1484c276f4371b934a27e42f87f9c9d49401d03086d716c1067fc71748daa4274b95636bc8a9393048cb614a85bd5b0375b3550aefff61729879a466575301b30272bf11c868321481a386188536715b94215c9f9c03b1be945d3a4ccaec1cbf4fccf3f164ba5e4be4" + }, + { + "signature": "0384ac46ee4985dbe159cf57241b51e50af3fe7495540d2889190b6e6a4e70e609023a97d86f5ae752c90f35a0932561d244571bc60444fd9edfcbc8fe5026a48dcf4cc91b324f0d9ab110cdb24e88865c75f851352cf67441dfa17da7b9f133e9dced9acc862419ada16d56f4433ee7818023b509557b5a3c874533c69ae5d8ce30e14a7226ba53a01e71d6d587ef8316c002db6f468266e2b5256f0b22f9953fa2" + }, + { + "signature": "03ed2983c2b70cf5e2a2d01cba8932fa5ea9ccb7816196089ce4d3ca3344ba155102e2ca581c07b8cbc3c22aa8925e0892b82f42c23a261513f5c1eda29fb85e6fae27b30fbfd9b8854bb914d586a1d9818d2304f87508a1f4ed81e8a38f569b2cc519597ba8fc35d0bf79730f6109e130fe1687d9f24bf58e14bfb8ccc6594510390ba30b798594d024282aedb737e09399344ae319e8e60c97791c4276678df0be" + }, + { + "signature": "0208f99913bdc43f11d454308d91bf9c8577ade039a5c236fc1ac5e4489db98a3d02c5b20886f633833085246d78d09fcaa9ea64d398afeadbc2bf48affb5a19736427d9fc83a9f7dc7811000a2cf3fbc9d7172dcb5225273c43a66500031238164ffcbc240765cbdcefa3818561b91a6e29038df1b97ed544e6e2050aa6160945ff24f39a1e076f7e7c17fd8972d62e02a408412f7e63ab4e7bfa8d61bc49145fe6" + }, + { + "signature": "024cd77c80a9bcdada1136ffda8714eef2e390ada9b9f3bdb8d60f4805dff6f22903aa53f2a70840b583c3b12cef4defb66fd76d13ecf630dacc3d3f2ae7ed4bd282535962ff01c9f4849d0cc52d5b6d776b7e3599f421d6eaab590d7ec5cf2c7bcf245325aa9af10ba7e15dca7a7f99bcbf60d2f9e1d43b47d63486b107a11ef0cbd15c382c9fa16a1ca7a54bc3c003fc7b815d2b920e2cd269ddf42f129d43b62e" + }, + { + "signature": "0386bec17b0c62ca90719a584cc265ba9aeba1a262c4a1e797b3ef0c7438d94b9c0396104c9314f61cc72f87d4a323210e706b11b7f902d7a00cd2a032b2b476b25ef2275e0c466147abbf0703ebf4df3ca46fc9cd9d57808f6c35fc4730bb725126b3a90ffc6f78916632efb9203b35b3aca6a11fa95144ba3e6bae311c0f12da1f7c1d73dd3199dd27067d3352febe2c2f1b5392ae2fcb97a9be0e2bcc58f32635" + }, + { + "signature": "022beea252e6aa02d37236e2302a71e933f9de8221f4b79c17b6eab9d196663970039c703a3898473b20873eac65728276bf014f55f8cacaa17c031185544678054570c790df032634bb82f8f0ca29f373505b52325201d9e8628e55c898d6236c9169c2fbc5bf177c365fd0676f0ddce89bb548b538068587748aa3a021ba06a7b43657bfc690f860fba6d2675fdb55775220ab360c6374f2a76dd7a7fce3af418b" + }, + { + "signature": "03bba64a8143bd11b0383396c8e7e7ce5e0af3162e93557a5c200fe16ab13b4dca021fa56711f3f15217144ccfc1f41c71f51658b2e25ed46348f853f044734c5fcf0245417feefa6cbe1f5019f593aa48a116105d5e9fa087f894495e733b92bf1f6f965b97a233424638a301dc6556d5b9d7d0aa9c45426d366c654f0fc60007ec7948874d6f4f9c61183978acf0c8c1ae47baf79aff9f0fcd9b86b42c8e70a5a5" + }, + { + "signature": "02e1f95ba13860d0f5ebb270e38eb842310113c84ba5e44ac235e3f1f7251837ea0369d3488e5a955ff749b70e1e2612aa262586e6cc9a9735426dfb2c6a43870d63cc1a2d678ba94e084098223642116efddc3bea476ed6da2cae43cfc286df6780da8d6b5fd813021eb5103ff8655fa61cb64a2b3b03ab1ca00053f7a3608e620dd9bf68a7f454a13d5ee9d356fe612924cb622369f5611adb548b77759357248f" + }, + { + "signature": "0218ff907600ab86972ab022df0f71c2115d688fdaacb54c1a133aece42ffa94b303fdc7c04d4359c7def7c27c202a728851575f4e3f4816593501a70b443092e1f09a053e551238d6edee268ade942604304842f441d03257bf2d763235dcee8d38d1ed7b141c53ba872aebfe912f31fc80cc124b8d4accfc2be302f0e1efb0d5436eec7b84248d04df148ec0380ff720990c3d3fc6ba7292dd7d27f1c010cd7208" + }, + { + "signature": "0285b4d2dbde8e71b68a8cda818a51dc3976cb607d6285eb45d80779c8b45973a3038a564eee82c7c8a6283d22b080896067bbb42d73d71568fad4dbced4cf77e06680f3f4a50732ae3cfbbb76566edc604d4da4f61cc64098ddc0132425daed70ce58dc283b0b70a900cba5cef37e802623dd15c604ea7430d0cbae1718f62bad8f8ee62056dc75953af6f1175e4f8e4d8e4921b95f62b86012c57d21898c9522f6" + }, + { + "signature": "03bf5a35234ad61e612066b72b1948146f57b03a439b57831922aa509fb8da997e02421e5224b6f94bd348554ca96d517e273445ce666c746fc1e0bda6801c5f97b969ee590332c45c6f90390318fc45124e9f9de6992746c65cf5cd94cb83977c825df1fc3771d41a5f22af2709bcc6d404ae07098d3e15fc244efad796017959e4e6535a22c3c637b995c29fba81b41879afe86a2fad877929c2e8bd8a1f006150" + }, + { + "signature": "029a37a18e30f361024b941f147c2a76c9f93404f092e2597af1223f94ece247d902b93bf93f3523cb14d927acd6c290760b7579d81d6194f940eddba34d2d82827570742eaa7a6aec53299c3e9c7e4352b82f95a61819a68d1c6dec4a2a46aff7e8952dac80ca21f083689f0303b7b49d0e3cc2c4cd557b202dbde237cacac25f440ad0cf31673bce84616a4658058c1d4cd9b68d2053df4ccc4a8877a0c5c5d599" + }, + { + "signature": "031f2281d52df3fe1b5bf4ad90982a1dd9b92e407f7084964612e2b8e58304ec4602086087a2b99158e5d8873bd9f726eb8d991adb40bdb765d99983298e3eaf959e9aaf244716bd764c801e7853b311249046a32f82135d6e917778c3ab39f513e41b190e8bc8ac24cba64344b7eb998893b30c08f7c457ea0b4de3d070e88c7479eac9935aaa679c1e33820eed7e22ec92ac76220c23999e0887e1e109761ea0a3" + }, + { + "signature": "03a6e929081ce279281b14353eb7356ecda32bb970518f43acc5cadf6abb6101f803848fe255178d10cc0ec5e97da99d4c3d9150cc14172faa80c7a2e120a194c54b034fdadf10e19c73cacc90718f46050845d0756d5205397ca844a7f88d19464688eb2fb5c49c965436b3360f5eb45b820f111db4856f1be2eb06ada1cd99fbb83005116d4552c8b8aa1c1ce42d3d717ec47674d02d06d45438417e5ec41964ee" + }, + { + "signature": "03804d5024cde722f6d065566ce79d763d7305c11c0a0ed6b20b2479d6670bbfa403503dc47ab6c5663790847edaf6859ce38c30aba1f6ace2be71e1a9a2ba940609284e1a248762873fff968d00596edbb563a2bd0cc23e658885bda883479c1704e8e65551c651a877af763022c31ce4e935507b6efd91a85f88040a43bc258f719955f21a8ac63ba3ee2c7ed9e957c662372f8955a29f3238f9ea29f9dec46e0b" + }, + { + "signature": "02c7db9e1b4e181fc6a1e34af7a30b93f8170b4bf1bb6808e5af4de4a24c908e3e0291e13796e98e2679c3aef4b8f638f6bbb872aced7570140879f88bbd4d6575dabff61f9d0515d44b7853e367184eaff74ebd38c31160fca637c7e6a25378a4c797d324e641ca39a07e9d1ccf87fe20f9c9752b8cad14642bd61b336b39c7f9ad2d24369a703d50412d1f3a8f1f348ac75e1b031d90220bf8c8676035428fdca1" + }, + { + "signature": "03616a3d4d68b4a330a62508c18a69fe03212fc804ae4b5dba952ccd3e9d1ae8bd0289bffdd559c0c634f91a5b38d0887030ab139bddec70fbd806fd832e71ad0c30119f9224cebbb813ea9cf80022a74d7d301a276d8316e05a0eb0efefbd7ab1e9b8266cab66706bad89383d9c45d77af8a02db10571a4a3768787ea7b4cca25eb221d720d7e9f12d7479f4a7e7caf955aa06d0f00f478512f40b9e3ec54a4e7f8" + }, + { + "signature": "03441319100cab537599256732a004df731bdeb443f88633fc8c4f9bb49cd83c4d03ff6a913277f2a6ce6422a86db0d2b42f5aac08d6d4dfc0bf61186679d22851efa40e2747d061c69ff63acabbcac1726429ed5e581f59804ca6a9aa90ea01bae4ce5f4e64f924f5fdb06cb8fa9b1264a1d3f685156972c8ab8f9e395ffff888afddaea4049f7fa1f130338ba10391bedffd75d404fd865010e99603f72d47a34e" + }, + { + "signature": "03a4a4bfae8cc33a7cd4f336ce6425bbb85febe58d94e1ce2316dd02d37a6b82a3028e640e81e584fdc25dc99500b38a6ff297797f6cf608d451cc1bd5f0b2a03137a73689a0dfc7e1dd9c7af3ece74fc8fbc77017d7065cc5a2bdfe471798750cff70ebb2ce5f0d2298f07075ff61fc94a3907c931d6730ee5df254ad30158b8530a760950d3f4a60ef98c5397c18a487d599a903fa0ece5203b392ad14411a2e3d" + }, + { + "signature": "0396997a624642bc381489b0e22cb8b65050fcca4386b7ebf3defa6c59976efb0f0280c2b76064c0ce58e31e9161ff0f436f7447ebf88b4a24f6d06075b863365a38564bb312a6b6ba66ed60ed2e82552a15c40e0b8ab13f0fbcbbc1692b4c8b1e144fac352f08ef234baacb4d8086edf85c3183e945449ca42d857ea20779f7eff22cb448abb821a119c92cfb6bd627168252ad02d3a6ebfc7e8298381cdd1870f8" + }, + { + "signature": "03b2fbe82957277be887c70c2657dcb65bc217e1d2a53470f910a0981187d39b0e034a03dd6915a832bc5c8125f789b0bcddcea140c863bd2abf18e008e53804b485738d3a6f3e9b7399f0cfa5e89f64c231568a07b7df3ff70e544b506f98dc476c5359bae7252bf7ec1e41c08e3faa100dad2d69ca69c0aec436a3a7a09dacefded6ef9b69b2f05fab008cf3c1e3dc9790d967015a7a1a117fba29c00395b50a98" + }, + { + "signature": "0228de2793bad989ed2840c36bbff783a755a5b7f497adcabd947375cc087e867d03a9b4f3086a0cb6173f357aa692e3769f4cca49c058a1cd546a7cb0de28ab7065c4caace9c1ddff51c3559412c33f032e831a9633d078aada4943a615d10b1a6c7fd3d8066fc06431025ccab724b221576c0f70ee24790d35b695c2b06020583a03b17f6a3f5c0dcddc1de4661815fa5631fffb72e78402065af7f3fd9d6c8676" + }, + { + "signature": "0282050b1eebd9d63aec0bf4c58a24da6abdfa3a41adf336eea8918b11319b718c0354e7f2c8a47b0c9167542f4f0f9b1dd7bd2d2f9dd75be94a0ea86c893bf7207fa9738c60f6b9957fe43f969926e3042f588df039ed2e2b0670f1b9b09eddb98536b872bbab5709dce7d6c5bde3ddbd3c38b30fc593d1f5fea733d1a84acb12213e0322b213e7fb77a8fa3c3c34ab07e5c6ab53c4e39f5bfc9832e5ea7a8f2053" + }, + { + "signature": "023709863a8391a162480383d2c14a2da5144246d37657a2c7dcbe058751aa900903b090fa8d7c9598951d7ea83b6c15e4adf779cb40bb2975d05f4240aac077af61423985711a991e53dd47f14f4f8f8e8667e25c51209869265a171c0751cbddd97e4699b1fd3a2b135ceef94bea95a2d084cb1239d3bf5a7cd09afa232a5f59078cd29ef9f3089ff827e5d611a7091f2481a3593b3e605c6def73221517c406a7" + }, + { + "signature": "03dd5b9d92b4666a635297662a46497182869a1c61e1af4881e943db31ca27e0290243c373019ac4f8231271280addf17f336e76243a8ee1ca535c7ed4d88a6e0336738b4b0a193b6010e2238df962bb86b2df61731ea82187c65112484f2076cbcca2a62666c9c76a835bb879806e786a191768a2ff9c8a623240cfcb5f2a9d19f65d0780a96ff73d96b5d0763e9fd6488c54eee0517b534c3ca347265ccf326dae" + }, + { + "signature": "028073bc327dfbbc0bcbd7b7f3ab8c8f04c9f228907b3986575b05f4d9c3418bf803097ec34bcf675a92697e49c30834b2a4e3288f7149058f7ea124e2512cad056bd54347db6fe4fc627ce579b74cf37adec924b95aa902efb0b507998243c969bc748247bdc7571f2aed709a3e646c35218b32439240e3040a108fc3962245380cbab7c301c5661d1f804fe4dc42c00baa96d253092cfe27948184c28c64cd4d13" + }, + { + "signature": "03cb85a51e28f3e084814a82f8819f4ba60ce219d56a8311cd9d8bb61a4357cca0038c2dc5a593826f4bd3755ef74129ed8ad3bd74b993cf25e2c245f72e6eda26d8034a0aa18fa1572f49402f8b6861b31a56c7dafcb81239cbd08dc10ffa9039154bc4929b80aa37d6d9949104d890a3d83534fc2253e72bc37a94097e7aeaa0c5bcb86fd37992782db6155e821dd324ca52e1168d37759cf5b2dcc6ff19c9041e" + }, + { + "signature": "025a718548e86b17ae4bfa77d10050c4bae9b236e85e81702a06e2c8b45e9de71a0323b2c54a7166438b5271810224ddd6495f20073ac05ad5d99734f2eea00559db55b893e955f234088d3ffa84e6cf704cc82347f0f8063e27ecce1d1c3b0df7d11ffab094fc2208de3219c1ffb35cf38f22bb174fc9c9f484238a7e655953bc6796fee7a6b727c1e4a8c265257615649724a21f9596d69a666a31d653f66f3ec7" + }, + { + "signature": "0262853a276cdee3e12106b573afbbf6b97fda17cb71e4312a5d5aed908042ee4803d650a501437b2ea69d4c06e578ed4080543979a40001fa8ce8daffcb1054ce6bdc808c62a31789f3afc590e788f9e33f389097e32473faf7c7469306324c697c86f6a1727b20c4857e0eac8019ed6032674913a80e13508bd996dd3c0cf4847891a2d94a2d5c67d57b5a8808b5f1b1867a44219c9f31c1b94acbb3e9542be261" + }, + { + "signature": "03861fd280ec3ce8d11fe62e541ad1833fcf18b96f1fd9934690c6c8d3256bdc6d024add0fc2a984139e8286ab9a52643557a7beb828649142ebcbe76c20c9c6f62a2a03bd40fa820713d065c4a7676145cb2a59698f912da8f6caa0699f11680426a3722ad33b25e24bf47caf4aa4797ddd947d183e865c635c2abfd3b198a5bc6c8045b47cc3fc767b3eb568ef4b58154aace38afe0744e144bcdd9063c0c40703" + }, + { + "signature": "03222b1cdf734f21546e356b85206780849aaa13056176b31294156c1083ce0bca02c935d34b906a71b13df2a9bc41aa8d69ad8cd186be1d1647b62f1e3f46f5bdcaf208c273b050117c15273822799ecae4c63deacb8ca04a1114a0111cf62c1da5f28182319115568b1f5f54bf97602ba36da0aa14f6dde63362dd1b04a164516f0394a359dbe39855c5b7eef0bedbff164d3473fd03bc7650c2459a52c09b228d" + }, + { + "signature": "02b85e3e66d42f601502aa8f2363cb4b74907b215e568aad770981bfc0d593755702c8403dc3c79f192bf27d91925c51d1b6a3e734f44b26929a2786bcd5def98e77c7261e509ba70af81f812e4ecfd88f525b91ac4c94bfd72b29160735f4abc5b36a4d6335b0950a62427717841e8afc0ae52ca5ef5fd15637e3a72f31ab873665042288673512814a32562c8c778ad44786e2124b7babfab187480ea5bf2e3722" + }, + { + "signature": "026a665c1a2e3584a2d0100c74bebb31a5a6936c59c79660363a7672e52b577d2e034de99d99438c605480f4b6975b4439de967c30c9e241f204b7628a5b3048c9cb1e9d8a6723896b58461f1b34974cc50480fba38f352acc1b90da0a2da63fd16015b461b77e9c89442ab37a75ac5de05d838e815ee5698f70d3645d2976e00b2169b177e57f704a5ab55d9de192d7600181810679a8955d38a97d8b09c5a45889" + }, + { + "signature": "020cc18f841d89836c2901f341e3302e2d97124813c9064e85680875608a5ae69e028fd7e2ff339ef0f8e91dbd465582767a04aaba6be97880d29e55eb69c18d6d7148b2897fe2e027940574484fa21c75a220b273435a44d4e534cf8a82fce8fe8fe9f278b3577451d2a3d8d3b4cf1006c56cda2d76c8cf456af485392eb74456e799806d6db44891f6a3e076312c02595bdc501d39518ad2bd58df3fe96bc74ea7" + }, + { + "signature": "03a36f08cec901a599dba49560fa06a03417021d283433b14f3a0231b242147190033cfa2fd7a7926a97d7cbe6971893840df4bda15142f98fc1ecba180ed8f86a854c8643b6751e06e817fe515cbc1db97f65c3325607f590ddc8593a9b9b3e4ce7a5bd3379fbb46b4b69a542155dfd3b24265fc51637a0624b8cbb1aea53c250ca2227edd4b9f13f409c8499952291c624912256de7076fb04fb26f47a23677513" + }, + { + "signature": "02cb3687cf4fcd368a2c4b6bdb56942f8850d3592e699a662a9bd3f1c49eec63a6025947624883d059c7f6d73a03816bccfffdd7e4162a09ad28315eee97e1cd1a6913d5b40b948ea982ffe5a10841119baf2e7a9270008e1b34f7aa6d923365b031b60eaccfe5b92226f156ee25715224ae4b9d17a3eb0af96ee87c04a69da33359350feff5a30aec583bcf0905a977f8ae46520ce5df6ab6e8180bf046b98eec6d" + }, + { + "signature": "03483cb275ef26e2d32df57d1f1d4f035bb0729ba5ed11bbc950838375675b3c9803b6219854849d053a6cce15b06bdf9fff8fee4a4543293ef84f031991d7df870fad769f0285d08e083135e6adf87d50c9102f14d787a56838a8a769a6eefc976f3bd46c3bdbcff78911eca2c42480ff074f691e1b6bcea047ffba36ececbabdd6437ef4d687ddaf38ce4b19198761adf06ac0abaaf2c9c1f51a3f18c181cd4c54" + }, + { + "signature": "021ee21034fb8fa31446738b404f8eb7be2965c76ccbd259c0887e8821f2d6c14703b4410db401f5d4e1d961a1224a4ff6f7ddcfc36a947ef7b065a420ac808658ef8152619a3e8e99c131c0c78f96553caf3d66cc97bfa99e7676094978fc19bb11c35bffdeb71dffc701116e752b62490d3e44b0f59f88dc39728ef70a78978dab44caa4a2ab43af6aa75826b9ea0dda4b0a47c0c3a9220e59bd04c2b8b07bb06e" + }, + { + "signature": "020f3fed1d717d755e8169aaf0a91476d75bc8bcdbd5ba681a0908b779dcc7e74d03c11c2c953acc8850045c21e0fb5b33a2cad7c1758f47fd94638ea4cc60d2b921fa71ddb79e78c5be28f7d519587e775635e81da414f4bc3798f50a4eda30c552c612cd2ae0624419b7d6772b1a4fb3d46ed0f504b6f49e9e28409a0bb4700505f731d9a28594e26b0dfd4212bbd3c917faa1f29e02eafc3a0eaf04ced56c1d0b" + }, + { + "signature": "0264ce25d8cdd5d64f2ac2d31651bf0164a674b7bf1f569066f07e065dd51a816e0349720a69f6360e3a2478bbf974cc6cebfdef6df267f3caf47fa214e54aabdd661eedf691df8ecc1922f3b306eb1f6ad84c0c131ab21aafa1b3303c4fbf2b6229afea84eae8f39baec6d3c34ba26d626515d68b86516841ea2129e2fda8017b801b7163e4ff2004d1a0ca7847bb58d39a54ebc52d69b22b99abe6c0c6f29ae9c8" + }, + { + "signature": "0335da0937a2f86f54927545c14e09de71b5c64ea8bc8e7c77dfd15f3726349b0a0298b23fad30c5a3467eb771e24f6200234503355c58116aa01508250197f35304f434ffc04dd1e90d95fd672ad4865697b1751bee044067d26fa0de5210c734d481e49d3b8f2ffa65eeb7161c0c27be20139f59d43b4a675305370ca0744c59512b80c88d68670482a49c6183cc3a21a3767b114d1e6ee39d6c26cdae18423221" + }, + { + "signature": "02676f014e707a4b91da1fc9c687ccaa350a7407aba7e6c326c54861c85e098b4803f2524da9510ef743f53df52ad5975d7dac1d8dbd10c936d6c663c300fbb503c20878013438988c056b838c6e1bc6c77e70742a2be02708a0466bc266386ff73a1b1c59e9affa208101d5b73d7a1c4796fd84d071c9f2438ccc51a1a0ac25ffb7ac14f5c909b2372af754648f2909b734ca4cd40a82980bcf5fb0f0e3418eb518" + }, + { + "signature": "03e1a0e946b635aa172cd7d9cdb997c63b80d3ade5e1099547b745343dbe49aced022bd425b68a13ae0156a59965f723afc8b7ccf2068517d19e8b83f9e611fc31157bdb62b44b1004d3d71bc6c95e3fef5f9ac5e6cbacf7b5f85fe09d127e4cf3cf238cc2f00d14dbff8211c80e8ce0e08aa706e4723c938111dee591c9cf3a7d694a7babbccd6c2767a38a67b49e3b3b1853b4732d53da9bdf5b0bb7584096516b" + }, + { + "signature": "0398dbcae60020bfd9f62945c7f3bcc3001ea7ee88f22e85fec4fee146429e890a0356cf9c76dfe87a748a139d1aa7b67e2e3ad43d15f57f15ed0e003284ee060406f6e095b58fb019fce6395ef7f8dcece09584630d390139a6e1c04a08095c67c6ebd93fde7aa0fd01bb8499b04a90a3700d8154c6eff97c44e1e29f0d6702ca6bb47771fc2c2355dcc126640eb25756ccb71260154f9d76fad884be76ea440e0b" + }, + { + "signature": "03f4965248c5060465d3829cbc66e1922938a36cc2dea29aa11d21b250e70732bc03f3a1932287ffd7fab0a8f0bc9d78010e3ef0ddba93fd7a886aa0d260aeeb5214044bc49b45034836e8d5c627fb0ea3514cc8de06a742cbf7de7c9918c20c9bb5eb7ee3ad6ca4b14eb6a7b47a5aeb72d48c26969825beed3d886da775374ebfcbc7faeb1239594d401d9bcb379e455b8cd5122bef317ca1b4dbfc2a7ede13ba00" + }, + { + "signature": "0383702690696b4499fe30012ea97b243fc594769e4630f33abe6298a633fd8b7b0349636d27189b1fdf6a2865c29610e169082911cab8ba4b77bb7d06a572884288d3ba78d7c22934e3a3d2d35c75a6a29a7b735411a5dc5c673e7c2597428b4187621e258ab3fbf02cc687ec066e8b37de349af8900bc3acb2074f6b1233d7485424fa13b227a9c67345ce40657870fb597e4b565fb398ae54de75f6ae466691f7" + }, + { + "signature": "02833678f750a1dfb3102fefdb13e9a546a948b9ac65e9c339c28a42392aed5d7003520578b4511e17e9b742c44c005061c8218d394c99d637b09621d02b03611623b26a9d44a3675c16fda2aed0256ed37fe51b12e2b001360972c195bce04d142282e9bd7c8b44e9e74e4506870a6e10b20378adf1103ecc95b3d5fd8239d545ce1258443d61a9e8edc04725bcce83a72f892a9c8e4c4fae48fd9da53e644a0eb6" + }, + { + "signature": "03eaf03f0893d300fe052802bfbcd0a2b0e0c4e010c14e7c935ee2e5a183e8233d02bad09ac69ecde791c8d6614172480d0642bbfcb90687a1a7e556f111978a5e7938168b3ed3b3bf6997798ac3dbc56fab2a465cb07d8063d8ca93e7cd7df4732751716039584e5eb4cec73edb5e6ff85f51b6031678880ebf378f79223c2cbcd34edb9e94df00ddc758a53a2b30be507c67366716e4c45ef8977b8bea832eabd0" + }, + { + "signature": "02f6ee9158bf9b2aeeb8b5ee7d74f61ec5978fee64344861d5e48855d405d870b8026ab9444206b8fa0e369b3af8dc420cdef101ab227a49a772632e5c20590f121dfdac3130617b5de96d4b1ccd7d3f0f06e85b85555e02cb6b616c243d150f0ac507b9e58ea553a636478fa26b521704f8449f675031f312d40ad7f0e8e82b9a2c1680fdeab3dbac2204d7941e191ec120984646f913fd03eefc118f4fb41f8567" + }, + { + "signature": "023bdf689afc7f32642bb01309a5cf4428384f3fa44dd0df15290d901adc0a257e0235264a0ec6ea5318ad55f25662b22b808775dc98b7a0e89834f5ec2a9add38961b2468275ee89da8028c72a2a67a9b3a3c9e41b5b66c177d78fdd7c4921d90e19f450bc4dbf0403d89a7babec78451a72b257655c3f8782a3fd39a3340b9d698e0743c956863e7aaed783d7853f48500f6873ead47f8d0a21143d4340cedc836" + }, + { + "signature": "033422c46e753520aa8ee87cefb28dd78a1e7285529e16974df8bf8bc5f4fd860103bf7ba5a0a57b9f4782c467fb1c9361bf8b953a374b97eecd34704b88c63d0c838c5675fa5ad30a0a20835e3e5d26657894eead16424874ca1b8f5e3eb3840eccd8c092702cd9a1e3965b0fbe9fe87c6640bca9b53410de9774124dbe703ce4c994ded0a12b50755ed0737d8b647b446837934fd9d4702ae64cfa73b5816c5ec1" + }, + { + "signature": "030e9ac7b1666884b9ff9a010d484f098d4a6167c7a0e056f723e3f08786aad28d02c4b1e1a44f83ef19f62d457b97aab4f9ea78e9f6017071aad72e75fa3919915f10175035ad640d0da6952717b5edbf2f44ca943afc2c8c3e4492cb0ccafea2102191af09ba8cd44c59d2ecf86b7e2b0b43d75eed33a7cf810e0fab783c11402ec8ad1b036021aa108eb7db6529e3859336cbdac4dccb9855f3ef7e22eb6407ba" + }, + { + "signature": "02d4372be3b6cdec6b203e6568be38b664a1d15d90f6b758a05598d7915d543e540278ea5f56aeaea14300b1e19bff38ba1c93730d6de7eb495f945be53812f4c953f91d545c1d373e750bc5252d8f6d159d1dae3530a86412f8473b32cdc50512a2d54e1e688b4270d101dca6fe93f106de6c398f3d12910a107031a817fff057e58c0ccbb6350ee95ca4d194ee7525bb49fc61c7e8405cff9f619e2b14c87be006" + }, + { + "signature": "03b6d0278f5e9e8f5699862e24924028d7906d422432123f3533b034b54778d05103bfb5f2250a5b829f05a565d5f70093eb2ba75089e4ec236b16e4d069ae2a0b565cb635b11ad39751e4f9f81cf969582cd6e77e958c56876f8f780f15d80bc59007d24b6f99d7eaf6795ad943f0c9b7ae2d06d99c04da56fb9643763adce154f12311c02c22bfc716302fe053aa99d18f2b809d61baae4ef78a665cb5cf0ca230" + }, + { + "signature": "02cab2efeeb664d157e66a19aaaa9a1f313792ac35d5197f23ca73610ae08a4d970228d18caed72b414d8875776a051edef3a0bfe51466b55432aaa83c253dd0441ec66010462793c3abe0a697b506fcf4b57120b5dd4c57ebd6163856304fde5c9cf4da459ecd13f38fd43e52f0251e662a87d66950bd004a771fa52cc8965caa9cab9000cdf83ac21923e60ae90510bbd0d3645d336e775d7a77bda3c47db75650" + }, + { + "signature": "030079f65d51edef4e2eb7cd8895aaf5d993b66ada3dbfc1d9001a6ab2086eb2140319a406408605b9d4a885ef2f74aaa10f895953c1487b5e13a51a93b7eadbde7d8396a16913604cf04275f763a4d7357cf4af2c0d49aff680392a627a2b5fb17dc0dd91a3eb03205a697ecb17b5b147c07ca75908bcd046067a00869061d66a46100f909e61935811ebdd3b660d364d1daa097d8f5199b2c2e80e80ea82ea0e1d" + }, + { + "signature": "02ec9a6bc89dcd6f0bd183f2768f3bdf834f5b2e16d08d58b482f6caf3be52793c037154a1d8a9b7a3dcdbbca5bf7c56fca0d05230bb653c52de45a0216900faf465d692e04fd65d1ea0820403c66c5c1860d6181f5018608ccbb78d31478c02c5db1755ca943bbe7cb9982b3e59ff0992c424ec1069d9c2dd0b19b6156df067f5e86f79e00071d70f5a9e6144aa1f91a76d64d65ade9fe9dcf54c44aab5055eacc8" + }, + { + "signature": "03b38647483f7ca257efbb7fb1bd08fb4d14c00bb4da7e56fc9d10ee191498b0d30370f5183d7f0c05a33255228430ef78afdab4aa12a05a95a07199ccbd8452ac91e991c78b613a1f8a64eba55b0ead95593afb3848e84f0ffab35a1285b5500329ebfcc512c11079393cf88e6232fd480f7b7744f07c714ac0b6c925aac5d601bc402b14abfd1dd3295c1b97d39209643063317c0bc15a24dd551d30139f638c99" + }, + { + "signature": "03bef9f1dba4512b7987ca78a1d221e4b7c1e9e22d197abe3f6406133a37c66dc80299bf21bce4004c8f3d2f0975e5101534a42ab929e73cb013356e61116275c9a46586da25f16f8a17800a77df3e6b29dcd9dcf460e5984a0bca4eb7341beba2f3f4bc5ec2d0fde0c036cc6632a64fcc409195bc34e530a01be8325c12d2fcab05f6f5ea2ec65667fb98f0ae727e423fa0a39c13286df68c528fbfa232d259e318" + }, + { + "signature": "02a420c2b6b072374b6f695b4386c949efa7cab4938796daa4db0125918aeb350b0340c35f2e622dfd884ff06968a7df6e20db61f768cc22ca9db65613cba72ce48be048a9430c0dda658168958023d4910f87eb446e656f2b26f41bc6991e2939582914e0fdfc98896b4037db9e1669270887dfb7769ba7251aaa38e5210f2f4d6e73935188c86443a54d54315ce98fe3fb2c1bfc5d0665e08286b6f88cca61c855" + }, + { + "signature": "02ca1a8041a95cdf79e995fceda54077394f00a65dcee7f1fa6938c3546bb4872302eadc8272360f55df5af2a8088bd2ab95fd51336b726b760cc0a13c9ba08fd96d2028b0c8d20ec01e5c11b822f0bfc96974383e89c6ec68229e8527d65ad560941597845e8af0ec8f1f6d3f9af7f46e9eed6a5490c93af984a6886bbb935369bc66ec0300e0c541e46a776e28492340165083bb6f190f893cfc0b990d975966ca" + }, + { + "signature": "0268d6cfb9693e6b4050fcf92d4ccd2c103f1a592d8fcd118ae1a55bcda168f11c03193919b7536cfcc7717b90230950efc2f3323de81ba290231bf8087b5911d0ef6000bdc937270f73de0db17f01b914351add82a1639d1df76b9b7e72e465dee6eb8fa9ce66c4d44c655ad716e60a666263cb8bca9a5c025c23793b420ff1b4dce485dc571f7dc95afb749a3f29226d991ef42138b492ac59bb18170ef60146d3" + }, + { + "signature": "0222988ff26472bfd1f92600642ab3df9b1abd81b634a6918548696baa47411843030d3bbc53538fa288aa6b0581c0a07f18cc42b19c84a70c27cce917a47d5ced949fb83f306e49f594461f3ec97f659e0462c9f39425d07f970ce0275c58597c955ab376f5dfa50887dd30e6c07552c8f2eaca23250d2ac856b8f88bf6f5365a11196246055d667ee9d22c177710ab62af39aca0a77276bd8306ee3e8556639b17" + }, + { + "signature": "0289d1816eb35e74b2b3ea9535a4dbb3798f6acd8885b726699de6913b4675856a03d6a2b5eb2928847e20b4f6c1163eb37424cf63b1b2e38dbc423b1fe2b7c3a34a0231768d702519a4dcf35c2849b4f7cc44ea125d00aefac89e1abff0e9100c9103f9f340fbf846105c559014ff1a3063ef9afc374af830705d6563cc74624b116cf174722001354bea532ce11a9ea2e40aaf62912f3756df559e92d65594adcb" + }, + { + "signature": "0294aae88b61cca6a5f37a372ee273e9cb2903388f760afa53c57da4501aff52e7022054362455e89f17b93cdd95065227aede29083b7fdb5f1738302169b1386220af2b4b098151d04196cdc066ca2b9cdafd9db7379c115dbceba2de7dee1270586bea6e2290731fa09467698346aa70e674a8953e85936ac8b0d6f46b9252c9b015aa9740c4ca296d68f9a01c306dc20a46ee49fd7d7295cb888c0f2412adb28b" + }, + { + "signature": "02ecb4f1056570db5e0a25ae9a55759ac420343d36569e50f051c6aee807d808c903ad65f92e5c661a28d26aca03119cd256b098cbf8c75984c7df6dc82a681db4c04609d67f0870d4f8c09ec0aa3afd38ec5615c0197db42e7606559ea86a6a2122f69450f5100466e58094033e584e0300611ab7948b8c39d72eaec6331979574cd953789e5657b30d028a6d4cab61982cec5db4f919dbc8baca742b1afe7b3298" + }, + { + "signature": "027883bd1b2c7d03beb63653fe043c9e790070388ba4d0c6b18ff8f0e5be7aec6402225499ae185267228892b041fca5a28af7593db2399d93e6de06c81a2ab4ec04a9421756418a6706c3630f9998b0e36b72dde11b60b412d73bfa64ebf493995a6ac8fda773fb869dd773b44b7c4740c2eeebd9b93799ad0a92d92d8eae94bbccf50e7db7ef593dc38ca694f5841023dae8cfac707686d64d1d27c3fd9f2ca5fe" + }, + { + "signature": "02bcb15a4e5e7dedbb144f9e58f140917a438b21c07001e012ba197d2f4956e13702bb728a62fc651ea31f7cd74129572986134d3aeb58293630dc85ce5978fd1247ee116fb9bb47ec83eae887edb9d58b097942a10b721198e8162f87960aca8debe9abfa2c917afd9b3468a375393ab4521d35b66fe116ef163459dda69132b545389c1875425e1720008620652d64e34ae15b83009edb8f968b886fcfedd4555a" + }, + { + "signature": "03789c42c21e6465e5cb9945941b212e4f37150a77f7f7e9a01c0ed6e860c6f93d039af7319967e31d9a6a487d64c65f5716fa1618009a13be60b4f756a37108493d6079cc7242853e7de6aec5e7d337cf90de0678d345a8be54e2f72f55989aa80aa2da7d4ea712ec86e9c5ddafdff4ea8587c5a1a6b8272922b2fc7b50d0560bd0b5c6d051a2f390ff6414b452e555a166e9f5cb140d726c2f80fe6058f023204a" + }, + { + "signature": "02cd5ecbde476ec2035b664ce1faf8e76e1a97690081ba64e50b59cce42a3fc86103c74439803c755ee4ed760381a901e4e2b9ed061928ec5a3d6833b24a284ea05fd5526036871d623be53240d2e11a8e46647e147ff8df627d3727f0c6ab781cff3f03c7bdda187fa189e5a95e9cc309c5856df5e17d88ae263824bec7f11371b1d7df35b1520e51e2f12cf4858954e32f9df7b0ec95353e7f5b7c404cb5bd8fdc" + }, + { + "signature": "03036f2119237187838b4760550509f8bdb9f8881e4a72782c463523ae77c3eca9025fe2d2c92f27a6e218e4cc7e2a79a27a31e43bd724eaf72c50cd4e0a301815abf93e358f0021f58b0111fb34ad5e7e03a7685f90f6071e24919c35ea687756c70206bd94174ed0a06636bb8bdb55bc653d4d8c2b9371a82ae7a4187a008b3346e7ebe28cacf7e891481cb0a1fb7455c78375061f056b089ed85e7a544d5bf1e5" + }, + { + "signature": "02a194e348d8ea07d00027802a8463e7158c5d8e89e9a9215bf3cbcbf2c90c1e3c03b9e97868a5a95ab30cf6f007580511013bc7339f71240c0aa7142d50385027f65055327e76689749b1758fd1b655f75ba8217ab9e875c8e8e00a738c8749b286dab0225810fc913c8679837e851ee85c5d02b1e6ee778e17942282e44c9994599465c6311b01e0758345d0f5a361f19c730c39a13aa167b7119aaed5fa982990" + }, + { + "signature": "025282b266c4d50e711c930e87d3927e7261f4e7f15af9330edccfa165dca0667c038948d12e9d9ccbeaa05f36f5ea0cade85846ae5ffb2f84c2993231554c4b1aa9918dc1179ca2aa394f28ba976473936c71b4330ab6e8a3578ead52b23565f3db521056d63254025f751c09e77f185fcf8f97a497096f4cd0c401bf711a6cb48515bee26d8a3d7873c8bc5c0994aea6031d523c4351092c18b9e1f6837ecc8a21" + }, + { + "signature": "025653f8519e54a1f2e3d6eaecdfd68b77fc79965d2919d1cd8b40d791450c7b16032c7c56daccace3095633fc812b094904b3eef431968c939e89b1d4a83712ee49474cfb8f9aae642bfb0c8b9fc80e43020d7320e61aa2b59938adf7a17144501506863d9b61bebd6c0392c093633b0b2c3acb73e07748fad95a183b5efefd916dcc8d8a59d2e4e5ef4e615b20fa7d4b6ace561e796860e717e1d441f83677aa42" + }, + { + "signature": "0279269c4698e2a292e5b5c45f847674eddf27409993ae0b7e0164c4868a55f98403b198f9530721cdb6518d81175d4f1c620bee0e5295992fee45c49fd9f77c47fb8b69a13f48a80543d844493065b98b00bf290f364e01069c8b5d6676983eb3439e47957334d2259ec593b1030c7a31b1049125e563bab608d409bfac69bcae14e476849f2b9e494fc3b48450b75655a929dea05ed4c3248f316f3b0779a9a3ea" + }, + { + "signature": "0208d87fb170ae61def95f3a4eced205faca65c67bd56dbd4583a0f318aee79fda0348d982217da25afb50c7d8af8b13b2ee0687da30d054989e0e35f24c91720309c890c878530187f538d25f4ea01a8e635eea28fdefbb5143050b4e2993840896b4673f9c077c37914df4c2f2c767561704f7d403e8ba21910f0c90fe357449ae7e2a0c0a540ff0a907bb2c7de2a0d79c9f4e412e23bc215e90850fc18a03d84a" + }, + { + "signature": "02d9bcd5cf97fac65593192d6455badcf5e5739bfab8b04fbe7ad3d931fa6e756d02da33aab51bd62656f40e8931d93f3eb731119e98d6eb46e641e1c2fcb2d5bf58bfb8c9eaaaa99771e6eba20306f5ef23980709a4d22c5c7a4a35d850aa3932138801f2b0ab6bb58aa4c6ad434f5a576e0449639c5ad9fc28b1dda6f3e66d0f55c38f15e668027db683c911aaa39d598f07dc6be4bfba743476d777a8da407d79" + }, + { + "signature": "024db97ab622a0c36825684ade3fdf4434258f967ea9bc72d0bea9f2eef91cdcf903eb9ae22f108922fc8cfff74071c70633f34bc2d9f51ee8247165b21518d7a6c1f13dab5768caddcb8df1e289c899199c48d7a816cb810f33ef71f01ac110b714df14c01de8eb3dff9359602f6cfb54fd2a95567356e7c4e7612af3b53cb0943cbe5c93b1898817e7588a13efb4df9fe8f27a53113bc6eae72ee9f5bef4efb426" + }, + { + "signature": "02dfb133027c7c5f89a606226e98b5e418dfd1fc486498dbb780a5a1ed7cc0896d02557539be47902045ad607326e1c52143f37751c3e979433efe678ab257631fdd60e733657883a32226f70717eb17ba7b1e1447ad42c3450f6ad437d81a9df0b4395e873c0a74fa42262932fe7ba7b76da3c0d5f4975c0abbab9a8de79a6bd9f96bca719d8f7b62292fc7aad10cfea20d1897ce5d2fbfaeeac959ef2353b0e391" + }, + { + "signature": "03236cca1e8d562ec7183d098c81e96b43e5dee55cc49cf032f0734daf1382f13d02a3cc03a0c5e95266753a8eec300ac934631eadb10cf53d86a3f1ebc266ab9f7af3fb83ed7b2e56dd33c33cd72fd200fde358c1ca2da369e68ccddd441816a4f735fe9c3ca61c1c41637456842253fd6d9328ecb7de611aecada272fe8e335d53a5e7d11e434dc9c2a58fe5591745040c4bfe0fa20ab7e9f4314f73313fd92969" + }, + { + "signature": "020d54261d9b954a80095f5601dd3ca88c7fba9a3f8f068e64cab557527d0feb9302ce5ec06a79ddffb21062c8344db677b08b791dd2a5ed1f946878ed8d8eca63e46cb6a63d5d45c8efd179400fd91ea30595b92f54a8b30c4dd29f2450bbea661ca8e1b48605f4107e68ce8b139de15bfbf1889f4463a2fdeb63a0c2b286f048e9cbd44e3fe13484e307ceea06d3a71fe433e400ede7f3e801f545a6225d5cd215" + }, + { + "signature": "021143736fb2931050717275d1a55d5c12bfde1513e5e897b38b8de52d772d15cd03db381259a7fdbbcdc678fd9923c966c2bbdb2c0307664789c610c391bf2f1e03da791a19e3788ee785085b8dea5bb95e4222f636ca6a4a886dab03f930b5076095853f504ffe39ebb815141112a7f6fd2fa2d99a7aea068f60261e6c3bb3e9b2e50b0c6a7eb418db638b19cd4d572f6dda8074bb2c027950c2119d1ac9bfc846" + }, + { + "signature": "026dbb1dece515ece0be160c5890a7a4282c289ee42b0e571e672dd2c0336a841f03a5992cfa0805392281777b953a3791c0db7af05c749fba8bfe70e7cd3fcf5be50c0fdf4e1186b88336fb31ec403dc82943b6384bf3f473bef5139efdb934024e21024d5725cee7bc2a6c4f57b76eb0271f0f5069826b8008f0b4e0734a64120776f501b54282923520d614ae4cb33784b9f282ac8ad881b0fbbfbdf803d70d02" + }, + { + "signature": "03cd6a1c0bfbf7fde815c571c615b02ea85132577963bc6418820b3e4662ef478f03d9a9fe489eb66a0c84c1d5cc88e2f2508289cec802e66600fad8ac075c68967ded244862439090144b443f7bddc04e8cf5dd1e923140a2358f23c2c81518e1d808f81c6124f83b0b371914d820607df0732cd9df6cb12935ea13805dbc517be48313d133984636d8e55d7bd2aaef23f70a44ff19ba66c6148bc9eed6a1a1d6dd" + }, + { + "signature": "023d4a7a42bfcb9f7fb8faa233e11e5f1a6f9992bfe38431dbdc6c61a9148be8c9033c2814fc4e0a3028af144f12dce0821c793c4156b8e0f5541ecc7b10190d23a9c171b6345c97703f73e46a8329707644b8ee0317b374c24dbe578f14498808cb41ea6533e604e310b8ad1210b059e5d7224584a65b693d84aa93618170da2d4180d4ae8a3a7b8575a4a5cb186b9a45419c3ea248717767a0ee9368d3054abba5" + }, + { + "signature": "03727724276ef0e23f35fe24a974314a1705d42b0ed5d5515d0514eb2b707b433302c83443e6d1d69e7cf566bb1adb0bd768d562043b60a2db3259b4265ffedb8b8166df0f38653e21300b04579fe81be2faa4176f803c9c60a9a3e0892a98a40eb20142ab291a1824949599d19e96c05cf2cb86ca3d55e9b2528f521f24467e37194f844576808bfa666ae6337f741a79953b1ce72c5885fd7c3ffc0bb8094da2be" + }, + { + "signature": "0266babc4649ed6b50dd48d534fce4ffcb3854bf158a0601320a8ef6630e16d82203e65fed1549afe52db23fdee261b46ac0c0038eeb03bf1d1f33057e8c4d57c0751397aca34ed95291816f65b8a7abe1f3c690b0bbcd4005a5ea79d6e0cc85f45c65668e8a6ea273991057b1945ac16dd01d552aa92e75206b73b9f88ba41483afe59a0a687c7d9eefd530494143a813e371095f867307a0f51e9e3b8ef18d47a4" + }, + { + "signature": "0220ce161be0cd120513e84dd59c53104ad4387d106208b9b5117a67b438cab98e02617d726f1fcddd8a03e64bb0468c324156aa7f63df496ab623671953b1d24a711da357d2efd8e2c852bf2f7c5e454651d9c809e653b3c1d109f3083af829576095902ff935eb78cc1751ed3169bc4f2816622d4d60e005dda63dd3228801fda04266e66d05170f63469e78c7c77102915b2fd8b22f7d5ea5f2f7090928d6b06a" + }, + { + "signature": "02c7fe4b71c68a8a0cb573bacfc8892b504a1b0295e56ba19b38e20710be8b6c98038ea05f1ee7c27c5b543b3975cdaf1a894dd5ed530e667e5cff24f535691b69c9e7f5568c7d098f508222d82b005e1e71ad55cfee91810486469ee878c63e781ec8ae66d33a1349b52b4d4239bce61f87a9043ac329dea22b9ad6df2a93f791d54d4cca8dce79884077c95523762ac8e475a788fc4ac5a8b51148ad5f45643e41" + }, + { + "signature": "02e034bb1579eacbccb3325c3a2e29dfdb3b69a3f3b4cc12a2baa12f584f93d47c0266ba33f4063516c40247a3ede0d716dc2ae79cd3b71e447ce4f920c88b27a9228181ad1d6a3bad63b97fe7bff3f8ac0f880bfbf12fc62676ca16607eabf7d4bce156ab2993510587f46102ae2b67a0b7d955240cc34629354b69e85ee9d9f81e511cdc2bf32b7ecaf6b7cff89031ed8339f73b6e3838303a9bffe3b9aaa33a57" + }, + { + "signature": "02ab5a092ae79320824784ad515155e1434b354280ad9ac7b6cf579b1a009861870221096b7e6eaa8690ec0d7956cb1cd65f2fd85c9734c0e20e1fe2c42f809030ad81a75ec92ee2015874561fa5dd8496df2ef4a00cee00d99f9bdec000115ff3bac6f3b6ab979fa3446f94787463842675333960abeb794c7f2d6f36f7f53d9e03831bb543f50bc1e44f649bfc1a376432c009251a45b1a8c2638c27100bf3dd8f" + }, + { + "signature": "03d165ff5fc4c93351cf998fbbc8cd26e83cb57f8c43f9fbbceb36bda881c70e9203fd4569fc955d8f936ccc82e650faa214c6edd01db30ebed5d3b5a91e2d6f9869593cae912e62f825e1148d20aa1ff0f07c7123012d5636434f41531d9be09f50ef050cc2e625c9494d895460b232524c3f7d7f19e92eec397b6a182b2c54163e9c9aa65cd80534771d45f23a69ba77897925dfa9c65c13c5350931b398d348f1" + }, + { + "signature": "02487b554e443bed0cb7f99292910ebd232fd3ae5834ef409f63cff261149d8f0402c505662079641c272eb42514570af75263994d7bc4a008faeeb105e78ed3bfa037dd6180302ba9d2cabf34f5c6704b1fcb56c51bcdef5c46b6930c3187486646fa47d38b067c8f3a1b5bafa81c3bf3b4193837ebfa37ad395c54b1890703db5b4e3c2bef2ad233aaed34267294270377718205e7e32e128b94d4fe65daa9bc89" + }, + { + "signature": "022bcb7e1f75f5bc5f9cbbeaf67e186780531a7add3d705a19a6d606bf303b2e11037f9afb447e85a105ba0fcd48b61d09642181b2a9010bb16d6e5669a49e4d47fd87a72efff81a851abb1e8b2761e846c1b7d848955ec20e3f536269fcfd9e20c9fb94f1c28e2d0901df47f0b384a1fa477f3078af8facd7ed807b8e05c2b8642f1f9d1c1ca74953a58235fac4614151bd77a486269825b032676bb837b7ae1cdd" + }, + { + "signature": "03a9746d2527c226b0ff0b8df524031eb8ada2bb62ab972acfde36d4f02e7a4d930304cd0c087908b436872147463d3b6dbfb01c467afecc0da301a30b849c3fb4ecb31f79366601c86ec87f3ccaff31dcb560b6c1abec46ba22efe6d375a53020aaa1f983c2ba059b9d5f210cb36d4fbfdf973b21656e9374248c1bdfcac872d5d0cd16d50121d8a4ad4a642bddef5531d2f30ae12cb8ff7afb3ab03891e59879c4" + }, + { + "signature": "0240b81709e2c2e9885b94af183b80da2589945613ac25515d122f0036104f5e5d035635f4b015871c22beb8d2dec9e0f61b07dcafc01449a622f832376a2d55caea25e53e3ca1f09ad0d972919c0499844976950ff3d989ca2ce26ebaf0f700874aa6a8d3603a7ba9f638fbb733cd337c6a7ee65f79337bf587ef4f5fa77a9e8f273ca6f1a64a6dccd65bce59b10b26c37fff10ec39afa4bc5949b6e9fe96005f16" + }, + { + "signature": "0204223fcc63e8492ecdbcb81b05eaa85c4971c90524320cb939121b4acd759631035a2f1076bd7fc91e2534e39ea67b27df5c2001fceb72a31a8cc8827b6f737a734a9dcf6851937070fc6be6c5ab56c03fad5be6052787073713d459dee8fe779afe73a5c7fb44abd274ec1a92ec38f2a0e8421b3daecff3bb17f80a3640ce8e0d1ee2f9cb232abcbdd20fb9a7ac67d32689868d26b3335e1abb93dcbc01193af0" + }, + { + "signature": "0229a47fb9a4fd7fe86709835b7e7e43c2f9e9dfc8f6c8abcccd301d7d1c20aac90291f8c65ea83460c78df8969ac3a816ce50f50fe86ccb7a960462ef3975af36bc3b0823cb3e0d7bca89a04341b7e25e91c6c6719b2b2f0814ac12a8a79209a461399ce0b3b177c43fc81943e2e259c8e97eb342707e970118e443a786f1ee19febf8ffa86540c62774a3f1b2309fe29525180ad7afc53060a595f61c18a972601" + }, + { + "signature": "02f4778aba61cebea47c8df3e7b86114ec7ab8f96367a4dcf7b4915566f9297799022f66695ab7ac448bbff0434f49d5fb5debdc602c558769b394fcb403238396aecfcdcce90e748c78782cced8b9dab5c51ac52e6103dd041d804d91a28650f55ca066696073de9c95e56ba66329e389032c0c2255df8165bbe84e70d3ac2367b5718b7c214bbccd4bd01b42f22773c6df96d11d14665a581abbe6ebf58a7e6643" + }, + { + "signature": "02b375b88f577490ed268c9dce47739f613295150ef3c23dd1b30f6678cc8a84660396ebf5a797d631e5d380961603fde5b2e133846d931a2d16d1de8495d833c5f10bd1c352b4f1ac46925f9d76bdf90dc94779c344700c94a7552eb160ba58635fc09a61312f80ca7e45adcb60ebe18aca2a89d717e3887bd57ce83815ae4972b42012954b88460d55ab24570fb36afbe84091ec60ddf99685faa749f101dae499" + }, + { + "signature": "038190883d8c10d20561e0bd7fb0c421e5c9b87ec47cdcbc647c878ee02d09b3b5037dde73abe33754cefe00f384e89e02f2b8ac2563f36e109c0bc27c7b077cd713ee5aa80d25acbbdda137ff766478f5078c478c66987b81453cfb332cfc0dc2444fa3af52ffcf15b062e2967d8f2da9d1e1f76b3ddaad5ec8eb5cc905d6f81259c8f69cff749f0cdf26f89abe087a81bd8e6423e90ac766fdb540e153571b55bf" + }, + { + "signature": "02d851a3d6fa3f0057ce1965ab4c483284092a8d1e586d40cf05ad1b551752362403cb128737f700a96516bf8eace037c228b663263350329049e40fa99217dfc937dd0c7f3ae8a67bf47dbc7bb30bee27ccd3ff498971725079047bc8d7eb62fb7801fdefa4d4ff9c4727c6350e4862ba335162d9edf3c53bd46c46540fd5239a12a133b590d533317027748927b8acf4d95f269cbf61d36d528295c920cf0a4191" + }, + { + "signature": "02bd67a469461972324eda818ed222899eccf6f0c18783883183178a3f610b23aa023ad3b35ffa9bc9e08719bebe6d8b64dc85410bee2bc5f900d54c905f3e53e6caa2aecc6bb1f0331d8051b40f866eab144d31918b7c24adf8355c35824d794570e510d63df9e8dc4427712eb8586c6785fc349dabf1926379d0ebf75b7757210d3122ae5ea4b0df34a8b2a486fbaa88a9b2caeccc87afdd9c91e58fb228394a2c" + }, + { + "signature": "0200216b459e328f37c625f178cb928e01db240d774627277d380ac7c6cf11ce150268e37e84af134838c213fe3f88ccfd4ef1a884303e6cb7aae6285ccb22835a66e930a5b26d6bd865c299788f3d25900a68ed28d9f8dac6863a1ae957243e3f1afdcc9e9ec0faa8dae0ba5e639883b99952e2857489a64dce4cd9ae0f9d7fa98c0bc07c8ff4f2f741295c8f5a08148b0e934b64a16972f83482d899938bda85ce" + } + ] + }, + "refundSignature": "304402207e868ace5ebcf9b7fc669645142fa4f6ab3d865b7f95cc081623bf328e3700a4022022bbbed4c3a07919412c13817a3f99ab9faea381dddc77993ed46a4aa1eb79c1", + "fundingSignatures": { + "fundingSignatures": [ + { + "witnessElements": [ + { + "witness": "304402205efdad3c52313450c5c2bbe36a20e1249fc8a4a8c6f9ad0e7da44de035f8e0fe022009dbc2ecfb5f7a2192f55cdc5c0c33c0a398b9e5ba3119cab924d14ab486484201" + }, + { + "witness": "02baa435d217ad54d5cba493dbf4e0cfb90cb1c7c37751333a0a7c2ccf25f31703" + } + ] + } + ] + } +} diff --git a/dlc-trie/CHANGELOG.md b/dlc-trie/CHANGELOG.md new file mode 100644 index 00000000..b486a2f3 --- /dev/null +++ b/dlc-trie/CHANGELOG.md @@ -0,0 +1,38 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## Changed +- validate that `RangePayout` do not contain a `count` of zero +- `group_by_ignoring_digits` panics when `start` is greater than `end` + +## [0.5.0] - 2024-07-11 + +### Changed +- update bitcoin and secp256k1_zkp dependencies + +### Added +- support for `no-std` + +## [0.4.0] - 2022-10-28 + +### Changed +- `dlc` crate version update + +## [0.3.0] - 2022-10-28 + +### Changed +- `dlc` crate version update + +## [0.2.0] + +### Added +- `parallel` feature for computing anticipation points in parallel. +- support for multi oracles with varying number of digits. + +### Fixed +- iteration of DigitTrie sometimes omitting values. diff --git a/dlc-trie/Cargo.toml b/dlc-trie/Cargo.toml new file mode 100644 index 00000000..139390c7 --- /dev/null +++ b/dlc-trie/Cargo.toml @@ -0,0 +1,22 @@ +[package] +authors = ["Crypto Garage"] +description = "Data structures for storage and retrival of numerical Discreet Log Contracts (DLC)." +homepage = "https://github.com/p2pderivatives/rust-dlc" +license-file = "../LICENSE" +name = "dlc-trie" +repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/dlc-trie" +version = "0.7.1" + +[features] +default = ["std"] +std = ["dlc/std", "bitcoin/std"] +no-std = ["dlc/no-std"] +parallel = ["rayon"] +use-serde = ["serde", "dlc/use-serde"] + +[dependencies] +bitcoin = { version = "0.32.2", default-features = false } +dlc = {version = "0.7.1", default-features = false, path = "../dlc"} +rayon = {version = "1.5", optional = true} +secp256k1-zkp = {version = "0.11.0" } +serde = {version = "1.0", optional = true, default-features = false, features = ["derive"]} diff --git a/dlc-trie/Readme.md b/dlc-trie/Readme.md new file mode 100644 index 00000000..64c7bc0f --- /dev/null +++ b/dlc-trie/Readme.md @@ -0,0 +1,3 @@ +# DLC Trie + +This crate provide data structures for facilitating the storage and retrieval of contract information for numerical DLC. \ No newline at end of file diff --git a/dlc-trie/src/combination_iterator.rs b/dlc-trie/src/combination_iterator.rs new file mode 100644 index 00000000..da2bd788 --- /dev/null +++ b/dlc-trie/src/combination_iterator.rs @@ -0,0 +1,100 @@ +//! # Combination Iterator +//! Utility struct and functions too support iterating though all possible +//! t combinations of n elements (where t >= n). + +/// Structure to use to support iteration through all possible t combinations +/// of n elements. +pub struct CombinationIterator { + selector: Vec, + pub(crate) nb_selected: usize, + pub(crate) nb_elements: usize, + is_init: bool, +} + +impl CombinationIterator { + /// Creates a new combination iterator for a collection of `nb_elements` + /// where each combination includes `nb_selected` elements. Panics if + /// `nb_elements < nb_selected`. + pub fn new(nb_elements: usize, nb_selected: usize) -> CombinationIterator { + assert!(nb_elements >= nb_selected); + + let selector = (0..nb_selected).collect(); + CombinationIterator { + selector, + nb_elements, + nb_selected, + is_init: false, + } + } + + /// Returns the index of the provided combination if part of the set of + /// combinations produced by the iterator, None otherwise. + pub fn get_index_for_combination(self, combination: &[usize]) -> Option { + for (i, cur) in self.enumerate() { + if combination == cur { + return Some(i); + } + } + + None + } +} + +impl Iterator for CombinationIterator { + type Item = Vec; + fn next(&mut self) -> Option { + if !self.is_init { + self.is_init = true; + return Some(self.selector.clone()); + } + + let last_index = self.nb_selected - 1; + let mut cur_index = last_index; + while cur_index > 0 + && self.selector[cur_index] == self.nb_elements - 1 - (last_index - cur_index) + { + cur_index -= 1; + } + + self.selector[cur_index] += 1; + cur_index += 1; + + while cur_index <= last_index { + self.selector[cur_index] = self.selector[cur_index - 1] + 1; + cur_index += 1; + } + + if self.selector[0] == self.nb_elements - self.nb_selected + 1 { + return None; + } + + Some(self.selector.clone()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn generate_combinations_test() { + let combination_iterator = CombinationIterator::new(4, 3); + let expected = vec![vec![0, 1, 2], vec![0, 1, 3], vec![0, 2, 3], vec![1, 2, 3]]; + + for (i, cur) in combination_iterator.enumerate() { + assert_eq!(cur, expected[i]); + } + } + + #[test] + fn get_combination_index_test() { + let combination_iterator = CombinationIterator::new(4, 3); + + assert_eq!( + 2, + combination_iterator + .get_index_for_combination(&[0, 2, 3]) + .expect("Could not find combination") + ); + } +} diff --git a/dlc-trie/src/digit_decomposition.rs b/dlc-trie/src/digit_decomposition.rs new file mode 100644 index 00000000..602ded6e --- /dev/null +++ b/dlc-trie/src/digit_decomposition.rs @@ -0,0 +1,653 @@ +//! Utility functions to decompose numeric outcome values + +use dlc::{Payout, RangePayout}; + +/// Decompose a numeric value into digits in the specified base. If the decomposed +/// value contains less than `nb_digits`, zeroes will be prepended to reach `nb_digits` +/// size. +pub fn decompose_value(mut value: usize, base: usize, nb_digits: usize) -> Vec { + let mut res = Vec::new(); + + while value > 0 { + res.push(value % base); + value = ((value as f64) / (base as f64)).floor() as usize; + } + + while res.len() < nb_digits { + res.push(0); + } + + assert_eq!(nb_digits, res.len()); + + res.into_iter().rev().collect() +} + +/// Takes a decomposed representation of a numerical value in a given base and returns +/// the represented value as a `usize` +pub fn compose_value(values: &[usize], base: usize) -> usize { + let mut composed = 0; + for i in 0..values.len() { + let pow = values.len() - i - 1; + composed += values[i] * base.pow(pow as u32); + } + + composed +} + +/// Takes a vector or `RangePayout` and (if necessary) updates the first element +/// to cover the range [0, first_end] where first_end is the end value of the +/// first element, and updates the last element to cover the range +/// [last_start, max_val] where last_start is the start value of the last +/// `RangePayout` in `original_outcomes` and max_val is equal to base^nb_digits - 1. +pub fn pad_range_payouts( + original_outcomes: Vec, + base: usize, + nb_digits: usize, +) -> Vec { + let mut outcomes: Vec = original_outcomes; + if outcomes[0].start != 0 { + outcomes[0] = RangePayout { + start: 0, + count: outcomes[0].count + outcomes[0].start, + payout: Payout { + offer: outcomes[0].payout.offer, + accept: outcomes[0].payout.accept, + }, + }; + } + let last_index = outcomes.len() - 1; + let last_outcome = &outcomes[last_index]; + let max_value = base.pow(nb_digits as u32); + if last_outcome.start + last_outcome.count != max_value { + outcomes[last_index] = RangePayout { + start: last_outcome.start, + count: max_value - last_outcome.start, + payout: Payout { + offer: last_outcome.payout.offer, + accept: last_outcome.payout.accept, + }, + } + } + + outcomes +} + +/// Takes away the common prefix of start and end and returns it. +#[inline] +fn take_prefix(start: &mut Vec, end: &mut Vec) -> Vec { + if start == end { + end.clear(); + return core::mem::take(start); + } + let mut i = 0; + while start[i] == end[i] { + i += 1; + } + + start.drain(0..i); + end.drain(0..i).collect() +} + +/// Remove the trailing digits of `v` if equal to `to_remove`. +#[inline] +fn remove_tail(v: &mut Vec, to_remove: usize) { + while v.len() > 1 && v[v.len() - 1] == to_remove { + v.pop(); + } +} + +/// Returns the set of decomposed prefixes that cover the range [start, end]. +/// +/// # Panics +/// +/// Panics if `start` is greater than `end`. +pub fn group_by_ignoring_digits( + start: usize, + end: usize, + base: usize, + nb_digits: usize, +) -> Vec> { + assert!(start <= end); + + let mut ds = decompose_value(start, base, nb_digits); + let mut de = decompose_value(end, base, nb_digits); + + // We take the common prefix of start and end and save it, so we are guaranteed that ds[0] != de[0]. + let prefix = take_prefix(&mut ds, &mut de); + + // If start is all 0 and end is all base - 1, the prefix is enough to cover the interval. + if (ds.is_empty() && de.is_empty()) + || (ds.iter().all(|x| *x == 0) && de.iter().all(|x| *x == base - 1)) + { + return vec![prefix]; + } + + // We can remove the trailing 0s from the start and trailing base - 1 from the end + // as they will be covered the interval represented by the digits in front of them. + remove_tail(&mut ds, 0); + remove_tail(&mut de, base - 1); + + // We initialize the stack with the start digits. + let mut stack = ds.clone(); + let mut list = Vec::new(); + + // This will generate all the prefixes for the interval [start, start[0]..base - 1]. E.g. + // if start is 1234 in base 10, this will generate for [1234, 1999]. + while stack.len() != 1 { + let i = stack.len() - 1; + // Once the last digit of the stack is base - 1, we can save the prefix and pop a digit. + // E.g. if we have our stack as [1, 2, 3, 9], next is [1, 2, 4, 0], but we don't need the last 0 + // as we can cover with [1, 2, 4]. + if stack[i] == base - 1 { + list.push(stack.clone()); + stack.pop(); + // We can remove any base - 1 digits at this point. E.g. if we had [1, 2, 9, 9] above, + // now we have [1, 2, 9], next is [1, 3, 0], but similarly as above we can get rid of + // the trailing zero. + remove_tail(&mut stack, base - 1); + // We increment the last digit (e.g. move from [1, 2] to [1, 3] in the example above). + let j = stack.len() - 1; + stack[j] += 1; + } else if stack[i] == 0 { + // We can always get rid of trailing zeros (up to the first digit). E.g. if we have + // out stack as [1, 3, 0, 0], [1, 3] is enough to cover the interval + remove_tail(&mut stack, 0); + } else { + // We save the stack an increment the last digit. E.g. if we had [1, 2, 3, 4], we save it + // and move to [1, 2, 3, 5]. + list.push(stack.clone()); + stack[i] += 1; + } + assert!(stack.iter().all(|x| x < &base)); + } + + // All the single digits in ]start[0]; end[0][ are sufficient to cover their respective intervals. + // E.g. with start = 1234 and end = 4567, 2___ and 3___ are enough to cover between 2000 and 3999. + while stack[0] != de[0] { + list.push(stack.clone()); + stack[0] += 1; + } + + // We take care of the interval [end[0]..0; end]. E.g. if end is 4567 that's [4000; 4567]. + while stack != de { + let i = stack.len() - 1; + // If stack has common prefix with end, we need to push a zero. E.g. if stack is [4], we + // want then have stack as [4, 0], so we will cover [4000; 4499] with (40, 41, 42, 43). + if stack[i] == de[i] { + stack.push(0); + } else { + // We save the stack and increment the last digit. E.g. if we have [4, 0], we move to [4, 1]. + list.push(stack.clone()); + stack[i] += 1; + } + } + + // We need to include end (previous condition exit when stack is equal to end). + list.push(de); + + // We add the common prefix of start and end if there was one and return our list of prefixes. + if !prefix.is_empty() { + list.into_iter() + .map(|mut x| { + let mut p = prefix.clone(); + p.append(&mut x); + p + }) + .collect() + } else { + list + } +} + +#[cfg(test)] +mod tests { + use bitcoin::Amount; + use dlc::{Payout, RangePayout}; + struct DecompositionTestCase { + composed: usize, + decomposed: Vec, + base: usize, + nb_digits: usize, + } + + struct GroupingTestCase { + start_index: usize, + end_index: usize, + base: usize, + nb_digits: usize, + expected: Vec>, + } + struct SetMaxRangeTestCase { + original: Vec, + expected: Vec, + base: usize, + nb_digits: usize, + } + + fn decomposition_test_cases() -> Vec { + vec![ + DecompositionTestCase { + composed: 123456789, + decomposed: vec![1, 2, 3, 4, 5, 6, 7, 8, 9], + base: 10, + nb_digits: 9, + }, + DecompositionTestCase { + composed: 4321, + decomposed: vec![1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1], + base: 2, + nb_digits: 13, + }, + DecompositionTestCase { + composed: 0, + decomposed: vec![0, 0, 0, 0], + base: 8, + nb_digits: 4, + }, + DecompositionTestCase { + composed: 2, + decomposed: vec![0, 2], + base: 10, + nb_digits: 2, + }, + DecompositionTestCase { + composed: 1, + decomposed: vec![1], + base: 2, + nb_digits: 1, + }, + ] + } + + fn grouping_test_cases() -> Vec { + vec![ + GroupingTestCase { + start_index: 123, + end_index: 123, + base: 10, + nb_digits: 3, + expected: vec![vec![1, 2, 3]], + }, + GroupingTestCase { + start_index: 171, + end_index: 210, + base: 16, + nb_digits: 2, + expected: vec![ + vec![10, 11], + vec![10, 12], + vec![10, 13], + vec![10, 14], + vec![10, 15], + vec![11], + vec![12], + vec![13, 0], + vec![13, 1], + vec![13, 2], + ], + }, + GroupingTestCase { + start_index: 73899, + end_index: 73938, + base: 16, + nb_digits: 6, + expected: vec![ + vec![0, 1, 2, 0, 10, 11], + vec![0, 1, 2, 0, 10, 12], + vec![0, 1, 2, 0, 10, 13], + vec![0, 1, 2, 0, 10, 14], + vec![0, 1, 2, 0, 10, 15], + vec![0, 1, 2, 0, 11], + vec![0, 1, 2, 0, 12], + vec![0, 1, 2, 0, 13, 0], + vec![0, 1, 2, 0, 13, 1], + vec![0, 1, 2, 0, 13, 2], + ], + }, + GroupingTestCase { + start_index: 1234, + end_index: 4321, + base: 10, + nb_digits: 4, + expected: vec![ + vec![1, 2, 3, 4], + vec![1, 2, 3, 5], + vec![1, 2, 3, 6], + vec![1, 2, 3, 7], + vec![1, 2, 3, 8], + vec![1, 2, 3, 9], + vec![1, 2, 4], + vec![1, 2, 5], + vec![1, 2, 6], + vec![1, 2, 7], + vec![1, 2, 8], + vec![1, 2, 9], + vec![1, 3], + vec![1, 4], + vec![1, 5], + vec![1, 6], + vec![1, 7], + vec![1, 8], + vec![1, 9], + vec![2], + vec![3], + vec![4, 0], + vec![4, 1], + vec![4, 2], + vec![4, 3, 0], + vec![4, 3, 1], + vec![4, 3, 2, 0], + vec![4, 3, 2, 1], + ], + }, + GroupingTestCase { + start_index: 1201234, + end_index: 1204321, + base: 10, + nb_digits: 8, + expected: vec![ + vec![0, 1, 2, 0, 1, 2, 3, 4], + vec![0, 1, 2, 0, 1, 2, 3, 5], + vec![0, 1, 2, 0, 1, 2, 3, 6], + vec![0, 1, 2, 0, 1, 2, 3, 7], + vec![0, 1, 2, 0, 1, 2, 3, 8], + vec![0, 1, 2, 0, 1, 2, 3, 9], + vec![0, 1, 2, 0, 1, 2, 4], + vec![0, 1, 2, 0, 1, 2, 5], + vec![0, 1, 2, 0, 1, 2, 6], + vec![0, 1, 2, 0, 1, 2, 7], + vec![0, 1, 2, 0, 1, 2, 8], + vec![0, 1, 2, 0, 1, 2, 9], + vec![0, 1, 2, 0, 1, 3], + vec![0, 1, 2, 0, 1, 4], + vec![0, 1, 2, 0, 1, 5], + vec![0, 1, 2, 0, 1, 6], + vec![0, 1, 2, 0, 1, 7], + vec![0, 1, 2, 0, 1, 8], + vec![0, 1, 2, 0, 1, 9], + vec![0, 1, 2, 0, 2], + vec![0, 1, 2, 0, 3], + vec![0, 1, 2, 0, 4, 0], + vec![0, 1, 2, 0, 4, 1], + vec![0, 1, 2, 0, 4, 2], + vec![0, 1, 2, 0, 4, 3, 0], + vec![0, 1, 2, 0, 4, 3, 1], + vec![0, 1, 2, 0, 4, 3, 2, 0], + vec![0, 1, 2, 0, 4, 3, 2, 1], + ], + }, + GroupingTestCase { + start_index: 2200, + end_index: 4999, + base: 10, + nb_digits: 4, + expected: vec![ + vec![2, 2], + vec![2, 3], + vec![2, 4], + vec![2, 5], + vec![2, 6], + vec![2, 7], + vec![2, 8], + vec![2, 9], + vec![3], + vec![4], + ], + }, + GroupingTestCase { + start_index: 100, + end_index: 199, + base: 10, + nb_digits: 3, + expected: vec![vec![1]], + }, + GroupingTestCase { + start_index: 100, + end_index: 200, + base: 10, + nb_digits: 3, + expected: vec![vec![1], vec![2, 0, 0]], + }, + GroupingTestCase { + start_index: 11, + end_index: 18, + base: 10, + nb_digits: 2, + expected: vec![ + vec![1, 1], + vec![1, 2], + vec![1, 3], + vec![1, 4], + vec![1, 5], + vec![1, 6], + vec![1, 7], + vec![1, 8], + ], + }, + GroupingTestCase { + start_index: 11, + end_index: 23, + base: 2, + nb_digits: 5, + expected: vec![vec![0, 1, 0, 1, 1], vec![0, 1, 1], vec![1, 0]], + }, + GroupingTestCase { + start_index: 5677, + end_index: 8621, + base: 2, + nb_digits: 14, + expected: vec![ + vec![0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1], + vec![0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1], + vec![0, 1, 0, 1, 1, 0, 0, 0, 1, 1], + vec![0, 1, 0, 1, 1, 0, 0, 1], + vec![0, 1, 0, 1, 1, 0, 1], + vec![0, 1, 0, 1, 1, 1], + vec![0, 1, 1], + vec![1, 0, 0, 0, 0, 0], + vec![1, 0, 0, 0, 0, 1, 0], + vec![1, 0, 0, 0, 0, 1, 1, 0, 0], + vec![1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0], + vec![1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0], + vec![1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0], + ], + }, + ] + } + + fn get_max_range_test_cases() -> Vec { + vec![ + SetMaxRangeTestCase { + original: vec![ + RangePayout { + start: 10, + count: 10, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }, + RangePayout { + start: 20, + count: 10, + payout: Payout { + offer: Amount::from_sat(10), + accept: Amount::ZERO, + }, + }, + ], + expected: vec![ + RangePayout { + start: 0, + count: 20, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }, + RangePayout { + start: 20, + count: 80, + payout: Payout { + offer: Amount::from_sat(10), + accept: Amount::ZERO, + }, + }, + ], + base: 10, + nb_digits: 2, + }, + SetMaxRangeTestCase { + original: vec![RangePayout { + start: 10, + count: 50, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }], + expected: vec![RangePayout { + start: 0, + count: 100, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }], + base: 10, + nb_digits: 2, + }, + SetMaxRangeTestCase { + original: vec![ + RangePayout { + start: 10, + count: 10, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }, + RangePayout { + start: 20, + count: 10, + payout: Payout { + offer: Amount::from_sat(10), + accept: Amount::ZERO, + }, + }, + ], + expected: vec![ + RangePayout { + start: 0, + count: 20, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }, + RangePayout { + start: 20, + count: 12, + payout: Payout { + offer: Amount::from_sat(10), + accept: Amount::ZERO, + }, + }, + ], + base: 2, + nb_digits: 5, + }, + SetMaxRangeTestCase { + original: vec![ + RangePayout { + start: 0, + count: 20, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }, + RangePayout { + start: 20, + count: 10, + payout: Payout { + offer: Amount::from_sat(10), + accept: Amount::ZERO, + }, + }, + ], + expected: vec![ + RangePayout { + start: 0, + count: 20, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(10), + }, + }, + RangePayout { + start: 20, + count: 12, + payout: Payout { + offer: Amount::from_sat(10), + accept: Amount::ZERO, + }, + }, + ], + base: 2, + nb_digits: 5, + }, + ] + } + + #[test] + fn compose_value_test() { + for test_case in decomposition_test_cases() { + assert_eq!( + test_case.composed, + super::compose_value(&test_case.decomposed, test_case.base) + ); + } + } + + #[test] + fn decompose_value_test() { + for test_case in decomposition_test_cases() { + assert_eq!( + test_case.decomposed, + super::decompose_value(test_case.composed, test_case.base, test_case.nb_digits) + ); + } + } + + #[test] + fn group_by_ignoring_digits_test() { + for test_case in grouping_test_cases() { + assert_eq!( + test_case.expected, + super::group_by_ignoring_digits( + test_case.start_index, + test_case.end_index, + test_case.base, + test_case.nb_digits + ) + ); + } + } + + #[test] + #[should_panic] + fn group_by_ignoring_digits_start_greater_than_end_panics() { + super::group_by_ignoring_digits(11, 10, 2, 4); + } + + #[test] + fn get_max_ranges_test() { + for test_case in get_max_range_test_cases() { + assert_eq!( + test_case.expected, + super::pad_range_payouts(test_case.original, test_case.base, test_case.nb_digits) + ); + } + } +} diff --git a/dlc-trie/src/digit_trie.rs b/dlc-trie/src/digit_trie.rs new file mode 100644 index 00000000..6f035a4d --- /dev/null +++ b/dlc-trie/src/digit_trie.rs @@ -0,0 +1,760 @@ +//! # DigitTrie +//! Data structure to store and lookup digit decomposition data. + +use crate::{LookupResult, Node}; +use dlc::Error; + +/// Structure to store data inserted and looked-up based on digit paths. +#[derive(Clone)] +pub struct DigitTrie { + /// Use the arena allocated approach which makes it easier to + /// satisfy the borrow checker. + store: Vec, DigitNode>>, + root: Option, + pub(crate) base: usize, +} + +/// Container for a dump of a DigitTrie used for serialization purpose. +pub struct DigitTrieDump +where + T: Clone, +{ + /// The data of the trie node. + pub node_data: Vec>, + /// The root of the trie. + pub root: Option, + /// The base for which this trie was built for. + pub base: usize, +} + +impl DigitTrie +where + T: Clone, +{ + /// Dump the content of the trie for the purpose of serialization. + pub fn dump(&self) -> DigitTrieDump { + let node_data = self.store.iter().map(|x| x.get_data()).collect(); + DigitTrieDump { + root: self.root, + base: self.base, + node_data, + } + } + + /// Restore a trie from a dump. + pub fn from_dump(dump: DigitTrieDump) -> DigitTrie { + let DigitTrieDump { + root, + base, + node_data, + } = dump; + let store = node_data.into_iter().map(|x| Node::from_data(x)).collect(); + DigitTrie { store, root, base } + } +} + +/// External representation of a node used for serialization purpose. +pub struct DigitNodeData { + /// The data contained in the node. + pub data: Option, + /// The prefix path of the node. + pub prefix: Vec, + /// The descendants of the node. + pub children: Option>>, +} + +impl Node, DigitNode> +where + T: Clone, +{ + fn get_data(&self) -> DigitNodeData { + match self { + Node::Leaf(l) => DigitNodeData { + data: Some(l.data.clone()), + prefix: l.prefix.clone(), + children: None, + }, + Node::Node(n) => DigitNodeData { + data: n.data.clone(), + prefix: n.prefix.clone(), + children: Some(n.children.clone()), + }, + Node::None => unreachable!(), + } + } + + fn from_data(data: DigitNodeData) -> Node, DigitNode> { + match data.children { + Some(c) => Node::Node(DigitNode { + children: c, + prefix: data.prefix, + data: data.data, + }), + None => Node::Leaf(DigitLeaf { + prefix: data.prefix, + data: data.data.unwrap(), + }), + } + } +} + +/// Structure used to iterated through a `DigitTrie` values. The iterator performs +/// a pre-order traversal of the trie. +pub struct DigitTrieIter<'a, T> { + trie: &'a DigitTrie, + /// Stack storing the node index of parents of the node currently being + /// visited (first item in the tuple), as well as the index of the child that + /// was last visited. An `isize` is used as the value -1 is used to indicate + /// that the node value has not yet been yield. + index_stack: Vec<(Option, isize)>, + cur_prefix: Vec>, +} + +impl<'a, T> DigitTrieIter<'a, T> { + /// Create a new `DigitTrieIter` struct. + pub fn new(trie: &'a DigitTrie) -> DigitTrieIter<'a, T> { + DigitTrieIter { + index_stack: vec![(trie.root, -1)], + trie, + cur_prefix: Vec::new(), + } + } + + fn cur_prefix_append(&mut self, to_append: &[usize]) { + self.cur_prefix.push(to_append.to_vec()); + } + fn cur_prefix_drop(&mut self) { + self.cur_prefix.pop(); + } +} + +#[derive(Clone)] +struct DigitLeaf { + data: T, + prefix: Vec, +} + +#[derive(Clone)] +struct DigitNode { + children: Vec>, + prefix: Vec, + data: Option, +} + +trait NodePrefix { + fn get_node_prefix(&self) -> Vec; + fn set_node_prefix(&mut self, prefix: Vec); +} + +impl NodePrefix for Node, DigitNode> { + fn get_node_prefix(&self) -> Vec { + match self { + Node::None => unreachable!(), + Node::Leaf(digit_leaf) => digit_leaf.prefix.clone(), + Node::Node(digit_node) => digit_node.prefix.clone(), + } + } + + fn set_node_prefix(&mut self, prefix: Vec) { + let pref = match self { + Node::None => unreachable!(), + Node::Leaf(digit_leaf) => &mut digit_leaf.prefix, + Node::Node(digit_node) => &mut digit_node.prefix, + }; + + *pref = prefix; + } +} + +fn get_common_prefix(a: &[usize], b: &[usize]) -> Vec { + a.iter() + .zip(b.iter()) + .take_while(|(x, y)| x == y) + .map(|(x, _)| x) + .cloned() + .collect() +} + +fn insert_new_leaf(trie: &mut DigitTrie, path: &[usize], data: T) -> usize { + trie.store.push(Node::Leaf(DigitLeaf { + prefix: path.to_vec(), + data, + })); + trie.store.len() - 1 +} + +fn is_prefix_of(prefix: &[usize], value: &[usize]) -> bool { + if prefix.len() > value.len() { + return false; + } + for i in 0..prefix.len() { + if prefix[i] != value[i] { + return false; + } + } + + true +} + +/// Implementation of the `Iterator` trait for `DigitTrieIter` +impl<'a, T> Iterator for DigitTrieIter<'a, T> { + type Item = LookupResult<'a, T, usize>; + fn next(&mut self) -> Option { + let popped = self.index_stack.pop(); + let (cur_index, mut cur_child) = match popped { + None => return None, + Some((cur_index, cur_child)) => match cur_index { + None => { + return self.next(); + } + Some(cur_index) => (cur_index, cur_child), + }, + }; + + match &self.trie.store[cur_index] { + Node::None => unreachable!(), + Node::Leaf(digit_leaf) => Some(LookupResult { + value: &digit_leaf.data, + path: self + .cur_prefix + .iter() + .filter(|x| !x.is_empty()) + .flatten() + .chain(digit_leaf.prefix.iter()) + .cloned() + .collect(), + }), + Node::Node(digit_node) => { + let node_prefix = digit_node.prefix.clone(); + + if cur_child >= (self.trie.base as isize) { + self.cur_prefix_drop(); + self.next() + } else { + let cur_children = digit_node.children.clone(); + if cur_child == -1 { + match &digit_node.data { + Some(data) => { + self.index_stack.push((Some(cur_index), cur_child + 1)); + return Some(LookupResult { + value: data, + path: self + .cur_prefix + .iter() + .filter(|x| !x.is_empty()) + .flatten() + .chain(digit_node.prefix.iter()) + .cloned() + .collect(), + }); + } + _ => { + cur_child += 1; + } + } + } + if cur_child == 0 { + self.cur_prefix_append(&node_prefix); + } + while cur_child < (self.trie.base as isize) { + self.index_stack.push((Some(cur_index), cur_child + 1)); + self.index_stack + .push((cur_children[cur_child as usize], -1)); + match self.next() { + None => { + self.index_stack.pop(); + cur_child += 1; + } + Some(res) => { + return Some(res); + } + }; + } + self.cur_prefix_drop(); + self.index_stack.pop(); + None + } + } + } + } +} + +impl DigitTrie { + /// Create a new `DigitTrie`. + pub fn new(base: usize) -> DigitTrie { + DigitTrie { + store: Vec::new(), + root: None, + base, + } + } + + /// Insert or update data at `path`. + pub fn insert(&mut self, path: &[usize], get_data: &mut F) -> Result<(), Error> + where + F: FnMut(Option) -> Result, + { + if path.is_empty() || path.iter().any(|x| x > &self.base) { + panic!("Invalid path"); + } + + self.root = Some(self.insert_internal(self.root, path, get_data)?); + Ok(()) + } + + fn insert_internal( + &mut self, + cur_index: Option, + path: &[usize], + get_data: &mut F, + ) -> Result + where + F: FnMut(Option) -> Result, + { + match cur_index { + None => Ok(insert_new_leaf(self, path, get_data(None)?)), + Some(cur_index) => { + self.store.push(Node::None); + let mut cur_node = self.store.swap_remove(cur_index); + let prefix = cur_node.get_node_prefix(); + if prefix == path { + match cur_node { + Node::Leaf(digit_leaf) => { + self.store[cur_index] = Node::Leaf(DigitLeaf { + data: get_data(Some(digit_leaf.data))?, + prefix: digit_leaf.prefix.to_vec(), + }); + Ok(cur_index) + } + Node::Node(mut node) => { + node.data = Some(get_data(node.data)?); + self.store[cur_index] = Node::Node(node); + Ok(cur_index) + } + Node::None => unreachable!(), + } + } else { + let common_prefix = get_common_prefix(&prefix, path); + let suffix: Vec<_> = path.iter().skip(common_prefix.len()).cloned().collect(); + if prefix == common_prefix { + match cur_node { + Node::Node(mut digit_node) => { + digit_node.children[suffix[0]] = Some(self.insert_internal( + digit_node.children[suffix[0]], + &suffix, + get_data, + )?); + self.store[cur_index] = Node::Node(DigitNode { + children: digit_node.children, + prefix: digit_node.prefix, + data: digit_node.data, + }); + return Ok(cur_index); + } + Node::None => unreachable!(), + Node::Leaf(digit_leaf) => { + let mut new_children = Vec::new(); + new_children.resize_with(self.base, || None); + new_children[suffix[0]] = + Some(insert_new_leaf(self, &suffix, get_data(None)?)); + self.store[cur_index] = Node::Node(DigitNode { + prefix: digit_leaf.prefix, + children: new_children, + data: Some(digit_leaf.data), + }); + return Ok(cur_index); + } + } + } + + let mut new_children = Vec::new(); + new_children.resize_with(self.base, || None); + + let data = if path == common_prefix { + Some(get_data(None)?) + } else { + new_children[path[common_prefix.len()]] = + Some(insert_new_leaf(self, &suffix, get_data(None)?)); + None + }; + + new_children[prefix[common_prefix.len()]] = Some(cur_index); + cur_node.set_node_prefix( + prefix.iter().skip(common_prefix.len()).cloned().collect(), + ); + self.store.push(Node::Node(DigitNode { + children: new_children, + prefix: common_prefix, + data, + })); + self.store[cur_index] = cur_node; + Ok(self.store.len() - 1) + } + } + } + } + + /// Lookup for nodes whose path is either equal or a prefix of `path`. + pub fn look_up(&self, path: &[usize]) -> Option>> { + self.look_up_internal(self.root, path) + } + + fn look_up_internal( + &self, + cur_index: Option, + path: &[usize], + ) -> Option>> { + match cur_index { + None => None, + Some(cur_index) => match &self.store[cur_index] { + Node::None => unreachable!(), + Node::Leaf(digit_leaf) => { + let common_prefix = get_common_prefix(&digit_leaf.prefix, path); + if digit_leaf.prefix == common_prefix { + Some(vec![LookupResult { + path: digit_leaf.prefix.to_vec(), + value: &digit_leaf.data, + }]) + } else { + None + } + } + Node::Node(digit_node) => { + if digit_node.prefix.len() > path.len() + || !is_prefix_of(&digit_node.prefix, path) + { + return None; + } + + if digit_node.prefix.len() == path.len() { + return digit_node.data.as_ref().map(|data| { + vec![LookupResult { + value: data, + path: digit_node.prefix.clone(), + }] + }); + } + + let prefix = path[digit_node.prefix.len()]; + let suffix: Vec<_> = + path.iter().skip(digit_node.prefix.len()).cloned().collect(); + let res = self.look_up_internal(digit_node.children[prefix], &suffix); + match res { + None => digit_node.data.as_ref().map(|data| { + vec![LookupResult { + value: data, + path: digit_node.prefix.clone(), + }] + }), + Some(l_res) => match &digit_node.data { + None => Some(extend_lookup_res_paths(l_res, &digit_node.prefix)), + Some(data) => { + let mut up_res = extend_lookup_res_paths(l_res, &digit_node.prefix); + let mut final_res = vec![LookupResult { + value: data, + path: digit_node.prefix.clone(), + }]; + final_res.append(&mut up_res); + Some(final_res) + } + }, + } + } + }, + } + } +} + +fn extend_lookup_res_paths<'a, T>( + l_res: Vec>, + path: &[usize], +) -> Vec> { + l_res + .into_iter() + .map(|x| LookupResult { + value: x.value, + path: path.iter().chain(x.path.iter()).cloned().collect(), + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + fn digit_trie_test_cases() -> Vec>> { + vec![ + vec![ + vec![10, 11], + vec![10, 12], + vec![10, 13], + vec![10, 14], + vec![10, 15], + vec![11], + vec![12], + vec![13, 0], + vec![13, 1], + vec![13, 2], + ], + vec![ + vec![0, 1, 2, 0, 10, 11], + vec![0, 1, 2, 0, 10, 12], + vec![0, 1, 2, 0, 10, 13], + vec![0, 1, 2, 0, 10, 14], + vec![0, 1, 2, 0, 10, 15], + vec![0, 1, 2, 0, 11], + vec![0, 1, 2, 0, 12], + vec![0, 1, 2, 0, 13, 0], + vec![0, 1, 2, 0, 13, 1], + vec![0, 1, 2, 0, 13, 2], + ], + ] + } + + #[test] + fn digit_trie_returns_inserted_elements() { + for test_case in digit_trie_test_cases() { + let mut digit_trie = DigitTrie::::new(16); + for (i, path) in test_case.iter().enumerate() { + digit_trie.insert(path, &mut |_| Ok(i)).unwrap(); + } + + for (i, path) in test_case.iter().enumerate() { + let actual = digit_trie.look_up(path); + match actual { + None => panic!(), + Some(l_res) => { + assert_eq!(1, l_res.len()); + assert_eq!(path, &l_res[0].path); + assert_eq!(i, *l_res[0].value); + } + } + } + } + } + + #[test] + fn digit_trie_return_value_with_longer_path_query() { + let mut digit_trie = DigitTrie::new(5); + let expected_path = &[0, 1]; + let expected_value = 1; + digit_trie + .insert(expected_path, &mut |_| Ok(expected_value)) + .unwrap(); + let actual = digit_trie.look_up(&[0, 1, 2]); + match actual { + None => panic!(), + Some(l_res) => { + assert_eq!(1, l_res.len()); + assert_eq!(l_res[0].path, &[0, 1]); + assert_eq!(*l_res[0].value, expected_value); + } + } + } + + #[test] + fn digit_trie_insert_on_common_prefix_query_longest_returns_both() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2, 3], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(2)).unwrap(); + let res = digit_trie.look_up(&[0, 1, 2, 3]).unwrap(); + + assert_eq!(res.len(), 2); + assert_eq!(vec![0, 1, 2], res[0].path); + assert_eq!(vec![0, 1, 2, 3], res[1].path); + } + + #[test] + fn digit_trie_insert_on_common_prefix_query_shortest_returns_single() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2, 3], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(2)).unwrap(); + let res = digit_trie.look_up(&[0, 1, 2]).unwrap(); + + assert_eq!(res.len(), 1); + assert_eq!(vec![0, 1, 2], res[0].path); + } + + #[test] + fn digit_trie_insert_on_common_prefix_query_longer_non_existing_returns_single() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2, 3], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(2)).unwrap(); + let res = digit_trie.look_up(&[0, 1, 2, 4]).unwrap(); + + assert_eq!(res.len(), 1); + assert_eq!(vec![0, 1, 2], res[0].path); + } + + #[test] + fn digit_trie_insert_on_leaf_returns_both() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[0, 1, 2, 3], &mut |_| Ok(2)).unwrap(); + let res = digit_trie.look_up(&[0, 1, 2, 3]).unwrap(); + + assert_eq!(res.len(), 2); + assert_eq!(vec![0, 1, 2], res[0].path); + assert_eq!(vec![0, 1, 2, 3], res[1].path); + } + + #[test] + fn digit_trie_query_non_inserted_returns_not_found() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[1, 2, 3], &mut |_| Ok(2)).unwrap(); + assert!(digit_trie.look_up(&[0, 1, 3]).is_none()); + assert!(digit_trie.look_up(&[1, 2, 5]).is_none()); + assert!(digit_trie.look_up(&[0, 0, 0]).is_none()); + } + + #[test] + fn digit_trie_replace_data_when_insert_on_existing_path() { + let mut digit_trie = DigitTrie::new(5); + let path = &[0, 1, 2, 3]; + digit_trie.insert(path, &mut |_| Ok(1)).unwrap(); + digit_trie.insert(path, &mut |_| Ok(2)).unwrap(); + let res = digit_trie.look_up(path); + match res { + None => panic!(), + Some(l_res) => assert_eq!(*l_res[0].value, 2), + } + } + + #[test] + fn digit_trie_insert_on_mid_node_returns_all() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2, 3], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[0, 1, 2, 4], &mut |_| Ok(2)).unwrap(); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(3)).unwrap(); + + let res = digit_trie.look_up(&[0, 1, 2, 3]).unwrap(); + + assert_eq!(2, res.len()); + assert_eq!(*res[0].value, 3); + assert_eq!(*res[1].value, 1); + + let res = digit_trie.look_up(&[0, 1, 2, 4]).unwrap(); + + assert_eq!(2, res.len()); + assert_eq!(*res[0].value, 3); + assert_eq!(*res[1].value, 2); + } + + fn assert_not_found(res: Option>>) + where + T: Copy, + { + if res.is_some() { + panic!(); + } + } + + #[test] + fn digit_trie_return_not_found_if_not_inserted() { + let mut digit_trie = DigitTrie::new(5); + digit_trie.insert(&[0, 1, 2], &mut |_| Ok(1)).unwrap(); + digit_trie.insert(&[0, 1, 3], &mut |_| Ok(2)).unwrap(); + digit_trie.insert(&[4, 1, 2], &mut |_| Ok(3)).unwrap(); + + assert_not_found(digit_trie.look_up(&[1, 2, 5])); + assert_not_found(digit_trie.look_up(&[2])); + assert_not_found(digit_trie.look_up(&[1])); + assert_not_found(digit_trie.look_up(&[1, 3])); + assert_not_found(digit_trie.look_up(&[2, 1, 3])); + } + + #[test] + fn digit_trie_returns_inserted_values_when_iterating() { + for test_case in digit_trie_test_cases() { + let mut digit_trie = DigitTrie::::new(16); + for (i, path) in test_case.iter().enumerate() { + digit_trie.insert(path, &mut |_| Ok(i)).unwrap(); + } + + let digit_trie_iter = DigitTrieIter::new(&digit_trie); + + let mut count = 0; + for (i, res) in digit_trie_iter.enumerate() { + assert_eq!(test_case[i], res.path); + assert_eq!(i, *res.value); + count += 1; + } + + assert_eq!(test_case.len(), count); + } + } + + #[test] + fn digit_trie_returns_node_values_when_iterating() { + let mut digit_trie = DigitTrie::new(5); + let test_cases = vec![ + vec![vec![0, 1, 2, 3], vec![0, 1, 2, 4], vec![0, 1, 2]], + vec![vec![0, 1, 2], vec![0, 1, 2, 3], vec![0, 1, 2, 4]], + vec![ + vec![0, 1], + vec![0, 1, 2], + vec![0, 1, 2, 3], + vec![0, 1, 2, 4], + ], + vec![ + vec![0, 1, 2], + vec![0, 1, 2, 3], + vec![0, 1], + vec![0, 1, 2, 4], + ], + vec![ + vec![0, 1, 2, 3], + vec![0, 1, 2, 4], + vec![0, 1], + vec![0, 1, 2], + ], + ]; + for test_case in test_cases { + for (i, test_path) in test_case.iter().enumerate() { + digit_trie.insert(test_path, &mut |_| Ok(i)).unwrap(); + } + + let digit_trie_iter = DigitTrieIter::new(&digit_trie); + + let mut count = 0; + for res in digit_trie_iter { + assert_eq!( + *res.value, + test_case.iter().position(|x| x == &res.path).unwrap() + ); + count += 1; + } + + assert_eq!(test_case.len(), count); + } + } + + #[test] + fn digit_trie_iterate_gets_all_inserted_values() { + let mut digit_trie = DigitTrie::new(2); + let paths = vec![vec![0, 0], vec![0, 1], vec![1, 0, 0], vec![0, 1, 0]]; + let mut counter = 0; + let mut get_value = |_: Option| -> Result { + let res = counter; + counter += 1; + Ok(res) + }; + + for path in &paths { + digit_trie.insert(path, &mut get_value).unwrap(); + } + + let iter = DigitTrieIter::new(&digit_trie); + + let mut unordered = iter.map(|x| *x.value).collect::>(); + + assert_eq!(paths.len(), unordered.len()); + + unordered.sort_unstable(); + + for (prev_index, i) in unordered.iter().skip(1).enumerate() { + assert_eq!(*i, prev_index + 1); + } + } +} diff --git a/dlc-trie/src/lib.rs b/dlc-trie/src/lib.rs new file mode 100644 index 00000000..41e86048 --- /dev/null +++ b/dlc-trie/src/lib.rs @@ -0,0 +1,358 @@ +//! # Dlc-trie +//! Package for storing and retrieving DLC data using tries. + +#![crate_name = "dlc_trie"] +// Coding conventions +#![forbid(unsafe_code)] +#![deny(non_upper_case_globals)] +#![deny(non_camel_case_types)] +#![deny(non_snake_case)] +#![deny(unused_mut)] +#![deny(dead_code)] +#![deny(unused_imports)] +#![deny(missing_docs)] + +extern crate bitcoin; +extern crate dlc; +#[cfg(feature = "parallel")] +extern crate rayon; +extern crate secp256k1_zkp; +#[cfg(feature = "use-serde")] +extern crate serde; + +use bitcoin::{Amount, Script, Transaction}; +use dlc::{Error, RangePayout}; +#[cfg(feature = "parallel")] +use rayon::prelude::*; +use secp256k1_zkp::{All, EcdsaAdaptorSignature, PublicKey, Secp256k1, SecretKey}; +#[cfg(feature = "use-serde")] +use serde::{Deserialize, Serialize}; + +pub mod combination_iterator; +pub mod digit_decomposition; +pub mod digit_trie; +pub mod multi_oracle; +pub mod multi_oracle_trie; +pub mod multi_oracle_trie_with_diff; +pub mod multi_trie; +#[cfg(test)] +mod test_utils; +mod utils; + +pub(crate) type IndexedPath = (usize, Vec); + +/// Structure containing a reference to a looked-up value and the +/// path at which it was found. +#[derive(Debug, Clone)] +pub struct LookupResult<'a, TValue, TPath> { + /// The path at which the `value` was found. + pub path: Vec, + /// The value that was returned. + pub value: &'a TValue, +} + +/// Enum representing the different type of nodes in a tree +#[derive(Debug, Clone)] +pub enum Node { + /// None is only used as a placeholder when taking mutable ownership of a + /// node during insertion. + None, + /// A leaf is a node in the tree that does not have any children. + Leaf(TLeaf), + /// A node is parent to at least one other node in a tree. + Node(TNode), +} + +#[derive(Eq, PartialEq, Debug, Clone)] +/// Structure that stores the indexes at which the CET and adaptor signature +/// related to a given outcome are located in CET and adaptor signatures arrays +/// respectively. +pub struct RangeInfo { + /// a cet index + pub cet_index: usize, + /// an adaptor signature index + pub adaptor_index: usize, +} + +#[derive(Clone, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +/// Information about the base and number of digits used by the oracle. +pub struct OracleNumericInfo { + /// The base in which the oracle will represent the outcome value. + pub base: usize, + /// The number of digits that each oracle will use to represent the outcome value. + pub nb_digits: Vec, +} + +impl OracleNumericInfo { + /// Return the minimum number of digits supported by an oracle in the group. + pub fn get_min_nb_digits(&self) -> usize { + *self.nb_digits.iter().min().unwrap() + } + + /// Returns whether oracles have varying number of digits. + pub fn has_diff_nb_digits(&self) -> bool { + self.nb_digits + .iter() + .skip(1) + .any(|x| *x != self.nb_digits[0]) + } +} + +/// A common trait for trie data structures that store DLC adaptor signature +/// information. +pub trait DlcTrie<'a, TrieIterator: Iterator> { + /// Generate the trie using the provided outcomes and oracle information, + /// calling the provided callback with the CET index and adaptor point for + /// each adaptor signature. + fn generate( + &'a mut self, + adaptor_index_start: usize, + outcomes: &[RangePayout], + ) -> Result, Error>; + + /// Returns an iterator to this trie. + fn iter(&'a self) -> TrieIterator; + + /// Generate the trie while verifying the provided adaptor signatures. + fn generate_verify( + &'a mut self, + secp: &Secp256k1, + fund_pubkey: &PublicKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + outcomes: &[RangePayout], + cets: &[Transaction], + precomputed_points: &[Vec>], + adaptor_sigs: &[EcdsaAdaptorSignature], + adaptor_index_start: usize, + ) -> Result { + let trie_info = self.generate(adaptor_index_start, outcomes)?; + verify_helper( + secp, + cets, + adaptor_sigs, + fund_pubkey, + funding_script_pubkey, + fund_output_value, + precomputed_points, + trie_info.into_iter(), + ) + } + + /// Generate the trie while creating the set of adaptor signatures. + fn generate_sign( + &'a mut self, + secp: &Secp256k1, + fund_privkey: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + outcomes: &[RangePayout], + cets: &[Transaction], + precomputed_points: &[Vec>], + adaptor_index_start: usize, + ) -> Result, Error> { + let trie_info = self.generate(adaptor_index_start, outcomes)?; + sign_helper( + secp, + cets, + fund_privkey, + funding_script_pubkey, + fund_output_value, + precomputed_points, + trie_info.into_iter(), + ) + } + + /// Verify that the provided signatures are valid with respect to the + /// information stored in the trie. + fn verify( + &'a self, + secp: &Secp256k1, + fund_pubkey: &PublicKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + adaptor_sigs: &[EcdsaAdaptorSignature], + cets: &[Transaction], + precomputed_points: &[Vec>], + ) -> Result { + verify_helper( + secp, + cets, + adaptor_sigs, + fund_pubkey, + funding_script_pubkey, + fund_output_value, + precomputed_points, + self.iter(), + ) + } + + /// Produce the set of adaptor signatures for the trie. + fn sign( + &'a self, + secp: &Secp256k1, + fund_privkey: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + cets: &[Transaction], + precomputed_points: &[Vec>], + ) -> Result, Error> { + let trie_info = self.iter(); + sign_helper( + secp, + cets, + fund_privkey, + funding_script_pubkey, + fund_output_value, + precomputed_points, + trie_info, + ) + } +} + +#[derive(Debug)] +/// Holds information provided when iterating a DlcTrie. +pub struct TrieIterInfo { + indexes: Vec, + paths: Vec>, + value: RangeInfo, +} + +#[cfg(not(feature = "parallel"))] +fn sign_helper>( + secp: &Secp256k1, + cets: &[Transaction], + fund_privkey: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + precomputed_points: &[Vec>], + trie_info: T, +) -> Result, Error> { + let mut unsorted = trie_info + .map(|x| { + let adaptor_point = utils::get_adaptor_point_for_indexed_paths( + &x.indexes, + &x.paths, + precomputed_points, + )?; + let adaptor_sig = dlc::create_cet_adaptor_sig_from_point( + secp, + &cets[x.value.cet_index], + &adaptor_point, + fund_privkey, + funding_script_pubkey, + fund_output_value, + )?; + Ok((x.value.adaptor_index, adaptor_sig)) + }) + .collect::, Error>>()?; + unsorted.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); + Ok(unsorted.into_iter().map(|(_, y)| y).collect()) +} + +#[cfg(feature = "parallel")] +fn sign_helper>( + secp: &Secp256k1, + cets: &[Transaction], + fund_privkey: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + precomputed_points: &[Vec>], + trie_info: T, +) -> Result, Error> { + let trie_info: Vec = trie_info.collect(); + let mut unsorted = trie_info + .par_iter() + .map(|x| { + let adaptor_point = utils::get_adaptor_point_for_indexed_paths( + &x.indexes, + &x.paths, + precomputed_points, + )?; + let adaptor_sig = dlc::create_cet_adaptor_sig_from_point( + secp, + &cets[x.value.cet_index], + &adaptor_point, + fund_privkey, + funding_script_pubkey, + fund_output_value, + )?; + Ok((x.value.adaptor_index, adaptor_sig)) + }) + .collect::, Error>>()?; + unsorted.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); + Ok(unsorted.into_iter().map(|(_, y)| y).collect()) +} + +#[cfg(not(feature = "parallel"))] +fn verify_helper>( + secp: &Secp256k1, + cets: &[Transaction], + adaptor_sigs: &[EcdsaAdaptorSignature], + fund_pubkey: &PublicKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + precomputed_points: &[Vec>], + trie_info: T, +) -> Result { + let mut max_adaptor_index = 0; + for x in trie_info { + let adaptor_point = + utils::get_adaptor_point_for_indexed_paths(&x.indexes, &x.paths, precomputed_points)?; + let adaptor_sig = adaptor_sigs[x.value.adaptor_index]; + let cet = &cets[x.value.cet_index]; + if x.value.adaptor_index > max_adaptor_index { + max_adaptor_index = x.value.adaptor_index; + } + dlc::verify_cet_adaptor_sig_from_point( + secp, + &adaptor_sig, + cet, + &adaptor_point, + fund_pubkey, + funding_script_pubkey, + fund_output_value, + )?; + } + Ok(max_adaptor_index + 1) +} + +#[cfg(feature = "parallel")] +fn verify_helper>( + secp: &Secp256k1, + cets: &[Transaction], + adaptor_sigs: &[EcdsaAdaptorSignature], + fund_pubkey: &PublicKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + precomputed_points: &[Vec>], + trie_info: T, +) -> Result { + let trie_info: Vec = trie_info.collect(); + let max_adaptor_index = trie_info + .iter() + .max_by(|x, y| x.value.adaptor_index.cmp(&y.value.adaptor_index)) + .unwrap(); + trie_info.par_iter().try_for_each(|x| { + let adaptor_point = + utils::get_adaptor_point_for_indexed_paths(&x.indexes, &x.paths, precomputed_points)?; + let adaptor_sig = adaptor_sigs[x.value.adaptor_index]; + let cet = &cets[x.value.cet_index]; + dlc::verify_cet_adaptor_sig_from_point( + secp, + &adaptor_sig, + cet, + &adaptor_point, + fund_pubkey, + funding_script_pubkey, + fund_output_value, + ) + })?; + + Ok(max_adaptor_index.value.adaptor_index + 1) +} diff --git a/dlc-trie/src/multi_oracle.rs b/dlc-trie/src/multi_oracle.rs new file mode 100644 index 00000000..7b6620db --- /dev/null +++ b/dlc-trie/src/multi_oracle.rs @@ -0,0 +1,840 @@ +//! Utility functions to compute outcome combinations to work with +//! multi oracle DLC. + +use digit_decomposition::{compose_value, decompose_value}; + +use crate::utils::pre_pad_vec; + +fn adjust_prefix_size( + prefix: &[usize], + nb_digits: usize, + suffix_len: usize, +) -> Result, ()> { + let expected_len = nb_digits - suffix_len; + match prefix.len() { + len if len <= expected_len => Ok(pre_pad_vec(prefix.to_vec(), expected_len)), + len => { + let mut res = prefix.to_vec(); + if !res.drain(..len - expected_len).all(|x| x == 0) { + return Err(()); + } + Ok(res) + } + } +} + +/// Returns the interval represented by the given prefix in the given base with +/// the given number of digits. +fn compute_interval_from_prefix( + prefix: &[usize], + num_digits: usize, + base: usize, +) -> (usize, usize) { + let suffix_len = num_digits - prefix.len(); + let start = compose_value( + &prefix + .iter() + .cloned() + .chain((0..suffix_len).map(|_| 0)) + .collect::>(), + base, + ); + let end = compose_value( + &prefix + .iter() + .cloned() + .chain((0..suffix_len).map(|_| base - 1)) + .collect::>(), + base, + ); + (start, end) +} + +fn num_to_vec(input: usize, nb_digits: usize, ignored_digits: usize, base: usize) -> Vec { + let decomposed = decompose_value(input, base, nb_digits); + let to_take = decomposed.len() - ignored_digits; + + decomposed.into_iter().take(to_take).collect::>() +} + +fn compute_min_support_covering_prefix( + start: usize, + end: usize, + min_support: usize, + min_nb_digits: usize, +) -> Vec { + let left_bound = start - min_support; + let right_bound = end + min_support; + let left_bound = decompose_value(left_bound, 2, min_nb_digits); + let right_bound = decompose_value(right_bound, 2, min_nb_digits); + + left_bound + .into_iter() + .zip(right_bound) + .take_while(|(x, y)| x == y) + .map(|(x, _)| x) + .collect() +} + +/// Take the largest prefix of the smallest interval that contains [max_error; end + min_support] +fn compute_left_covering_prefix( + start: usize, + max_error_exp: usize, + min_support: usize, + nb_digits: usize, +) -> Vec { + let left_bound = start - min_support; + let left_bound = decompose_value(left_bound, 2, nb_digits); + let (prefix, suffix) = left_bound.split_at(nb_digits - max_error_exp); + + prefix + .iter() + .chain(suffix.iter().take_while(|x| **x == 1)) + .cloned() + .collect() +} + +/// Take the largest prefix of the smallest interval that contains [start - min_support; max_error] +fn compute_right_covering_prefix( + end: usize, + max_error_exp: usize, + min_support: usize, + nb_digits: usize, +) -> Vec { + let left_bound = end + min_support; + let left_bound = decompose_value(left_bound, 2, nb_digits); + let (prefix, suffix) = left_bound.split_at(nb_digits - max_error_exp); + + prefix + .iter() + .chain(suffix.iter().take_while(|x| **x == 0)) + .cloned() + .collect() +} + +fn single_covering_prefix_combinations( + main_outcome_prefix: &[usize], + secondary_outcomes_prefix: &[usize], + oracle_digits_infos: &[usize], + suffix_len: usize, +) -> Vec> { + let mut secondary = oracle_digits_infos + .iter() + .skip(1) + .map(|nb_digits| { + adjust_prefix_size( + secondary_outcomes_prefix, + *nb_digits, + main_outcome_prefix.len() - secondary_outcomes_prefix.len() + suffix_len, + ) + .unwrap() + }) + .collect::>>(); + let mut res = + vec![adjust_prefix_size(main_outcome_prefix, oracle_digits_infos[0], suffix_len).unwrap()]; + res.append(&mut secondary); + res +} + +/// All combinations of main outcome and other except for the one that contains +/// only main outcome. +fn double_covering_restricted_prefix_combinations( + main_outcome_prefix: &[usize], + other_interval_prefix: &[usize], + oracle_digits_infos: &[usize], + suffix_len: usize, +) -> Vec>> { + let mut combinations = double_covering_prefix_combinations( + main_outcome_prefix, + main_outcome_prefix, + other_interval_prefix, + oracle_digits_infos, + suffix_len, + ); + + if main_outcome_prefix > other_interval_prefix { + combinations.remove(combinations.len() - 1); + combinations + } else { + combinations.into_iter().skip(1).collect::>() + } +} + +/// Generates all the combination of prefixes starting with `main_outcome_prefix` +/// with `left_interval_prefix` and `right_interval_prefix` in lexicographic +/// order. +fn double_covering_prefix_combinations( + main_outcome_prefix: &[usize], + left_interval_prefix: &[usize], + right_interval_prefix: &[usize], + oracle_digits_infos: &[usize], + suffix_len: usize, +) -> Vec>> { + let nb_oracles = oracle_digits_infos.len(); + let mut res = Vec::with_capacity(nb_oracles); + let (first, second) = if left_interval_prefix <= right_interval_prefix { + (left_interval_prefix, right_interval_prefix) + } else { + (right_interval_prefix, left_interval_prefix) + }; + + for i in 0..(1 << (nb_oracles - 1)) { + let mut mid_res = Vec::with_capacity(nb_oracles); + for j in 0..(nb_oracles - 1) { + let val: Vec = match i & (1 << j) { + 0 => first.to_vec(), + _ => second.to_vec(), + }; + mid_res.push(val); + } + mid_res.push(main_outcome_prefix.to_vec()); + mid_res.reverse(); + let trimmed = mid_res + .into_iter() + .zip(oracle_digits_infos) + .map(|(x, y)| { + adjust_prefix_size(&x, *y, main_outcome_prefix.len() + suffix_len - x.len()) + }) + .collect::>, ()>>(); + + if let Ok(mid_res) = trimmed { + res.push(mid_res) + } + } + + res +} + +/// Compute the outcome combinations required to cover intervals that will +/// satisfy the specified min support and max error parameters. +/// Expect that the first element of oracle_numeric_infos is the one with smallest +/// `num_digits`. +/// Throws if oracle_numeric_infos has less than 2 elements or max_error_exp is +/// not greater than min_support_exp. +pub fn compute_outcome_combinations( + oracle_digits_infos: &[usize], + main_outcome_prefix: &[usize], + max_error_exp: usize, + min_support_exp: usize, + maximize_coverage: bool, +) -> Vec>> { + let nb_oracles = oracle_digits_infos.len(); + assert!(nb_oracles > 1 && max_error_exp > min_support_exp); + + let min_num_digits = oracle_digits_infos[0]; + let (min_num_digits, max_num, main_outcome_prefix) = if oracle_digits_infos + .iter() + .skip(1) + .all(|x| x == &min_num_digits) + { + ( + min_num_digits, + (1 << min_num_digits) - 1, + main_outcome_prefix.to_vec(), + ) + } else { + let mut new_main_outcome_prefix = vec![0]; + new_main_outcome_prefix.extend_from_slice(main_outcome_prefix); + ( + min_num_digits + 1, + (1 << (min_num_digits + 1)) - 1, + new_main_outcome_prefix, + ) + }; + let max_error: usize = 1 << max_error_exp; + let half_max_error: usize = max_error >> 1; + let min_support: usize = 1 << min_support_exp; + let suffix_len = min_num_digits - main_outcome_prefix.len(); + + let (start, end) = compute_interval_from_prefix(&main_outcome_prefix, min_num_digits, 2); + + // interval length is strictly smaller than max_error + if suffix_len < max_error_exp { + let start_max_error_suffix = start & ((1 << max_error_exp) - 1); + let left_bound = (start >> max_error_exp) << max_error_exp; + let right_bound = left_bound | (max_error - 1); + let error_interval_prefix = num_to_vec(left_bound, min_num_digits, max_error_exp, 2); + + // interval length is less than or equal to min_support + if start_max_error_suffix >= min_support && end <= right_bound - min_support { + let support_interval_prefix = if maximize_coverage { + error_interval_prefix + } else { + compute_min_support_covering_prefix(start, end, min_support, min_num_digits) + }; + + return vec![single_covering_prefix_combinations( + &main_outcome_prefix, + &support_interval_prefix, + oracle_digits_infos, + suffix_len, + )]; + } else if start_max_error_suffix < min_support { + let right_interval_prefix = if maximize_coverage { + error_interval_prefix + } else { + compute_right_covering_prefix(end, max_error_exp, min_support, min_num_digits) + }; + + return if left_bound == 0 { + vec![single_covering_prefix_combinations( + &main_outcome_prefix, + &right_interval_prefix, + oracle_digits_infos, + suffix_len, + )] + } else { + let left_interval_prefix = if maximize_coverage { + num_to_vec( + left_bound - half_max_error, + min_num_digits, + max_error_exp - 1, + 2, + ) + } else { + compute_left_covering_prefix(start, max_error_exp, min_support, min_num_digits) + }; + double_covering_prefix_combinations( + &main_outcome_prefix, + &right_interval_prefix, + &left_interval_prefix, + oracle_digits_infos, + suffix_len, + ) + }; + } else if end > right_bound - min_support { + let left_interval_prefix = if maximize_coverage { + error_interval_prefix + } else { + compute_left_covering_prefix(start, max_error_exp, min_support, min_num_digits) + }; + + return if right_bound == max_num { + vec![single_covering_prefix_combinations( + &main_outcome_prefix, + &left_interval_prefix, + oracle_digits_infos, + suffix_len, + )] + } else { + let right_interval_prefix = if maximize_coverage { + num_to_vec(right_bound + 1, min_num_digits, max_error_exp - 1, 2) + } else { + compute_right_covering_prefix(end, max_error_exp, min_support, min_num_digits) + }; + + double_covering_prefix_combinations( + &main_outcome_prefix, + &left_interval_prefix, + &right_interval_prefix, + oracle_digits_infos, + suffix_len, + ) + }; + } else { + unreachable!(); + } + } + + let mut res = Vec::new(); + + if start != 0 { + let right_interval_prefix = if maximize_coverage { + num_to_vec(start, min_num_digits, max_error_exp - 1, 2) + } else { + num_to_vec(start, min_num_digits, min_support_exp, 2) + }; + + let left_interval_prefix = if maximize_coverage { + num_to_vec(start - half_max_error, min_num_digits, max_error_exp - 1, 2) + } else { + num_to_vec(start - min_support, min_num_digits, min_support_exp, 2) + }; + + let mut combination = double_covering_restricted_prefix_combinations( + &right_interval_prefix, + &left_interval_prefix, + oracle_digits_infos, + min_num_digits - right_interval_prefix.len(), + ); + + res.append(&mut combination); + } + + res.push(single_covering_prefix_combinations( + &main_outcome_prefix, + &main_outcome_prefix, + oracle_digits_infos, + suffix_len, + )); + + if end != max_num { + let right_interval_prefix = if maximize_coverage { + num_to_vec( + end - half_max_error + 1, + min_num_digits, + max_error_exp - 1, + 2, + ) + } else { + num_to_vec(end - min_support + 1, min_num_digits, min_support_exp, 2) + }; + + let left_interval_prefix = if maximize_coverage { + num_to_vec(end + 1, min_num_digits, max_error_exp - 1, 2) + } else { + num_to_vec(end + 1, min_num_digits, min_support_exp, 2) + }; + + let mut combination = double_covering_restricted_prefix_combinations( + &right_interval_prefix, + &left_interval_prefix, + oracle_digits_infos, + min_num_digits - right_interval_prefix.len(), + ); + res.append(&mut combination); + } + + res +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_utils::{ + get_variable_oracle_numeric_infos, same_num_digits_oracle_numeric_infos, + }; + use secp256k1_zkp::rand::{thread_rng, RngCore}; + + type CoveringCetsMinMax = (Vec<(Vec, Vec)>, Vec<(Vec, Vec)>); + + fn compute_covering_cets_min_and_max( + oracle_digits_infos: &[usize], + main_outcome_prefix: &[usize], + max_error_exp: usize, + min_support_exp: usize, + ) -> CoveringCetsMinMax { + let covering_max = compute_outcome_combinations( + oracle_digits_infos, + main_outcome_prefix, + max_error_exp, + min_support_exp, + true, + ); + let covering_min = compute_outcome_combinations( + oracle_digits_infos, + main_outcome_prefix, + max_error_exp, + min_support_exp, + false, + ); + + assert!(covering_max.iter().all(|x| x.len() == 2)); + assert!(covering_min.iter().all(|x| x.len() == 2)); + + ( + covering_max + .into_iter() + .map(|mut x| (x.remove(0), x.remove(x.len() - 1))) + .collect(), + covering_min + .into_iter() + .map(|mut x| (x.remove(0), x.remove(x.len() - 1))) + .collect(), + ) + } + + struct TestCase { + main_outcome_prefix: Vec, + nb_digits: usize, + max_error_exp: usize, + min_support_exp: usize, + expected_max: Vec<(Vec, Vec)>, + expected_min: Vec<(Vec, Vec)>, + } + + fn outcome_prefixes() -> Vec> { + vec![ + vec![0, 0, 1, 0, 1, 1, 0, 0, 1], + vec![0, 1, 0, 0, 0, 0, 0, 1, 1], + vec![0, 1, 1, 1, 1, 1, 0, 1, 0], + vec![0, 1], + vec![0, 0, 1], + vec![1, 1, 1, 1, 1, 1, 1, 1], + vec![0, 0], + vec![1, 1], + ] + } + + fn prefix(index: usize) -> Vec { + outcome_prefixes().remove(index) + } + + fn test_cases() -> Vec { + vec![ + TestCase { + main_outcome_prefix: prefix(0), + nb_digits: 14, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![(prefix(0), vec![0, 0, 1])], + expected_min: vec![(prefix(0), vec![0, 0, 1, 0, 1])], + }, + TestCase { + main_outcome_prefix: prefix(1), + nb_digits: 13, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![(prefix(1), vec![0, 0, 1]), (prefix(1), vec![0, 1])], + expected_min: vec![ + (prefix(1), vec![0, 0, 1, 1, 1, 1]), + (prefix(1), vec![0, 1, 0, 0, 0]), + ], + }, + TestCase { + main_outcome_prefix: prefix(2), + nb_digits: 13, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![(prefix(2), vec![0, 1]), (prefix(2), vec![1, 0, 0])], + expected_min: vec![ + (prefix(2), vec![0, 1, 1, 1, 1]), + (prefix(2), vec![1, 0, 0, 0, 0, 0, 0]), + ], + }, + TestCase { + main_outcome_prefix: prefix(3), + nb_digits: 13, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![ + (vec![0, 1, 0], vec![0, 0, 1]), + (prefix(3), prefix(3)), + (vec![0, 1, 1], vec![1, 0, 0]), + ], + expected_min: vec![ + (vec![0, 1, 0, 0, 0, 0], vec![0, 0, 1, 1, 1, 1]), + (prefix(3), prefix(3)), + (vec![0, 1, 1, 1, 1, 1], vec![1, 0, 0, 0, 0, 0]), + ], + }, + TestCase { + main_outcome_prefix: prefix(4), + nb_digits: 15, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![ + (vec![0, 0, 1, 0, 0], vec![0, 0, 0, 1, 1]), + (prefix(4), prefix(4)), + (vec![0, 0, 1, 1, 1], vec![0, 1, 0, 0, 0]), + ], + expected_min: vec![ + (vec![0, 0, 1, 0, 0, 0, 0, 0], vec![0, 0, 0, 1, 1, 1, 1, 1]), + (prefix(4), prefix(4)), + (vec![0, 0, 1, 1, 1, 1, 1, 1], vec![0, 1, 0, 0, 0, 0, 0, 0]), + ], + }, + TestCase { + main_outcome_prefix: prefix(5), + nb_digits: 13, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![(prefix(5), vec![1, 1])], + expected_min: vec![(prefix(5), vec![1, 1, 1, 1, 1])], + }, + TestCase { + main_outcome_prefix: prefix(6), + nb_digits: 13, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![(prefix(6), prefix(6)), (vec![0, 0, 1], vec![0, 1, 0])], + expected_min: vec![ + (prefix(6), prefix(6)), + (vec![0, 0, 1, 1, 1, 1], vec![0, 1, 0, 0, 0, 0]), + ], + }, + TestCase { + main_outcome_prefix: prefix(7), + nb_digits: 14, + max_error_exp: 11, + min_support_exp: 7, + expected_max: vec![(vec![1, 1, 0, 0], vec![1, 0, 1, 1]), (prefix(7), prefix(7))], + expected_min: vec![ + (vec![1, 1, 0, 0, 0, 0, 0], vec![1, 0, 1, 1, 1, 1, 1]), + (prefix(7), prefix(7)), + ], + }, + ] + } + + #[test] + fn compute_outcome_combination_tests() { + for case in test_cases() { + let (max, min) = compute_covering_cets_min_and_max( + &same_num_digits_oracle_numeric_infos(2, case.nb_digits, 2).nb_digits, + &case.main_outcome_prefix, + case.max_error_exp, + case.min_support_exp, + ); + assert_eq!(case.expected_max, max); + assert_eq!(case.expected_min, min); + } + } + + #[test] + fn compute_outcome_three_oracles() { + let prefix = vec![0, 1, 0]; + + let res = compute_outcome_combinations( + &same_num_digits_oracle_numeric_infos(3, 3, 2).nb_digits, + &prefix, + 2, + 1, + true, + ); + + let expected = vec![ + vec![vec![0, 1, 0], vec![0], vec![0]], + vec![vec![0, 1, 0], vec![0], vec![1, 0]], + vec![vec![0, 1, 0], vec![1, 0], vec![0]], + vec![vec![0, 1, 0], vec![1, 0], vec![1, 0]], + ]; + + assert_eq!(res, expected); + } + + #[test] + fn multiple_interval_within_bounds() { + let mut rng = thread_rng(); + + let nb_digits = (rng.next_u32() % 29) + 2; + let nb_digits_used = rng.next_u32() % nb_digits + 1; + let mut main_outcome_prefix = Vec::with_capacity(nb_digits_used as usize); + for _ in 0..nb_digits_used { + main_outcome_prefix.push((rng.next_u32() % 2) as usize); + } + let max_error_exp = (rng.next_u32() % (nb_digits - 1)) + 1; + let min_support_exp = rng.next_u32() % max_error_exp; + let nb_digits = nb_digits as usize; + let max_error_exp = max_error_exp as usize; + let min_support_exp = min_support_exp as usize; + let max_error = 1 << max_error_exp; + let min_support = 1 << min_support_exp; + let max_val = (1 << nb_digits) - 1; + + let (cover_max, cover_min) = compute_covering_cets_min_and_max( + &same_num_digits_oracle_numeric_infos(2, nb_digits, 2).nb_digits, + &main_outcome_prefix, + max_error_exp, + min_support_exp, + ); + + assert_eq!(cover_min.len(), cover_max.len()); + assert!(cover_min + .iter() + .map(|(a, _)| a) + .zip(cover_max.iter().map(|(a, _)| a)) + .all(|(a, b)| a.iter().zip(b.iter()).all(|(c, d)| c == d))); + + let relevant_primary_prefixes = cover_max.iter().map(|(a, _)| a).collect::>(); + let (left, right) = compute_interval_from_prefix(&main_outcome_prefix, nb_digits, 2); + + let primary_and_covering_intervals_max: Vec<((usize, usize), (usize, usize))> = cover_max + .iter() + .map(|(a, b)| { + ( + compute_interval_from_prefix(a, nb_digits, 2), + compute_interval_from_prefix(b, nb_digits, 2), + ) + }) + .collect(); + let cover_intervals_min: Vec<(usize, usize)> = cover_max + .iter() + .map(|(_, b)| compute_interval_from_prefix(b, nb_digits, 2)) + .collect(); + + for ( + ((primary_left, primary_right), (max_cover_left, max_cover_right)), + (min_cover_left, min_cover_right), + ) in primary_and_covering_intervals_max + .iter() + .cloned() + .zip(cover_intervals_min.iter().cloned()) + { + assert!(max_cover_left <= min_cover_left); + assert!(max_cover_right <= min_cover_right); + + if primary_left == max_cover_left && primary_right == max_cover_right { + assert_eq!(min_cover_left, max_cover_left); + assert_eq!(min_cover_right, max_cover_right); + } + + let assert_valid_cover = |cover_left: usize, cover_right: usize, max_coverage: bool| { + if primary_left == cover_left && primary_right == cover_right { + } else if primary_left >= cover_left && primary_right <= cover_right { + if max_coverage { + assert_eq!(cover_right - cover_left + 1, max_error); + } else { + let side_to_boundary = std::cmp::max( + primary_right % max_error, + max_error - (primary_left % max_error), + ); + assert!(cover_right - cover_left < 2 * side_to_boundary); + assert!(cover_right - cover_left + 1 >= side_to_boundary); + } + + assert!( + primary_left - cover_left >= min_support + || cover_left == 0 + || relevant_primary_prefixes.len() == 2 + ); + assert!(primary_right - cover_left < max_error); + assert!( + cover_right - primary_right >= min_support + || cover_right == max_val + || relevant_primary_prefixes.len() == 2 + ); + } else { + let (most_inner, least_inner, most_outer) = if primary_left <= cover_left { + (primary_left, primary_right, cover_right) + } else { + (primary_right, primary_left, cover_left) + }; + + let diff = |x: usize, y: usize| -> usize { + if x > y { + x - y + } else { + y - x + } + }; + + assert!(diff(least_inner, most_outer) >= min_support); + assert!(diff(most_inner, most_outer) < max_error); + } + }; + + assert_valid_cover(max_cover_left, max_cover_right, true); + assert_valid_cover(min_cover_left, min_cover_right, false); + } + + let primary_interval = primary_and_covering_intervals_max + .iter() + .map(|(a, _)| *a) + .fold((usize::MAX, 0), |(min, max), (start, end)| { + (std::cmp::min(min, start), std::cmp::max(max, end)) + }); + assert_eq!(primary_interval, (left, right)); + + let (max_cover_interval_left, max_cover_interval_right) = + primary_and_covering_intervals_max + .iter() + .map(|(_, b)| *b) + .fold((usize::MAX, 0), |(min, max), (start, end)| { + (std::cmp::min(min, start), std::cmp::max(max, end)) + }); + let (min_cover_interval_left, min_cover_interval_right) = cover_intervals_min + .iter() + .fold((usize::MAX, 0), |(min, max), (start, end)| { + (std::cmp::min(min, *start), std::cmp::max(max, *end)) + }); + assert!(max_cover_interval_left <= min_cover_interval_left); + assert!(max_cover_interval_right >= min_cover_interval_right); + + assert!(left - max_cover_interval_left >= min_support || max_cover_interval_left == 0); + assert!(left - max_cover_interval_left < max_error); + assert!( + max_cover_interval_right - right >= min_support || max_cover_interval_right == max_val + ); + assert!(max_cover_interval_right - right < max_error); + + assert!(left - min_cover_interval_left >= min_support || min_cover_interval_left == 0); + assert!(left - min_cover_interval_left < max_error); + assert!( + min_cover_interval_right - right >= min_support || min_cover_interval_right == max_val + ); + assert!(min_cover_interval_right - right < max_error); + } + + struct VariableLengthTestCase { + main_outcome_prefix: Vec, + nb_digits: Vec, + max_error_exp: usize, + min_support_exp: usize, + expected_max: Vec<(Vec, Vec)>, + expected_min: Vec<(Vec, Vec)>, + } + + impl From for VariableLengthTestCase { + fn from(test_case: TestCase) -> VariableLengthTestCase { + let to_add = ((thread_rng().next_u32() % 10) + 1) as usize; + + let extend = |y: &[usize]| { + let mut new_y = Vec::with_capacity(y.len() + to_add); + new_y.resize(to_add, 0); + new_y.extend(y.iter()); + new_y + }; + + let expected_max = test_case + .expected_max + .iter() + .map(|(x, y)| (x.clone(), extend(y))) + .collect(); + + let expected_min = test_case + .expected_min + .iter() + .map(|(x, y)| (x.clone(), extend(y))) + .collect(); + + VariableLengthTestCase { + main_outcome_prefix: test_case.main_outcome_prefix, + nb_digits: vec![test_case.nb_digits, test_case.nb_digits + to_add], + max_error_exp: test_case.max_error_exp, + min_support_exp: test_case.min_support_exp, + expected_max, + expected_min, + } + } + } + + fn variable_len_test_cases() -> Vec { + let black_list = [5, 7]; + let mut test_cases = test_cases() + .into_iter() + .enumerate() + .filter(|(i, _)| !black_list.contains(i)) + .map(|(_, x)| x.into()) + .collect::>(); + test_cases.append(&mut vec![VariableLengthTestCase { + main_outcome_prefix: vec![1, 1, 1, 1], + nb_digits: vec![4, 5], + max_error_exp: 2, + min_support_exp: 1, + expected_max: vec![ + (vec![1, 1, 1, 1], vec![0, 1, 1]), + (vec![1, 1, 1, 1], vec![1, 0, 0, 0]), + ], + expected_min: vec![ + (vec![1, 1, 1, 1], vec![0, 1, 1]), + (vec![1, 1, 1, 1], vec![1, 0, 0, 0]), + ], + }]); + test_cases + } + + #[test] + fn variable_nb_digit_tests() { + for case in variable_len_test_cases() { + let (max, min) = compute_covering_cets_min_and_max( + &get_variable_oracle_numeric_infos(&case.nb_digits, 2).nb_digits, + &case.main_outcome_prefix, + case.max_error_exp, + case.min_support_exp, + ); + assert_eq!(case.expected_max, max); + assert_eq!(case.expected_min, min); + } + } +} diff --git a/dlc-trie/src/multi_oracle_trie.rs b/dlc-trie/src/multi_oracle_trie.rs new file mode 100644 index 00000000..d8bdb774 --- /dev/null +++ b/dlc-trie/src/multi_oracle_trie.rs @@ -0,0 +1,426 @@ +//! # MultiOracleTrie +//! Data structure and functions used to store adaptor signature information +//! for numerical outcome DLC with t of n oracles where at least t oracles +//! need to sign the same outcome for the contract to be able to close. + +use crate::combination_iterator::CombinationIterator; +use crate::digit_decomposition::group_by_ignoring_digits; +use crate::digit_trie::{DigitTrie, DigitTrieDump, DigitTrieIter}; +use crate::multi_trie::{MultiTrie, MultiTrieDump, MultiTrieIterator}; +use crate::utils::{get_value_callback, pre_pad_vec}; +use crate::{DlcTrie, IndexedPath, LookupResult, OracleNumericInfo, RangeInfo, TrieIterInfo}; +use dlc::{Error, RangePayout}; + +/// Data structure used to store adaptor signature information for numerical +/// outcome DLC with t of n oracles where at least t oracles need to sign the +/// same outcome for the contract to be able to close. +#[derive(Clone)] +pub struct MultiOracleTrie { + /// The underlying trie data structure. + digit_trie: DigitTrie>, + threshold: usize, + oracle_numeric_infos: OracleNumericInfo, + extra_cover_trie: Option>, +} + +/// Container for a dump of a MultiOracleTrie used for serialization purpose. +pub struct MultiOracleTrieDump { + /// A dump of the underlying digit trie. + pub digit_trie_dump: DigitTrieDump>, + /// The required number of oracles for this trie. + pub threshold: usize, + /// Information about each oracle numerical representation. + pub oracle_numeric_infos: OracleNumericInfo, + /// A dump of the trie for extra coverage. + pub extra_cover_trie_dump: Option>, +} + +impl MultiOracleTrie { + /// Dump the trie information. + pub fn dump(&self) -> MultiOracleTrieDump { + MultiOracleTrieDump { + digit_trie_dump: self.digit_trie.dump(), + threshold: self.threshold, + oracle_numeric_infos: self.oracle_numeric_infos.clone(), + extra_cover_trie_dump: self.extra_cover_trie.as_ref().map(|trie| trie.dump()), + } + } + + /// Recover a MultiOracleTrie from a dump. + pub fn from_dump(dump: MultiOracleTrieDump) -> MultiOracleTrie { + let MultiOracleTrieDump { + digit_trie_dump, + threshold, + oracle_numeric_infos, + extra_cover_trie_dump, + } = dump; + MultiOracleTrie { + digit_trie: DigitTrie::from_dump(digit_trie_dump), + threshold, + oracle_numeric_infos, + extra_cover_trie: extra_cover_trie_dump.map(MultiTrie::from_dump), + } + } + + fn get_agreeing_oracles( + &self, + paths: &[(usize, Vec)], + ) -> Option, Vec)>> { + let mut hash_set: std::collections::HashMap, Vec> = + std::collections::HashMap::new(); + + for path in paths { + let index = path.0; + let outcome_path = &path.1; + + if let Some(index_set) = hash_set.get_mut(outcome_path) { + index_set.push(index); + } else { + let index_set = vec![index]; + hash_set.insert(outcome_path.to_vec(), index_set); + } + } + + if hash_set.is_empty() { + return None; + } + + let mut values: Vec<_> = hash_set.into_iter().collect(); + values.sort_by(|x, y| x.1.len().partial_cmp(&y.1.len()).unwrap()); + let res = values + .into_iter() + .filter(|x| x.1.len() >= self.threshold) + .collect::>(); + if !res.is_empty() { + Some(res) + } else { + None + } + } + + /// Lookup for nodes whose path is either equal or a prefix of `path`. + pub fn look_up(&self, paths: &[(usize, Vec)]) -> Option<(RangeInfo, Vec)> { + let min_nb_digits = self.oracle_numeric_infos.get_min_nb_digits(); + // Take all the paths that have a max value of base^min_nb_digits - 1, and + // shorten them to min_nb_digits. + let stripped_paths = paths + .iter() + .filter_map(|x| { + let extra_len = x.1.len().checked_sub(min_nb_digits)?; + if extra_len == 0 { + Some((x.0, x.1.clone())) + } else if x.1.iter().take(extra_len).all(|x| *x == 0) { + let mut cloned = x.1.clone(); + cloned.drain(..extra_len); + Some((x.0, cloned)) + } else { + None + } + }) + .collect::>(); + // Try to get the combinations of at least threshold oracles that agree on the outcome. + let agreeing_combinations = self.get_agreeing_oracles(&stripped_paths); + if let Some(sufficient_combinations) = agreeing_combinations { + for (path, combination) in sufficient_combinations { + debug_assert_eq!( + path.len(), + min_nb_digits, + "Expected length {} got length {}", + min_nb_digits, + path.len() + ); + + if let Some(res) = self.digit_trie.look_up(&path) { + let sufficient_combination: Vec<_> = + combination.into_iter().take(self.threshold).collect(); + if let Some(position) = CombinationIterator::new( + self.oracle_numeric_infos.nb_digits.len(), + self.threshold, + ) + .get_index_for_combination(&sufficient_combination) + { + return Some(( + res[0].value[position].clone(), + sufficient_combination + .iter() + .map(|x| { + let actual_len = res[0].path.len() + + self.oracle_numeric_infos.nb_digits[*x] + - min_nb_digits; + (*x, pre_pad_vec(res[0].path.clone(), actual_len)) + }) + .collect::>(), + )); + } + } + } + } + + if let Some(extra_cover_trie) = &self.extra_cover_trie { + if let Some(res) = extra_cover_trie.look_up(paths) { + return Some((res.0.clone(), res.1)); + } + } + + None + } + + /// Creates a new MultiOracleTrie + pub fn new(oracle_numeric_infos: &OracleNumericInfo, threshold: usize) -> Result { + if oracle_numeric_infos.nb_digits.is_empty() { + return Err(Error::InvalidArgument); + } + let digit_trie = DigitTrie::new(oracle_numeric_infos.base); + let extra_cover_trie = if oracle_numeric_infos.has_diff_nb_digits() { + // The support and coverage parameters don't matter as we only use this trie for coverage of + // the "out of bounds" outcomes. + Some(MultiTrie::new(oracle_numeric_infos, threshold, 1, 2, true)) + } else { + None + }; + Ok(MultiOracleTrie { + digit_trie, + threshold, + oracle_numeric_infos: oracle_numeric_infos.clone(), + extra_cover_trie, + }) + } +} + +impl<'a> DlcTrie<'a, MultiOracleTrieIter<'a>> for MultiOracleTrie { + fn generate( + &mut self, + adaptor_index_start: usize, + outcomes: &[RangePayout], + ) -> Result, Error> { + let threshold = self.threshold; + let nb_oracles = self.oracle_numeric_infos.nb_digits.len(); + let min_nb_digits = self.oracle_numeric_infos.get_min_nb_digits(); + let mut adaptor_index = adaptor_index_start; + let mut trie_infos = Vec::new(); + let oracle_numeric_infos = &self.oracle_numeric_infos; + for (cet_index, outcome) in outcomes.iter().enumerate() { + if outcome.count == 0 { + return Err(Error::InvalidArgument); + } + let groups = group_by_ignoring_digits( + outcome.start, + outcome.start + outcome.count - 1, + self.digit_trie.base, + min_nb_digits, + ); + for group in groups { + let mut get_value = |_: Option>| -> Result, Error> { + let combination_iterator = CombinationIterator::new(nb_oracles, threshold); + let mut range_infos: Vec = Vec::new(); + for selector in combination_iterator { + let range_info = RangeInfo { + cet_index, + adaptor_index, + }; + adaptor_index += 1; + let paths = oracle_numeric_infos + .nb_digits + .iter() + .enumerate() + .filter_map(|(i, nb_digits)| { + if !selector.contains(&i) { + return None; + } + let expected_len = group.len() + nb_digits - min_nb_digits; + Some(pre_pad_vec(group.clone(), expected_len)) + }) + .collect(); + let trie_info = TrieIterInfo { + paths, + indexes: selector, + value: range_info.clone(), + }; + trie_infos.push(trie_info); + range_infos.push(range_info); + } + Ok(range_infos) + }; + self.digit_trie.insert(&group, &mut get_value)?; + } + } + + if let Some(extra_cover_trie) = &mut self.extra_cover_trie { + let mut get_value = + |paths: &[Vec], oracle_indexes: &[usize]| -> Result { + get_value_callback( + paths, + oracle_indexes, + outcomes.len() - 1, + &mut adaptor_index, + &mut trie_infos, + ) + }; + extra_cover_trie.insert_max_paths(&mut get_value)?; + } + + Ok(trie_infos) + } + + fn iter(&'a self) -> MultiOracleTrieIter<'a> { + let digit_trie_iterator = DigitTrieIter::new(&self.digit_trie); + let extra_cover_trie_iterator = self.extra_cover_trie.as_ref().map(MultiTrieIterator::new); + MultiOracleTrieIter { + digit_trie_iterator, + extra_cover_trie_iterator, + cur_res: None, + cur_index: 0, + combination_iter: CombinationIterator::new( + self.oracle_numeric_infos.nb_digits.len(), + self.threshold, + ), + oracle_numeric_infos: self.oracle_numeric_infos.clone(), + } + } +} + +/// Iterator for a MultiOracleTrie. +pub struct MultiOracleTrieIter<'a> { + digit_trie_iterator: DigitTrieIter<'a, Vec>, + extra_cover_trie_iterator: Option>, + cur_res: Option, usize>>, + cur_index: usize, + combination_iter: CombinationIterator, + oracle_numeric_infos: OracleNumericInfo, +} + +impl Iterator for MultiOracleTrieIter<'_> { + type Item = TrieIterInfo; + + fn next(&mut self) -> Option { + if self.cur_res.is_none() { + self.cur_res = self.digit_trie_iterator.next(); + } + let res = match &self.cur_res { + None => { + if let Some(extra_cover_trie_iterator) = &mut self.extra_cover_trie_iterator { + let res = extra_cover_trie_iterator.next()?; + let (indexes, paths) = res.path.iter().fold( + (Vec::new(), Vec::new()), + |(mut indexes, mut paths), x| { + indexes.push(x.0); + paths.push(x.1.clone()); + (indexes, paths) + }, + ); + return Some(TrieIterInfo { + indexes, + paths, + value: res.value.clone(), + }); + } else { + return None; + } + } + Some(res) => res, + }; + + let indexes = match self.combination_iter.next() { + Some(selector) => selector, + None => { + self.cur_res = None; + self.cur_index = 0; + self.combination_iter = CombinationIterator::new( + self.combination_iter.nb_elements, + self.combination_iter.nb_selected, + ); + return self.next(); + } + }; + let min_nb_digits = self.oracle_numeric_infos.get_min_nb_digits(); + let paths = &std::iter::repeat(res.path.clone()) + .take(indexes.len()) + .zip(indexes.iter()) + .map(|(x, i)| { + let extra_len = self.oracle_numeric_infos.nb_digits[*i] - min_nb_digits; + if extra_len == 0 { + x + } else { + let expected_size = extra_len + x.len(); + pre_pad_vec(x, expected_size) + } + }) + .collect::>>(); + let value = res.value[self.cur_index].clone(); + self.cur_index += 1; + Some(TrieIterInfo { + indexes, + paths: paths.clone(), + value, + }) + } +} + +#[cfg(test)] +mod tests { + use bitcoin::Amount; + use dlc::{Payout, RangePayout}; + + use crate::{test_utils::get_variable_oracle_numeric_infos, DlcTrie}; + + use super::MultiOracleTrie; + #[test] + fn test_longer_outcome_len() { + let range_payouts = vec![RangePayout { + start: 0, + count: 1023, + payout: Payout { + offer: Amount::from_sat(200000000), + accept: Amount::ZERO, + }, + }]; + let oracle_numeric_infos = get_variable_oracle_numeric_infos(&[10, 15, 15, 15, 12], 2); + let mut multi_oracle_trie = MultiOracleTrie::new(&oracle_numeric_infos, 2).unwrap(); + multi_oracle_trie.generate(0, &range_payouts).unwrap(); + multi_oracle_trie + .look_up(&[ + (1, vec![0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0]), + (4, vec![0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0]), + ]) + .expect("Could not retrieve path with extra len."); + } + + #[test] + fn test_over_bound_outcome() { + let range_payouts = vec![RangePayout { + start: 0, + count: 1023, + payout: Payout { + offer: Amount::from_sat(200000000), + accept: Amount::ZERO, + }, + }]; + let oracle_numeric_infos = get_variable_oracle_numeric_infos(&[10, 15, 15, 15, 12], 2); + let mut multi_oracle_trie = MultiOracleTrie::new(&oracle_numeric_infos, 2).unwrap(); + multi_oracle_trie.generate(0, &range_payouts).unwrap(); + multi_oracle_trie + .look_up(&[ + (1, vec![1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0]), + (4, vec![0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0]), + ]) + .expect("Could not retrieve path with extra len."); + } + + #[test] + fn test_invalid_range_payout() { + let range_payouts = vec![RangePayout { + start: 0, + count: 0, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(200000000), + }, + }]; + + let oracle_numeric_infos = get_variable_oracle_numeric_infos(&[13, 12], 2); + let mut multi_oracle_trie = MultiOracleTrie::new(&oracle_numeric_infos, 2).unwrap(); + multi_oracle_trie + .generate(0, &range_payouts) + .expect_err("Should fail when given a range payout with a count of 0"); + } +} diff --git a/dlc-trie/src/multi_oracle_trie_with_diff.rs b/dlc-trie/src/multi_oracle_trie_with_diff.rs new file mode 100644 index 00000000..f741da10 --- /dev/null +++ b/dlc-trie/src/multi_oracle_trie_with_diff.rs @@ -0,0 +1,295 @@ +//! # MultiOracleTrieWithDiff +//! Data structure and functions used to store adaptor signature information +//! for numerical outcome DLC with t of n oracles where some difference +//! between the outcomes of each oracle can be supported. + +use crate::digit_decomposition::group_by_ignoring_digits; +use crate::multi_trie::{MultiTrie, MultiTrieDump, MultiTrieIterator}; +use crate::utils::get_value_callback; + +use crate::{DlcTrie, OracleNumericInfo, RangeInfo, TrieIterInfo}; +use dlc::{Error, RangePayout}; + +/// Data structure used to store adaptor signature information for numerical +/// outcome DLC with multiple oracles where some difference between the outcomes +/// of each oracle can be supported. +#[derive(Clone)] +pub struct MultiOracleTrieWithDiff { + /// The underlying trie of trie + pub multi_trie: MultiTrie, + /// Information on the numeric representation used by each oracle. + pub oracle_numeric_infos: OracleNumericInfo, +} + +impl MultiOracleTrieWithDiff { + /// Create a new MultiOracleTrieWithDiff + pub fn new( + oracle_numeric_infos: &OracleNumericInfo, + threshold: usize, + min_support_exp: usize, + max_error_exp: usize, + ) -> Result { + let nb_oracles = oracle_numeric_infos.nb_digits.len(); + let is_valid = + nb_oracles >= 1 && threshold <= nb_oracles && min_support_exp < max_error_exp; + if !is_valid { + return Err(Error::InvalidArgument); + } + let multi_trie = MultiTrie::new( + oracle_numeric_infos, + threshold, + min_support_exp, + max_error_exp, + true, + ); + Ok(MultiOracleTrieWithDiff { + multi_trie, + oracle_numeric_infos: oracle_numeric_infos.clone(), + }) + } +} + +impl<'a> DlcTrie<'a, MultiOracleTrieWithDiffIter<'a>> for MultiOracleTrieWithDiff { + fn generate( + &mut self, + adaptor_index_start: usize, + outcomes: &[RangePayout], + ) -> Result, Error> { + let mut adaptor_index = adaptor_index_start; + let mut trie_infos = Vec::new(); + + for (cet_index, outcome) in outcomes.iter().enumerate() { + if outcome.count == 0 { + return Err(Error::InvalidArgument); + } + let groups = group_by_ignoring_digits( + outcome.start, + outcome.start + outcome.count - 1, + self.oracle_numeric_infos.base, + self.oracle_numeric_infos.get_min_nb_digits(), + ); + for group in groups { + let mut get_value = + |paths: &[Vec], oracle_indexes: &[usize]| -> Result { + get_value_callback( + paths, + oracle_indexes, + cet_index, + &mut adaptor_index, + &mut trie_infos, + ) + }; + self.multi_trie.insert(&group, &mut get_value)?; + } + } + + if self.oracle_numeric_infos.has_diff_nb_digits() { + let mut get_value = + |paths: &[Vec], oracle_indexes: &[usize]| -> Result { + get_value_callback( + paths, + oracle_indexes, + outcomes.len() - 1, + &mut adaptor_index, + &mut trie_infos, + ) + }; + self.multi_trie.insert_max_paths(&mut get_value)?; + } + + Ok(trie_infos) + } + + fn iter(&'a self) -> MultiOracleTrieWithDiffIter<'a> { + let multi_trie_iterator = MultiTrieIterator::new(&self.multi_trie); + MultiOracleTrieWithDiffIter { + multi_trie_iterator, + } + } +} + +/// Container for a dump of a MultiOracleTrieWithDiff used for serialization purpose. +pub struct MultiOracleTrieWithDiffDump { + /// The dump of the underlying MultiTrie. + pub multi_trie_dump: MultiTrieDump, + /// Information about numerical representation used by oracles. + pub oracle_numeric_infos: OracleNumericInfo, +} + +impl MultiOracleTrieWithDiff { + /// Dump the content of the trie for the purpose of serialization. + pub fn dump(&self) -> MultiOracleTrieWithDiffDump { + let multi_trie_dump = self.multi_trie.dump(); + MultiOracleTrieWithDiffDump { + multi_trie_dump, + oracle_numeric_infos: self.oracle_numeric_infos.clone(), + } + } + + /// Restore a trie from a dump. + pub fn from_dump(dump: MultiOracleTrieWithDiffDump) -> MultiOracleTrieWithDiff { + let MultiOracleTrieWithDiffDump { + multi_trie_dump, + oracle_numeric_infos, + } = dump; + MultiOracleTrieWithDiff { + multi_trie: MultiTrie::from_dump(multi_trie_dump), + oracle_numeric_infos, + } + } +} + +/// Iterator for a MultiOracleTrieWithDiff trie. +pub struct MultiOracleTrieWithDiffIter<'a> { + multi_trie_iterator: MultiTrieIterator<'a, RangeInfo>, +} + +impl Iterator for MultiOracleTrieWithDiffIter<'_> { + type Item = TrieIterInfo; + + fn next(&mut self) -> Option { + let res = self.multi_trie_iterator.next()?; + let (indexes, paths) = + res.path + .iter() + .fold((Vec::new(), Vec::new()), |(mut indexes, mut paths), x| { + indexes.push(x.0); + paths.push(x.1.clone()); + (indexes, paths) + }); + Some(TrieIterInfo { + indexes, + paths, + value: res.value.clone(), + }) + } +} + +#[cfg(test)] +mod tests { + use bitcoin::Amount; + use dlc::{Payout, RangePayout}; + + use crate::{test_utils::get_variable_oracle_numeric_infos, DlcTrie}; + + use super::MultiOracleTrieWithDiff; + #[test] + fn test_is_ordered() { + let range_payouts = vec![ + RangePayout { + start: 0, + count: 1, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(200000000), + }, + }, + RangePayout { + start: 1, + count: 1, + payout: Payout { + offer: Amount::from_sat(40000000), + accept: Amount::from_sat(160000000), + }, + }, + RangePayout { + start: 2, + count: 1, + payout: Payout { + offer: Amount::from_sat(80000000), + accept: Amount::from_sat(120000000), + }, + }, + RangePayout { + start: 3, + count: 1, + payout: Payout { + offer: Amount::from_sat(120000000), + accept: Amount::from_sat(80000000), + }, + }, + RangePayout { + start: 4, + count: 1, + payout: Payout { + offer: Amount::from_sat(160000000), + accept: Amount::from_sat(40000000), + }, + }, + RangePayout { + start: 5, + count: 1019, + payout: Payout { + offer: Amount::from_sat(200000000), + accept: Amount::ZERO, + }, + }, + ]; + + let oracle_numeric_infos = get_variable_oracle_numeric_infos(&[13, 12], 2); + let mut multi_oracle_trie = + MultiOracleTrieWithDiff::new(&oracle_numeric_infos, 2, 1, 2).unwrap(); + let info = multi_oracle_trie.generate(0, &range_payouts).unwrap(); + let mut indexes: Vec<_> = info + .into_iter() + .map(|info| info.value.adaptor_index) + .collect(); + + let lookup_res = multi_oracle_trie + .multi_trie + .look_up(&[ + (0, vec![0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0]), + (1, vec![0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0]), + ]) + .expect("Could not find"); + + indexes.sort(); + + for (prev_index, i) in indexes.iter().skip(1).enumerate() { + assert_eq!(*i, prev_index + 1); + } + + let mut indexes: Vec<_> = multi_oracle_trie + .iter() + .map(|info| info.value.adaptor_index) + .collect(); + + indexes.sort(); + + for (prev_index, i) in indexes.iter().skip(1).enumerate() { + assert_eq!(*i, prev_index + 1); + } + + let iter_res = multi_oracle_trie + .iter() + .find(|x| x.value.adaptor_index == 22) + .unwrap(); + assert_eq!( + &lookup_res + .1 + .iter() + .map(|(_, x)| x.clone()) + .collect::>(), + &iter_res.paths + ); + } + + #[test] + fn test_invalid_range_payout() { + let range_payouts = vec![RangePayout { + start: 0, + count: 0, + payout: Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(200000000), + }, + }]; + + let oracle_numeric_infos = get_variable_oracle_numeric_infos(&[13, 12], 2); + let mut multi_oracle_trie = + MultiOracleTrieWithDiff::new(&oracle_numeric_infos, 2, 1, 2).unwrap(); + multi_oracle_trie + .generate(0, &range_payouts) + .expect_err("Should fail when given a range payout with a count of 0"); + } +} diff --git a/dlc-trie/src/multi_trie.rs b/dlc-trie/src/multi_trie.rs new file mode 100644 index 00000000..41f5f9dc --- /dev/null +++ b/dlc-trie/src/multi_trie.rs @@ -0,0 +1,1035 @@ +//! Data structure and functions to create, insert, lookup and iterate a trie +//! of trie. + +use crate::{ + utils::{get_max_covering_paths, pre_pad_vec}, + LookupResult, Node, OracleNumericInfo, +}; +use combination_iterator::CombinationIterator; +use digit_trie::{DigitTrie, DigitTrieDump, DigitTrieIter}; +use dlc::Error; +use multi_oracle::compute_outcome_combinations; + +#[derive(Clone, Debug)] +/// Information stored in a node. +pub struct TrieNodeInfo { + /// The index of the sub-trie. + pub trie_index: usize, + /// The index of the node in the trie store. + pub store_index: usize, +} + +type MultiTrieNode = Node, DigitTrie>>; +type NodeStackElement<'a> = Vec<(IndexedPath, DigitTrieIter<'a, Vec>)>; +type IndexedPath = (usize, Vec); + +impl MultiTrieNode { + fn new_node(base: usize) -> MultiTrieNode { + let m_trie = DigitTrie::>::new(base); + MultiTrieNode::Node(m_trie) + } + fn new_leaf(base: usize) -> MultiTrieNode { + let d_trie = DigitTrie::::new(base); + MultiTrieNode::Leaf(d_trie) + } +} + +/// Struct for iterating over the values of a MultiTrie. +pub(crate) struct MultiTrieIterator<'a, T> { + trie: &'a MultiTrie, + node_stack: NodeStackElement<'a>, + trie_info_iter: Vec<( + Vec, + std::iter::Enumerate>, + )>, + leaf_iter: Vec<(usize, DigitTrieIter<'a, T>)>, + cur_path: Vec<(usize, Vec)>, +} + +fn create_node_iterator(node: &MultiTrieNode) -> DigitTrieIter> { + match node { + Node::Node(d_trie) => DigitTrieIter::new(d_trie), + _ => unreachable!(), + } +} + +fn create_leaf_iterator(node: &MultiTrieNode) -> DigitTrieIter { + match node { + Node::Leaf(d_trie) => DigitTrieIter::new(d_trie), + _ => unreachable!(), + } +} + +impl<'a, T> MultiTrieIterator<'a, T> { + /// Create a new MultiTrie iterator. + pub fn new(trie: &'a MultiTrie) -> MultiTrieIterator<'a, T> { + let mut node_stack = Vec::with_capacity(trie.nb_required); + let nb_roots = trie.nb_tries - trie.nb_required + 1; + let mut leaf_iter = Vec::new(); + for i in (0..nb_roots).rev() { + if trie.nb_required > 1 { + node_stack.push(( + (i, Vec::::new()), + create_node_iterator(&trie.store[i]), + )); + } else { + leaf_iter.push((i, create_leaf_iterator(&trie.store[i]))); + } + } + MultiTrieIterator { + trie, + node_stack, + trie_info_iter: Vec::new(), + leaf_iter, + cur_path: Vec::new(), + } + } +} + +/// Implements the Iterator trait for MultiTrieIterator. +impl<'a, T> Iterator for MultiTrieIterator<'a, T> { + type Item = LookupResult<'a, T, (usize, Vec)>; + + fn next(&mut self) -> Option { + let mut leaf_iter = self.leaf_iter.last_mut(); + if let Some(ref mut iter) = &mut leaf_iter { + match iter.1.next() { + Some(res) => { + let mut path = self.cur_path.clone(); + path.push((iter.0, res.path)); + return Some(LookupResult { + value: res.value, + path, + }); + } + None => { + self.leaf_iter.pop(); + return self.next(); + } + } + }; + + let mut trie_info_iter = self.trie_info_iter.last_mut(); + + if let Some(ref mut iter) = &mut trie_info_iter { + match iter.1.next() { + None => { + self.trie_info_iter.pop(); + self.cur_path.pop(); + } + Some((i, info)) => { + if i == 0 { + self.cur_path + .push((self.node_stack.last().unwrap().0 .0, iter.0.clone())); + } + match &self.trie.store[info.store_index] { + Node::None => unreachable!(), + Node::Node(d_trie) => { + self.node_stack.push(( + (info.trie_index, iter.0.clone()), + DigitTrieIter::new(d_trie), + )); + } + Node::Leaf(d_trie) => { + self.leaf_iter + .push((info.trie_index, DigitTrieIter::new(d_trie))); + return self.next(); + } + } + } + } + } + + let ((cur_trie_index, parent_path), mut cur_iter) = self.node_stack.pop()?; + + match cur_iter.next() { + None => self.next(), + Some(res) => { + // Put back the node on the stack + self.node_stack + .push(((cur_trie_index, parent_path), cur_iter)); + + // Push an iterator to the child on the trie info stack + self.trie_info_iter + .push((res.path, res.value.iter().enumerate())); + + self.next() + } + } + } +} + +/// Struct used to store DLC outcome information for multi oracle cases. +#[derive(Clone)] +pub struct MultiTrie { + store: Vec>, + nb_tries: usize, + nb_required: usize, + min_support_exp: usize, + max_error_exp: usize, + maximize_coverage: bool, + oracle_numeric_infos: OracleNumericInfo, +} + +impl MultiTrie { + /// Create a new MultiTrie. Panics if `nb_required` is less or equal to + /// zero, or if `nb_tries` is less than `nb_required`. + pub fn new( + oracle_numeric_infos: &OracleNumericInfo, + nb_required: usize, + min_support_exp: usize, + max_error_exp: usize, + maximize_coverage: bool, + ) -> MultiTrie { + let nb_tries = oracle_numeric_infos.nb_digits.len(); + assert!( + nb_required > 0 + && nb_tries >= nb_required + && !oracle_numeric_infos.nb_digits.is_empty() + ); + let nb_roots = nb_tries - nb_required + 1; + + let store: Vec<_> = if nb_required > 1 { + (0..nb_tries) + .take(nb_roots) + .map(|_| MultiTrieNode::new_node(oracle_numeric_infos.base)) + .collect() + } else { + (0..nb_tries) + .take(nb_roots) + .map(|_| MultiTrieNode::new_leaf(oracle_numeric_infos.base)) + .collect() + }; + + MultiTrie { + store, + nb_tries, + nb_required, + min_support_exp, + max_error_exp, + maximize_coverage, + oracle_numeric_infos: oracle_numeric_infos.clone(), + } + } + + fn swap_remove(&mut self, index: usize) -> MultiTrieNode { + self.store.push(MultiTrieNode::None); + self.store.swap_remove(index) + } + + /// Insert the paths to cover outcomes outside of the range of the oracle with + /// minimum number of digits. Should only be called when oracles have varying + /// number of digits. + pub fn insert_max_paths(&mut self, get_value: &mut F) -> Result<(), Error> + where + F: FnMut(&[Vec], &[usize]) -> Result, + { + let indexed_paths = get_max_covering_paths(&self.oracle_numeric_infos, self.nb_required); + for indexed_path in indexed_paths { + let (indexes, paths): (Vec, Vec>) = indexed_path.into_iter().unzip(); + self.insert_internal(indexes[0], &paths, 0, &indexes, get_value)?; + } + Ok(()) + } + + /// Insert the value returned by `get_value` at the position specified by `path`. + pub fn insert(&mut self, path: &[usize], get_value: &mut F) -> Result<(), Error> + where + F: FnMut(&[Vec], &[usize]) -> Result, + { + let combination_iter = CombinationIterator::new(self.nb_tries, self.nb_required); + let min_nb_digits = self.oracle_numeric_infos.get_min_nb_digits(); + + for selector in combination_iter { + let combinations = if self.nb_required > 1 { + let mut digit_infos = self + .oracle_numeric_infos + .nb_digits + .iter() + .enumerate() + .filter_map(|(i, x)| { + if selector.contains(&i) { + Some(*x) + } else { + None + } + }) + .collect::>(); + let min_index = reorder_to_min_first(&mut digit_infos); + let to_pad = digit_infos[0] - min_nb_digits; + let padded_path = pre_pad_vec(path.to_vec(), path.len() + to_pad); + let mut combinations = compute_outcome_combinations( + &digit_infos, + &padded_path, + self.max_error_exp, + self.min_support_exp, + self.maximize_coverage, + ); + if min_index != 0 { + for combination in &mut combinations { + let to_reorder = combination.remove(0); + combination.insert(min_index, to_reorder); + } + } + combinations + } else { + vec![vec![path.to_vec()]] + }; + + for combination in combinations { + self.insert_internal(selector[0], &combination, 0, &selector, get_value)?; + } + } + + Ok(()) + } + + fn insert_new(&mut self, is_leaf: bool) { + let m_trie = if is_leaf { + let d_trie = DigitTrie::::new(self.oracle_numeric_infos.base); + MultiTrieNode::Leaf(d_trie) + } else { + let d_trie = DigitTrie::>::new(self.oracle_numeric_infos.base); + MultiTrieNode::Node(d_trie) + }; + self.store.push(m_trie); + } + + fn insert_internal( + &mut self, + cur_node_index: usize, + paths: &[Vec], + path_index: usize, + trie_indexes: &[usize], + get_value: &mut F, + ) -> Result<(), Error> + where + F: FnMut(&[Vec], &[usize]) -> Result, + { + assert!(path_index < paths.len()); + let cur_node = self.swap_remove(cur_node_index); + match cur_node { + MultiTrieNode::None => unreachable!(), + MultiTrieNode::Leaf(mut digit_trie) => { + assert_eq!(path_index, paths.len() - 1); + let mut get_data = |_| get_value(paths, trie_indexes); + digit_trie.insert(&paths[path_index], &mut get_data)?; + self.store[cur_node_index] = MultiTrieNode::Leaf(digit_trie); + } + MultiTrieNode::Node(mut node) => { + assert!(path_index < paths.len() - 1); + let mut store_index = 0; + let mut callback = + |cur_data_res: Option>| -> Result, Error> { + let mut cur_data = match cur_data_res { + Some(cur_data) => { + if let Some(cur_store_index) = + find_store_index(&cur_data, trie_indexes[path_index + 1]) + { + store_index = cur_store_index; + return Ok(cur_data); + } + cur_data + } + _ => vec![], + }; + self.insert_new(paths.len() - 1 == path_index + 1); + store_index = self.store.len() - 1; + let trie_index = trie_indexes[path_index + 1]; + let trie_node_info = TrieNodeInfo { + trie_index, + store_index, + }; + cur_data.push(trie_node_info); + Ok(cur_data) + }; + node.insert(&paths[path_index], &mut callback)?; + self.store[cur_node_index] = MultiTrieNode::Node(node); + self.insert_internal(store_index, paths, path_index + 1, trie_indexes, get_value)?; + } + } + Ok(()) + } + + /// Lookup in the trie for a value that matches with `paths`. + pub fn look_up<'a>( + &'a self, + paths: &[(usize, Vec)], + ) -> Option<(&'a T, Vec)> { + if paths.len() < self.nb_required { + return None; + } + + let store = &self.store; + + let combination_iter = CombinationIterator::new(paths.len(), self.nb_required); + + let nb_roots = self.nb_tries - self.nb_required + 1; + + for selector in combination_iter { + let first_index = paths[selector[0]].0; + if first_index >= nb_roots { + continue; + } + + let res = self.look_up_internal( + &store[first_index], + &paths + .iter() + .enumerate() + .filter_map(|(i, x)| { + if selector.contains(&i) { + return Some(x); + } + None + }) + .collect::>(), + 0, + ); + if let Some(mut l_res) = res { + l_res.path.reverse(); + return Some((l_res.value, l_res.path.clone())); + } + } + + None + } + + fn look_up_internal<'a>( + &'a self, + cur_node: &'a MultiTrieNode, + paths: &[&(usize, Vec)], + path_index: usize, + ) -> Option)>> { + assert!(path_index < paths.len()); + let trie_index = paths[path_index].0; + + match cur_node { + MultiTrieNode::None => unreachable!(), + MultiTrieNode::Leaf(d_trie) => { + let res = d_trie.look_up(&paths[path_index].1)?; + Some(LookupResult { + value: res[0].value, + path: vec![(trie_index, res[0].path.clone())], + }) + } + MultiTrieNode::Node(d_trie) => { + assert!(path_index < paths.len() - 1); + let results = d_trie.look_up(&paths[path_index].1)?; + + for l_res in results { + if let Some(index) = find_store_index(l_res.value, paths[path_index + 1].0) { + let next_node = &self.store[index]; + if let Some(mut child_l_res) = + self.look_up_internal(next_node, paths, path_index + 1) + { + child_l_res.path.push((trie_index, l_res.path)); + return Some(child_l_res); + } + } + } + + None + } + } + } +} + +fn find_store_index(children: &[TrieNodeInfo], trie_index: usize) -> Option { + for info in children { + if trie_index == info.trie_index { + return Some(info.store_index); + } + } + + None +} + +fn reorder_to_min_first(oracle_digit_infos: &mut Vec) -> usize { + let min_index = oracle_digit_infos + .iter() + .enumerate() + .min_by_key(|(_, x)| *x) + .unwrap() + .0; + if min_index != 0 { + let min_val = oracle_digit_infos.remove(min_index); + oracle_digit_infos.insert(0, min_val); + } + min_index +} + +/// Container for a dump of a MultiTrie used for serialization purpose. +pub struct MultiTrieDump +where + T: Clone, +{ + /// The node data. + pub node_data: Vec>, + /// The total number of tries. + pub nb_tries: usize, + /// The number of trie per path. + pub nb_required: usize, + /// The guaranteed support as a power of 2. + pub min_support_exp: usize, + /// The maximum support as a power of 2. + pub max_error_exp: usize, + /// Whether this trie maximizes outcome coverage. + pub maximize_coverage: bool, + /// Information about the numerical representation of oracles + pub oracle_numeric_infos: OracleNumericInfo, +} + +impl MultiTrie +where + T: Clone, +{ + /// Dump the content of the trie for the purpose of serialization. + pub fn dump(&self) -> MultiTrieDump { + let node_data = self.store.iter().map(|x| x.get_data()).collect(); + MultiTrieDump { + node_data, + nb_tries: self.nb_tries, + nb_required: self.nb_required, + min_support_exp: self.min_support_exp, + max_error_exp: self.max_error_exp, + maximize_coverage: self.maximize_coverage, + oracle_numeric_infos: self.oracle_numeric_infos.clone(), + } + } + + /// Restore a trie from a dump. + pub fn from_dump(dump: MultiTrieDump) -> MultiTrie { + let MultiTrieDump { + node_data, + nb_tries, + nb_required, + min_support_exp, + max_error_exp, + maximize_coverage, + oracle_numeric_infos, + } = dump; + + let store = node_data + .into_iter() + .map(|x| MultiTrieNode::from_data(x)) + .collect(); + + MultiTrie { + store, + nb_tries, + nb_required, + min_support_exp, + max_error_exp, + maximize_coverage, + oracle_numeric_infos, + } + } +} + +/// Holds the data of a multi trie node. Used for serialization purpose. +pub enum MultiTrieNodeData +where + T: Clone, +{ + /// A leaf in the trie. + Leaf(DigitTrieDump), + /// A node in the trie. + Node(DigitTrieDump>), +} + +impl MultiTrieNode +where + T: Clone, +{ + fn get_data(&self) -> MultiTrieNodeData { + match self { + Node::Leaf(l) => MultiTrieNodeData::Leaf(l.dump()), + Node::Node(n) => MultiTrieNodeData::Node(n.dump()), + Node::None => unreachable!(), + } + } + + fn from_data(data: MultiTrieNodeData) -> MultiTrieNode { + match data { + MultiTrieNodeData::Leaf(l) => Node::Leaf(DigitTrie::from_dump(l)), + MultiTrieNodeData::Node(n) => Node::Node(DigitTrie::from_dump(n)), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_utils::{ + get_variable_oracle_numeric_infos, same_num_digits_oracle_numeric_infos, + }; + + type ExpectedIter = Vec)>>; + + fn tests_common( + m_trie: &mut MultiTrie, + path: Vec, + good_paths: Vec)>>, + bad_paths: Vec)>>, + expected_iter: Option, + ) { + let mut get_value = |_: &[Vec], _: &[usize]| -> Result { Ok(2) }; + + m_trie.insert(&path, &mut get_value).unwrap(); + + for good_path in good_paths { + assert!( + m_trie.look_up(&good_path).is_some(), + "Path {:?} not found", + good_path + ); + } + + for bad_path in bad_paths { + assert!( + m_trie.look_up(&bad_path).is_none(), + "Path {:?} was found", + bad_path + ); + } + + if let Some(expected) = expected_iter { + let iter = MultiTrieIterator::new(m_trie); + + for (i, res) in iter.enumerate() { + assert_eq!(expected[i], res.path); + } + } + } + + #[test] + fn multi_trie_1_of_1_test() { + let mut m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(1, 5, 2), + 1, + 2, + 3, + true, + ); + + let path = vec![0, 1, 1, 1]; + + let good_paths = vec![ + vec![(0, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 0])], + ]; + + let bad_paths = vec![ + vec![(0, vec![1, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 0, 1])], + vec![(0, vec![0, 1, 0, 1, 0])], + ]; + + let expected_iter: Vec)>> = vec![vec![(0, vec![0, 1, 1, 1])]]; + + tests_common( + &mut m_trie, + path, + good_paths, + bad_paths, + Some(expected_iter), + ); + } + + #[test] + fn multi_trie_1_of_2_test() { + let mut m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(2, 5, 2), + 1, + 2, + 3, + true, + ); + + let path = vec![0, 1, 1, 1]; + + let good_paths = vec![ + vec![(0, vec![0, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 0])], + vec![(1, vec![0, 1, 1, 1, 0])], + ]; + + let bad_paths = vec![ + vec![(0, vec![1, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 0, 1])], + vec![(0, vec![0, 1, 0, 1, 0])], + ]; + + let expected_iter: Vec)>> = + vec![vec![(0, vec![0, 1, 1, 1])], vec![(1, vec![0, 1, 1, 1])]]; + + tests_common( + &mut m_trie, + path, + good_paths, + bad_paths, + Some(expected_iter), + ); + } + + #[test] + fn multi_trie_2_of_2_test() { + let mut m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(2, 5, 2), + 2, + 2, + 3, + true, + ); + + let path = vec![0, 1, 1, 1]; + + let good_paths = vec![ + vec![(0, vec![0, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (1, vec![1, 0, 0, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (1, vec![0, 1, 1, 0, 0])], + ]; + + let bad_paths = vec![ + vec![(0, vec![1, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (1, vec![1, 1, 0, 1, 1])], + vec![(0, vec![0, 1, 0, 1, 1]), (1, vec![0, 1, 1, 0, 0])], + ]; + + let expected_iter: Vec)>> = vec![ + vec![(0, vec![0, 1, 1, 1]), (1, vec![0, 1])], + vec![(0, vec![0, 1, 1, 1]), (1, vec![1, 0, 0])], + ]; + + tests_common( + &mut m_trie, + path, + good_paths, + bad_paths, + Some(expected_iter), + ); + } + + #[test] + fn multi_trie_2_of_3_test() { + let mut m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(3, 5, 2), + 2, + 2, + 3, + true, + ); + + let path = vec![0, 1, 1, 1]; + + let good_paths = vec![ + vec![(0, vec![0, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![1, 0, 0, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![1, 0, 0, 1, 1])], + ]; + + let bad_paths = vec![ + vec![(0, vec![1, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(2, vec![0, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![1, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![1, 1, 1, 1, 1])], + ]; + + tests_common(&mut m_trie, path, good_paths, bad_paths, None); + } + + #[test] + fn multi_trie_5_of_5_test() { + let mut m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(5, 3, 2), + 5, + 1, + 2, + true, + ); + + let path = vec![0, 0, 0]; + + let good_paths = vec![vec![ + (0, vec![0, 0, 0]), + (1, vec![0]), + (2, vec![0]), + (3, vec![0]), + (4, vec![0]), + ]]; + + tests_common( + &mut m_trie, + path, + good_paths.clone(), + vec![], + Some(good_paths), + ); + } + + #[test] + fn multi_3_of_3_test_lexicographic_order() { + let mut m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(3, 3, 2), + 3, + 1, + 2, + true, + ); + + let inputs = vec![ + vec![0, 0], + vec![0, 0, 1], + vec![0, 1, 0], + vec![0, 1, 1], + vec![1, 0, 0], + vec![1, 0, 1], + ]; + + let mut counter = 0; + + let mut get_value = |_: &[std::vec::Vec], _: &[usize]| -> Result { + counter += 1; + Ok(counter - 1) + }; + + for input in inputs { + m_trie + .insert(&input, &mut get_value) + .expect("Error inserting in trie"); + } + + let iter = MultiTrieIterator::new(&m_trie); + + for (i, res) in iter.enumerate() { + assert_eq!(i, *res.value); + } + } + + fn multi_enumerate_equal_lookup_common(mut m_trie: MultiTrie) { + let inputs = vec![ + // vec![0, 0], + vec![0, 1, 0], + // vec![0, 1, 1], + // vec![1, 0, 0], + // vec![1, 0, 1], + ]; + + let mut counter = 0; + + let mut get_value = |_: &[Vec], _: &[usize]| -> Result { + counter += 1; + Ok(counter - 1) + }; + + for input in inputs { + m_trie + .insert(&input, &mut get_value) + .expect("Error inserting in trie"); + } + + let iter = MultiTrieIterator::new(&m_trie); + + for res in iter { + assert_eq!( + m_trie.look_up(&res.path).expect("Path not found").0, + res.value + ); + } + } + + #[test] + fn multi_3_of_5_test_enumerate_equal_lookup() { + let m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(5, 3, 2), + 3, + 1, + 2, + true, + ); + multi_enumerate_equal_lookup_common(m_trie); + } + + #[test] + fn multi_5_of_5_test_enumerate_equal_lookup() { + let m_trie = MultiTrie::::new( + &same_num_digits_oracle_numeric_infos(5, 3, 2), + 5, + 1, + 2, + true, + ); + multi_enumerate_equal_lookup_common(m_trie); + } + + #[test] + fn multi_2_of_3_diff_nb_digits_enumerate_equal_lookup() { + let m_trie = MultiTrie::::new( + &get_variable_oracle_numeric_infos(&[3, 4, 5], 2), + 2, + 1, + 2, + true, + ); + multi_enumerate_equal_lookup_common(m_trie); + } + + struct TestCase { + path: Vec, + good_paths: Vec)>>, + bad_paths: Vec)>>, + } + + #[test] + fn multi_trie_2_of_3_diff_nb_digits_test() { + let mut m_trie = MultiTrie::::new( + &get_variable_oracle_numeric_infos(&[5, 6, 7], 2), + 2, + 2, + 3, + true, + ); + + let test_cases = vec![ + TestCase { + path: vec![0, 1, 1, 1], + good_paths: vec![ + vec![(0, vec![0, 1, 1, 1, 1]), (1, vec![0, 0, 1, 1, 1, 1])], + vec![(1, vec![0, 0, 1, 1, 1, 1]), (2, vec![0, 0, 0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![0, 0, 0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![0, 0, 1, 0, 0, 1, 1])], + vec![(1, vec![0, 0, 1, 1, 1, 1]), (2, vec![0, 0, 1, 0, 0, 1, 1])], + vec![(1, vec![0, 0, 1, 1, 1, 1]), (2, vec![0, 0, 1, 0, 0, 1, 1])], + ], + bad_paths: vec![ + vec![(0, vec![1, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(2, vec![0, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![1, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![1, 1, 1, 1, 1])], + ], + }, + TestCase { + path: vec![1, 1, 1], + good_paths: vec![ + vec![(0, vec![1, 1, 1, 1, 1]), (1, vec![1, 0, 0, 0, 0])], + vec![(0, vec![1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 0, 0, 0, 0])], + vec![(0, vec![1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 0, 0, 0, 1])], + vec![(1, vec![0, 1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 0, 0, 0, 0])], + ], + bad_paths: vec![ + vec![(0, vec![1, 1, 1, 1, 1]), (1, vec![1, 0, 0, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 1, 1, 1])], + vec![(0, vec![1, 1, 1, 0, 0]), (2, vec![0, 1, 0, 0, 1, 0, 1])], + vec![(0, vec![1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 1, 0, 0, 0])], + ], + }, + ]; + + for case in test_cases { + tests_common( + &mut m_trie, + case.path, + case.good_paths, + case.bad_paths, + None, + ); + } + } + + #[test] + fn multi_trie_2_of_3_diff_nb_digits_unordered_test() { + let mut m_trie = MultiTrie::::new( + &get_variable_oracle_numeric_infos(&[6, 5, 7], 2), + 2, + 2, + 3, + true, + ); + + let test_cases = vec![ + TestCase { + path: vec![0, 1, 1, 1], + good_paths: vec![ + vec![(0, vec![0, 0, 1, 1, 1, 1]), (1, vec![0, 1, 1, 1, 1])], + vec![(0, vec![0, 0, 1, 1, 1, 1]), (2, vec![0, 0, 0, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![0, 0, 0, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![0, 0, 1, 0, 0, 1, 1])], + vec![(0, vec![0, 0, 1, 1, 1, 1]), (2, vec![0, 0, 1, 0, 0, 1, 1])], + vec![(0, vec![0, 0, 1, 1, 1, 1]), (2, vec![0, 0, 1, 0, 0, 1, 1])], + ], + bad_paths: vec![ + vec![(1, vec![1, 1, 1, 1, 1]), (0, vec![0, 1, 1, 1, 1])], + vec![(2, vec![0, 1, 1, 1, 1]), (0, vec![0, 1, 1, 1, 1])], + vec![(1, vec![0, 1, 1, 1, 1]), (2, vec![1, 1, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1]), (2, vec![1, 1, 1, 1, 1])], + ], + }, + TestCase { + path: vec![1, 1, 1], + good_paths: vec![ + vec![(0, vec![1, 0, 0, 0, 0]), (1, vec![1, 1, 1, 1, 1])], + vec![(1, vec![1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 0, 0, 0, 0])], + vec![(1, vec![1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 0, 0, 0, 1])], + vec![(0, vec![0, 1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 0, 0, 0, 0])], + ], + bad_paths: vec![ + vec![(1, vec![1, 1, 1, 1, 1]), (0, vec![1, 0, 0, 1, 1, 1])], + vec![(0, vec![0, 1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 1, 1, 1])], + vec![(1, vec![1, 1, 1, 0, 0]), (2, vec![0, 1, 0, 0, 1, 0, 1])], + vec![(1, vec![1, 1, 1, 1, 1]), (2, vec![0, 1, 0, 1, 0, 0, 0])], + ], + }, + ]; + + for case in test_cases { + tests_common( + &mut m_trie, + case.path, + case.good_paths, + case.bad_paths, + None, + ); + } + } + + #[test] + fn ttt() { + let inputs = vec![ + vec![0, 0, 0], + vec![0, 0, 1], + vec![0, 1, 0], + vec![0, 1, 1], + vec![1], + ]; + let mut m_trie = MultiTrie::::new( + &get_variable_oracle_numeric_infos(&[4, 3], 2), + 2, + 1, + 2, + true, + ); + + let mut counter = 0; + let mut get_value = |_: &[Vec], _: &[usize]| -> Result { + let res = counter; + counter += 1; + Ok(res) + }; + for input in inputs { + m_trie.insert(&input, &mut get_value).unwrap(); + } + + let iterator = MultiTrieIterator::new(&m_trie); + let mut unordered = iterator.map(|x| *x.value).collect::>(); + + unordered.sort(); + + for (prev_index, i) in unordered.iter().skip(1).enumerate() { + assert_eq!(*i, prev_index + 1); + } + } +} diff --git a/dlc-trie/src/test_utils.rs b/dlc-trie/src/test_utils.rs new file mode 100644 index 00000000..451da58e --- /dev/null +++ b/dlc-trie/src/test_utils.rs @@ -0,0 +1,22 @@ +use crate::OracleNumericInfo; + +pub(crate) fn same_num_digits_oracle_numeric_infos( + nb_oracles: usize, + nb_digits: usize, + base: usize, +) -> OracleNumericInfo { + OracleNumericInfo { + nb_digits: std::iter::repeat(nb_digits).take(nb_oracles).collect(), + base, + } +} + +pub(crate) fn get_variable_oracle_numeric_infos( + nb_digits: &[usize], + base: usize, +) -> OracleNumericInfo { + OracleNumericInfo { + base, + nb_digits: nb_digits.to_vec(), + } +} diff --git a/dlc-trie/src/utils.rs b/dlc-trie/src/utils.rs new file mode 100644 index 00000000..e559fcff --- /dev/null +++ b/dlc-trie/src/utils.rs @@ -0,0 +1,207 @@ +//! Utility functions when working with DLC trie + +use dlc::Error; +use secp256k1_zkp::PublicKey; + +use crate::{ + combination_iterator::CombinationIterator, OracleNumericInfo, RangeInfo, TrieIterInfo, +}; + +/// Creates an adaptor point using the provided oracle infos and paths, selecting +/// the oracle info at the provided indexes only. The paths are converted to +/// strings and hashed to be used as messages in adaptor signature creation. +pub(crate) fn get_adaptor_point_for_indexed_paths( + indexes: &[usize], + paths: &[Vec], + precomputed_points: &[Vec>], +) -> Result { + debug_assert!(indexes.len() == paths.len()); + debug_assert!(precomputed_points.len() >= indexes.len()); + if indexes.is_empty() { + return Err(super::Error::InvalidArgument); + } + + let mut keys = Vec::new(); + + for (i, j) in indexes.iter().enumerate() { + let path = &paths[i]; + let k: Vec<&PublicKey> = precomputed_points[*j] + .iter() + .zip(path.iter()) + .map(|(y, p)| &y[*p]) + .collect(); + keys.extend(k); + } + + Ok(PublicKey::combine_keys(&keys)?) +} + +/// Prepend zeros to the given vector until its size matches `expected_size`. +pub(crate) fn pre_pad_vec(mut input: Vec, expected_size: usize) -> Vec { + if input.len() == expected_size { + return input; + } + + let mut res = Vec::with_capacity(expected_size); + res.resize(expected_size - input.len(), 0); + res.append(&mut input); + res +} + +pub(crate) fn get_max_covering_paths( + oracle_numeric_infos: &OracleNumericInfo, + threshold: usize, +) -> Vec)>> { + let mut paths: Vec)>> = Vec::new(); + let min_nb_digits = oracle_numeric_infos.get_min_nb_digits(); + let combination_iter = + CombinationIterator::new(oracle_numeric_infos.nb_digits.len(), threshold); + for combination in combination_iter { + let infos = oracle_numeric_infos + .nb_digits + .iter() + .enumerate() + .filter_map(|(i, x)| { + if combination.contains(&i) { + Some(x) + } else { + None + } + }) + .collect::>(); + if infos.iter().all(|x| *x == &min_nb_digits) { + continue; + } + + // The extra digits that each oracle has compared to `min_nb_digits`. + let max = infos.iter().map(|x| *x - min_nb_digits).collect::>(); + + // Counters for the extra length of prefixes of each oracle. 0 if the oracle + // has nb_digit, starts at 1 for others since at the minimum we want to generate + // a prefix with `min_nb_digits + 1`. + let mut counters = infos + .iter() + .map(|x| usize::from(**x != min_nb_digits)) + .collect::>(); + let mut i = 0; + loop { + let path = counters + .iter() + .zip(combination.iter()) + .map(|(x, i)| { + // For oracles with `min_nb_digits` we just generate the max value. + let p = if *x == 0 { + std::iter::repeat(1).take(min_nb_digits).collect() + } else { + // For others we generate the prefix based on their current + // counter value. We insert `counter - 1` zero and then a 1. + let mut p = Vec::with_capacity(*x); + p.resize(x - 1, 0); + p.push(1); + p + }; + (*i, p) + }) + .collect::>(); + paths.push(path); + + // If all counters have reached their max prefix size value, we're done. + if counters.iter().zip(max.iter()).all(|(x, y)| x == y) { + break; + } + + // We reset the counters of oracles that had reached their max length + // prefixes, until we reach one that had not yet. We increment the counter + // for that one. + while counters[i] == max[i] { + if *infos[i] != min_nb_digits { + counters[i] = 1; + } + i += 1; + } + counters[i] += 1; + i = 0; + } + } + paths +} + +pub(crate) fn get_value_callback( + paths: &[Vec], + oracle_indexes: &[usize], + cet_index: usize, + adaptor_index: &mut usize, + trie_infos: &mut Vec, +) -> Result { + let range_info = RangeInfo { + cet_index, + adaptor_index: *adaptor_index, + }; + let iter_info = TrieIterInfo { + value: range_info.clone(), + indexes: oracle_indexes.to_vec(), + paths: paths.to_vec(), + }; + trie_infos.push(iter_info); + *adaptor_index += 1; + Ok(range_info) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_utils::get_variable_oracle_numeric_infos; + + struct TestCase { + nb_digits: Vec, + threshold: usize, + expected_paths: Vec)>>, + } + + fn test_cases() -> Vec { + vec![ + TestCase { + nb_digits: vec![10, 12, 11, 10], + threshold: 4, + expected_paths: vec![ + vec![ + (0, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), + (1, vec![1]), + (2, vec![1]), + (3, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), + ], + vec![ + (0, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), + (1, vec![0, 1]), + (2, vec![1]), + (3, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), + ], + ], + }, + TestCase { + nb_digits: vec![10, 12, 11, 10], + threshold: 2, + expected_paths: vec![ + vec![(0, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), (1, vec![1])], + vec![(0, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), (1, vec![0, 1])], + vec![(0, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), (2, vec![1])], + vec![(1, vec![1]), (2, vec![1])], + vec![(1, vec![0, 1]), (2, vec![1])], + vec![(1, vec![1]), (3, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1])], + vec![(1, vec![0, 1]), (3, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1])], + vec![(2, vec![1]), (3, vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1])], + ], + }, + ] + } + + #[test] + fn max_covering_paths_test() { + for test_case in test_cases() { + let oracle_infos = get_variable_oracle_numeric_infos(&test_case.nb_digits, 2); + let max_covering_paths = get_max_covering_paths(&oracle_infos, test_case.threshold); + + assert_eq!(test_case.expected_paths, max_covering_paths); + } + } +} diff --git a/dlc/CHANGELOG.md b/dlc/CHANGELOG.md new file mode 100644 index 00000000..62727ce2 --- /dev/null +++ b/dlc/CHANGELOG.md @@ -0,0 +1,41 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.5.0] - 2024-07-11 + +### Added +- Implement `std::error::Error` for `dlc::Error` +- Support for `no-std` +- Re-export of `secp256k1_zkp` +- `get_fund_outpoint` for `DlcTransactions` + +### Changed +- Updated bitcoin and secp256k1 dependencies + +### Fixed +- Issue with fee computation +- Issue with the `use-serde` feature + +## [0.4.0] - 2023-02-06 + +### Added +- Utility functions for DLC channels. + +### Fixed +- Use checked additions and multiplications to avoid panicking on bad use inputs. + +## [0.3.0] - 2022-10-28 + +### Changed +- Rename `local_payout` to `offer_payout` in `Payout` structure. + +## [0.2.0] - 2022-06-06 + +### Fixed +- Fix build issue caused by breaking minor update of `rust-secp256k1-sys` crate. + +### Changed +- Discard dust outputs on the refund transaction. diff --git a/dlc/Cargo.toml b/dlc/Cargo.toml new file mode 100644 index 00000000..820632bd --- /dev/null +++ b/dlc/Cargo.toml @@ -0,0 +1,27 @@ +[package] +authors = ["Crypto Garage"] +description = "Creation, signing and verification of Discreet Log Contracts (DLC) transactions." +homepage = "https://github.com/p2pderivatives/rust-dlc" +license-file = "../LICENSE" +name = "dlc" +repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/dlc" +version = "0.7.1" + +[dependencies] +bitcoin = { version = "0.32.2", default-features = false } +miniscript = { version = "12.2", default-features = false } +secp256k1-sys = "0.10.0" +secp256k1-zkp = "0.11.0" +serde = { version = "1.0", default-features = false, optional = true } + +[features] +# for benchmarks +unstable = [] +default = ["std"] +std = ["bitcoin/std", "miniscript/std", "secp256k1-zkp/rand-std"] +no-std = ["miniscript/no-std"] +use-serde = ["serde", "secp256k1-zkp/serde", "bitcoin/serde"] + +[dev-dependencies] +rayon = "1.5" +secp256k1-zkp = { version = "0.11.0", features = ["hashes", "rand","serde", "global-context"] } diff --git a/dlc/Readme.md b/dlc/Readme.md new file mode 100644 index 00000000..2e06a33a --- /dev/null +++ b/dlc/Readme.md @@ -0,0 +1,5 @@ +# DLC + +This crate provides base functionality for creation, signing and verification of transactions used in a DLC. + +See [the development docs](../docs/Development.md) for information about running integration tests. diff --git a/dlc/benches/Readme.md b/dlc/benches/Readme.md new file mode 100644 index 00000000..24793824 --- /dev/null +++ b/dlc/benches/Readme.md @@ -0,0 +1,9 @@ +# DLC Benchmarks + +This folder contains benchmarks to evaluate the impact of optimizations on computation of adaptor signatures and aggregated anticipation points. +The `const` parameters at the beginning of the file can be changed to try out different settings (note that the computation of all aggregated points without optimization can take a very long time for large number of digits and/or oracles). +See code comments for details on each benchmark. + +## Running + +To run the benchmarks: `cargo +nightly bench --features=unstable` diff --git a/dlc/benches/benchmarks.rs b/dlc/benches/benchmarks.rs new file mode 100644 index 00000000..3e09acc3 --- /dev/null +++ b/dlc/benches/benchmarks.rs @@ -0,0 +1,458 @@ +#![cfg_attr(all(test, feature = "unstable"), feature(test))] + +extern crate bitcoin; +extern crate dlc; +extern crate rayon; +extern crate secp256k1_zkp; +#[cfg(all(test, feature = "unstable"))] +extern crate test; + +#[cfg(all(test, feature = "unstable"))] +mod benches { + + use bitcoin::{consensus::Decodable, ScriptBuf, Transaction}; + use dlc::*; + use rayon::prelude::*; + use secp256k1_zkp::{ + global::SECP256K1, rand::thread_rng, rand::RngCore, Keypair, Message, PublicKey, SecretKey, + }; + use test::{black_box, Bencher}; + + const SINGLE_NB_ORACLES: usize = 1; + const SINGLE_NB_NONCES: usize = 10; + const ALL_NB_ORACLES: usize = 1; + const ALL_NB_NONCES: usize = 10; + const ALL_BASE: usize = 2; + + fn generate_oracle_info(nb_nonces: usize) -> OracleInfo { + let public_key = Keypair::new(SECP256K1, &mut thread_rng()) + .x_only_public_key() + .0; + + let mut nonces = Vec::with_capacity(nb_nonces); + for _ in 0..nb_nonces { + nonces.push( + Keypair::new(SECP256K1, &mut thread_rng()) + .x_only_public_key() + .0, + ); + } + + OracleInfo { public_key, nonces } + } + + fn generate_oracle_infos(nb_oracles: usize, nb_nonces: usize) -> Vec { + (0..nb_oracles) + .map(|_| generate_oracle_info(nb_nonces)) + .collect() + } + + fn generate_single_outcome_messages(nb_oracles: usize, nb_nonces: usize) -> Vec> { + (0..nb_oracles) + .map(|_| { + (0..nb_nonces) + .map(|_| { + let mut buf = [0u8; 32]; + thread_rng().fill_bytes(&mut buf); + Message::from_digest_slice(&buf).unwrap() + }) + .collect() + }) + .collect() + } + + fn generate_all_messages_recur( + nb_oracles: usize, + nb_nonces: usize, + base: usize, + cur: &mut Vec, + result: &mut Vec>>, + ) { + if nb_nonces == 0 { + let mut tmp = Vec::new(); + for _ in 0..nb_oracles { + tmp.push( + cur.iter() + .map(|x| { + let mut msg = [0u8; 32]; + msg[31] = (*x) as u8; + Message::from_digest(msg) + }) + .collect(), + ); + } + result.push(tmp); + return; + } + for i in 0..base { + cur.push(i); + generate_all_messages_recur(nb_oracles, nb_nonces - 1, base, cur, result); + cur.pop(); + } + } + + fn generate_all_messages( + nb_oracles: usize, + nb_nonces: usize, + base: usize, + ) -> Vec>> { + let mut result = Vec::new(); + let mut cur = Vec::new(); + + generate_all_messages_recur(nb_oracles, nb_nonces, base, &mut cur, &mut result); + + result + } + + fn generate_messages_for_precompute(nb_nonces: usize, base: usize) -> Vec> { + (0..base) + .map(|i| { + (0..nb_nonces) + .map(|_| { + let mut msg = [0u8; 32]; + msg[31] = i as u8; + Message::from_digest(msg) + }) + .collect() + }) + .collect() + } + + fn cet() -> Transaction { + tx_from_string("02000000019246862ea34db0833bd4bd9e657d61e2e5447d0438f6f6181d1cd329e8cf71c30000000000ffffffff02603bea0b000000001600145dedfbf9ea599dd4e3ca6a80b333c472fd0b3f69a0860100000000001600149652d86bedf43ad264362e6e6eba6eb76450812700000000") + } + + fn funding_script_pubkey() -> ScriptBuf { + let seckey = SecretKey::new(&mut thread_rng()); + make_funding_redeemscript( + &PublicKey::from_secret_key(SECP256K1, &seckey), + &PublicKey::from_secret_key(SECP256K1, &seckey), + ) + } + + /// Create a single adaptor signature including both the signature itself and the + /// aggregated anticipation point (base case). + #[bench] + fn bench_create_single_adaptor_sig_including_aggregated_point(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(SINGLE_NB_ORACLES, SINGLE_NB_NONCES); + let seckey = SecretKey::new(&mut thread_rng()); + let cet = cet(); + + b.iter(|| { + black_box( + create_cet_adaptor_sig_from_oracle_info( + SECP256K1, + &cet, + &oracle_infos, + &seckey, + &funding_script_pubkey(), + cet.output[0].value, + &generate_single_outcome_messages(SINGLE_NB_ORACLES, SINGLE_NB_NONCES), + ) + .unwrap(), + ); + }) + } + + /// Create an adaptor signature directly from the aggregated anticipation point. + #[bench] + fn bench_create_single_adaptor_sig_from_aggregated_point(b: &mut Bencher) { + let seckey = SecretKey::new(&mut thread_rng()); + let cet = cet(); + let adaptor_point = &PublicKey::from_secret_key(SECP256K1, &seckey); + + b.iter(|| { + black_box( + create_cet_adaptor_sig_from_point( + SECP256K1, + &cet, + adaptor_point, + &seckey, + &funding_script_pubkey(), + cet.output[0].value, + ) + .unwrap(), + ) + }) + } + + /// Create only the aggregated anticipation point. + #[bench] + fn bench_compute_aggregated_point(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(SINGLE_NB_ORACLES, SINGLE_NB_NONCES); + let msgs = generate_single_outcome_messages(SINGLE_NB_ORACLES, SINGLE_NB_NONCES); + + b.iter(|| get_adaptor_point_from_oracle_info(SECP256K1, &oracle_infos, &msgs).unwrap()) + } + + /// Create all possible aggregated anticipation points without any optimization (base case). + #[bench] + fn bench_create_all_aggregated_point_base(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(ALL_NB_ORACLES, ALL_NB_NONCES); + let all_msgs = generate_all_messages(ALL_NB_ORACLES, ALL_NB_NONCES, ALL_BASE); + + b.iter(|| { + compute_all_aggregated_points_base(&all_msgs, &oracle_infos); + }); + } + + /// Create all possible aggregated anticipation points, pre-computing the anticipation points + /// for each digits (pre-computation optimization). + #[bench] + fn bench_create_all_aggregated_point_pre_compute(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(ALL_NB_ORACLES, ALL_NB_NONCES); + let msgs: Vec> = generate_messages_for_precompute(ALL_NB_NONCES, ALL_BASE); + + b.iter(|| compute_all_aggregated_points_precompute(&oracle_infos, &msgs)); + } + + #[bench] + fn bench_create_all_aggregated_point_pre_compute_parallelize(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(ALL_NB_ORACLES, ALL_NB_NONCES); + let msgs: Vec> = generate_messages_for_precompute(ALL_NB_NONCES, ALL_BASE); + + b.iter(|| compute_all_aggregated_points_precompute_parallelize(&oracle_infos, &msgs)); + } + + /// Create all possible aggregated anticipation points, using pre-computation as well as memoization. + #[bench] + fn bench_create_all_aggregated_point_pre_compute_memoize(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(ALL_NB_ORACLES, ALL_NB_NONCES); + let msgs: Vec> = generate_messages_for_precompute(ALL_NB_NONCES, ALL_BASE); + + b.iter(|| compute_all_aggregated_points_precompute_memoize(&oracle_infos, &msgs)); + } + + /// Create all possible aggregated anticipation points, using pre-computation and memoization. + /// This differs from the above one in that it performs memoization on the aggregation of the anticipation + /// points for each digit across all oracles. + #[bench] + fn bench_create_all_aggregated_point_pre_compute_memoize2(b: &mut Bencher) { + let oracle_infos = generate_oracle_infos(ALL_NB_ORACLES, ALL_NB_NONCES); + let msgs: Vec> = generate_messages_for_precompute(ALL_NB_NONCES, ALL_BASE); + + b.iter(|| compute_all_aggregated_points_precompute_memoize2(&oracle_infos, &msgs)); + } + + /// Verify that optimized and base case yield the same result. + #[test] + fn test_all_equal_result() { + let oracle_infos = generate_oracle_infos(ALL_NB_ORACLES, ALL_NB_NONCES); + let all_msgs: Vec>> = + generate_all_messages(ALL_NB_ORACLES, ALL_NB_NONCES, ALL_BASE); + let precomp_msgs: Vec> = + generate_messages_for_precompute(ALL_NB_NONCES, ALL_BASE); + + let base = compute_all_aggregated_points_base(&all_msgs, &oracle_infos); + let precompute = compute_all_aggregated_points_precompute(&oracle_infos, &precomp_msgs); + let memoize_precompute = + compute_all_aggregated_points_precompute_memoize(&oracle_infos, &precomp_msgs); + let memoize_precompute2 = + compute_all_aggregated_points_precompute_memoize2(&oracle_infos, &precomp_msgs); + assert_eq!(base, precompute); + assert_eq!(precompute, memoize_precompute); + assert_eq!(precompute, memoize_precompute2); + } + + fn compute_all_aggregated_points_base( + msgs: &[Vec>], + oracle_infos: &[OracleInfo], + ) -> Vec { + msgs.iter() + .map(|m| get_adaptor_point_from_oracle_info(SECP256K1, oracle_infos, m).unwrap()) + .collect::>() + } + + fn compute_all_aggregated_points_precompute( + oracle_infos: &[OracleInfo], + msgs: &[Vec], + ) -> Vec { + let precomputed_points = get_precomputed_points(oracle_infos, msgs); + let mut all_adaptor_points: Vec = Vec::new(); + let nb_outcomes = ALL_BASE.pow(ALL_NB_NONCES as u32); + for i in 0..nb_outcomes { + let mut to_combine = Vec::with_capacity(ALL_NB_NONCES * ALL_NB_ORACLES); + for precomputed in &precomputed_points { + for j in 0..ALL_NB_NONCES { + let x = i / (ALL_BASE.pow((ALL_NB_NONCES - j - 1) as u32)) % ALL_BASE; + to_combine.push(&precomputed[x][j]); + } + } + all_adaptor_points.push(PublicKey::combine_keys(&to_combine).unwrap()); + } + all_adaptor_points + } + + fn compute_all_aggregated_points_precompute_parallelize( + oracle_infos: &[OracleInfo], + msgs: &[Vec], + ) -> Vec { + let precomputed_points = get_precomputed_points(oracle_infos, msgs); + let nb_outcomes = ALL_BASE.pow(ALL_NB_NONCES as u32); + (0..nb_outcomes) + .into_par_iter() + .map(|i| { + let mut to_combine = Vec::with_capacity(ALL_NB_NONCES * ALL_NB_ORACLES); + for precomputed in &precomputed_points { + for j in 0..ALL_NB_NONCES { + let x = i / (ALL_BASE.pow((ALL_NB_NONCES - j - 1) as u32)) % ALL_BASE; + to_combine.push(&precomputed[x][j]); + } + } + PublicKey::combine_keys(&to_combine).unwrap() + }) + .collect() + } + + fn compute_all_aggregated_points_precompute_memoize( + oracle_infos: &[OracleInfo], + msgs: &[Vec], + ) -> Vec { + let mut all_adaptor_points: Vec = Vec::new(); + let pre_computed_points = get_precomputed_points(oracle_infos, msgs); + let mut all_outcomes_per_oracle: Vec> = Vec::with_capacity(ALL_NB_ORACLES); + all_outcomes_per_oracle.resize(ALL_NB_ORACLES, Vec::new()); + for i in 0..oracle_infos.len() { + memoize_recursive( + 0, + None, + &pre_computed_points[i], + &mut all_outcomes_per_oracle[i], + ); + } + + for i in 0..ALL_BASE.pow(ALL_NB_NONCES as u32) { + let mut to_add = Vec::new(); + for v in &all_outcomes_per_oracle { + to_add.push(v[i]); + } + if to_add.len() == 1 { + all_adaptor_points.push(to_add[0]); + } else { + all_adaptor_points + .push(PublicKey::combine_keys(&to_add.iter().collect::>()).unwrap()); + } + } + all_adaptor_points + } + + fn compute_all_aggregated_points_precompute_memoize2( + oracle_infos: &[OracleInfo], + msgs: &[Vec], + ) -> Vec { + let mut all_adaptor_points: Vec = Vec::new(); + let pre_computed_points = get_precomputed_points(oracle_infos, msgs); + memoize_recursive2(0, None, &pre_computed_points, &mut all_adaptor_points); + all_adaptor_points + } + + fn get_precomputed_points( + oracle_infos: &[OracleInfo], + msgs: &[Vec], + ) -> Vec>> { + oracle_infos + .iter() + .map(|info| { + msgs.iter() + .map(|msg| { + msg.iter() + .zip(info.nonces.iter()) + .map(|(m, n)| { + secp_utils::schnorrsig_compute_sig_point( + SECP256K1, + &info.public_key, + n, + m, + ) + .unwrap() + }) + .collect() + }) + .collect() + }) + .collect() + } + + fn memoize_recursive( + index: usize, + prev: Option, + nonces_sig_points: &[Vec], + res: &mut Vec, + ) { + assert!(index < nonces_sig_points[0].len()); + for i in 0..nonces_sig_points.len() { + let next = match prev { + Some(prev) => prev.combine(&nonces_sig_points[i][index]).unwrap(), + None => nonces_sig_points[i][index], + }; + if index < nonces_sig_points[0].len() - 1 { + memoize_recursive(index + 1, Some(next), nonces_sig_points, res); + } else { + res.push(next); + } + } + } + + fn memoize_recursive2( + index: usize, + prev: Option, + nonces_sig_points: &[Vec>], + res: &mut Vec, + ) { + assert!(index < nonces_sig_points[0][0].len()); + for i in 0..nonces_sig_points[0].len() { + let mut to_combine = Vec::new(); + for o in nonces_sig_points { + to_combine.push(o[i][index]); + } + let next = match prev { + Some(prev) => { + to_combine.push(prev); + PublicKey::combine_keys(&to_combine.iter().collect::>()).unwrap() + } + None => PublicKey::combine_keys(&to_combine.iter().collect::>()).unwrap(), + }; + if index < nonces_sig_points[0][0].len() - 1 { + memoize_recursive2(index + 1, Some(next), nonces_sig_points, res); + } else { + res.push(next); + } + } + } + + #[allow(clippy::result_unit_err)] // This is just a test util + fn from_hex(hex: &str, target: &mut [u8]) -> Result { + if hex.len() % 2 == 1 || hex.len() > target.len() * 2 { + return Err(()); + } + + let mut b = 0; + let mut idx = 0; + for c in hex.bytes() { + b <<= 4; + match c { + b'A'..=b'F' => b |= c - b'A' + 10, + b'a'..=b'f' => b |= c - b'a' + 10, + b'0'..=b'9' => b |= c - b'0', + _ => return Err(()), + } + if (idx & 1) == 1 { + target[idx / 2] = b; + b = 0; + } + idx += 1; + } + Ok(idx / 2) + } + + fn str_to_hex(hex_str: &str) -> Vec { + let mut hex = vec![0; hex_str.len() / 2]; + from_hex(hex_str, &mut hex).unwrap(); + hex + } + + fn tx_from_string(tx_str: &str) -> Transaction { + let tx_hex = str_to_hex(tx_str); + Transaction::consensus_decode(&mut tx_hex.as_slice()).unwrap() + } +} diff --git a/dlc/src/channel/mod.rs b/dlc/src/channel/mod.rs new file mode 100644 index 00000000..8eb3bd16 --- /dev/null +++ b/dlc/src/channel/mod.rs @@ -0,0 +1,973 @@ +//! Module for working with DLC channels + +#[cfg(any(feature = "std", not(feature = "no-std")))] +use std::collections::BTreeMap; + +#[cfg(all(feature = "no-std", not(feature = "std")))] +use alloc::collections::BTreeMap; + +use crate::{signatures_to_secret, util::get_sig_hash_msg, DlcTransactions, PartyParams, Payout}; + +use super::Error; +use bitcoin::{ + absolute::LockTime, ecdsa::Signature, sighash::EcdsaSighashType, Address, Amount, OutPoint, + PublicKey, Script, ScriptBuf, Sequence, Transaction, TxIn, TxOut, Witness, +}; +use miniscript::Descriptor; +use secp256k1_zkp::{ + schnorr::Signature as SchnorrSignature, EcdsaAdaptorSignature, PublicKey as SecpPublicKey, + Secp256k1, SecretKey, Signing, Verification, +}; +use std::iter::FromIterator; + +/** + * Weight of the buffer transaction: + * INPUT + * Overhead -> 10.5 * 4 + * Outpoint -> 36 * 4 + * scriptSigLength -> 1 * 4 + * scriptSig -> 0 + * nSequence -> 4 * 4 + * Witness item count -> 1 + * Witness -> 220 + * OUTPUT: + * nValue -> 8 * 4 + * scriptPubkeyLen -> 1 * 4 + * scriptPubkey -> 34 * 4 + * TOTAL: 599 +*/ +const BUFFER_TX_WEIGHT: usize = 599; + +/** + * Due to the buffer output script being more complex than the funding output + * one, the weight of the CET increases. + * In the worst case, the witness input is (+1 is added to each witness for size + * parameter): + * 3 signatures (own one, with publish key and revocation key) -> 73 * 3 + * 3 compressed public keys -> 34 * 3 + * Empty input to fail the first `OP_CHECKSIG` -> 1 + * Boolean to chose the offer or accept path -> 2 + * Script -> 225 + * TOTAL: 550 + * Regular CET witness size: 220 + * Extra size => 330 + */ +const CET_EXTRA_WEIGHT: usize = 330; + +// Same as buffer input +const SETTLE_INPUT_WEIGHT: usize = 428; +// Simple P2WSH output +const SETTLE_OUTPUT_WEIGHT: usize = 172; + +/** + * In the worst case the witness input is (+1 is added to each witness for size + * parameter): + * + * 3 signatures (own one, with publish key and revocation key) -> 73 * 3 + * 3 compressed public keys -> 34 * 3 + * Empty input to fail the first `OP_CHECKSIG` -> 1 + * Boolean to chose the offer or accept path -> 2 + * Script -> 225 + * TOTAL: 550 + * + */ +const PUNISH_BUFFER_INPUT_WEIGHT: usize = 758; + +/** + * In the worst case the witness input is (+1 is added to each witness for size + * parameter): + * + * 3 signatures (own one, with publish key and revocation key) -> 73 * 3 + * Empty input to fail the first `OP_CHECKSIG` -> 1 + * Script -> 147 + * TOTAL: 367 + * + */ +const PUNISH_SETTLE_INPUT_WEIGHT: usize = 575; + +const N_VALUE_WEIGHT: usize = 8 * 4; + +#[derive(Clone, Debug)] +/// Container for the set of [`PublicKey`] required for creating a transaction +/// that can later on be revoked. +pub struct RevokeParams { + /// Key used to restrict the transaction output path. + pub own_pk: PublicKey, + /// Key used to restrict the transaction output path and for generating + /// an adaptor signature, that gets revealed when using the transaction. + pub publish_pk: PublicKey, + /// Key used to revoke the transaction. + pub revoke_pk: PublicKey, +} + +/// Transactions used to setup a DLC channel. +pub struct DlcChannelTransactions { + /// The set of transactions used to setup the DLC within the channel. + pub dlc_transactions: DlcTransactions, + /// The buffer transaction enabling revocation of the contract. + pub buffer_transaction: Transaction, + /// Script pubkey of the buffer transaction. + pub buffer_script_pubkey: ScriptBuf, +} + +/// Creates a buffer transaction using the given descriptor. +pub fn create_buffer_transaction( + fund_tx_in: &TxIn, + descriptor: &Descriptor, + total_collateral: Amount, + lock_time: u32, +) -> Transaction { + Transaction { + version: super::TX_VERSION, + lock_time: LockTime::from_consensus(lock_time), + input: vec![fund_tx_in.clone()], + output: vec![TxOut { + value: total_collateral, + script_pubkey: descriptor.script_pubkey(), + }], + } +} + +/// Returns an adaptor signature for the given transaction generated using the +/// given secret key and parameters. +pub fn get_tx_adaptor_signature( + secp: &Secp256k1, + tx: &Transaction, + input_value: Amount, + script_pubkey: &Script, + own_fund_sk: &SecretKey, + other_publish_key: &SecpPublicKey, +) -> Result { + let sighash = get_sig_hash_msg(tx, 0, script_pubkey, input_value)?; + + #[cfg(feature = "std")] + let res = EcdsaAdaptorSignature::encrypt(secp, &sighash, own_fund_sk, other_publish_key); + + #[cfg(not(feature = "std"))] + let res = + EcdsaAdaptorSignature::encrypt_no_aux_rand(secp, &sighash, own_fund_sk, other_publish_key); + + Ok(res) +} + +/// Verify that the given adaptor signature is valid with respect to the given +/// transaction and parameters. +pub fn verify_tx_adaptor_signature( + secp: &Secp256k1, + tx: &Transaction, + input_value: Amount, + script_pubkey: &Script, + other_fund_pk: &SecpPublicKey, + own_publish_key: &SecpPublicKey, + adaptor_sig: &EcdsaAdaptorSignature, +) -> Result<(), Error> { + let sighash = get_sig_hash_msg(tx, 0, script_pubkey, input_value)?; + + adaptor_sig.verify(secp, &sighash, other_fund_pk, own_publish_key)?; + + Ok(()) +} + +/// Returns a settle transaction. +pub fn create_settle_transaction( + fund_tx_in: &TxIn, + offer_revoke_params: &RevokeParams, + accept_revoke_params: &RevokeParams, + offer_payout: Amount, + accept_payout: Amount, + csv_timelock: u32, + lock_time: u32, + fund_output_value: Amount, + fee_rate_per_vb: u64, +) -> Result { + let offer_descriptor = settle_descriptor( + offer_revoke_params, + &accept_revoke_params.own_pk, + csv_timelock, + ); + let accept_descriptor = settle_descriptor( + accept_revoke_params, + &offer_revoke_params.own_pk, + csv_timelock, + ); + + let mut output = crate::util::discard_dust( + vec![ + TxOut { + value: offer_payout, + script_pubkey: offer_descriptor.script_pubkey(), + }, + TxOut { + value: accept_payout, + script_pubkey: accept_descriptor.script_pubkey(), + }, + ], + crate::DUST_LIMIT, + ); + + // We compute the fee that is left as the unilateral closing in settle state + // is cheaper than in established state. + let remaining_fee = (fund_output_value + - offer_payout + - accept_payout + - crate::util::weight_to_fee( + SETTLE_INPUT_WEIGHT + output.len() * SETTLE_OUTPUT_WEIGHT, + fee_rate_per_vb, + )?) + / (output.len() as u64); + + for o in &mut output { + o.value += remaining_fee; + } + + Ok(Transaction { + version: super::TX_VERSION, + lock_time: LockTime::from_consensus(lock_time), + input: vec![fund_tx_in.clone()], + output, + }) +} + +/// Returns the transactions necessary to establish a DLC channel. +pub fn create_channel_transactions( + offer_params: &PartyParams, + accept_params: &PartyParams, + offer_revoke_params: &RevokeParams, + accept_revoke_params: &RevokeParams, + payouts: &[Payout], + refund_lock_time: u32, + fee_rate_per_vb: u64, + fund_lock_time: u32, + cet_lock_time: u32, + fund_output_serial_id: u64, + cet_nsequence: Sequence, +) -> Result { + let extra_fee = + super::util::weight_to_fee(BUFFER_TX_WEIGHT + CET_EXTRA_WEIGHT, fee_rate_per_vb)?; + let (fund, funding_script_pubkey) = super::create_fund_transaction_with_fees( + offer_params, + accept_params, + fee_rate_per_vb, + fund_lock_time, + fund_output_serial_id, + extra_fee, + )?; + + create_renewal_channel_transactions( + offer_params, + accept_params, + offer_revoke_params, + accept_revoke_params, + &fund, + &funding_script_pubkey, + payouts, + refund_lock_time, + fee_rate_per_vb, + cet_lock_time, + cet_nsequence, + ) +} + +/// Returns the transactions necessary to renew the contract of a DLC +/// channel. +pub fn create_renewal_channel_transactions( + offer_params: &PartyParams, + accept_params: &PartyParams, + offer_revoke_params: &RevokeParams, + accept_revoke_params: &RevokeParams, + fund_tx: &Transaction, + funding_script_pubkey: &Script, + payouts: &[Payout], + refund_lock_time: u32, + fee_rate_per_vb: u64, + cet_lock_time: u32, + cet_nsequence: Sequence, +) -> Result { + let extra_fee = + super::util::weight_to_fee(BUFFER_TX_WEIGHT + CET_EXTRA_WEIGHT, fee_rate_per_vb)?; + + let (fund_vout, fund_output) = + super::util::get_output_for_script_pubkey(fund_tx, &funding_script_pubkey.to_p2wsh()) + .expect("to find the funding script pubkey"); + + let outpoint = OutPoint { + txid: fund_tx.compute_txid(), + vout: fund_vout as u32, + }; + + let tx_in = TxIn { + previous_output: outpoint, + sequence: super::util::get_sequence(cet_lock_time), + script_sig: ScriptBuf::default(), + witness: Witness::default(), + }; + + let buffer_descriptor = buffer_descriptor(offer_revoke_params, accept_revoke_params); + + let buffer_transaction = create_buffer_transaction( + &tx_in, + &buffer_descriptor, + fund_output.value - extra_fee, + cet_lock_time, + ); + + let outpoint = OutPoint { + txid: buffer_transaction.compute_txid(), + vout: 0, + }; + + let (cets, refund) = super::create_cets_and_refund_tx( + offer_params, + accept_params, + outpoint, + payouts, + refund_lock_time, + cet_lock_time, + Some(cet_nsequence), + )?; + + Ok(DlcChannelTransactions { + dlc_transactions: DlcTransactions { + fund: fund_tx.clone(), + cets, + refund, + funding_script_pubkey: funding_script_pubkey.to_owned(), + }, + buffer_transaction, + buffer_script_pubkey: buffer_descriptor.script_code()?, + }) +} + +/// Sign a CET within a DLC channel. +pub fn sign_cet( + secp: &Secp256k1, + cet: &mut Transaction, + input_amount: Amount, + offer_params: &RevokeParams, + accept_params: &RevokeParams, + own_sk: &SecretKey, + counter_pubkey: &PublicKey, + adaptor_signature: &EcdsaAdaptorSignature, + oracle_signatures: &[Vec], +) -> Result<(), Error> { + let adaptor_secret = signatures_to_secret(oracle_signatures)?; + let adapted_sig = adaptor_signature.decrypt(&adaptor_secret)?; + let descriptor = buffer_descriptor(offer_params, accept_params); + + let own_sig = super::util::get_raw_sig_for_tx_input( + secp, + cet, + 0, + &descriptor.script_code()?, + input_amount, + own_sk, + )?; + let own_pk = SecpPublicKey::from_secret_key(secp, own_sk); + + let sigs = BTreeMap::from_iter([ + ( + PublicKey { + inner: own_pk, + compressed: true, + }, + bitcoin::ecdsa::Signature { + signature: own_sig, + sighash_type: EcdsaSighashType::All, + }, + ), + ( + *counter_pubkey, + bitcoin::ecdsa::Signature { + signature: adapted_sig, + sighash_type: EcdsaSighashType::All, + }, + ), + ]); + + descriptor + .satisfy(&mut cet.input[0], sigs) + .map_err(|_| Error::InvalidArgument)?; + + Ok(()) +} + +/// Returns a signed transaction to punish the publication of a revoked buffer +/// transaction. +pub fn create_and_sign_punish_buffer_transaction( + secp: &Secp256k1, + offer_params: &RevokeParams, + accept_params: &RevokeParams, + own_sk: &SecretKey, + counter_publish_sk: &SecretKey, + counter_revoke_sk: &SecretKey, + prev_tx: &Transaction, + dest_address: &Address, + lock_time: u32, + fee_rate_per_vb: u64, +) -> Result { + let descriptor = buffer_descriptor(offer_params, accept_params); + + let tx_in = TxIn { + previous_output: OutPoint { + txid: prev_tx.compute_txid(), + vout: 0, + }, + sequence: Sequence::ZERO, + script_sig: ScriptBuf::default(), + witness: Witness::default(), + }; + + let dest_script_pk_len = dest_address.script_pubkey().len(); + let var_int_prefix_len = crate::util::compute_var_int_prefix_size(dest_script_pk_len); + let output_weight = N_VALUE_WEIGHT + var_int_prefix_len + dest_script_pk_len * 4; + let tx_fee = + crate::util::weight_to_fee(PUNISH_BUFFER_INPUT_WEIGHT + output_weight, fee_rate_per_vb)?; + + let output_value = prev_tx.output[0].value - tx_fee; + + let mut tx = Transaction { + version: super::TX_VERSION, + lock_time: LockTime::from_consensus(lock_time), + input: vec![tx_in], + output: vec![TxOut { + value: output_value, + script_pubkey: dest_address.script_pubkey(), + }], + }; + + let mut sigs = BTreeMap::new(); + + for sk in &[&own_sk, &counter_publish_sk, &counter_revoke_sk] { + let pk = PublicKey { + inner: SecpPublicKey::from_secret_key(secp, sk), + compressed: true, + }; + + let pkh = pk.pubkey_hash().to_raw_hash(); + sigs.insert( + pkh, + ( + pk, + bitcoin::ecdsa::Signature { + signature: super::util::get_raw_sig_for_tx_input( + secp, + &tx, + 0, + &descriptor.script_code()?, + prev_tx.output[0].value, + sk, + )?, + sighash_type: EcdsaSighashType::All, + }, + ), + ); + } + + descriptor + .satisfy(&mut tx.input[0], sigs) + .map_err(|_| Error::InvalidArgument)?; + + Ok(tx) +} + +/// Create and sign a punishment transaction for a revoked settle transaction. +pub fn create_and_sign_punish_settle_transaction( + secp: &Secp256k1, + offer_params: &RevokeParams, + accept_params: &RevokeParams, + own_sk: &SecretKey, + counter_publish_sk: &SecretKey, + counter_revoke_sk: &SecretKey, + prev_tx: &Transaction, + dest_address: &Address, + csv_timelock: u32, + lock_time: u32, + fee_rate_per_vb: u64, + is_offer: bool, +) -> Result { + let (own_params, counter_params) = if is_offer { + (offer_params, accept_params) + } else { + (accept_params, offer_params) + }; + + let descriptor = settle_descriptor(counter_params, &own_params.own_pk, csv_timelock); + + let vout = u32::from(is_offer); + + let tx_in = TxIn { + previous_output: OutPoint { + txid: prev_tx.compute_txid(), + vout, + }, + sequence: Sequence::ZERO, + script_sig: ScriptBuf::default(), + witness: Witness::default(), + }; + + let input_value = prev_tx.output[vout as usize].value; + + let dest_script_pk_len = dest_address.script_pubkey().len(); + let var_int_prefix_len = crate::util::compute_var_int_prefix_size(dest_script_pk_len); + let output_weight = N_VALUE_WEIGHT + var_int_prefix_len + dest_script_pk_len * 4; + let tx_fee = + crate::util::weight_to_fee(PUNISH_SETTLE_INPUT_WEIGHT + output_weight, fee_rate_per_vb)?; + + let mut tx = Transaction { + version: super::TX_VERSION, + lock_time: LockTime::from_consensus(lock_time), + input: vec![tx_in], + output: vec![TxOut { + value: input_value - tx_fee, + script_pubkey: dest_address.script_pubkey(), + }], + }; + + let mut sigs = BTreeMap::new(); + + for sk in &[&own_sk, &counter_publish_sk, &counter_revoke_sk] { + let pk = PublicKey { + inner: SecpPublicKey::from_secret_key(secp, sk), + compressed: true, + }; + sigs.insert( + pk, + Signature::sighash_all(super::util::get_raw_sig_for_tx_input( + secp, + &tx, + 0, + &descriptor.script_code()?, + input_value, + sk, + )?), + ); + } + + descriptor + .satisfy(&mut tx.input[0], sigs) + .map_err(|_| Error::InvalidArgument)?; + + Ok(tx) +} + +/// Create a transaction for collaboratively closing a channel. +pub fn create_collaborative_close_transaction( + offer_params: &PartyParams, + offer_payout: Amount, + accept_params: &PartyParams, + accept_payout: Amount, + fund_outpoint: OutPoint, + _fund_output_amount: Amount, +) -> Transaction { + let input = TxIn { + previous_output: fund_outpoint, + witness: Witness::default(), + script_sig: ScriptBuf::default(), + sequence: crate::util::DISABLE_LOCKTIME, + }; + + //TODO(tibo): add fee re-payment + let offer_output = TxOut { + value: offer_payout, + script_pubkey: offer_params.payout_script_pubkey.clone(), + }; + + let accept_output = TxOut { + value: accept_payout, + script_pubkey: accept_params.payout_script_pubkey.clone(), + }; + + let mut output: Vec = if offer_params.payout_serial_id < accept_params.payout_serial_id { + vec![offer_output, accept_output] + } else { + vec![accept_output, offer_output] + }; + + output = crate::util::discard_dust(output, crate::DUST_LIMIT); + + Transaction { + version: crate::TX_VERSION, + lock_time: LockTime::ZERO, + input: vec![input], + output, + } +} + +/// Returns a descriptor for a buffer transaction. +pub fn buffer_descriptor( + offer_revoke_params: &RevokeParams, + accept_revoke_params: &RevokeParams, +) -> Descriptor { + let offer_pk = offer_revoke_params.own_pk; + let accept_pk = accept_revoke_params.own_pk; + let accept_publish_pk = accept_revoke_params.publish_pk; + let accept_revoke_pk = accept_revoke_params.revoke_pk; + let offer_publish_pk = offer_revoke_params.publish_pk; + let offer_revoke_pk = offer_revoke_params.revoke_pk; + + let (first_pk, second_pk) = if offer_pk < accept_pk { + (offer_pk, accept_pk) + } else { + (accept_pk, offer_pk) + }; + // heavily inspired by: https://github.com/comit-network/maia/blob/main/src/protocol.rs#L283 + // policy: or(and(pk(offer_pk),pk(accept_pk)),or(and(pk(offer_pk),and(pk(accept_publish_pk), pk(accept_rev_pk))),and(pk(accept_pk),and(pk(offer_publish_pk),pk(offer_rev_pk))))) + let script = format!("wsh(c:andor(pk({first_pk}),pk_k({second_pk}),or_i(and_v(v:pkh({offer_pk_hash}),and_v(v:pkh({accept_publish_pk_hash}),pk_h({accept_revoke_pk_hash}))),and_v(v:pkh({accept_pk_hash}),and_v(v:pkh({offer_publish_pk_hash}),pk_h({offer_revoke_pk_hash}))))))", + first_pk = first_pk, + second_pk = second_pk, + offer_pk_hash = offer_pk, + accept_pk_hash = accept_pk, + accept_publish_pk_hash = accept_publish_pk, + accept_revoke_pk_hash = accept_revoke_pk, + offer_publish_pk_hash = offer_publish_pk, + offer_revoke_pk_hash = offer_revoke_pk); + script.parse().expect("a valid miniscript") +} + +/// Returns a descriptor for a settle transaction. +pub fn settle_descriptor( + payee_revoke_params: &RevokeParams, + counter_pk: &PublicKey, + csv_timelock: u32, +) -> Descriptor { + // policy: or(and(pk(payee_pk), older(csv_timelock)), and(pk(counter_pk), and(pk(payee_publish_pk), pk(payee_revoke_pk)))) + let script = format!("wsh(andor(pk({payee_pk}),older({csv_timelock}),and_v(v:pk({counter_pk}),and_v(v:pk({payee_publish_pk}),pk({payee_revoke_pk})))))", + payee_pk = payee_revoke_params.own_pk, + csv_timelock = csv_timelock, + counter_pk = counter_pk, + payee_publish_pk = payee_revoke_params.publish_pk, + payee_revoke_pk = payee_revoke_params.revoke_pk, + ); + script.parse().expect("a valid miniscript") +} + +#[cfg(test)] +mod tests { + use std::{iter::FromIterator, str::FromStr}; + + use bitcoin::{Network, PrivateKey}; + use secp256k1_zkp::{rand::thread_rng, SECP256K1}; + + use super::*; + + const FEE_RATE_PER_VB: u64 = 2; + + struct RevokePrivateParams { + pub own_priv: PrivateKey, + pub publish_priv: PrivateKey, + pub revoke_priv: PrivateKey, + } + + impl RevokePrivateParams { + fn new(network: Network) -> Self { + Self { + own_priv: PrivateKey::new(SecretKey::new(&mut thread_rng()), network), + publish_priv: PrivateKey::new(SecretKey::new(&mut thread_rng()), network), + revoke_priv: PrivateKey::new(SecretKey::new(&mut thread_rng()), network), + } + } + + fn public_params(&self, secp: &Secp256k1) -> RevokeParams { + RevokeParams::from_priv_params(secp, self) + } + } + + impl RevokeParams { + /// Create a [`RevokeParams`] struct from the given [`RevokePrivateParams`] + fn from_priv_params( + secp: &Secp256k1, + priv_params: &RevokePrivateParams, + ) -> Self { + RevokeParams { + own_pk: priv_params.own_priv.public_key(secp), + publish_pk: priv_params.publish_priv.public_key(secp), + revoke_pk: priv_params.revoke_priv.public_key(secp), + } + } + } + + #[test] + fn create_and_sign_penalty_from_buffer_transaction_test() { + let offer_priv_params = RevokePrivateParams::new(Network::Regtest); + let accept_priv_params = RevokePrivateParams::new(Network::Regtest); + let offer_params = offer_priv_params.public_params(SECP256K1); + let accept_params = accept_priv_params.public_params(SECP256K1); + let dest_address = Address::p2pkh( + &PublicKey::from_private_key( + SECP256K1, + &PrivateKey::new(SecretKey::new(&mut thread_rng()), Network::Regtest), + ), + Network::Regtest, + ); + let total_collateral = Amount::ONE_BTC; + + let descriptor = buffer_descriptor(&offer_params, &accept_params); + + let buffer_tx = + create_buffer_transaction(&TxIn::default(), &descriptor, total_collateral, 0); + + // Offerer can create and sign with accepter revocation and publish secret. + create_and_sign_punish_buffer_transaction( + SECP256K1, + &offer_params, + &accept_params, + &offer_priv_params.own_priv.inner, + &accept_priv_params.publish_priv.inner, + &accept_priv_params.revoke_priv.inner, + &buffer_tx, + &dest_address, + 0, + FEE_RATE_PER_VB, + ) + .expect("to be able to create and sign the punish transaction"); + + // Accepter can create and sign with offerer revocation and publish secret. + create_and_sign_punish_buffer_transaction( + SECP256K1, + &offer_params, + &accept_params, + &accept_priv_params.own_priv.inner, + &offer_priv_params.publish_priv.inner, + &offer_priv_params.revoke_priv.inner, + &buffer_tx, + &dest_address, + 0, + FEE_RATE_PER_VB, + ) + .expect("to be able to create and sign the punish transaction"); + + // Offerer and accepter cannot satisfy with only their parameters + assert!(create_and_sign_punish_buffer_transaction( + SECP256K1, + &offer_params, + &accept_params, + &offer_priv_params.own_priv.inner, + &offer_priv_params.publish_priv.inner, + &offer_priv_params.revoke_priv.inner, + &buffer_tx, + &dest_address, + 0, + FEE_RATE_PER_VB, + ) + .is_err()); + + // Offerer and accepter cannot satisfy with only their parameters + assert!(create_and_sign_punish_buffer_transaction( + SECP256K1, + &offer_params, + &accept_params, + &accept_priv_params.own_priv.inner, + &accept_priv_params.publish_priv.inner, + &accept_priv_params.revoke_priv.inner, + &buffer_tx, + &dest_address, + 0, + FEE_RATE_PER_VB, + ) + .is_err()); + } + + #[test] + fn two_parties_sigs_satisfy_buffer_descriptor_test() { + let offer_priv_params = RevokePrivateParams::new(Network::Regtest); + let accept_priv_params = RevokePrivateParams::new(Network::Regtest); + let offer_params = offer_priv_params.public_params(SECP256K1); + let accept_params = accept_priv_params.public_params(SECP256K1); + + let descriptor = buffer_descriptor(&offer_params, &accept_params); + + // Use random signature as it doesn't matter. + let sig = bitcoin::ecdsa::Signature { + signature: secp256k1_zkp::ecdsa::Signature::from_str( + "3045\ + 0221\ + 00f7c3648c390d87578cd79c8016940aa8e3511c4104cb78daa8fb8e429375efc1\ + 0220\ + 531d75c136272f127a5dc14acc0722301cbddc222262934151f140da345af177", + ) + .unwrap(), + sighash_type: EcdsaSighashType::All, + }; + + let satisfier = BTreeMap::from_iter(vec![ + (offer_params.own_pk, sig), + (accept_params.own_pk, sig), + ]); + + descriptor + .satisfy(&mut TxIn::default(), satisfier) + .expect("to be able to satisfy the descriptor"); + } + + #[test] + fn create_and_sign_penalty_from_settle_transaction_test() { + let offer_priv_params = RevokePrivateParams::new(Network::Regtest); + let accept_priv_params = RevokePrivateParams::new(Network::Regtest); + let offer_params = offer_priv_params.public_params(SECP256K1); + let accept_params = accept_priv_params.public_params(SECP256K1); + let dest_address = Address::p2pkh( + &PublicKey::from_private_key( + SECP256K1, + &PrivateKey::new(SecretKey::new(&mut thread_rng()), Network::Regtest), + ), + Network::Regtest, + ); + let payout = Amount::ONE_BTC; + let csv_timelock = 100; + let settle_tx = create_settle_transaction( + &TxIn::default(), + &offer_params, + &accept_params, + payout, + payout, + csv_timelock, + 0, + Amount::from_sat(200020000), + FEE_RATE_PER_VB, + ) + .unwrap(); + + // Offerer can create and sign with accepter revocation and publish secret. + create_and_sign_punish_settle_transaction( + SECP256K1, + &offer_params, + &accept_params, + &offer_priv_params.own_priv.inner, + &accept_priv_params.publish_priv.inner, + &accept_priv_params.revoke_priv.inner, + &settle_tx, + &dest_address, + csv_timelock, + 0, + FEE_RATE_PER_VB, + true, + ) + .expect("to be able to create and sign the punish transaction"); + + // Accepter can create and sign with offerer revocation and publish secret. + create_and_sign_punish_settle_transaction( + SECP256K1, + &offer_params, + &accept_params, + &accept_priv_params.own_priv.inner, + &offer_priv_params.publish_priv.inner, + &offer_priv_params.revoke_priv.inner, + &settle_tx, + &dest_address, + csv_timelock, + 0, + FEE_RATE_PER_VB, + false, + ) + .expect("to be able to create and sign the punish transaction"); + + // Offerer and accepter cannot satisfy with only their parameters + assert!(create_and_sign_punish_settle_transaction( + SECP256K1, + &offer_params, + &accept_params, + &offer_priv_params.own_priv.inner, + &offer_priv_params.publish_priv.inner, + &offer_priv_params.revoke_priv.inner, + &settle_tx, + &dest_address, + csv_timelock, + 0, + FEE_RATE_PER_VB, + true + ) + .is_err()); + + // Offerer and accepter cannot satisfy with only their parameters + assert!(create_and_sign_punish_settle_transaction( + SECP256K1, + &offer_params, + &accept_params, + &accept_priv_params.own_priv.inner, + &accept_priv_params.publish_priv.inner, + &accept_priv_params.revoke_priv.inner, + &settle_tx, + &dest_address, + csv_timelock, + 0, + FEE_RATE_PER_VB, + false + ) + .is_err()); + } + + #[test] + fn one_party_sig_satisfies_settle_descriptor_test() { + let offer_priv_params = RevokePrivateParams::new(Network::Regtest); + let accept_priv_params = RevokePrivateParams::new(Network::Regtest); + let offer_params = offer_priv_params.public_params(SECP256K1); + let accept_params = accept_priv_params.public_params(SECP256K1); + let csv = 100; + + let descriptor = settle_descriptor(&offer_params, &accept_params.own_pk, csv); + + // Use random signature as it doesn't matter. + let sig = bitcoin::ecdsa::Signature { + signature: secp256k1_zkp::ecdsa::Signature::from_str( + "3045\ + 0221\ + 00f7c3648c390d87578cd79c8016940aa8e3511c4104cb78daa8fb8e429375efc1\ + 0220\ + 531d75c136272f127a5dc14acc0722301cbddc222262934151f140da345af177", + ) + .unwrap(), + sighash_type: EcdsaSighashType::All, + }; + + let satisfier = BTreeMap::from_iter(vec![(offer_params.own_pk, sig)]); + + descriptor + .satisfy( + &mut TxIn { + sequence: Sequence(csv + 1), + ..Default::default() + }, + (satisfier, Sequence(csv)), + ) + .expect("to be able to satisfy the descriptor"); + } + + #[test] + fn get_verify_tx_adaptor_signature_test() { + let offer_priv_params = RevokePrivateParams::new(Network::Regtest); + let accept_priv_params = RevokePrivateParams::new(Network::Regtest); + let offer_params = offer_priv_params.public_params(SECP256K1); + let accept_params = accept_priv_params.public_params(SECP256K1); + let total_collateral = Amount::ONE_BTC; + + let descriptor = buffer_descriptor(&offer_params, &accept_params); + + let buffer_tx = + create_buffer_transaction(&TxIn::default(), &descriptor, total_collateral, 0); + + let input_value = total_collateral + Amount::from_sat(10000); + + let adaptor_sec_key = SecretKey::new(&mut thread_rng()); + + let adaptor_sig = get_tx_adaptor_signature( + SECP256K1, + &buffer_tx, + input_value, + &descriptor.script_code().expect("a valid script code"), + &adaptor_sec_key, + &accept_params.publish_pk.inner, + ) + .expect("to be able to create the adaptor sig"); + + verify_tx_adaptor_signature( + SECP256K1, + &buffer_tx, + input_value, + &descriptor.script_code().expect("a valid script code"), + &secp256k1_zkp::PublicKey::from_secret_key(SECP256K1, &adaptor_sec_key), + &accept_params.publish_pk.inner, + &adaptor_sig, + ) + .expect("the signature to be valid"); + } +} diff --git a/dlc/src/dlc_input.rs b/dlc/src/dlc_input.rs new file mode 100644 index 00000000..1c15b7cc --- /dev/null +++ b/dlc/src/dlc_input.rs @@ -0,0 +1,136 @@ +//! Module for working with DLC inputs + +use bitcoin::{Amount, EcdsaSighashType, OutPoint, ScriptBuf, Transaction, Witness}; +use secp256k1_zkp::{ecdsa::Signature, PublicKey, Secp256k1, SecretKey, Signing, Verification}; + +use crate::{util::finalize_sig, Error, TxInputInfo}; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "use-serde", derive(serde::Serialize, serde::Deserialize))] +/// Contains information about a DLC input to be used in a funding transaction. +pub struct DlcInputInfo { + /// The transaction of the funding transaction. + pub fund_tx: Transaction, + /// The output index of the funding transaction. + pub fund_vout: u32, + /// The local funding public key. + pub local_fund_pubkey: PublicKey, + /// The remote funding public key. + pub remote_fund_pubkey: PublicKey, + /// The amount of the funding transaction. + pub fund_amount: Amount, + /// The maximum witness length of the funding transaction. + pub max_witness_len: usize, + /// The serial id of the funding transaction. + pub input_serial_id: u64, + /// The contract id referenced + pub contract_id: [u8; 32], +} + +impl From<&DlcInputInfo> for TxInputInfo { + fn from(val: &DlcInputInfo) -> Self { + TxInputInfo { + outpoint: OutPoint::new(val.fund_tx.compute_txid(), val.fund_vout), + max_witness_len: val.max_witness_len, + redeem_script: ScriptBuf::new(), + serial_id: val.input_serial_id, + } + } +} + +/// Calculate weight of DLC inputs for fee estimation +pub fn get_dlc_inputs_weight(dlc_inputs: &[DlcInputInfo]) -> usize { + dlc_inputs + .iter() + .map(|dlc_input| { + // P2WSH 2-of-2 multisig weight + 36 * 4 + 4 + 4 * 4 + dlc_input.max_witness_len + }) + .sum() +} + +/// Calculate total amount from DLC inputs +pub fn calculate_total_dlc_input_amount(dlc_inputs: &[DlcInputInfo]) -> Amount { + dlc_inputs.iter().map(|input| input.fund_amount).sum() +} + +/// Create the funding script for a DLC input +pub fn create_dlc_input_funding_script(dlc_input: &DlcInputInfo) -> ScriptBuf { + crate::make_funding_redeemscript(&dlc_input.local_fund_pubkey, &dlc_input.remote_fund_pubkey) +} + +/// Create a signature for a DLC funding input +pub fn create_dlc_funding_input_signature( + secp: &Secp256k1, + fund_transaction: &Transaction, + input_index: usize, + dlc_input: &DlcInputInfo, + privkey: &SecretKey, +) -> Result, Error> { + let funding_script = create_dlc_input_funding_script(dlc_input); + let sig_hash_msg = super::util::get_sig_hash_msg( + fund_transaction, + input_index, + &funding_script, + dlc_input.fund_amount, + )?; + let signature = secp.sign_ecdsa_low_r(&sig_hash_msg, privkey); + Ok(finalize_sig(&signature, EcdsaSighashType::All)) +} + +/// Verify a DLC funding input signature +pub fn verify_dlc_funding_input_signature( + secp: &Secp256k1, + fund_transaction: &Transaction, + input_index: usize, + dlc_input: &DlcInputInfo, + signature: Vec, + pubkey: &PublicKey, +) -> Result<(), Error> { + let funding_script = create_dlc_input_funding_script(dlc_input); + + // Parse DER signature instead of compact + let signature = if signature.len() == 64 { + Signature::from_compact(&signature)? + } else { + // Remove sighash type byte and parse DER + let sig_bytes = &signature[..signature.len() - 1]; + Signature::from_der(sig_bytes)? + }; + + super::verify_tx_input_sig( + secp, + &signature, + fund_transaction, + input_index, + &funding_script, + dlc_input.fund_amount, + pubkey, + ) +} + +/// Combine both parties' signatures for a DLC input +pub fn combine_dlc_input_signatures( + dlc_input: &DlcInputInfo, + my_signature: &Vec, + other_signature: &Vec, + my_pubkey: &PublicKey, + other_pubkey: &PublicKey, +) -> Witness { + let funding_script = create_dlc_input_funding_script(dlc_input); + + // Order signatures based on pubkey order + let (first_sig, second_sig) = if my_pubkey <= other_pubkey { + (my_signature, other_signature) + } else { + (other_signature, my_signature) + }; + + let mut witness = Witness::new(); + witness.push([]); + witness.push(first_sig); + witness.push(second_sig); + witness.push(funding_script.to_bytes()); + + witness +} diff --git a/dlc/src/lib.rs b/dlc/src/lib.rs new file mode 100644 index 00000000..422b888f --- /dev/null +++ b/dlc/src/lib.rs @@ -0,0 +1,1716 @@ +//! # Rust DLC Library +//! Library for creating, signing and verifying transactions for the +//! Discreet Log Contract protocol. +//! + +// Coding conventions +#![deny(non_upper_case_globals)] +#![deny(non_camel_case_types)] +#![deny(non_snake_case)] +#![deny(unused_mut)] +#![deny(dead_code)] +#![deny(unused_imports)] +#![deny(missing_docs)] + +#[cfg(not(feature = "std"))] +extern crate alloc; +extern crate bitcoin; +extern crate core; +extern crate miniscript; +extern crate secp256k1_sys; +pub extern crate secp256k1_zkp; +#[cfg(feature = "use-serde")] +extern crate serde; + +use bitcoin::secp256k1::Scalar; +use bitcoin::transaction::Version; +use bitcoin::Amount; +use bitcoin::{ + absolute::LockTime, + blockdata::{ + opcodes, + script::{Builder, Script, ScriptBuf}, + transaction::{OutPoint, Transaction, TxIn, TxOut}, + }, + Sequence, Witness, +}; +use secp256k1_zkp::schnorr::Signature as SchnorrSignature; +use secp256k1_zkp::{ + ecdsa::Signature, EcdsaAdaptorSignature, Message, PublicKey, Secp256k1, SecretKey, + Verification, XOnlyPublicKey, +}; +#[cfg(feature = "use-serde")] +use serde::{Deserialize, Serialize}; +use std::fmt; + +// use crate::dlc_input::calculate_total_dlc_input_amount; + +pub mod channel; +pub mod dlc_input; +pub mod secp_utils; +pub mod util; + +/// Minimum value that can be included in a transaction output. Under this value, +/// outputs are discarded +/// See: https://github.com/discreetlogcontracts/dlcspecs/blob/master/Transactions.md#change-outputs +const DUST_LIMIT: Amount = Amount::from_sat(1000); + +/// The transaction version +/// See: https://github.com/discreetlogcontracts/dlcspecs/blob/master/Transactions.md#funding-transaction +const TX_VERSION: Version = Version::TWO; + +/// The base weight of a fund transaction +/// See: https://github.com/discreetlogcontracts/dlcspecs/blob/master/Transactions.md#fees +const FUND_TX_BASE_WEIGHT: usize = 214; + +/// The weight of a CET excluding payout outputs +/// See: https://github.com/discreetlogcontracts/dlcspecs/blob/master/Transactions.md#fees +const CET_BASE_WEIGHT: usize = 500; + +/// The base weight of a transaction input computed as: (outpoint(36) + sequence(4) + scriptPubKeySize(1)) * 4 +/// See: +const TX_INPUT_BASE_WEIGHT: usize = 164; + +/// The witness size of a P2WPKH input +/// See: +pub const P2WPKH_WITNESS_SIZE: usize = 107; + +macro_rules! checked_add { + ($a: expr, $b: expr) => { + $a.checked_add($b).ok_or(Error::InvalidArgument) + }; + ($a: expr, $b: expr, $c: expr) => { + checked_add!(checked_add!($a, $b)?, $c) + }; + ($a: expr, $b: expr, $c: expr, $d: expr) => { + checked_add!(checked_add!($a, $b, $c)?, $d) + }; +} + +/// Represents the payouts for a unique contract outcome. Offer party represents +/// the initiator of the contract while accept party represents the party +/// accepting the contract. +#[derive(Eq, PartialEq, Debug, Clone)] +#[cfg_attr(feature = "use-serde", derive(Serialize, Deserialize))] +pub struct Payout { + /// Payout for the offering party + pub offer: Amount, + /// Payout for the accepting party + pub accept: Amount, +} + +#[derive(Eq, PartialEq, Debug, Clone)] +/// Representation of a set of contiguous outcomes that share a single payout. +pub struct RangePayout { + /// The start of the range + pub start: usize, + /// The number of outcomes in the range + pub count: usize, + /// The payout associated with all outcomes + pub payout: Payout, +} + +/// Representation of a payout for an enumeration outcome. +#[derive(Clone, Debug)] +#[cfg_attr(feature = "use-serde", derive(Serialize, Deserialize))] +pub struct EnumerationPayout { + /// The outcome value (prior to hashing) + pub outcome: String, + /// The corresponding payout + pub payout: Payout, +} + +/// Contains the necessary transactions for establishing a DLC +#[derive(Clone)] +pub struct DlcTransactions { + /// The fund transaction locking both parties collaterals + pub fund: Transaction, + /// The contract execution transactions for closing the contract on a + /// certain outcome + pub cets: Vec, + /// The refund transaction for returning the collateral for each party in + /// case of an oracle misbehavior + pub refund: Transaction, + + /// The script pubkey of the fund output in the fund transaction + pub funding_script_pubkey: ScriptBuf, +} + +impl DlcTransactions { + /// Get the fund output in the fund transaction + pub fn get_fund_output(&self) -> &TxOut { + let v0_witness_fund_script = self.funding_script_pubkey.to_p2wsh(); + util::get_output_for_script_pubkey(&self.fund, &v0_witness_fund_script) + .unwrap() + .1 + } + + /// Get the fund output in the fund transaction + pub fn get_fund_output_index(&self) -> usize { + let v0_witness_fund_script = self.funding_script_pubkey.to_p2wsh(); + util::get_output_for_script_pubkey(&self.fund, &v0_witness_fund_script) + .unwrap() + .0 + } + + /// Get the outpoint for the fund output in the fund transaction + pub fn get_fund_outpoint(&self) -> OutPoint { + OutPoint { + txid: self.fund.compute_txid(), + vout: self.get_fund_output_index() as u32, + } + } +} + +/// Contains info about a utxo used for funding a DLC contract +#[derive(Clone, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct TxInputInfo { + /// The outpoint for the utxo + pub outpoint: OutPoint, + /// The maximum witness length + pub max_witness_len: usize, + /// The redeem script + pub redeem_script: ScriptBuf, + /// The serial id for the input that will be used for ordering inputs of + /// the fund transaction + pub serial_id: u64, +} + +/// Structure containing oracle information for a single event. +#[derive(Clone)] +pub struct OracleInfo { + /// The public key of the oracle. + pub public_key: XOnlyPublicKey, + /// The nonces that the oracle will use to attest to the event. + pub nonces: Vec, +} + +/// An error code. +#[derive(Debug)] +pub enum Error { + /// Secp256k1 error + Secp256k1(secp256k1_zkp::Error), + /// An error while computing a p2wpkh signature hash + P2wpkh(bitcoin::sighash::P2wpkhError), + /// An invalid argument was provided + InvalidArgument, + /// An error occurred in miniscript + Miniscript(miniscript::Error), + /// Error attempting to do an out of bounds access on the transaction inputs vector. + InputsIndex(bitcoin::transaction::InputsIndexError), +} + +impl From for Error { + fn from(error: secp256k1_zkp::Error) -> Error { + Error::Secp256k1(error) + } +} + +impl From for Error { + fn from(error: secp256k1_zkp::UpstreamError) -> Error { + Error::Secp256k1(secp256k1_zkp::Error::Upstream(error)) + } +} + +impl From for Error { + fn from(error: bitcoin::sighash::P2wpkhError) -> Error { + Error::P2wpkh(error) + } +} + +impl From for Error { + fn from(error: bitcoin::transaction::InputsIndexError) -> Error { + Error::InputsIndex(error) + } +} + +impl From for Error { + fn from(error: miniscript::Error) -> Error { + Error::Miniscript(error) + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::Secp256k1(ref e) => write!(f, "Secp256k1 error: {}", e), + Error::InvalidArgument => write!(f, "Invalid argument"), + Error::P2wpkh(ref e) => write!(f, "Error while computing p2wpkh sighash: {}", e), + Error::InputsIndex(ref e) => write!(f, "Error ordering inputs: {}", e), + Error::Miniscript(_) => write!(f, "Error within miniscript"), + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Secp256k1(e) => Some(e), + Error::P2wpkh(e) => Some(e), + Error::InputsIndex(e) => Some(e), + Error::InvalidArgument => None, + Error::Miniscript(e) => Some(e), + } + } +} + +/// Contains the parameters required for creating DLC transactions for a single +/// party. Specifically these are the common fields between Offer and Accept +/// messages. +#[derive(Clone, Debug)] +#[cfg_attr( + feature = "use-serde", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct PartyParams { + /// The public key for the fund multisig script + pub fund_pubkey: PublicKey, + /// An address to receive change + pub change_script_pubkey: ScriptBuf, + /// Id used to order fund outputs + pub change_serial_id: u64, + /// An address to receive the outcome amount + pub payout_script_pubkey: ScriptBuf, + /// Id used to order CET outputs + pub payout_serial_id: u64, + /// A list of inputs to fund the contract + pub inputs: Vec, + /// A list of dlc inputs to be used + pub dlc_inputs: Vec, + /// The sum of the inputs values. + pub input_amount: Amount, + /// The collateral put in the contract by the party + pub collateral: Amount, +} + +impl PartyParams { + /// Returns the change output for a single party as well as the fees that + /// they are required to pay for the fund transaction and the cet or refund transaction. + /// The change output value already accounts for the required fees. + /// If input amount (sum of all input values) is lower than the sum of the collateral + /// plus the required fees, an error is returned. + pub(crate) fn get_change_output_and_fees( + &self, + total_collateral: Amount, + fee_rate_per_vb: u64, + extra_fee: Amount, + ) -> Result<(TxOut, Amount, Amount), Error> { + let mut inputs_weight: usize = 0; + + // first check if a party does not need to fund the contract if so, then it is zero + if self.collateral == Amount::ZERO { + // We use a zero value output to indicate that the party does not need to fund the contract + let change_output = TxOut { + value: Amount::ZERO, + script_pubkey: self.change_script_pubkey.clone(), + }; + return Ok((change_output, Amount::ZERO, Amount::ZERO)); + } + + inputs_weight += dlc_input::get_dlc_inputs_weight(&self.dlc_inputs); + + for w in &self.inputs { + let script_weight = util::redeem_script_to_script_sig(&w.redeem_script) + .len() + .checked_mul(4) + .ok_or(Error::InvalidArgument)?; + inputs_weight = checked_add!( + inputs_weight, + TX_INPUT_BASE_WEIGHT, + script_weight, + w.max_witness_len + )?; + } + + // Value size + script length var_int + ouput script pubkey size + let change_size = self.change_script_pubkey.len(); + // Change size is scaled by 4 from vBytes to weight units + let change_weight = change_size.checked_mul(4).ok_or(Error::InvalidArgument)?; + + // If the party is funding the whole contract, then the base weight is the full base weight + // otherwise, the base weight (nLocktime, nVersion, ...) is distributed among parties + // independently of inputs contributed + let this_party_fund_base_weight = if self.collateral == total_collateral { + FUND_TX_BASE_WEIGHT + } else { + FUND_TX_BASE_WEIGHT / 2 + }; + + let total_fund_weight = checked_add!( + this_party_fund_base_weight, + inputs_weight, + change_weight, + 36 + )?; + let fund_fee = util::weight_to_fee(total_fund_weight, fee_rate_per_vb)?; + + // If the party is funding the whole contract, then the base weight is the full base weight + // otherwise, the base weight (nLocktime, nVersion, funding input ...) is distributed + // among parties independently of output types + let this_party_cet_base_weight = if self.collateral == total_collateral { + CET_BASE_WEIGHT + } else { + CET_BASE_WEIGHT / 2 + }; + + // size of the payout script pubkey scaled by 4 from vBytes to weight units + let output_spk_weight = self + .payout_script_pubkey + .len() + .checked_mul(4) + .ok_or(Error::InvalidArgument)?; + let total_cet_weight = checked_add!(this_party_cet_base_weight, output_spk_weight)?; + let cet_or_refund_fee = util::weight_to_fee(total_cet_weight, fee_rate_per_vb)?; + + let required_input_funds = + checked_add!(self.collateral, fund_fee, cet_or_refund_fee, extra_fee)?; + if self.input_amount < required_input_funds { + return Err(Error::InvalidArgument); + } + + let change_output = TxOut { + value: self.input_amount - required_input_funds, + script_pubkey: self.change_script_pubkey.clone(), + }; + + Ok((change_output, fund_fee, cet_or_refund_fee)) + } + + fn get_unsigned_tx_inputs_and_serial_ids(&self, sequence: Sequence) -> (Vec, Vec) { + let mut tx_ins = Vec::with_capacity(self.inputs.len()); + let mut serial_ids = Vec::with_capacity(self.inputs.len()); + + for input in &self.inputs { + let tx_in = TxIn { + previous_output: input.outpoint, + script_sig: util::redeem_script_to_script_sig(&input.redeem_script), + sequence, + witness: Witness::new(), + }; + tx_ins.push(tx_in); + serial_ids.push(input.serial_id); + } + + (tx_ins, serial_ids) + } +} + +/// Create the transactions for a DLC contract based on the provided parameters +/// This function is used to create the transactions for a DLC contract when the +/// offer and accept parameters are spliced together. +pub fn create_spliced_dlc_transactions( + offer_params: &PartyParams, + accept_params: &PartyParams, + payouts: &[Payout], + refund_lock_time: u32, + fee_rate_per_vb: u64, + fund_lock_time: u32, + cet_lock_time: u32, + fund_output_serial_id: u64, +) -> Result { + // Create enhanced party parameters that include DLC inputs as regular inputs + let mut enhanced_offer_params = offer_params.clone(); + let mut enhanced_accept_params = accept_params.clone(); + + let offer_dlc_tx_inputs = offer_params + .dlc_inputs + .iter() + .map(|input| input.into()) + .collect::>(); + + let accept_dlc_tx_inputs = accept_params + .dlc_inputs + .iter() + .map(|input| input.into()) + .collect::>(); + + // Add DLC inputs to regular inputs + enhanced_offer_params.inputs.extend(offer_dlc_tx_inputs); + enhanced_accept_params.inputs.extend(accept_dlc_tx_inputs); + + // Calculate total DLC input amounts + // let offer_dlc_amount = calculate_total_dlc_input_amount(&offer_params.dlc_inputs); + // let accept_dlc_amount = calculate_total_dlc_input_amount(&accept_params.dlc_inputs); + + // // Add DLC amounts to input amounts + // enhanced_offer_params.input_amount = enhanced_offer_params + // .input_amount + // .checked_add(offer_dlc_amount) + // .ok_or(Error::InvalidArgument)?; + // enhanced_accept_params.input_amount = enhanced_accept_params + // .input_amount + // .checked_add(accept_dlc_amount) + // .ok_or(Error::InvalidArgument)?; + + // Clear DLC inputs from enhanced params since they're now regular inputs + enhanced_offer_params.dlc_inputs.clear(); + enhanced_accept_params.dlc_inputs.clear(); + + create_dlc_transactions( + &enhanced_offer_params, + &enhanced_accept_params, + payouts, + refund_lock_time, + fee_rate_per_vb, + fund_lock_time, + cet_lock_time, + fund_output_serial_id, + ) +} + +/// Create the transactions for a DLC contract based on the provided parameters +pub fn create_dlc_transactions( + offer_params: &PartyParams, + accept_params: &PartyParams, + payouts: &[Payout], + refund_lock_time: u32, + fee_rate_per_vb: u64, + fund_lock_time: u32, + cet_lock_time: u32, + fund_output_serial_id: u64, +) -> Result { + let (fund_tx, funding_script_pubkey) = create_fund_transaction_with_fees( + offer_params, + accept_params, + fee_rate_per_vb, + fund_lock_time, + fund_output_serial_id, + Amount::ZERO, + )?; + let fund_outpoint = OutPoint { + txid: fund_tx.compute_txid(), + vout: util::get_output_for_script_pubkey(&fund_tx, &funding_script_pubkey.to_p2wsh()) + .expect("to find the funding script pubkey") + .0 as u32, + }; + let (cets, refund_tx) = create_cets_and_refund_tx( + offer_params, + accept_params, + fund_outpoint, + payouts, + refund_lock_time, + cet_lock_time, + None, + )?; + + Ok(DlcTransactions { + fund: fund_tx, + cets, + refund: refund_tx, + funding_script_pubkey, + }) +} + +pub(crate) fn create_fund_transaction_with_fees( + offer_params: &PartyParams, + accept_params: &PartyParams, + fee_rate_per_vb: u64, + fund_lock_time: u32, + fund_output_serial_id: u64, + extra_fee: Amount, +) -> Result<(Transaction, ScriptBuf), Error> { + let total_collateral = checked_add!(offer_params.collateral, accept_params.collateral)?; + + let (offer_change_output, offer_fund_fee, offer_cet_fee) = + offer_params.get_change_output_and_fees(total_collateral, fee_rate_per_vb, extra_fee)?; + let (accept_change_output, accept_fund_fee, accept_cet_fee) = + accept_params.get_change_output_and_fees(total_collateral, fee_rate_per_vb, extra_fee)?; + + let fund_output_value = checked_add!(offer_params.input_amount, accept_params.input_amount)? + - offer_change_output.value + - accept_change_output.value + - offer_fund_fee + - accept_fund_fee + - extra_fee; + + assert_eq!( + total_collateral + offer_cet_fee + accept_cet_fee + extra_fee, + fund_output_value + ); + + assert_eq!( + offer_params.input_amount + accept_params.input_amount, + fund_output_value + + offer_change_output.value + + accept_change_output.value + + offer_fund_fee + + accept_fund_fee + + extra_fee + ); + + let fund_sequence = util::get_sequence(fund_lock_time); + let (offer_tx_ins, offer_inputs_serial_ids) = + offer_params.get_unsigned_tx_inputs_and_serial_ids(fund_sequence); + let (accept_tx_ins, accept_inputs_serial_ids) = + accept_params.get_unsigned_tx_inputs_and_serial_ids(fund_sequence); + + let funding_script_pubkey = + make_funding_redeemscript(&offer_params.fund_pubkey, &accept_params.fund_pubkey); + + let fund_tx = create_funding_transaction( + &funding_script_pubkey, + fund_output_value, + &offer_tx_ins, + &offer_inputs_serial_ids, + &accept_tx_ins, + &accept_inputs_serial_ids, + offer_change_output, + offer_params.change_serial_id, + accept_change_output, + accept_params.change_serial_id, + fund_output_serial_id, + fund_lock_time, + ); + + Ok((fund_tx, funding_script_pubkey)) +} + +pub(crate) fn create_cets_and_refund_tx( + offer_params: &PartyParams, + accept_params: &PartyParams, + prev_outpoint: OutPoint, + payouts: &[Payout], + refund_lock_time: u32, + cet_lock_time: u32, + cet_nsequence: Option, +) -> Result<(Vec, Transaction), Error> { + let total_collateral = checked_add!(offer_params.collateral, accept_params.collateral)?; + + let has_proper_outcomes = payouts.iter().all(|o| { + let total = checked_add!(o.offer, o.accept); + if let Ok(total) = total { + total == total_collateral + } else { + false + } + }); + + if !has_proper_outcomes { + return Err(Error::InvalidArgument); + } + + let cet_input = TxIn { + previous_output: prev_outpoint, + witness: Witness::default(), + script_sig: ScriptBuf::default(), + sequence: cet_nsequence.unwrap_or_else(|| util::get_sequence(cet_lock_time)), + }; + + let cets = create_cets( + &cet_input, + &offer_params.payout_script_pubkey, + offer_params.payout_serial_id, + &accept_params.payout_script_pubkey, + accept_params.payout_serial_id, + payouts, + cet_lock_time, + ); + + let offer_refund_output = TxOut { + value: offer_params.collateral, + script_pubkey: offer_params.payout_script_pubkey.clone(), + }; + + let accept_refund_ouput = TxOut { + value: accept_params.collateral, + script_pubkey: accept_params.payout_script_pubkey.clone(), + }; + + let refund_input = TxIn { + previous_output: prev_outpoint, + witness: Witness::default(), + script_sig: ScriptBuf::default(), + sequence: util::ENABLE_LOCKTIME, + }; + + let refund_tx = create_refund_transaction( + offer_refund_output, + accept_refund_ouput, + refund_input, + refund_lock_time, + ); + + Ok((cets, refund_tx)) +} + +/// Create a contract execution transaction +pub fn create_cet( + offer_output: TxOut, + offer_payout_serial_id: u64, + accept_output: TxOut, + accept_payout_serial_id: u64, + fund_tx_in: &TxIn, + lock_time: u32, +) -> Transaction { + let mut output: Vec = if offer_payout_serial_id < accept_payout_serial_id { + vec![offer_output, accept_output] + } else { + vec![accept_output, offer_output] + }; + + output = util::discard_dust(output, DUST_LIMIT); + + Transaction { + version: TX_VERSION, + lock_time: LockTime::from_consensus(lock_time), + input: vec![fund_tx_in.clone()], + output, + } +} + +/// Create a set of contract execution transaction for each provided outcome +pub fn create_cets( + fund_tx_input: &TxIn, + offer_payout_script_pubkey: &Script, + offer_payout_serial_id: u64, + accept_payout_script_pubkey: &Script, + accept_payout_serial_id: u64, + payouts: &[Payout], + lock_time: u32, +) -> Vec { + let mut txs: Vec = Vec::with_capacity(payouts.len()); + for payout in payouts { + let offer_output = TxOut { + value: payout.offer, + script_pubkey: offer_payout_script_pubkey.to_owned(), + }; + let accept_output = TxOut { + value: payout.accept, + script_pubkey: accept_payout_script_pubkey.to_owned(), + }; + let tx = create_cet( + offer_output, + offer_payout_serial_id, + accept_output, + accept_payout_serial_id, + fund_tx_input, + lock_time, + ); + + txs.push(tx); + } + + txs +} + +/// Create a funding transaction +pub fn create_funding_transaction( + funding_script_pubkey: &Script, + output_amount: Amount, + offer_inputs: &[TxIn], + offer_inputs_serial_ids: &[u64], + accept_inputs: &[TxIn], + accept_inputs_serial_ids: &[u64], + offer_change_output: TxOut, + offer_change_serial_id: u64, + accept_change_output: TxOut, + accept_change_serial_id: u64, + fund_output_serial_id: u64, + lock_time: u32, +) -> Transaction { + let fund_tx_out = TxOut { + value: output_amount, + script_pubkey: funding_script_pubkey.to_p2wsh(), + }; + + let output: Vec = { + let serial_ids = vec![ + fund_output_serial_id, + offer_change_serial_id, + accept_change_serial_id, + ]; + util::discard_dust( + util::order_by_serial_ids( + vec![fund_tx_out, offer_change_output, accept_change_output], + &serial_ids, + ), + DUST_LIMIT, + ) + }; + + let input = util::order_by_serial_ids( + [offer_inputs, accept_inputs].concat(), + &[offer_inputs_serial_ids, accept_inputs_serial_ids].concat(), + ); + + Transaction { + version: TX_VERSION, + lock_time: LockTime::from_consensus(lock_time), + input, + output, + } +} + +/// Create a refund transaction +pub fn create_refund_transaction( + offer_output: TxOut, + accept_output: TxOut, + funding_input: TxIn, + locktime: u32, +) -> Transaction { + let output = util::discard_dust(vec![offer_output, accept_output], DUST_LIMIT); + Transaction { + version: TX_VERSION, + lock_time: LockTime::from_consensus(locktime), + input: vec![funding_input], + output, + } +} + +/// Create the multisig redeem script for the funding output +pub fn make_funding_redeemscript(a: &PublicKey, b: &PublicKey) -> ScriptBuf { + let (first, second) = if a <= b { (a, b) } else { (b, a) }; + + Builder::new() + .push_opcode(opcodes::all::OP_PUSHNUM_2) + .push_slice(first.serialize()) + .push_slice(second.serialize()) + .push_opcode(opcodes::all::OP_PUSHNUM_2) + .push_opcode(opcodes::all::OP_CHECKMULTISIG) + .into_script() +} + +fn get_oracle_sig_point( + secp: &Secp256k1, + oracle_info: &OracleInfo, + msgs: &[Message], +) -> Result { + if oracle_info.nonces.len() < msgs.len() { + return Err(Error::InvalidArgument); + } + + let sig_points: Vec = oracle_info + .nonces + .iter() + .zip(msgs.iter()) + .map(|(nonce, msg)| { + secp_utils::schnorrsig_compute_sig_point(secp, &oracle_info.public_key, nonce, msg) + }) + .collect::, Error>>()?; + Ok(PublicKey::combine_keys( + &sig_points.iter().collect::>(), + )?) +} + +/// Get an adaptor point generated using the given oracle information and messages. +pub fn get_adaptor_point_from_oracle_info( + secp: &Secp256k1, + oracle_infos: &[OracleInfo], + msgs: &[Vec], +) -> Result { + if oracle_infos.is_empty() || msgs.is_empty() { + return Err(Error::InvalidArgument); + } + + let mut oracle_sigpoints = Vec::with_capacity(msgs[0].len()); + for (i, info) in oracle_infos.iter().enumerate() { + oracle_sigpoints.push(get_oracle_sig_point(secp, info, &msgs[i])?); + } + Ok(PublicKey::combine_keys( + &oracle_sigpoints.iter().collect::>(), + )?) +} + +/// Create an adaptor signature for the given cet using the provided adaptor point. +pub fn create_cet_adaptor_sig_from_point( + secp: &secp256k1_zkp::Secp256k1, + cet: &Transaction, + adaptor_point: &PublicKey, + funding_sk: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, +) -> Result { + let sig_hash = util::get_sig_hash_msg(cet, 0, funding_script_pubkey, fund_output_value)?; + + #[cfg(feature = "std")] + let res = EcdsaAdaptorSignature::encrypt(secp, &sig_hash, funding_sk, adaptor_point); + + #[cfg(not(feature = "std"))] + let res = + EcdsaAdaptorSignature::encrypt_no_aux_rand(secp, &sig_hash, funding_sk, adaptor_point); + + Ok(res) +} + +/// Create an adaptor signature for the given cet using the provided oracle infos. +pub fn create_cet_adaptor_sig_from_oracle_info( + secp: &secp256k1_zkp::Secp256k1, + cet: &Transaction, + oracle_infos: &[OracleInfo], + funding_sk: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + msgs: &[Vec], +) -> Result { + let adaptor_point = get_adaptor_point_from_oracle_info(secp, oracle_infos, msgs)?; + create_cet_adaptor_sig_from_point( + secp, + cet, + &adaptor_point, + funding_sk, + funding_script_pubkey, + fund_output_value, + ) +} + +/// Crerate a set of adaptor signatures for the given cet/message pairs. +pub fn create_cet_adaptor_sigs_from_points( + secp: &secp256k1_zkp::Secp256k1, + inputs: &[(&Transaction, &PublicKey)], + funding_sk: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, +) -> Result, Error> { + inputs + .iter() + .map(|(cet, adaptor_point)| { + create_cet_adaptor_sig_from_point( + secp, + cet, + adaptor_point, + funding_sk, + funding_script_pubkey, + fund_output_value, + ) + }) + .collect() +} + +/// Crerate a set of adaptor signatures for the given cet/message pairs. +pub fn create_cet_adaptor_sigs_from_oracle_info( + secp: &secp256k1_zkp::Secp256k1, + cets: &[Transaction], + oracle_infos: &[OracleInfo], + funding_sk: &SecretKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, + msgs: &[Vec>], +) -> Result, Error> { + if msgs.len() != cets.len() { + return Err(Error::InvalidArgument); + } + + cets.iter() + .zip(msgs.iter()) + .map(|(cet, msg)| { + create_cet_adaptor_sig_from_oracle_info( + secp, + cet, + oracle_infos, + funding_sk, + funding_script_pubkey, + fund_output_value, + msg, + ) + }) + .collect() +} + +fn signatures_to_secret(signatures: &[Vec]) -> Result { + let s_values = signatures + .iter() + .flatten() + .map(|x| match secp_utils::schnorrsig_decompose(x) { + Ok(v) => Ok(v.1), + Err(err) => Err(err), + }) + .collect::, Error>>()?; + let secret = SecretKey::from_slice(s_values[0])?; + + let result = s_values.iter().skip(1).fold(secret, |accum, s| { + let sec = SecretKey::from_slice(s).unwrap(); + accum.add_tweak(&Scalar::from(sec)).unwrap() + }); + + Ok(result) +} + +/// Sign the given cet using own private key, adapt the counter party signature +/// and place both signatures and the funding multi sig script pubkey on the +/// witness stack +pub fn sign_cet( + secp: &secp256k1_zkp::Secp256k1, + cet: &mut Transaction, + adaptor_signature: &EcdsaAdaptorSignature, + oracle_signatures: &[Vec], + funding_sk: &SecretKey, + other_pk: &PublicKey, + funding_script_pubkey: &Script, + fund_output_value: Amount, +) -> Result<(), Error> { + let adaptor_secret = signatures_to_secret(oracle_signatures)?; + let adapted_sig = adaptor_signature.decrypt(&adaptor_secret)?; + + util::sign_multi_sig_input( + secp, + cet, + &adapted_sig, + other_pk, + funding_sk, + funding_script_pubkey, + fund_output_value, + 0, + )?; + + Ok(()) +} + +/// Verify that a given adaptor signature for a given cet is valid with respect +/// to an adaptor point. +pub fn verify_cet_adaptor_sig_from_point( + secp: &Secp256k1, + adaptor_sig: &EcdsaAdaptorSignature, + cet: &Transaction, + adaptor_point: &PublicKey, + pubkey: &PublicKey, + funding_script_pubkey: &Script, + total_collateral: Amount, +) -> Result<(), Error> { + let sig_hash = util::get_sig_hash_msg(cet, 0, funding_script_pubkey, total_collateral)?; + adaptor_sig.verify(secp, &sig_hash, pubkey, adaptor_point)?; + Ok(()) +} + +/// Verify that a given adaptor signature for a given cet is valid with respect +/// to an oracle public key, nonce and a given message. +pub fn verify_cet_adaptor_sig_from_oracle_info( + secp: &Secp256k1, + adaptor_sig: &EcdsaAdaptorSignature, + cet: &Transaction, + oracle_infos: &[OracleInfo], + pubkey: &PublicKey, + funding_script_pubkey: &Script, + total_collateral: Amount, + msgs: &[Vec], +) -> Result<(), Error> { + let adaptor_point = get_adaptor_point_from_oracle_info(secp, oracle_infos, msgs)?; + verify_cet_adaptor_sig_from_point( + secp, + adaptor_sig, + cet, + &adaptor_point, + pubkey, + funding_script_pubkey, + total_collateral, + ) +} + +/// Verify a signature for a given transaction input. +pub fn verify_tx_input_sig( + secp: &Secp256k1, + signature: &Signature, + tx: &Transaction, + input_index: usize, + script_pubkey: &Script, + value: Amount, + pk: &PublicKey, +) -> Result<(), Error> { + let sig_hash_msg = util::get_sig_hash_msg(tx, input_index, script_pubkey, value)?; + secp.verify_ecdsa(&sig_hash_msg, signature, pk)?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use bitcoin::blockdata::script::ScriptBuf; + use bitcoin::blockdata::transaction::OutPoint; + use bitcoin::consensus::encode::Encodable; + use bitcoin::hashes::sha256; + use bitcoin::hashes::Hash; + use bitcoin::sighash::EcdsaSighashType; + use bitcoin::{Address, CompressedPublicKey, Network, Txid}; + use secp256k1_zkp::{ + rand::{Rng, RngCore}, + Keypair, PublicKey, Secp256k1, SecretKey, Signing, + }; + use std::fmt::Write; + use std::str::FromStr; + use util; + + fn create_txin_vec(sequence: Sequence) -> Vec { + let mut inputs = Vec::new(); + let txin = TxIn { + previous_output: OutPoint::default(), + script_sig: ScriptBuf::new(), + sequence, + witness: Witness::new(), + }; + inputs.push(txin); + inputs + } + + fn create_multi_party_pub_keys() -> (PublicKey, PublicKey) { + let secp = Secp256k1::new(); + let secret_key = + SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000001") + .unwrap(); + let pk = PublicKey::from_secret_key(&secp, &secret_key); + let pk1 = pk; + + (pk, pk1) + } + + fn create_test_tx_io() -> (TxOut, TxOut, TxIn) { + let offer = TxOut { + value: DUST_LIMIT + Amount::from_sat(1), + script_pubkey: ScriptBuf::new(), + }; + + let accept = TxOut { + value: DUST_LIMIT + Amount::from_sat(2), + script_pubkey: ScriptBuf::new(), + }; + + let funding = TxIn { + previous_output: OutPoint::default(), + script_sig: ScriptBuf::new(), + sequence: Sequence(3), + witness: Witness::new(), + }; + + (offer, accept, funding) + } + + #[test] + fn create_refund_transaction_test() { + let (offer, accept, funding) = create_test_tx_io(); + + let refund_transaction = create_refund_transaction(offer, accept, funding, 0); + assert_eq!(Version::TWO, refund_transaction.version); + assert_eq!(0, refund_transaction.lock_time.to_consensus_u32()); + assert_eq!( + DUST_LIMIT + Amount::from_sat(1), + refund_transaction.output[0].value + ); + assert_eq!( + DUST_LIMIT + Amount::from_sat(2), + refund_transaction.output[1].value + ); + assert_eq!(3, refund_transaction.input[0].sequence.0); + } + + #[test] + fn create_funding_transaction_test() { + let (pk, pk1) = create_multi_party_pub_keys(); + + let offer_inputs = create_txin_vec(Sequence::ZERO); + let accept_inputs = create_txin_vec(Sequence(1)); + + let change = Amount::from_sat(1000); + + let total_collateral = Amount::from_sat(31415); + + let offer_change_output = TxOut { + value: change, + script_pubkey: ScriptBuf::new(), + }; + let accept_change_output = TxOut { + value: change, + script_pubkey: ScriptBuf::new(), + }; + let funding_script_pubkey = make_funding_redeemscript(&pk, &pk1); + + let transaction = create_funding_transaction( + &funding_script_pubkey, + total_collateral, + &offer_inputs, + &[1], + &accept_inputs, + &[2], + offer_change_output, + 0, + accept_change_output, + 1, + 0, + 0, + ); + + assert_eq!(transaction.input[0].sequence.0, 0); + assert_eq!(transaction.input[1].sequence.0, 1); + + assert_eq!(transaction.output[0].value, total_collateral); + assert_eq!(transaction.output[1].value, change); + assert_eq!(transaction.output[2].value, change); + assert_eq!(transaction.output.len(), 3); + } + + #[test] + fn create_funding_transaction_with_outputs_less_than_dust_limit_test() { + let (pk, pk1) = create_multi_party_pub_keys(); + + let offer_inputs = create_txin_vec(Sequence::ZERO); + let accept_inputs = create_txin_vec(Sequence(1)); + + let total_collateral = Amount::from_sat(31415); + let change = Amount::from_sat(999); + + let offer_change_output = TxOut { + value: change, + script_pubkey: ScriptBuf::new(), + }; + let accept_change_output = TxOut { + value: change, + script_pubkey: ScriptBuf::new(), + }; + + let funding_script_pubkey = make_funding_redeemscript(&pk, &pk1); + + let transaction = create_funding_transaction( + &funding_script_pubkey, + total_collateral, + &offer_inputs, + &[1], + &accept_inputs, + &[2], + offer_change_output, + 0, + accept_change_output, + 1, + 0, + 0, + ); + + assert_eq!(transaction.output[0].value, total_collateral); + assert_eq!(transaction.output.len(), 1); + } + + #[test] + fn create_funding_transaction_serialized_test() { + let secp = Secp256k1::new(); + let input_amount = Amount::from_sat(5000000000); + let change = Amount::from_sat(4899999719); + let total_collateral = Amount::from_sat(200000312); + let offer_change_address = + Address::from_str("bcrt1qlgmznucxpdkp5k3ktsct7eh6qrc4tju7ktjukn") + .unwrap() + .assume_checked(); + let accept_change_address = + Address::from_str("bcrt1qvh2dvgjctwh4z5w7sc93u7h4sug0yrdz2lgpqf") + .unwrap() + .assume_checked(); + + let offer_change_output = TxOut { + value: change, + script_pubkey: offer_change_address.script_pubkey(), + }; + + let accept_change_output = TxOut { + value: change, + script_pubkey: accept_change_address.script_pubkey(), + }; + + let offer_input = TxIn { + previous_output: OutPoint { + txid: Txid::from_str( + "83266d6b22a9babf6ee469b88fd0d3a0c690525f7c903aff22ec8ee44214604f", + ) + .unwrap(), + vout: 0, + }, + script_sig: ScriptBuf::new(), + sequence: Sequence(0xffffffff), + witness: Witness::from_slice(&[ScriptBuf::new().to_bytes()]), + }; + + let accept_input = TxIn { + previous_output: OutPoint { + txid: Txid::from_str( + "bc92a22f07ef23c53af343397874b59f5f8c0eb37753af1d1a159a2177d4bb98", + ) + .unwrap(), + vout: 0, + }, + script_sig: ScriptBuf::new(), + sequence: Sequence(0xffffffff), + witness: Witness::from_slice(&[ScriptBuf::new().to_bytes()]), + }; + let offer_fund_sk = + SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000001") + .unwrap(); + let offer_fund_pubkey = PublicKey::from_secret_key(&secp, &offer_fund_sk); + let accept_fund_sk = + SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000002") + .unwrap(); + let accept_fund_pubkey = PublicKey::from_secret_key(&secp, &accept_fund_sk); + let offer_input_sk = + SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000005") + .unwrap(); + let accept_input_sk = + SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000006") + .unwrap(); + + let expected_serialized = "020000000001024F601442E48EEC22FF3A907C5F5290C6A0D3D08FB869E46EBFBAA9226B6D26830000000000FFFFFFFF98BBD477219A151A1DAF5377B30E8C5F9FB574783943F33AC523EF072FA292BC0000000000FFFFFFFF0338C3EB0B000000002200209B984C7BAE3EFDDC3A3F0A20FF81BFE89ED1FE07FF13E562149EE654BED845DBE70F102401000000160014FA3629F3060B6C1A5A365C30BF66FA00F155CB9EE70F10240100000016001465D4D622585BAF5151DE860B1E7AF58710F20DA20247304402207108DE1563AE311F8D4217E1C0C7463386C1A135BE6AF88CBE8D89A3A08D65090220195A2B0140FB9BA83F20CF45AD6EA088BB0C6860C0D4995F1CF1353739CA65A90121022F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4024730440220048716EAEE918AEBCB1BFCFAF7564E78293A7BB0164D9A7844E42FCEB5AE393C022022817D033C9DB19C5BDCADD49B7587A810B6FC2264158A59665ABA8AB298455B012103FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A146029755600000000"; + + let funding_script_pubkey = + make_funding_redeemscript(&offer_fund_pubkey, &accept_fund_pubkey); + + let mut fund_tx = create_funding_transaction( + &funding_script_pubkey, + total_collateral, + &[offer_input], + &[1], + &[accept_input], + &[2], + offer_change_output, + 0, + accept_change_output, + 1, + 0, + 0, + ); + + util::sign_p2wpkh_input( + &secp, + &offer_input_sk, + &mut fund_tx, + 0, + EcdsaSighashType::All, + input_amount, + ) + .expect("to be able to sign the input."); + + util::sign_p2wpkh_input( + &secp, + &accept_input_sk, + &mut fund_tx, + 1, + EcdsaSighashType::All, + input_amount, + ) + .expect("to be able to sign the input."); + + let mut writer = Vec::new(); + fund_tx.consensus_encode(&mut writer).unwrap(); + let mut serialized = String::new(); + for x in writer { + write!(&mut serialized, "{:02X}", x).unwrap(); + } + + assert_eq!(expected_serialized, serialized); + } + + fn get_p2wpkh_script_pubkey( + secp: &Secp256k1, + rng: &mut R, + ) -> ScriptBuf { + let sk = bitcoin::PrivateKey { + inner: SecretKey::new(rng), + network: Network::Testnet.into(), + compressed: true, + }; + let pk = CompressedPublicKey::from_private_key(secp, &sk).unwrap(); + Address::p2wpkh(&pk, Network::Testnet).script_pubkey() + } + + fn get_party_params( + input_amount: Amount, + collateral: Amount, + serial_id: Option, + ) -> (PartyParams, SecretKey) { + let secp = Secp256k1::new(); + let mut rng = secp256k1_zkp::rand::thread_rng(); + let fund_privkey = SecretKey::new(&mut rng); + let serial_id = serial_id.unwrap_or(1); + ( + PartyParams { + fund_pubkey: PublicKey::from_secret_key(&secp, &fund_privkey), + change_script_pubkey: get_p2wpkh_script_pubkey(&secp, &mut rng), + change_serial_id: serial_id, + payout_script_pubkey: get_p2wpkh_script_pubkey(&secp, &mut rng), + payout_serial_id: serial_id, + input_amount, + collateral, + inputs: vec![TxInputInfo { + max_witness_len: 108, + redeem_script: ScriptBuf::new(), + outpoint: OutPoint { + txid: Txid::from_str( + "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456", + ) + .unwrap(), + vout: serial_id as u32, + }, + serial_id, + }], + dlc_inputs: vec![], + }, + fund_privkey, + ) + } + + fn payouts() -> Vec { + vec![ + Payout { + offer: Amount::from_sat(200_000_000), + accept: Amount::ZERO, + }, + Payout { + offer: Amount::ZERO, + accept: Amount::from_sat(200_000_000), + }, + ] + } + + #[test] + fn get_change_output_and_fees_no_inputs_no_funding() { + let (party_params, _) = get_party_params(Amount::ZERO, Amount::ZERO, None); + + let total_collateral = Amount::ONE_BTC; + + let (change_out, fund_fee, cet_fee) = party_params + .get_change_output_and_fees(total_collateral, 4, Amount::ZERO) + .unwrap(); + + assert_eq!(change_out.value, Amount::ZERO); + assert_eq!(fund_fee, Amount::ZERO); + assert_eq!(cet_fee, Amount::ZERO); + } + + #[test] + fn get_change_output_and_fees_single_funded_vs_dual_funded() { + let (party_params_single_funded, _) = + get_party_params(Amount::from_sat(150_000_000), Amount::ONE_BTC, None); + + let total_collateral = Amount::ONE_BTC; + + let (change_out_single_funded, fund_fee_single_funded, cet_fee_single_funded) = + party_params_single_funded + .get_change_output_and_fees(total_collateral, 4, Amount::ZERO) + .unwrap(); + + let (party_params_dual_funded, _) = + get_party_params(Amount::from_sat(150_000_000), Amount::ONE_BTC, None); + let total_collateral = Amount::ONE_BTC + Amount::ONE_BTC; + + let (change_out_dual_funded, fund_fee_dual_funded, cet_fee_dual_funded) = + party_params_dual_funded + .get_change_output_and_fees(total_collateral, 4, Amount::ZERO) + .unwrap(); + + assert!(change_out_single_funded.value < change_out_dual_funded.value); + assert!(fund_fee_single_funded > fund_fee_dual_funded); + assert!(cet_fee_single_funded > cet_fee_dual_funded); + } + + #[test] + fn get_change_output_and_fees_enough_funds() { + // Arrange + let (party_params, _) = + get_party_params(Amount::from_sat(100000), Amount::from_sat(10000), None); + + // Act + let total_collateral = Amount::from_sat(100001); + let (change_out, fund_fee, cet_fee) = party_params + .get_change_output_and_fees(total_collateral, 4, Amount::ZERO) + .unwrap(); + + // Assert + assert!( + change_out.value > Amount::ZERO && fund_fee > Amount::ZERO && cet_fee > Amount::ZERO + ); + } + + #[test] + fn get_change_output_and_fees_not_enough_funds() { + // Arrange + let (party_params, _) = + get_party_params(Amount::from_sat(100000), Amount::from_sat(100000), None); + + let total_collateral = Amount::from_sat(100001); + // Act + let res = party_params.get_change_output_and_fees(total_collateral, 4, Amount::ZERO); + + // Assert + assert!(res.is_err()); + } + + #[test] + fn create_dlc_transactions_no_error() { + // Arrange + let (offer_party_params, _) = get_party_params( + Amount::from_sat(1000000000), + Amount::from_sat(100000000), + None, + ); + let (accept_party_params, _) = get_party_params( + Amount::from_sat(1000000000), + Amount::from_sat(100000000), + None, + ); + + // Act + let dlc_txs = create_dlc_transactions( + &offer_party_params, + &accept_party_params, + &payouts(), + 100, + 4, + 10, + 10, + 0, + ) + .unwrap(); + + // Assert + assert_eq!(10, dlc_txs.fund.lock_time.to_consensus_u32()); + assert_eq!(100, dlc_txs.refund.lock_time.to_consensus_u32()); + assert!(dlc_txs + .cets + .iter() + .all(|x| x.lock_time.to_consensus_u32() == 10)); + } + + #[test] + fn create_cet_adaptor_sig_is_valid() { + // Arrange + let secp = Secp256k1::new(); + let mut rng = secp256k1_zkp::rand::thread_rng(); + let (offer_party_params, offer_fund_sk) = get_party_params( + Amount::from_sat(1000000000), + Amount::from_sat(100000000), + None, + ); + let (accept_party_params, accept_fund_sk) = get_party_params( + Amount::from_sat(1000000000), + Amount::from_sat(100000000), + None, + ); + + let dlc_txs = create_dlc_transactions( + &offer_party_params, + &accept_party_params, + &payouts(), + 100, + 4, + 10, + 10, + 0, + ) + .unwrap(); + + let cets = dlc_txs.cets; + const NB_ORACLES: usize = 3; + const NB_OUTCOMES: usize = 2; + const NB_DIGITS: usize = 20; + let mut oracle_infos: Vec = Vec::with_capacity(NB_ORACLES); + let mut oracle_sks: Vec = Vec::with_capacity(NB_ORACLES); + let mut oracle_sk_nonce: Vec> = Vec::with_capacity(NB_ORACLES); + let mut oracle_sigs: Vec> = Vec::with_capacity(NB_ORACLES); + let messages: Vec>> = (0..NB_OUTCOMES) + .map(|x| { + (0..NB_ORACLES) + .map(|y| { + (0..NB_DIGITS) + .map(|z| { + let message = &[(x + y + z) as u8]; + let hash = sha256::Hash::hash(message).to_byte_array(); + Message::from_digest(hash) + }) + .collect() + }) + .collect() + }) + .collect(); + + for i in 0..NB_ORACLES { + let oracle_kp = Keypair::new(&secp, &mut rng); + let oracle_pubkey = oracle_kp.x_only_public_key().0; + let mut nonces: Vec = Vec::with_capacity(NB_DIGITS); + let mut sk_nonces: Vec<[u8; 32]> = Vec::with_capacity(NB_DIGITS); + oracle_sigs.push(Vec::with_capacity(NB_DIGITS)); + for j in 0..NB_DIGITS { + let mut sk_nonce = [0u8; 32]; + rng.fill_bytes(&mut sk_nonce); + let oracle_r_kp = Keypair::from_seckey_slice(&secp, &sk_nonce).unwrap(); + let nonce = XOnlyPublicKey::from_keypair(&oracle_r_kp).0; + let sig = secp_utils::schnorrsig_sign_with_nonce( + &secp, + &messages[0][i][j], + &oracle_kp, + &sk_nonce, + ); + oracle_sigs[i].push(sig); + nonces.push(nonce); + sk_nonces.push(sk_nonce); + } + oracle_infos.push(OracleInfo { + public_key: oracle_pubkey, + nonces, + }); + oracle_sk_nonce.push(sk_nonces); + oracle_sks.push(oracle_kp); + } + + let funding_script_pubkey = make_funding_redeemscript( + &offer_party_params.fund_pubkey, + &accept_party_params.fund_pubkey, + ); + let fund_output_value = dlc_txs.fund.output[0].value; + + // Act + let cet_sigs = create_cet_adaptor_sigs_from_oracle_info( + &secp, + &cets, + &oracle_infos, + &offer_fund_sk, + &funding_script_pubkey, + fund_output_value, + &messages, + ) + .unwrap(); + + let sign_res = sign_cet( + &secp, + &mut cets[0].clone(), + &cet_sigs[0], + &oracle_sigs, + &accept_fund_sk, + &offer_party_params.fund_pubkey, + &funding_script_pubkey, + fund_output_value, + ); + + let adaptor_secret = signatures_to_secret(&oracle_sigs).unwrap(); + let adapted_sig = cet_sigs[0].decrypt(&adaptor_secret).unwrap(); + + // Assert + assert!(cet_sigs + .iter() + .enumerate() + .all(|(i, x)| verify_cet_adaptor_sig_from_oracle_info( + &secp, + x, + &cets[i], + &oracle_infos, + &offer_party_params.fund_pubkey, + &funding_script_pubkey, + fund_output_value, + &messages[i], + ) + .is_ok())); + sign_res.expect("Error signing CET"); + verify_tx_input_sig( + &secp, + &adapted_sig, + &cets[0], + 0, + &funding_script_pubkey, + fund_output_value, + &offer_party_params.fund_pubkey, + ) + .expect("Invalid decrypted adaptor signature"); + } + + #[test] + fn input_output_ordering_test() { + struct OrderingCase { + serials: [u64; 3], + expected_input_order: [usize; 2], + expected_fund_output_order: [usize; 3], + expected_payout_order: [usize; 2], + } + + let cases = vec![ + OrderingCase { + serials: [0, 1, 2], + expected_input_order: [0, 1], + expected_fund_output_order: [0, 1, 2], + expected_payout_order: [0, 1], + }, + OrderingCase { + serials: [1, 0, 2], + expected_input_order: [0, 1], + expected_fund_output_order: [1, 0, 2], + expected_payout_order: [0, 1], + }, + OrderingCase { + serials: [2, 0, 1], + expected_input_order: [0, 1], + expected_fund_output_order: [2, 0, 1], + expected_payout_order: [0, 1], + }, + OrderingCase { + serials: [2, 1, 0], + expected_input_order: [1, 0], + expected_fund_output_order: [2, 1, 0], + expected_payout_order: [1, 0], + }, + ]; + + for case in cases { + let (offer_party_params, _) = get_party_params( + Amount::from_sat(1000000000), + Amount::from_sat(100000000), + Some(case.serials[1]), + ); + let (accept_party_params, _) = get_party_params( + Amount::from_sat(1000000000), + Amount::from_sat(100000000), + Some(case.serials[2]), + ); + + let dlc_txs = create_dlc_transactions( + &offer_party_params, + &accept_party_params, + &[Payout { + offer: Amount::from_sat(100000000), + accept: Amount::from_sat(100000000), + }], + 100, + 4, + 10, + 10, + case.serials[0], + ) + .unwrap(); + + // Check that fund inputs are in correct order + assert!( + dlc_txs.fund.input[case.expected_input_order[0]].previous_output + == offer_party_params.inputs[0].outpoint + ); + assert!( + dlc_txs.fund.input[case.expected_input_order[1]].previous_output + == accept_party_params.inputs[0].outpoint + ); + + // Check that fund output are in correct order + assert!( + dlc_txs.fund.output[case.expected_fund_output_order[0]].script_pubkey + == dlc_txs.funding_script_pubkey.to_p2wsh() + ); + assert!( + dlc_txs.fund.output[case.expected_fund_output_order[1]].script_pubkey + == offer_party_params.change_script_pubkey + ); + assert!( + dlc_txs.fund.output[case.expected_fund_output_order[2]].script_pubkey + == accept_party_params.change_script_pubkey + ); + + // Check payout output ordering + assert!( + dlc_txs.cets[0].output[case.expected_payout_order[0]].script_pubkey + == offer_party_params.payout_script_pubkey + ); + assert!( + dlc_txs.cets[0].output[case.expected_payout_order[1]].script_pubkey + == accept_party_params.payout_script_pubkey + ); + + crate::util::get_output_for_script_pubkey( + &dlc_txs.fund, + &dlc_txs.funding_script_pubkey.to_p2wsh(), + ) + .expect("Could not find fund output"); + } + } +} diff --git a/dlc/src/secp_utils.rs b/dlc/src/secp_utils.rs new file mode 100644 index 00000000..bbb69f79 --- /dev/null +++ b/dlc/src/secp_utils.rs @@ -0,0 +1,109 @@ +//! Crypto utilities providing necessary DLC specific functions not available in +//! rust-secp256k1 or rust-secp256k1-zkp. + +use crate::Error; +use bitcoin::hashes::{sha256t_hash_newtype, Hash}; +use core::ptr; +use secp256k1_sys::{ + types::{c_int, c_uchar, c_void, size_t}, + CPtr, SchnorrSigExtraParams, +}; +use secp256k1_zkp::{ + schnorr::Signature as SchnorrSignature, Keypair, Message, PublicKey, Scalar, Secp256k1, + Signing, Verification, XOnlyPublicKey, +}; + +const BIP340_MIDSTATE: [u8; 32] = [ + 0x9c, 0xec, 0xba, 0x11, 0x23, 0x92, 0x53, 0x81, 0x11, 0x67, 0x91, 0x12, 0xd1, 0x62, 0x7e, 0x0f, + 0x97, 0xc8, 0x75, 0x50, 0x00, 0x3c, 0xc7, 0x65, 0x90, 0xf6, 0x11, 0x64, 0x33, 0xe9, 0xb6, 0x6a, +]; + +sha256t_hash_newtype! { + /// BIP340 Hash Tag + pub struct BIP340HashTag = raw(BIP340_MIDSTATE, 64); + + /// BIP340 Hash + #[hash_newtype(backward)] + pub struct BIP340Hash(_); +} + +/// Create a Schnorr signature using the provided nonce instead of generating one. +pub fn schnorrsig_sign_with_nonce( + secp: &Secp256k1, + msg: &Message, + keypair: &Keypair, + nonce: &[u8; 32], +) -> SchnorrSignature { + unsafe { + let mut sig = [0u8; secp256k1_zkp::constants::SCHNORR_SIGNATURE_SIZE]; + let extra_params = + SchnorrSigExtraParams::new(Some(constant_nonce_fn), nonce.as_c_ptr() as *const c_void); + assert_eq!( + 1, + secp256k1_sys::secp256k1_schnorrsig_sign_custom( + secp.ctx().as_ref(), + sig.as_mut_c_ptr(), + msg.as_c_ptr(), + 32_usize, + keypair.as_c_ptr(), + &extra_params, + ) + ); + + SchnorrSignature::from_slice(&sig).unwrap() + } +} + +/// Compute a signature point for the given public key, nonce and message. +pub fn schnorrsig_compute_sig_point( + secp: &Secp256k1, + pubkey: &XOnlyPublicKey, + nonce: &XOnlyPublicKey, + message: &Message, +) -> Result { + let hash = create_schnorr_hash(message, nonce, pubkey); + let pk = schnorr_pubkey_to_pubkey(pubkey)?; + let scalar = Scalar::from_be_bytes(hash).unwrap(); + let tweaked = pk.mul_tweak(secp, &scalar)?; + let npk = schnorr_pubkey_to_pubkey(nonce)?; + Ok(npk.combine(&tweaked)?) +} + +/// Decompose a bip340 signature into a nonce and a secret key (as byte array) +pub fn schnorrsig_decompose( + signature: &SchnorrSignature, +) -> Result<(XOnlyPublicKey, &[u8]), Error> { + let bytes = signature.as_ref(); + Ok((XOnlyPublicKey::from_slice(&bytes[0..32])?, &bytes[32..64])) +} + +extern "C" fn constant_nonce_fn( + nonce32: *mut c_uchar, + _msg32: *const c_uchar, + _msg_len: size_t, + _key32: *const c_uchar, + _xonly_pk32: *const c_uchar, + _algo16: *const c_uchar, + _algo_len: size_t, + data: *mut c_void, +) -> c_int { + unsafe { + ptr::copy_nonoverlapping(data as *const c_uchar, nonce32, 32); + } + 1 +} + +fn create_schnorr_hash(msg: &Message, nonce: &XOnlyPublicKey, pubkey: &XOnlyPublicKey) -> [u8; 32] { + let mut buf = Vec::::new(); + buf.extend(nonce.serialize()); + buf.extend(pubkey.serialize()); + buf.extend(msg.as_ref().to_vec()); + BIP340Hash::hash(&buf).to_byte_array() +} + +fn schnorr_pubkey_to_pubkey(schnorr_pubkey: &XOnlyPublicKey) -> Result { + let mut buf = Vec::::with_capacity(33); + buf.push(0x02); + buf.extend(schnorr_pubkey.serialize()); + Ok(PublicKey::from_slice(&buf)?) +} diff --git a/dlc/src/util.rs b/dlc/src/util.rs new file mode 100644 index 00000000..48e07548 --- /dev/null +++ b/dlc/src/util.rs @@ -0,0 +1,258 @@ +//! Utility functions not uniquely related to DLC + +use bitcoin::sighash::SighashCache; +use bitcoin::{sighash::EcdsaSighashType, Script, Transaction, TxOut}; +use bitcoin::{Amount, ScriptBuf, Sequence, Witness}; +use bitcoin::{PubkeyHash, WitnessProgram, WitnessVersion}; +use secp256k1_zkp::{ecdsa::Signature, Message, PublicKey, Secp256k1, SecretKey, Signing}; + +use crate::Error; + +// Setting the nSequence for every input of a transaction to this value disables +// both RBF and nLockTime usage. +pub(crate) const DISABLE_LOCKTIME: Sequence = Sequence(0xffffffff); +// Setting the nSequence for every input of a transaction to this value disables +// RBF but enables nLockTime usage. +pub(crate) const ENABLE_LOCKTIME: Sequence = Sequence(0xfffffffe); + +/// Get a BIP143 (https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki) +/// signature hash with sighash all flag for a segwit transaction input as +/// a Message instance +pub(crate) fn get_sig_hash_msg( + tx: &Transaction, + input_index: usize, + script_pubkey: &Script, + value: Amount, +) -> Result { + let sig_hash = SighashCache::new(tx).p2wsh_signature_hash( + input_index, + script_pubkey, + value, + EcdsaSighashType::All, + )?; + + Ok(Message::from_digest_slice(sig_hash.as_ref()).unwrap()) +} + +/// Convert a raw signature to DER encoded and append the sighash type, to use +/// a signature in a signature script +pub(crate) fn finalize_sig(sig: &Signature, sig_hash_type: EcdsaSighashType) -> Vec { + [ + sig.serialize_der().as_ref(), + &[sig_hash_type.to_u32() as u8], + ] + .concat() +} + +/// Generate a signature for a given transaction input using the given secret key. +pub fn get_raw_sig_for_tx_input( + secp: &Secp256k1, + tx: &Transaction, + input_index: usize, + script_pubkey: &Script, + value: Amount, + sk: &SecretKey, +) -> Result { + let sig_hash_msg = get_sig_hash_msg(tx, input_index, script_pubkey, value)?; + Ok(secp.sign_ecdsa_low_r(&sig_hash_msg, sk)) +} + +/// Returns a DER encoded signature with appended sighash for the specified input +/// in the provided transaction (assumes a segwit input) +pub fn get_sig_for_tx_input( + secp: &Secp256k1, + tx: &Transaction, + input_index: usize, + script_pubkey: &Script, + value: Amount, + sig_hash_type: EcdsaSighashType, + sk: &SecretKey, +) -> Result, Error> { + let sig = get_raw_sig_for_tx_input(secp, tx, input_index, script_pubkey, value, sk)?; + Ok(finalize_sig(&sig, sig_hash_type)) +} + +/// Returns a DER encoded signature with apended sighash for the specified P2WPKH input. +pub fn get_sig_for_p2wpkh_input( + secp: &Secp256k1, + sk: &SecretKey, + tx: &Transaction, + input_index: usize, + value: Amount, + sig_hash_type: EcdsaSighashType, +) -> Result, Error> { + let script_pubkey = get_pkh_script_pubkey_from_sk(secp, sk); + get_sig_for_tx_input( + secp, + tx, + input_index, + &script_pubkey, + value, + sig_hash_type, + sk, + ) +} + +/// Returns the fee for the given weight at given fee rate. +pub fn weight_to_fee(weight: usize, fee_rate: u64) -> Result { + let amount = (f64::ceil((weight as f64) / 4.0) as u64) + .checked_mul(fee_rate) + .ok_or(Error::InvalidArgument)?; + Ok(Amount::from_sat(amount)) +} + +/// Return the common base fee for a DLC for the given fee rate. +pub fn get_common_fee(fee_rate: u64) -> Result { + let base_weight = crate::FUND_TX_BASE_WEIGHT + crate::CET_BASE_WEIGHT; + weight_to_fee(base_weight, fee_rate) +} + +fn get_pkh_script_pubkey_from_sk(secp: &Secp256k1, sk: &SecretKey) -> ScriptBuf { + use bitcoin::hashes::*; + let pk = bitcoin::PublicKey { + compressed: true, + inner: PublicKey::from_secret_key(secp, sk), + }; + let mut hash_engine = PubkeyHash::engine(); + + pk.write_into(&mut hash_engine) + .expect("Error writing hash."); + let pk = PubkeyHash::from_engine(hash_engine); + + ScriptBuf::new_p2pkh(&pk) +} + +/// Create a signature for a p2wpkh transaction input using the provided secret key +/// and places the signature and associated public key on the witness stack. +pub fn sign_p2wpkh_input( + secp: &Secp256k1, + sk: &SecretKey, + tx: &mut Transaction, + input_index: usize, + sig_hash_type: EcdsaSighashType, + value: Amount, +) -> Result<(), Error> { + tx.input[input_index].witness = + get_witness_for_p2wpkh_input(secp, sk, tx, input_index, sig_hash_type, value)?; + Ok(()) +} + +/// Generates the witness data for a P2WPKH input using the provided secret key. +pub fn get_witness_for_p2wpkh_input( + secp: &Secp256k1, + sk: &SecretKey, + tx: &Transaction, + input_index: usize, + sig_hash_type: EcdsaSighashType, + value: Amount, +) -> Result { + let full_sig = get_sig_for_p2wpkh_input(secp, sk, tx, input_index, value, sig_hash_type)?; + Ok(Witness::from_slice(&[ + full_sig, + PublicKey::from_secret_key(secp, sk).serialize().to_vec(), + ])) +} + +/// Generates a signature for a given p2wsh transaction input using the given secret +/// key and info, and places the generated and provided signatures on the input's +/// witness stack, ordering the signatures based on the ordering of the associated +/// public keys. +pub fn sign_multi_sig_input( + secp: &Secp256k1, + transaction: &mut Transaction, + other_sig: &Signature, + other_pk: &PublicKey, + sk: &SecretKey, + script_pubkey: &Script, + input_value: Amount, + input_index: usize, +) -> Result<(), Error> { + let own_sig = get_sig_for_tx_input( + secp, + transaction, + input_index, + script_pubkey, + input_value, + EcdsaSighashType::All, + sk, + )?; + + let own_pk = &PublicKey::from_secret_key(secp, sk); + + let other_finalized_sig = finalize_sig(other_sig, EcdsaSighashType::All); + + transaction.input[input_index].witness = if own_pk < other_pk { + Witness::from_slice(&[ + Vec::new(), + own_sig, + other_finalized_sig, + script_pubkey.to_bytes(), + ]) + } else { + Witness::from_slice(&[ + Vec::new(), + other_finalized_sig, + own_sig, + script_pubkey.to_bytes(), + ]) + }; + + Ok(()) +} + +/// Transforms a redeem script for a p2sh-p2w* output to a script signature. +pub(crate) fn redeem_script_to_script_sig(redeem: &Script) -> ScriptBuf { + match redeem.len() { + 0 => ScriptBuf::new(), + _ => { + let bytes = redeem.as_bytes(); + ScriptBuf::new_witness_program(&WitnessProgram::new(WitnessVersion::V0, bytes).unwrap()) + } + } +} + +/// Sorts the given inputs in following the order of the ids. +pub(crate) fn order_by_serial_ids(inputs: Vec, ids: &[u64]) -> Vec { + debug_assert!(inputs.len() == ids.len()); + let mut combined: Vec<(&u64, T)> = ids.iter().zip(inputs).collect(); + combined.sort_by(|a, b| a.0.partial_cmp(b.0).unwrap()); + combined.into_iter().map(|x| x.1).collect() +} + +/// Get the vout and TxOut of the first output with a matching `script_pubkey` +/// if any. +pub fn get_output_for_script_pubkey<'a>( + tx: &'a Transaction, + script_pubkey: &Script, +) -> Option<(usize, &'a TxOut)> { + tx.output + .iter() + .enumerate() + .find(|(_, x)| &x.script_pubkey == script_pubkey) +} + +/// Filters the outputs that have a value lower than the given `dust_limit`. +pub(crate) fn discard_dust(txs: Vec, dust_limit: Amount) -> Vec { + txs.into_iter().filter(|x| x.value >= dust_limit).collect() +} + +pub(crate) fn get_sequence(lock_time: u32) -> Sequence { + if lock_time == 0 { + DISABLE_LOCKTIME + } else { + ENABLE_LOCKTIME + } +} + +pub(crate) fn compute_var_int_prefix_size(len: usize) -> usize { + bitcoin::VarInt(len as u64).size() +} + +/// Validate that the fee rate is not too high +pub fn validate_fee_rate(fee_rate_per_vb: u64) -> Result<(), Error> { + if fee_rate_per_vb > 25 * 250 { + return Err(Error::InvalidArgument); + } + + Ok(()) +} diff --git a/payouts/Cargo.toml b/payouts/Cargo.toml index 666e4b22..c387e05e 100644 --- a/payouts/Cargo.toml +++ b/payouts/Cargo.toml @@ -9,16 +9,9 @@ edition = "2021" [dependencies] ddk-manager = { version = "0.7.5", path = "../ddk-manager", features = ["use-serde"] } - -# dlc = { version = "0.7.1", features = ["use-serde"] } -# dlc-messages = { version = "0.7.1", features = ["use-serde"] } -# dlc-trie = { version = "0.7.1", features = ["use-serde"] } -# dlc = { path = "../../rust-dlc/dlc", features = ["use-serde"] } -# dlc-messages = { path = "../../rust-dlc/dlc-messages", features = ["use-serde"] } -# dlc-trie = { path = "../../rust-dlc/dlc-trie", features = ["use-serde"] } -dlc = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } -dlc-messages = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = [ "use-serde"] } -dlc-trie = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } +dlc = { path = "../dlc", features = ["use-serde"] } +dlc-messages = { path = "../dlc-messages", features = ["use-serde"] } +dlc-trie = { path = "../dlc-trie", features = ["use-serde"] } bitcoin = "0.32.2" serde = { version = "1.0.209", features = ["derive"] } From 79ba55c5836a8d28b381f1687f7cb056d649b537 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Mon, 28 Jul 2025 17:12:45 -0400 Subject: [PATCH 2/9] feat: splice DLC to ddk-manager --- .github/workflows/rust.yml | 2 +- ddk-manager/Cargo.toml | 12 +- ddk-manager/benches/benchmarks.rs | 2 + ddk-manager/src/channel/offered_channel.rs | 4 +- ddk-manager/src/channel_updater.rs | 57 ++- ddk-manager/src/contract/accepted_contract.rs | 9 +- ddk-manager/src/contract/offered_contract.rs | 3 + ddk-manager/src/contract/signed_contract.rs | 34 ++ ddk-manager/src/contract_updater.rs | 160 +++++-- ddk-manager/src/conversion_utils.rs | 7 +- ddk-manager/src/dlc_input.rs | 64 +++ ddk-manager/src/lib.rs | 1 + ddk-manager/src/manager.rs | 157 +++++- ddk-manager/src/utils.rs | 56 ++- ...ffer_enum_collateral_not_equal_payout.json | 90 +--- .../offer_enum_missing_payout.json | 90 +--- .../offer_enum_oracle_with_diff_payout.json | 89 +--- .../offer_numerical_bad_first_payout.json | 73 +-- .../offer_numerical_bad_last_payout.json | 73 +-- ...numerical_collateral_less_than_payout.json | 73 +-- ...fer_numerical_empty_rounding_interval.json | 73 +-- ...r_numerical_invalid_rounding_interval.json | 73 +-- .../offer_numerical_non_continuous.json | 73 +-- ddk-manager/tests/manager_execution_tests.rs | 303 ++++++++++-- ddk-manager/tests/splice_execution_tests.rs | 452 ++++++++++++++++++ ddk-manager/tests/test_utils.rs | 237 ++++++++- 26 files changed, 1504 insertions(+), 763 deletions(-) create mode 100644 ddk-manager/src/dlc_input.rs create mode 100644 ddk-manager/tests/splice_execution_tests.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index fe7ee6a3..1aca5cac 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -159,6 +159,6 @@ jobs: chmod +x ./testconfig/scripts/wait_for_electrs.sh ./testconfig/scripts/wait_for_electrs.sh - name: Run test - run: RUST_BACKTRACE=1 ${{ matrix.tests }} --ignored + run: RUST_BACKTRACE=1 RUST_MIN_STACK=4194304 ${{ matrix.tests }} --ignored - name: Stop bitcoin node run: docker compose down -v diff --git a/ddk-manager/Cargo.toml b/ddk-manager/Cargo.toml index 6dbc94c6..8f93485d 100644 --- a/ddk-manager/Cargo.toml +++ b/ddk-manager/Cargo.toml @@ -19,15 +19,9 @@ use-serde = ["serde", "dlc/use-serde", "dlc-messages/use-serde", "dlc-trie/use-s async-trait = "0.1.50" bitcoin = { version = "0.32.2", default-features = false } -# dlc = { version = "0.7.1", features = ["use-serde"] } -# dlc-messages = { version = "0.7.1", features = [ "use-serde"] } -# dlc-trie = { version = "0.7.1", features = ["use-serde"] } -# dlc = { path = "../../rust-dlc/dlc", features = ["use-serde"] } -# dlc-messages = { path = "../../rust-dlc/dlc-messages", features = [ "use-serde"] } -# dlc-trie = { path = "../../rust-dlc/dlc-trie", features = ["use-serde"] } -dlc = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } -dlc-messages = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = [ "use-serde"] } -dlc-trie = { git = "https://github.com/bennyhodl/rust-dlc", branch = "single-funded-dlc", features = ["use-serde"] } +dlc = { path = "../dlc", features = ["use-serde"] } +dlc-messages = { path = "../dlc-messages", features = [ "use-serde"] } +dlc-trie = { path = "../dlc-trie", features = ["use-serde"] } futures = "0.3.31" hex = { package = "hex-conservative", version = "0.1" } diff --git a/ddk-manager/benches/benchmarks.rs b/ddk-manager/benches/benchmarks.rs index 08328a33..2ffae215 100644 --- a/ddk-manager/benches/benchmarks.rs +++ b/ddk-manager/benches/benchmarks.rs @@ -192,6 +192,7 @@ fn create_transactions(payouts: &[Payout]) -> DlcTransactions { inputs: create_txinputinfo_vec(), input_amount: Amount::from_sat(300000000), collateral: Amount::from_sat(100000000), + dlc_inputs: vec![], }; let accept_params = PartyParams { @@ -203,6 +204,7 @@ fn create_transactions(payouts: &[Payout]) -> DlcTransactions { inputs: create_txinputinfo_vec(), input_amount: Amount::from_sat(300000000), collateral: Amount::from_sat(100000000), + dlc_inputs: vec![], }; create_dlc_transactions(&offer_params, &accept_params, payouts, 1000, 2, 0, 1000, 3).unwrap() } diff --git a/ddk-manager/src/channel/offered_channel.rs b/ddk-manager/src/channel/offered_channel.rs index 6e082b1f..6dc6b445 100644 --- a/ddk-manager/src/channel/offered_channel.rs +++ b/ddk-manager/src/channel/offered_channel.rs @@ -8,7 +8,7 @@ use secp256k1_zkp::PublicKey; use crate::{ contract::offered_contract::OfferedContract, conversion_utils::get_tx_input_infos, - error::Error, ChannelId, ContractId, KeysId, + dlc_input::get_dlc_inputs_from_funding_inputs, error::Error, ChannelId, ContractId, KeysId, }; use super::party_points::PartyBasePoints; @@ -97,6 +97,7 @@ impl OfferedChannel { }; let (inputs, input_amount) = get_tx_input_infos(&offer_channel.funding_inputs)?; + let dlc_inputs = get_dlc_inputs_from_funding_inputs(&offer_channel.funding_inputs); let contract = OfferedContract { id: offer_channel.temporary_contract_id, @@ -113,6 +114,7 @@ impl OfferedChannel { payout_serial_id: offer_channel.payout_serial_id, collateral: offer_channel.offer_collateral, inputs, + dlc_inputs, input_amount, }, cet_locktime: offer_channel.cet_locktime, diff --git a/ddk-manager/src/channel_updater.rs b/ddk-manager/src/channel_updater.rs index 2b3e7331..29328596 100644 --- a/ddk-manager/src/channel_updater.rs +++ b/ddk-manager/src/channel_updater.rs @@ -23,8 +23,8 @@ use crate::{ }, error::Error, utils::get_new_temporary_id, - Blockchain, ChannelId, ContractId, ContractSigner, ContractSignerProvider, KeysId, Time, - Wallet, + Blockchain, ChannelId, ContractId, ContractSigner, ContractSignerProvider, KeysId, Storage, + Time, Wallet, }; use bitcoin::{Amount, OutPoint, Script, ScriptBuf, Sequence, Transaction, TxIn, Witness}; use dlc::{ @@ -99,6 +99,7 @@ where secp, contract.offer_collateral, total_collateral, + vec![], contract.fee_rate, wallet, &signer, @@ -169,6 +170,7 @@ where secp, total_collateral - offered_contract.offer_params.collateral, total_collateral, + vec![], offered_contract.fee_rate_per_vb, wallet, &signer, @@ -281,7 +283,7 @@ where /// to a [`SignedChannel`] and [`SignedContract`], returning them as well as the /// [`SignChannel`] to be sent to the counter party. #[allow(clippy::too_many_arguments)] -pub async fn verify_and_sign_accepted_channel( +pub async fn verify_and_sign_accepted_channel( secp: &Secp256k1, offered_channel: &OfferedChannel, offered_contract: &OfferedContract, @@ -289,11 +291,13 @@ pub async fn verify_and_sign_accepted_channel, ) -> Result<(SignedChannel, SignedContract, SignChannel), Error> where W::Target: Wallet, SP::Target: ContractSignerProvider, + S::Target: Storage, { let (tx_input_infos, input_amount) = crate::conversion_utils::get_tx_input_infos(&accept_channel.funding_inputs)?; @@ -305,6 +309,7 @@ where payout_script_pubkey: accept_channel.payout_spk.clone(), payout_serial_id: accept_channel.payout_serial_id, inputs: tx_input_infos, + dlc_inputs: vec![], input_amount, collateral: accept_channel.accept_collateral, }; @@ -318,7 +323,7 @@ where let offer_own_base_secret = signer_provider.get_secret_key_for_pubkey(&offered_channel.party_points.own_basepoint)?; - let offer_own_sk = derive_private_key( + let _offer_own_sk = derive_private_key( secp, &offered_channel.per_update_point, &offer_own_base_secret, @@ -373,11 +378,13 @@ where &accept_cet_adaptor_signatures, buffer_transaction.output[0].value, wallet, - &offer_own_sk, + &offer_fund_sk, Some(&buffer_script_pubkey), Some(accept_revoke_params.own_pk.inner), &dlc_transactions, Some(channel_id), + storage, + signer_provider, ) .await?; @@ -459,16 +466,20 @@ where /// Verify that the given [`SignChannel`] message is valid with respect to the /// given [`AcceptedChannel`] and [`AcceptedContract`], transforming them /// to a [`SignedChannel`] and [`SignedContract`], and returning them. -pub async fn verify_signed_channel( +pub async fn verify_signed_channel( secp: &Secp256k1, accepted_channel: &AcceptedChannel, accepted_contract: &AcceptedContract, sign_channel: &SignChannel, wallet: &W, chain_monitor: &Mutex, + storage: &S, + signer_provider: &SP, ) -> Result<(SignedChannel, SignedContract, Transaction), Error> where W::Target: Wallet, + SP::Target: ContractSignerProvider, + S::Target: Storage, { let own_publish_pk = accepted_channel .accept_base_points @@ -500,6 +511,8 @@ where Some(counter_own_pk), wallet, Some(accepted_channel.channel_id), + storage, + signer_provider, ) .await?; @@ -1354,7 +1367,13 @@ where /// channel and associated contract the same time. Expects the channel to be in /// [`SignedChannelState::RenewOffered`] state. #[allow(clippy::too_many_arguments)] -pub async fn verify_renew_accept_and_confirm( +pub async fn verify_renew_accept_and_confirm< + W: Deref, + SP: Deref, + X: ContractSigner, + T: Deref, + S: Deref, +>( secp: &Secp256k1, renew_accept: &RenewAccept, signed_channel: &mut SignedChannel, @@ -1364,11 +1383,13 @@ pub async fn verify_renew_accept_and_confirm Result<(SignedContract, RenewConfirm), Error> where W::Target: Wallet, SP::Target: ContractSignerProvider, T::Target: Time, + S::Target: Storage, { let own_base_secret_key = signer_provider.get_secret_key_for_pubkey(&signed_channel.own_points.own_basepoint)?; @@ -1416,7 +1437,7 @@ where Sequence(cet_nsequence), )?; - let offer_own_sk = derive_private_key(secp, &offer_per_update_point, &own_base_secret_key); + let _offer_own_sk = derive_private_key(secp, &offer_per_update_point, &own_base_secret_key); let cet_adaptor_signatures: Vec<_> = (&renew_accept.cet_adaptor_signatures).into(); let (signed_contract, cet_adaptor_signatures) = verify_accepted_and_sign_contract_internal( @@ -1428,11 +1449,13 @@ where &cet_adaptor_signatures, buffer_transaction.output[0].value, wallet, - &offer_own_sk, + &contract_signer, Some(&buffer_script_pubkey), Some(accept_revoke_params.own_pk.inner), &dlc_transactions, Some(signed_channel.channel_id), + storage, + signer_provider, ) .await?; @@ -1475,7 +1498,13 @@ where /// channel and associated contract the same time. Expects the channel to be in /// [`SignedChannelState::RenewAccepted`] state. #[allow(clippy::too_many_arguments)] -pub(crate) async fn verify_renew_confirm_and_finalize( +pub(crate) async fn verify_renew_confirm_and_finalize< + S: Deref, + T: Deref, + W: Deref, + SP: Deref, + X: ContractSigner, +>( secp: &Secp256k1, signed_channel: &mut SignedChannel, accepted_contract: &AcceptedContract, @@ -1483,13 +1512,15 @@ pub(crate) async fn verify_renew_confirm_and_finalize, + storage: &S, ) -> Result<(SignedContract, RenewFinalize), Error> where T::Target: Time, - S::Target: ContractSignerProvider, + SP::Target: ContractSignerProvider, W::Target: Wallet, + S::Target: Storage, { let ( &offer_per_update_point, @@ -1541,6 +1572,8 @@ where Some(counter_own_pk), wallet, Some(signed_channel.channel_id), + storage, + signer, ) .await?; diff --git a/ddk-manager/src/contract/accepted_contract.rs b/ddk-manager/src/contract/accepted_contract.rs index dda5138a..883e7bb2 100644 --- a/ddk-manager/src/contract/accepted_contract.rs +++ b/ddk-manager/src/contract/accepted_contract.rs @@ -109,16 +109,13 @@ mod tests { #[test] fn pnl_compute_test() { - let buf = include_bytes!("../../../ddk/tests/data/dlc_storage/Accepted"); + let buf = include_bytes!("../../test_inputs/Accepted"); let accepted_contract: AcceptedContract = Readable::read(&mut Cursor::new(&buf)).unwrap(); let cets = &accepted_contract.dlc_transactions.cets; - assert_eq!( - accepted_contract.compute_pnl(&cets[0]), - SignedAmount::from_sat(90000000) - ); + assert_eq!(accepted_contract.compute_pnl(&cets[0]), SignedAmount::ZERO); assert_eq!( accepted_contract.compute_pnl(&cets[cets.len() - 1]), - SignedAmount::from_sat(-11000000) + SignedAmount::from_sat(101000000) ); } } diff --git a/ddk-manager/src/contract/offered_contract.rs b/ddk-manager/src/contract/offered_contract.rs index 4dcaa0ac..35a9302a 100644 --- a/ddk-manager/src/contract/offered_contract.rs +++ b/ddk-manager/src/contract/offered_contract.rs @@ -3,6 +3,7 @@ use crate::conversion_utils::{ get_contract_info_and_announcements, get_tx_input_infos, BITCOIN_CHAINHASH, PROTOCOL_VERSION, }; +use crate::dlc_input::get_dlc_inputs_from_funding_inputs; use crate::utils::get_new_serial_id; use super::contract_info::ContractInfo; @@ -133,6 +134,7 @@ impl OfferedContract { let contract_info = get_contract_info_and_announcements(&offer_dlc.contract_info)?; let (inputs, input_amount) = get_tx_input_infos(&offer_dlc.funding_inputs)?; + let dlc_inputs = get_dlc_inputs_from_funding_inputs(&offer_dlc.funding_inputs); Ok(OfferedContract { id: offer_dlc.temporary_contract_id, @@ -146,6 +148,7 @@ impl OfferedContract { payout_serial_id: offer_dlc.payout_serial_id, collateral: offer_dlc.offer_collateral, inputs, + dlc_inputs, input_amount, }, cet_locktime: offer_dlc.cet_locktime, diff --git a/ddk-manager/src/contract/signed_contract.rs b/ddk-manager/src/contract/signed_contract.rs index f392a892..db755d02 100644 --- a/ddk-manager/src/contract/signed_contract.rs +++ b/ddk-manager/src/contract/signed_contract.rs @@ -1,9 +1,11 @@ //! #SignedContract use crate::conversion_utils::PROTOCOL_VERSION; +use crate::utils::get_new_serial_id; use crate::ChannelId; use super::accepted_contract::AcceptedContract; +use dlc::dlc_input::DlcInputInfo; use dlc_messages::CetAdaptorSignature; use dlc_messages::CetAdaptorSignatures; use dlc_messages::FundingSignatures; @@ -46,4 +48,36 @@ impl SignedContract { funding_signatures: self.funding_signatures.clone(), } } + + /// Use an existing contract to create a funding input for a spliced DLC. + pub(crate) fn get_dlc_input(&self) -> DlcInputInfo { + let fund_tx = self.accepted_contract.dlc_transactions.fund.clone(); + + let fund_vout = self + .accepted_contract + .dlc_transactions + .get_fund_output_index() as u32; + let local_fund_pubkey = self + .accepted_contract + .offered_contract + .offer_params + .fund_pubkey; + let remote_fund_pubkey = self.accepted_contract.accept_params.fund_pubkey; + let fund_amount = self + .accepted_contract + .dlc_transactions + .get_fund_output() + .value; + + DlcInputInfo { + fund_tx, + fund_vout, + local_fund_pubkey, + remote_fund_pubkey, + fund_amount, + max_witness_len: 220, + input_serial_id: get_new_serial_id(), + contract_id: self.accepted_contract.get_contract_id(), + } + } } diff --git a/ddk-manager/src/contract_updater.rs b/ddk-manager/src/contract_updater.rs index 480784cd..b27a5e3a 100644 --- a/ddk-manager/src/contract_updater.rs +++ b/ddk-manager/src/contract_updater.rs @@ -5,6 +5,7 @@ use std::ops::Deref; use bitcoin::psbt::Psbt; use bitcoin::Amount; use bitcoin::{consensus::Decodable, Script, Transaction, Witness}; +use dlc::dlc_input::DlcInputInfo; use dlc::{DlcTransactions, PartyParams}; use dlc_messages::FundingInput; use dlc_messages::{ @@ -16,6 +17,8 @@ use secp256k1_zkp::{ }; use std::time::Instant; +use crate::dlc_input::{get_dlc_inputs_from_funding_inputs, get_signature_for_dlc_input}; +use crate::Storage; use crate::{ contract::{ accepted_contract::AcceptedContract, contract_info::ContractInfo, @@ -41,6 +44,7 @@ pub async fn offer_contract< secp: &Secp256k1, contract_input: &ContractInput, oracle_announcements: Vec>, + dlc_inputs: Vec, refund_delay: u32, counter_party: &PublicKey, wallet: &W, @@ -64,6 +68,7 @@ where secp, contract_input.offer_collateral, total_collateral, + dlc_inputs, contract_input.fee_rate, wallet, &signer, @@ -109,6 +114,8 @@ where secp, total_collateral - offered_contract.offer_params.collateral, total_collateral, + // The accept party does not have any DLC inputs, so we pass an empty vector. + vec![], offered_contract.fee_rate_per_vb, wallet, &signer, @@ -251,18 +258,21 @@ pub(crate) fn accept_contract_internal( /// Verifies the information of the accepting party [`Accept` message](dlc_messages::AcceptDlc), /// creates a [`SignedContract`], and generates the offering party CET adaptor signatures. -pub async fn verify_accepted_and_sign_contract( +pub async fn verify_accepted_and_sign_contract( secp: &Secp256k1, offered_contract: &OfferedContract, accept_msg: &AcceptDlc, wallet: &W, signer_provider: &SP, + storage: &S, ) -> Result<(SignedContract, SignDlc), Error> where W::Target: Wallet, SP::Target: ContractSignerProvider, + S::Target: Storage, { let (tx_input_infos, input_amount) = get_tx_input_infos(&accept_msg.funding_inputs)?; + let dlc_inputs = get_dlc_inputs_from_funding_inputs(&accept_msg.funding_inputs); let accept_params = PartyParams { fund_pubkey: accept_msg.funding_pubkey, @@ -271,6 +281,7 @@ where payout_script_pubkey: accept_msg.payout_spk.clone(), payout_serial_id: accept_msg.payout_serial_id, inputs: tx_input_infos, + dlc_inputs: dlc_inputs.clone(), input_amount, collateral: accept_msg.accept_collateral, }; @@ -283,23 +294,30 @@ where .collect::>(); let total_collateral = offered_contract.total_collateral; + let dlc_transactions = if !dlc_inputs.is_empty() { + dlc::create_spliced_dlc_transactions( + &offered_contract.offer_params, + &accept_params, + &offered_contract.contract_info[0].get_payouts(total_collateral)?, + offered_contract.refund_locktime, + offered_contract.fee_rate_per_vb, + 0, + offered_contract.cet_locktime, + offered_contract.fund_output_serial_id, + )? + } else { + dlc::create_dlc_transactions( + &offered_contract.offer_params, + &accept_params, + &offered_contract.contract_info[0].get_payouts(total_collateral)?, + offered_contract.refund_locktime, + offered_contract.fee_rate_per_vb, + 0, + offered_contract.cet_locktime, + offered_contract.fund_output_serial_id, + )? + }; - let now = Instant::now(); - let dlc_transactions = dlc::create_dlc_transactions( - &offered_contract.offer_params, - &accept_params, - &offered_contract.contract_info[0].get_payouts(total_collateral)?, - offered_contract.refund_locktime, - offered_contract.fee_rate_per_vb, - 0, - offered_contract.cet_locktime, - offered_contract.fund_output_serial_id, - )?; - tracing::info!( - "Created {} CETs in {} milliseconds.", - dlc_transactions.cets.len(), - now.elapsed().as_millis() - ); let fund_output_value = dlc_transactions.get_fund_output().value; let signer = signer_provider.derive_contract_signer(offered_contract.keys_id)?; @@ -318,6 +336,8 @@ where None, &dlc_transactions, None, + storage, + signer_provider, ) .await?; let contract_id = signed_contract.accepted_contract.get_contract_id_string(); @@ -353,7 +373,12 @@ fn populate_psbt(psbt: &mut Psbt, all_funding_inputs: &[&FundingInput]) -> Resul } #[allow(clippy::too_many_arguments)] -pub(crate) async fn verify_accepted_and_sign_contract_internal( +pub(crate) async fn verify_accepted_and_sign_contract_internal< + W: Deref, + X: ContractSigner, + S: Deref, + SP: Deref, +>( secp: &Secp256k1, offered_contract: &OfferedContract, accept_params: &PartyParams, @@ -367,9 +392,13 @@ pub(crate) async fn verify_accepted_and_sign_contract_internal, dlc_transactions: &DlcTransactions, channel_id: Option, + storage: &S, + signer_provider: &SP, ) -> Result<(SignedContract, Vec), Error> where W::Target: Wallet, + S::Target: Storage, + SP::Target: ContractSignerProvider, { let DlcTransactions { fund, @@ -485,6 +514,29 @@ where )) })?; + // If the funding input contains DLC information, we can sign the input internally using the + // corresponding contract id to get the keys id. + // + // The funding pubkeys for both the offer and accepting party are deterministically derived from + // the ContractSignerProvider. Becuase of this, we do not need to prompt the consumer for the signature. + if let Some(dlc_input) = &funding_input.dlc_input { + let dlc_input_signature = get_signature_for_dlc_input( + secp, + funding_input, + fund, + input_index, + &dlc_input.contract_id, + storage, + signer_provider, + ) + .await?; + + let witness = Witness::from_slice(&[dlc_input_signature]); + + witnesses.push(witness); + continue; + } + wallet.sign_psbt_input(&mut fund_psbt, input_index).await?; let witness = fund_psbt.inputs[input_index] @@ -550,14 +602,18 @@ where /// Verifies the information from the offer party [`Sign` message](dlc_messages::SignDlc), /// creates the accepting party's [`SignedContract`] and returns it along with the /// signed fund transaction. -pub async fn verify_signed_contract( +pub async fn verify_signed_contract( secp: &Secp256k1, accepted_contract: &AcceptedContract, sign_msg: &SignDlc, wallet: &W, + storage: &S, + signer_provider: &SP, ) -> Result<(SignedContract, Transaction), Error> where W::Target: Wallet, + S::Target: Storage, + SP::Target: ContractSignerProvider, { let cet_adaptor_signatures: Vec<_> = (&sign_msg.cet_adaptor_signatures).into(); verify_signed_contract_internal( @@ -571,12 +627,19 @@ where None, wallet, None, + storage, + signer_provider, ) .await } #[allow(clippy::too_many_arguments)] -pub(crate) async fn verify_signed_contract_internal( +pub(crate) async fn verify_signed_contract_internal< + W: Deref, + SP: Deref, + S: Deref, + X: ContractSigner, +>( secp: &Secp256k1, accepted_contract: &AcceptedContract, refund_signature: &Signature, @@ -587,9 +650,13 @@ pub(crate) async fn verify_signed_contract_internal( counter_adaptor_pk: Option, wallet: &W, channel_id: Option, + storage: &S, + signer_provider: &SP, ) -> Result<(SignedContract, Transaction), Error> where W::Target: Wallet, + S::Target: Storage, + SP::Target: ContractSignerProvider, { let offered_contract = &accepted_contract.offered_contract; let input_script_pubkey = input_script_pubkey @@ -656,13 +723,52 @@ where )) })?; - fund_psbt.inputs[input_index].final_script_witness = Some(Witness::from_slice( - &funding_signatures - .witness_elements - .iter() - .map(|x| x.witness.clone()) - .collect::>(), - )); + // If the funding input contains DLC information, we know that the corresponding funding signature + // from the offer party is their half of the DLC input and we can build the valid redeem script. + if let Some(dlc_input) = &funding_input.dlc_input { + let dlc_input_info: DlcInputInfo = funding_input.into(); + + // Verify the signature from the offer party is valid for the DLC input. + dlc::dlc_input::verify_dlc_funding_input_signature( + secp, + fund_tx, + input_index, + &dlc_input_info, + funding_signatures.witness_elements[0].witness.clone(), + &dlc_input.local_fund_pubkey, + )?; + + // Get the signature for the DLC input from the accepting party. + let my_dlc_input_signature = get_signature_for_dlc_input( + secp, + funding_input, + fund_tx, + input_index, + &dlc_input.contract_id, + storage, + signer_provider, + ) + .await?; + + // Build the redeem script for the DLC input. + let completed_witness = dlc::dlc_input::combine_dlc_input_signatures( + &dlc_input_info, + &my_dlc_input_signature, + &funding_signatures.witness_elements[0].witness, + &dlc_input.remote_fund_pubkey, + &dlc_input.local_fund_pubkey, + ); + + fund_psbt.inputs[input_index].final_script_witness = Some(completed_witness); + } else { + fund_psbt.inputs[input_index].final_script_witness = Some(Witness::from_slice( + &funding_signatures + .witness_elements + .iter() + .map(|x| x.witness.clone()) + .collect::>(), + )); + } } for funding_input in &accepted_contract.funding_inputs { diff --git a/ddk-manager/src/conversion_utils.rs b/ddk-manager/src/conversion_utils.rs index 4520b1aa..a5bb4880 100644 --- a/ddk-manager/src/conversion_utils.rs +++ b/ddk-manager/src/conversion_utils.rs @@ -76,6 +76,11 @@ pub fn get_tx_input_infos( let mut inputs = Vec::new(); for fund_input in funding_inputs { + let max_witness_len = if fund_input.dlc_input.is_some() { + 220 + } else { + 107 + }; let tx = Transaction::consensus_decode(&mut fund_input.prev_tx.as_slice())?; let vout = fund_input.prev_tx_vout; let tx_out = tx @@ -88,7 +93,7 @@ pub fn get_tx_input_infos( txid: tx.compute_txid(), vout, }, - max_witness_len: 107, + max_witness_len, redeem_script: fund_input.redeem_script.clone(), serial_id: fund_input.input_serial_id, }); diff --git a/ddk-manager/src/dlc_input.rs b/ddk-manager/src/dlc_input.rs new file mode 100644 index 00000000..a697fa35 --- /dev/null +++ b/ddk-manager/src/dlc_input.rs @@ -0,0 +1,64 @@ +//! Module for working with DLC inputs +use std::ops::Deref; + +use bitcoin::Transaction; +use dlc::dlc_input::DlcInputInfo; +use dlc_messages::FundingInput; +use secp256k1_zkp::{All, Secp256k1}; + +use crate::{ + contract::Contract, error::Error, ContractId, ContractSigner, ContractSignerProvider, Storage, +}; + +// todo: definitely test +/// Get the DlcInputInfo from FundingInputs +pub fn get_dlc_inputs_from_funding_inputs(funding_inputs: &[FundingInput]) -> Vec { + funding_inputs + .iter() + .filter(|i| i.dlc_input.is_some()) + .collect::>() + .into_iter() + .map(|i| i.into()) + .collect::>() +} + +pub async fn get_signature_for_dlc_input( + secp: &Secp256k1, + funding_input: &FundingInput, + fund_transaction: &Transaction, + input_index: usize, + contract_id: &ContractId, + storage: &S, + signer_provider: &SP, +) -> Result, Error> +where + S::Target: Storage, + SP::Target: ContractSignerProvider, +{ + let dlc_input_info: DlcInputInfo = funding_input.into(); + + let contract = storage + .get_contract(&contract_id) + .await? + .ok_or(Error::StorageError( + "Contract not found to sign DLC input.".to_string(), + ))?; + + let key_id = match contract { + Contract::Confirmed(c) => Ok(c.accepted_contract.offered_contract.keys_id), + _ => Err(Error::InvalidState( + "Contract must be confirmed to sign DLC input.".to_string(), + )), + }?; + + let dlc_input_signer = signer_provider.derive_contract_signer(key_id)?; + + dlc::dlc_input::create_dlc_funding_input_signature( + secp, + fund_transaction, + input_index, + &dlc_input_info, + &dlc_input_signer.get_secret_key()?, + ) + .map_err(|e| Error::DlcError(e)) +} diff --git a/ddk-manager/src/lib.rs b/ddk-manager/src/lib.rs index 7d9b96b4..ed07fb5e 100644 --- a/ddk-manager/src/lib.rs +++ b/ddk-manager/src/lib.rs @@ -21,6 +21,7 @@ pub mod channel_updater; pub mod contract; pub mod contract_updater; mod conversion_utils; +mod dlc_input; pub mod error; pub mod manager; pub mod payout_curve; diff --git a/ddk-manager/src/manager.rs b/ddk-manager/src/manager.rs index fd773936..04b80bb9 100644 --- a/ddk-manager/src/manager.rs +++ b/ddk-manager/src/manager.rs @@ -270,6 +270,58 @@ where } } + /// Create a new spliced offer + pub async fn send_splice_offer( + &self, + contract_input: &ContractInput, + counter_party: PublicKey, + contract_id: &ContractId, + ) -> Result { + let oracle_announcements = self.oracle_announcements(contract_input).await?; + + self.send_splice_offer_with_announcements( + contract_input, + counter_party, + contract_id, + oracle_announcements, + ) + .await + } + + /// Creates a new offer DLC using an existing DLC as an input. + /// The new DLC MUST use a Confirmed contract as an input. + pub async fn send_splice_offer_with_announcements( + &self, + contract_input: &ContractInput, + counter_party: PublicKey, + contract_id: &ContractId, + oracle_announcements: Vec>, + ) -> Result { + let confirmed_contract = + get_contract_in_state!(self, contract_id, Confirmed, Some(counter_party))?; + + let dlc_input = confirmed_contract.get_dlc_input(); + let (offered_contract, offer_msg) = crate::contract_updater::offer_contract( + &self.secp, + contract_input, + oracle_announcements, + vec![dlc_input], + REFUND_DELAY, + &counter_party, + &self.wallet, + &self.blockchain, + &self.time, + &self.signer_provider, + ) + .await?; + + offered_contract.validate()?; + + self.store.create_contract(&offered_contract).await?; + + Ok(offer_msg) + } + /// Function called to create a new DLC. The offered contract will be stored /// and an OfferDlc message returned. /// @@ -301,6 +353,7 @@ where &self.secp, contract_input, oracle_announcements, + vec![], REFUND_DELAY, &counter_party, &self.wallet, @@ -383,7 +436,8 @@ where /// update them if possible. pub async fn periodic_check(&self, check_channels: bool) -> Result<(), Error> { tracing::debug!("Periodic check."); - self.check_signed_contracts().await?; + let signed_contracts = self.check_for_spliced_contract().await?; + self.check_signed_contracts(&signed_contracts).await?; self.check_confirmed_contracts().await?; self.check_preclosed_contracts().await?; @@ -436,6 +490,7 @@ where accept_msg, &self.wallet, &self.signer_provider, + &self.store, ) .await { @@ -475,6 +530,8 @@ where &accepted_contract, sign_message, &self.wallet, + &self.store, + &self.signer_provider, ) .await { @@ -487,11 +544,50 @@ where }; self.store - .update_contract(&Contract::Signed(signed_contract)) + .update_contract(&Contract::Signed(signed_contract.clone())) .await?; self.blockchain.send_transaction(&fund_tx).await?; + // Check if there are any DLC inputs in the funding inputs of the contract. + // If there are, mark the contract as pre-closed. + if accepted_contract + .offered_contract + .funding_inputs + .iter() + .any(|c| c.dlc_input.is_some()) + { + let Some(dlc_input) = accepted_contract + .offered_contract + .funding_inputs + .iter() + .find(|c| c.dlc_input.is_some()) + else { + return Ok(()); + }; + + let preclosed_contract = get_contract_in_state!( + self, + &dlc_input.dlc_input.as_ref().unwrap().contract_id, + Confirmed, + None as Option + )?; + + let preclosed_contract = PreClosedContract { + signed_contract: preclosed_contract.clone(), + attestations: None, + signed_cet: signed_contract + .accepted_contract + .dlc_transactions + .fund + .clone(), + }; + + self.store + .update_contract(&Contract::PreClosed(preclosed_contract.clone())) + .await?; + } + Ok(()) } @@ -577,9 +673,12 @@ where Ok(()) } - async fn check_signed_contracts(&self) -> Result<(), Error> { - for c in self.store.get_signed_contracts().await? { - if let Err(e) = self.check_signed_contract(&c).await { + async fn check_signed_contracts( + &self, + signed_contracts: &[SignedContract], + ) -> Result<(), Error> { + for c in signed_contracts { + if let Err(e) = self.check_signed_contract(c).await { tracing::error!( "Error checking confirmed contract {}: {}", c.accepted_contract.get_contract_id_string(), @@ -591,6 +690,49 @@ where Ok(()) } + async fn check_for_spliced_contract(&self) -> Result, Error> { + let contracts = self.get_store().get_signed_contracts().await?; + for contract in &contracts { + let dlc_input = contract + .accepted_contract + .offered_contract + .funding_inputs + .iter() + .find(|d| d.dlc_input.is_some()); + + let Some(funding_input) = dlc_input else { + continue; + }; + + let contract_id = funding_input.dlc_input.as_ref().unwrap().contract_id; + + let confirmed_contract_in_splice = match get_contract_in_state!( + self, + &contract_id, + Confirmed, + None as Option + ) { + Ok(c) => Ok(c), + Err(Error::InvalidState(_)) => continue, + Err(e) => { + tracing::debug!("The previouse contract referenced in a splice transaction failed to retrieve. error={}", e.to_string()); + Err(e) + } + }?; + + let preclosed_contract = PreClosedContract { + signed_contract: confirmed_contract_in_splice.clone(), + attestations: None, + signed_cet: contract.accepted_contract.dlc_transactions.fund.clone(), + }; + + self.store + .update_contract(&Contract::PreClosed(preclosed_contract.clone())) + .await?; + } + Ok(contracts) + } + async fn check_confirmed_contracts(&self) -> Result<(), Error> { for c in self.store.get_confirmed_contracts().await? { // Confirmed contracts from channel are processed in channel specific methods. @@ -1562,6 +1704,7 @@ where CET_NSEQUENCE, &self.wallet, &self.signer_provider, + &self.store, &self.chain_monitor, ) .await; @@ -1642,6 +1785,8 @@ where sign_channel, &self.wallet, &self.chain_monitor, + &self.store, + &self.signer_provider, ) .await; @@ -1913,6 +2058,7 @@ where &self.wallet, &self.signer_provider, &self.time, + &self.store, ) .await?; @@ -2000,6 +2146,7 @@ where &self.wallet, &self.signer_provider, &self.chain_monitor, + &self.store, ) .await?; diff --git a/ddk-manager/src/utils.rs b/ddk-manager/src/utils.rs index 0884f29f..5f565155 100644 --- a/ddk-manager/src/utils.rs +++ b/ddk-manager/src/utils.rs @@ -1,11 +1,11 @@ //! #Utils use std::ops::Deref; -use bitcoin::{consensus::Encodable, Amount, Txid}; -use dlc::{util::get_common_fee, PartyParams, TxInputInfo}; +use bitcoin::{consensus::Encodable, Amount, ScriptBuf, Txid}; +use dlc::{dlc_input::DlcInputInfo, util::get_common_fee, PartyParams, TxInputInfo}; use dlc_messages::{ oracle_msgs::{OracleAnnouncement, OracleAttestation}, - FundingInput, + DlcInput, FundingInput, }; use dlc_trie::RangeInfo; #[cfg(not(feature = "fuzztarget"))] @@ -14,7 +14,7 @@ use secp256k1_zkp::{PublicKey, Secp256k1, Signing}; use crate::{ channel::party_points::PartyBasePoints, - contract::{contract_info::ContractInfo, AdaptorInfo}, + contract::{contract_info::ContractInfo, ser::Serializable, AdaptorInfo}, error::Error, Blockchain, ContractSigner, ContractSignerProvider, Wallet, }; @@ -93,6 +93,7 @@ pub(crate) async fn get_party_params, own_collateral: Amount, total_collateral: Amount, + dlc_inputs: Vec, fee_rate: u64, wallet: &W, signer: &X, @@ -112,14 +113,21 @@ where let change_serial_id = get_new_serial_id(); let appr_required_amount = - get_approximate_required_amount(total_collateral, own_collateral, fee_rate)?; + get_approximate_required_amount(&dlc_inputs, total_collateral, own_collateral, fee_rate)?; + + // First get the amount in the DLC input. Subtract from own collateral to see if there is needed extra UTXO. + let dlc_input_amount = dlc_inputs.iter().map(|d| d.fund_amount).sum::(); + + let potential_additional_collateral_needed = appr_required_amount + .checked_sub(dlc_input_amount) + .unwrap_or(Amount::ZERO); let utxos = wallet - .get_utxos_for_amount(appr_required_amount, fee_rate, true) + .get_utxos_for_amount(potential_additional_collateral_needed, fee_rate, true) .await?; let mut funding_inputs: Vec = Vec::new(); let mut funding_tx_info: Vec = Vec::new(); - let mut total_input = Amount::ZERO; + let mut total_input = dlc_input_amount; for utxo in utxos { let prev_tx = blockchain.get_transaction(&utxo.outpoint.txid).await?; let mut writer = Vec::new(); @@ -135,12 +143,31 @@ where sequence, max_witness_len, redeem_script: utxo.redeem_script, + dlc_input: None, }; total_input += prev_tx.output[prev_tx_vout as usize].value; funding_tx_info.push((&funding_input).into()); funding_inputs.push(funding_input); } + dlc_inputs.iter().for_each(|d| { + let funding_input = FundingInput { + input_serial_id: d.input_serial_id, + prev_tx: d.fund_tx.serialize().unwrap(), + prev_tx_vout: d.fund_vout, + sequence: 0xffffffff, + max_witness_len: d.max_witness_len as u16, + redeem_script: ScriptBuf::new(), + dlc_input: Some(DlcInput { + local_fund_pubkey: d.local_fund_pubkey, + remote_fund_pubkey: d.remote_fund_pubkey, + contract_id: d.contract_id, + }), + }; + funding_tx_info.push((&funding_input).into()); + funding_inputs.push(funding_input); + }); + let party_params = PartyParams { fund_pubkey: funding_pubkey, change_script_pubkey: change_spk, @@ -148,6 +175,7 @@ where payout_script_pubkey: payout_spk, payout_serial_id, inputs: funding_tx_info, + dlc_inputs, collateral: own_collateral, input_amount: total_input, }; @@ -160,6 +188,7 @@ where // Otherwise, appr_required_amount is the half common fee. // Add base cost of fund tx + CET / 2 and a CET output to the collateral. fn get_approximate_required_amount( + dlc_inputs: &[DlcInputInfo], total_collateral: Amount, own_collateral: Amount, fee_rate: u64, @@ -169,6 +198,8 @@ fn get_approximate_required_amount( // TODO: handle different address types for CET execution (multisig, p2wsh, p2tr, etc.) const ASSUME_P2WPKH_WEIGHT: usize = 124; + let dlc_weight = dlc::dlc_input::get_dlc_inputs_weight(dlc_inputs); + let appr_required_amount = if own_collateral == Amount::ZERO { // No collateral = no fees Amount::ZERO @@ -177,11 +208,13 @@ fn get_approximate_required_amount( own_collateral + get_common_fee(fee_rate)? + dlc::util::weight_to_fee(ASSUME_P2WPKH_WEIGHT, fee_rate)? + + dlc::util::weight_to_fee(dlc_weight, fee_rate)? } else { // Partial collateral = split fees own_collateral + get_half_common_fee(fee_rate)? + dlc::util::weight_to_fee(ASSUME_P2WPKH_WEIGHT, fee_rate)? + + dlc::util::weight_to_fee(dlc_weight, fee_rate)? }; Ok(appr_required_amount) } @@ -310,7 +343,8 @@ mod tests { let own_collateral = Amount::ONE_BTC; let fee_rate = 2; let appr_required_amount = - get_approximate_required_amount(total_collateral, own_collateral, fee_rate).unwrap(); + get_approximate_required_amount(&[], total_collateral, own_collateral, fee_rate) + .unwrap(); let expected_amount = Amount::ONE_BTC + Amount::from_sat(420); assert_eq!(appr_required_amount, expected_amount); } @@ -321,7 +355,8 @@ mod tests { let own_collateral = Amount::ZERO; let fee_rate = 2; let appr_required_amount = - get_approximate_required_amount(total_collateral, own_collateral, fee_rate).unwrap(); + get_approximate_required_amount(&[], total_collateral, own_collateral, fee_rate) + .unwrap(); assert_eq!(appr_required_amount, Amount::ZERO); } @@ -331,7 +366,8 @@ mod tests { let own_collateral = Amount::from_sat(50_000_000); let fee_rate = 2; let appr_required_amount = - get_approximate_required_amount(total_collateral, own_collateral, fee_rate).unwrap(); + get_approximate_required_amount(&[], total_collateral, own_collateral, fee_rate) + .unwrap(); assert_eq!(appr_required_amount, Amount::from_sat(50_000_000 + 241)); } diff --git a/ddk-manager/test_inputs/offer_enum_collateral_not_equal_payout.json b/ddk-manager/test_inputs/offer_enum_collateral_not_equal_payout.json index ddbba204..2f3c399e 100644 --- a/ddk-manager/test_inputs/offer_enum_collateral_not_equal_payout.json +++ b/ddk-manager/test_inputs/offer_enum_collateral_not_equal_payout.json @@ -1,37 +1,7 @@ { "id": [ - 155, - 212, - 62, - 219, - 175, - 95, - 42, - 204, - 223, - 54, - 197, - 38, - 211, - 63, - 152, - 35, - 68, - 201, - 208, - 36, - 124, - 66, - 82, - 30, - 41, - 1, - 4, - 234, - 154, - 144, - 105, - 176 + 155, 212, 62, 219, 175, 95, 42, 204, 223, 54, 197, 38, 211, 63, 152, 35, 68, + 201, 208, 36, 124, 66, 82, 30, 41, 1, 4, 234, 154, 144, 105, 176 ], "isOfferParty": false, "contractInfo": [ @@ -81,12 +51,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -102,12 +67,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -123,12 +83,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -153,6 +108,7 @@ "serialId": 2904786313666239109 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -172,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_enum_missing_payout.json b/ddk-manager/test_inputs/offer_enum_missing_payout.json index 0fdf3579..f49030f0 100644 --- a/ddk-manager/test_inputs/offer_enum_missing_payout.json +++ b/ddk-manager/test_inputs/offer_enum_missing_payout.json @@ -1,37 +1,7 @@ { "id": [ - 66, - 45, - 75, - 127, - 245, - 123, - 32, - 231, - 135, - 70, - 226, - 195, - 249, - 219, - 192, - 57, - 194, - 24, - 51, - 2, - 115, - 136, - 214, - 219, - 13, - 8, - 11, - 30, - 7, - 172, - 177, - 97 + 66, 45, 75, 127, 245, 123, 32, 231, 135, 70, 226, 195, 249, 219, 192, 57, + 194, 24, 51, 2, 115, 136, 214, 219, 13, 8, 11, 30, 7, 172, 177, 97 ], "isOfferParty": false, "contractInfo": [ @@ -74,12 +44,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -95,12 +60,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -116,12 +76,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -146,6 +101,7 @@ "serialId": 8898618283234174875 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -165,37 +121,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_enum_oracle_with_diff_payout.json b/ddk-manager/test_inputs/offer_enum_oracle_with_diff_payout.json index 64784428..e26525fc 100644 --- a/ddk-manager/test_inputs/offer_enum_oracle_with_diff_payout.json +++ b/ddk-manager/test_inputs/offer_enum_oracle_with_diff_payout.json @@ -1,37 +1,7 @@ { "id": [ - 155, - 212, - 62, - 219, - 175, - 95, - 42, - 204, - 223, - 54, - 197, - 38, - 211, - 63, - 152, - 35, - 68, - 201, - 208, - 36, - 124, - 66, - 82, - 30, - 41, - 1, - 4, - 234, - 154, - 144, - 105, - 176 + 155, 212, 62, 219, 175, 95, 42, 204, 223, 54, 197, 38, 211, 63, 152, 35, 68, + 201, 208, 36, 124, 66, 82, 30, 41, 1, 4, 234, 154, 144, 105, 176 ], "isOfferParty": false, "contractInfo": [ @@ -81,12 +51,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -102,12 +67,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "c", - "d" - ] + "outcomes": ["a", "b", "c", "d"] } }, "eventId": "Test" @@ -123,11 +83,7 @@ "eventMaturityEpoch": 1623133104, "eventDescriptor": { "enumEvent": { - "outcomes": [ - "a", - "b", - "d" - ] + "outcomes": ["a", "b", "d"] } }, "eventId": "Test" @@ -152,6 +108,7 @@ "serialId": 2904786313666239109 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -171,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_numerical_bad_first_payout.json b/ddk-manager/test_inputs/offer_numerical_bad_first_payout.json index 2338c4d9..ba44e4b8 100644 --- a/ddk-manager/test_inputs/offer_numerical_bad_first_payout.json +++ b/ddk-manager/test_inputs/offer_numerical_bad_first_payout.json @@ -1,37 +1,7 @@ { "id": [ - 9, - 164, - 248, - 98, - 221, - 224, - 186, - 237, - 180, - 155, - 198, - 201, - 213, - 182, - 7, - 99, - 192, - 179, - 34, - 214, - 206, - 92, - 177, - 1, - 209, - 63, - 226, - 247, - 31, - 128, - 33, - 115 + 9, 164, 248, 98, 221, 224, 186, 237, 180, 155, 198, 201, 213, 182, 7, 99, + 192, 179, 34, 214, 206, 92, 177, 1, 209, 63, 226, 247, 31, 128, 33, 115 ], "isOfferParty": false, "contractInfo": [ @@ -85,9 +55,7 @@ "differenceParams": null, "oracleNumericInfos": { "base": 2, - "nbDigits": [ - 10 - ] + "nbDigits": [10] } } }, @@ -140,6 +108,7 @@ "serialId": 4408916189615191417 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -159,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_numerical_bad_last_payout.json b/ddk-manager/test_inputs/offer_numerical_bad_last_payout.json index 01ddcceb..64359032 100644 --- a/ddk-manager/test_inputs/offer_numerical_bad_last_payout.json +++ b/ddk-manager/test_inputs/offer_numerical_bad_last_payout.json @@ -1,37 +1,7 @@ { "id": [ - 9, - 164, - 248, - 98, - 221, - 224, - 186, - 237, - 180, - 155, - 198, - 201, - 213, - 182, - 7, - 99, - 192, - 179, - 34, - 214, - 206, - 92, - 177, - 1, - 209, - 63, - 226, - 247, - 31, - 128, - 33, - 115 + 9, 164, 248, 98, 221, 224, 186, 237, 180, 155, 198, 201, 213, 182, 7, 99, + 192, 179, 34, 214, 206, 92, 177, 1, 209, 63, 226, 247, 31, 128, 33, 115 ], "isOfferParty": false, "contractInfo": [ @@ -85,9 +55,7 @@ "differenceParams": null, "oracleNumericInfos": { "base": 2, - "nbDigits": [ - 10 - ] + "nbDigits": [10] } } }, @@ -140,6 +108,7 @@ "serialId": 4408916189615191417 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -159,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_numerical_collateral_less_than_payout.json b/ddk-manager/test_inputs/offer_numerical_collateral_less_than_payout.json index fdd5f8b0..2e78bc8e 100644 --- a/ddk-manager/test_inputs/offer_numerical_collateral_less_than_payout.json +++ b/ddk-manager/test_inputs/offer_numerical_collateral_less_than_payout.json @@ -1,37 +1,7 @@ { "id": [ - 9, - 164, - 248, - 98, - 221, - 224, - 186, - 237, - 180, - 155, - 198, - 201, - 213, - 182, - 7, - 99, - 192, - 179, - 34, - 214, - 206, - 92, - 177, - 1, - 209, - 63, - 226, - 247, - 31, - 128, - 33, - 115 + 9, 164, 248, 98, 221, 224, 186, 237, 180, 155, 198, 201, 213, 182, 7, 99, + 192, 179, 34, 214, 206, 92, 177, 1, 209, 63, 226, 247, 31, 128, 33, 115 ], "isOfferParty": false, "contractInfo": [ @@ -85,9 +55,7 @@ "differenceParams": null, "oracleNumericInfos": { "base": 2, - "nbDigits": [ - 10 - ] + "nbDigits": [10] } } }, @@ -140,6 +108,7 @@ "serialId": 4408916189615191417 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -159,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_numerical_empty_rounding_interval.json b/ddk-manager/test_inputs/offer_numerical_empty_rounding_interval.json index fa182edb..845becab 100644 --- a/ddk-manager/test_inputs/offer_numerical_empty_rounding_interval.json +++ b/ddk-manager/test_inputs/offer_numerical_empty_rounding_interval.json @@ -1,37 +1,7 @@ { "id": [ - 9, - 164, - 248, - 98, - 221, - 224, - 186, - 237, - 180, - 155, - 198, - 201, - 213, - 182, - 7, - 99, - 192, - 179, - 34, - 214, - 206, - 92, - 177, - 1, - 209, - 63, - 226, - 247, - 31, - 128, - 33, - 115 + 9, 164, 248, 98, 221, 224, 186, 237, 180, 155, 198, 201, 213, 182, 7, 99, + 192, 179, 34, 214, 206, 92, 177, 1, 209, 63, 226, 247, 31, 128, 33, 115 ], "isOfferParty": false, "contractInfo": [ @@ -80,9 +50,7 @@ "differenceParams": null, "oracleNumericInfos": { "base": 2, - "nbDigits": [ - 10 - ] + "nbDigits": [10] } } }, @@ -135,6 +103,7 @@ "serialId": 4408916189615191417 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -154,37 +123,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_numerical_invalid_rounding_interval.json b/ddk-manager/test_inputs/offer_numerical_invalid_rounding_interval.json index 7d4c5beb..bc7d5986 100644 --- a/ddk-manager/test_inputs/offer_numerical_invalid_rounding_interval.json +++ b/ddk-manager/test_inputs/offer_numerical_invalid_rounding_interval.json @@ -1,37 +1,7 @@ { "id": [ - 9, - 164, - 248, - 98, - 221, - 224, - 186, - 237, - 180, - 155, - 198, - 201, - 213, - 182, - 7, - 99, - 192, - 179, - 34, - 214, - 206, - 92, - 177, - 1, - 209, - 63, - 226, - 247, - 31, - 128, - 33, - 115 + 9, 164, 248, 98, 221, 224, 186, 237, 180, 155, 198, 201, 213, 182, 7, 99, + 192, 179, 34, 214, 206, 92, 177, 1, 209, 63, 226, 247, 31, 128, 33, 115 ], "isOfferParty": false, "contractInfo": [ @@ -85,9 +55,7 @@ "differenceParams": null, "oracleNumericInfos": { "base": 2, - "nbDigits": [ - 10 - ] + "nbDigits": [10] } } }, @@ -140,6 +108,7 @@ "serialId": 4408916189615191417 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -159,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/test_inputs/offer_numerical_non_continuous.json b/ddk-manager/test_inputs/offer_numerical_non_continuous.json index 80148b45..022531f4 100644 --- a/ddk-manager/test_inputs/offer_numerical_non_continuous.json +++ b/ddk-manager/test_inputs/offer_numerical_non_continuous.json @@ -1,37 +1,7 @@ { "id": [ - 9, - 164, - 248, - 98, - 221, - 224, - 186, - 237, - 180, - 155, - 198, - 201, - 213, - 182, - 7, - 99, - 192, - 179, - 34, - 214, - 206, - 92, - 177, - 1, - 209, - 63, - 226, - 247, - 31, - 128, - 33, - 115 + 9, 164, 248, 98, 221, 224, 186, 237, 180, 155, 198, 201, 213, 182, 7, 99, + 192, 179, 34, 214, 206, 92, 177, 1, 209, 63, 226, 247, 31, 128, 33, 115 ], "isOfferParty": false, "contractInfo": [ @@ -85,9 +55,7 @@ "differenceParams": null, "oracleNumericInfos": { "base": 2, - "nbDigits": [ - 10 - ] + "nbDigits": [10] } } }, @@ -140,6 +108,7 @@ "serialId": 4408916189615191417 } ], + "dlcInputs": [], "inputAmount": 5000000000, "collateral": 100000000 }, @@ -159,37 +128,7 @@ "cetLocktime": 1623133104, "refundLocktime": 1623737904, "keysId": [ - 16, - 175, - 248, - 204, - 229, - 173, - 124, - 107, - 34, - 204, - 75, - 138, - 154, - 151, - 193, - 8, - 142, - 116, - 180, - 156, - 90, - 229, - 80, - 251, - 77, - 5, - 215, - 234, - 70, - 117, - 68, - 208 + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 ] } diff --git a/ddk-manager/tests/manager_execution_tests.rs b/ddk-manager/tests/manager_execution_tests.rs index c5b0171c..7939b79a 100644 --- a/ddk-manager/tests/manager_execution_tests.rs +++ b/ddk-manager/tests/manager_execution_tests.rs @@ -6,10 +6,9 @@ use ddk::chain::EsploraClient; use ddk_manager::payout_curve::PayoutFunctionPiece; use test_utils::*; -use bitcoincore_rpc::RpcApi; use ddk_manager::contract::{numerical_descriptor::DifferenceParams, Contract}; use ddk_manager::manager::Manager; -use ddk_manager::{Blockchain, Oracle, Storage}; +use ddk_manager::{Oracle, Storage}; use dlc_messages::oracle_msgs::OracleAttestation; use dlc_messages::{AcceptDlc, OfferDlc, SignDlc}; use dlc_messages::{CetAdaptorSignatures, Message}; @@ -19,8 +18,6 @@ use secp256k1_zkp::rand::{thread_rng, RngCore}; use secp256k1_zkp::{ecdsa::Signature, EcdsaAdaptorSignature}; use serde_json::from_str; use std::collections::HashMap; -use std::future::Future; -use std::pin::Pin; use std::sync::{ atomic::{AtomicBool, Ordering}, Arc, @@ -28,7 +25,7 @@ use std::sync::{ use test_utils::init_clients; use tokio::sync::mpsc::channel; use tokio::sync::Mutex; -use tokio::time::sleep; + #[derive(serde::Serialize, serde::Deserialize)] struct TestVectorPart { message: T, @@ -111,6 +108,7 @@ async fn numerical_common( payout_function_pieces_cb: F, difference_params: Option, manual_close: bool, + test_path: TestPath, ) where F: Fn(usize) -> Vec, { @@ -130,7 +128,7 @@ async fn numerical_common( false, ) .await, - TestPath::Close, + test_path, manual_close, ) .await; @@ -148,6 +146,7 @@ async fn numerical_polynomial_common( get_polynomial_payout_curve_pieces, difference_params, manual_close, + TestPath::Close, ) .await; } @@ -188,6 +187,7 @@ async fn numerical_common_diff_nb_digits( #[derive(Eq, PartialEq, Clone)] enum TestPath { + Splice, Close, Refund, BadAcceptCetSignature, @@ -211,7 +211,15 @@ async fn single_oracle_numerical_manual_test() { #[tokio::test] #[ignore] async fn single_oracle_numerical_hyperbola_test() { - numerical_common(1, 1, get_hyperbola_payout_curve_pieces, None, false).await; + numerical_common( + 1, + 1, + get_hyperbola_payout_curve_pieces, + None, + false, + TestPath::Close, + ) + .await; } #[tokio::test] @@ -512,6 +520,45 @@ async fn three_of_three_oracle_numerical_with_diff_diff_nb_digits_test() { numerical_common_diff_nb_digits(3, 3, Some(get_difference_params()), false, false).await; } +#[tokio::test] +#[ignore] +async fn single_funded_dlc_test() { + manager_execution_test( + get_single_funded_test_params(1, 1).await, + TestPath::Close, + false, + ) + .await; +} + +#[tokio::test] +#[ignore] +async fn single_oracle_numerical_splice_test_manual() { + numerical_common( + 1, + 1, + get_polynomial_payout_curve_pieces, + None, + true, + TestPath::Splice, + ) + .await; +} + +#[tokio::test] +#[ignore] +async fn single_oracle_numerical_splice_test() { + numerical_common( + 1, + 1, + get_polynomial_payout_curve_pieces, + None, + false, + TestPath::Splice, + ) + .await; +} + #[tokio::test] #[ignore] async fn two_of_five_oracle_numerical_with_diff_diff_nb_digits_test() { @@ -631,33 +678,19 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ } let mock_time = Arc::new(test_utils::MockTime {}); - test_utils::set_time((EVENT_MATURITY as u64) - 1); + // For splice tests, set time much earlier to keep original DLC far from maturity + let initial_time = if path == TestPath::Splice { + (EVENT_MATURITY as u64) - 3600 // 30 days before EVENT_MATURITY + } else { + (EVENT_MATURITY as u64) - 1 + }; + + test_utils::set_time(initial_time); let electrs = Arc::new(EsploraClient::new("http://localhost:30000", bitcoin::Network::Regtest).unwrap()); - let generate_blocks = |nb_blocks: u64| -> Pin + Send>> { - let electrs_clone = electrs.clone(); - let sink_clone = sink.clone(); - Box::pin(async move { - let prev_blockchain_height = electrs_clone.get_blockchain_height().await.unwrap(); - let sink_address = sink_clone - .get_new_address(None, None) - .expect("RPC Error") - .assume_checked(); - sink_clone - .generate_to_address(nb_blocks, &sink_address) - .expect("RPC Error"); - // Wait for electrs to have processed the new blocks - let mut cur_blockchain_height = prev_blockchain_height; - while cur_blockchain_height < prev_blockchain_height + nb_blocks { - sleep(std::time::Duration::from_millis(200)).await; - cur_blockchain_height = electrs_clone.get_blockchain_height().await.unwrap(); - } - }) - }; - - generate_blocks(6).await; + test_utils::generate_blocks(6, electrs.clone(), sink.clone()).await; refresh_wallet(&alice_wallet, 200000000).await; refresh_wallet(&bob_wallet, 200000000).await; @@ -814,7 +847,7 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ sync_receive.recv().await.expect("Error synchronizing"); assert_contract_state!(alice_manager_send, contract_id, FailedSign); } - TestPath::Close | TestPath::Refund => { + TestPath::Close | TestPath::Refund | TestPath::Splice => { alice_send .send(Some(Message::Accept(accept_msg))) .await @@ -833,26 +866,204 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ alice_wallet.sync().await.unwrap(); bob_wallet.sync().await.unwrap(); - generate_blocks(10).await; + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; periodic_check!(alice_manager_send, contract_id, Confirmed); periodic_check!(bob_manager_send, contract_id, Confirmed); if !manual_close { - test_utils::set_time((EVENT_MATURITY as u64) + 1); + // For splice tests, don't advance time (keep original DLC valid) + // For other tests, advance past maturity to allow close/refund + if path != TestPath::Splice { + test_utils::set_time((EVENT_MATURITY as u64) + 1); + } } - // Select the first one to close or refund randomly - let (first, second) = if thread_rng().next_u32() % 2 == 0 { - (alice_manager_send, bob_manager_send) - } else { - (bob_manager_send, alice_manager_send) - }; - alice_wallet.sync().await.unwrap(); bob_wallet.sync().await.unwrap(); match path { + TestPath::Splice => { + // Create splice DLC with maturity just in the future (1 second from current time) + // Original DLC stays far in the future, splice DLC can be closer + let splice_maturity = (EVENT_MATURITY + 1) as u32; // 1 second in the future + + let splice_test_params = if thread_rng().next_u32() % 2 == 0 { + get_splice_in_test_params_with_maturity( + test_params.oracles.clone(), + splice_maturity, + ) + .await + } else { + get_splice_out_test_params_with_maturity( + test_params.oracles.clone(), + splice_maturity, + ) + .await + }; + + // Send splice offer using the current confirmed contract (Bob as original offeror) + let splice_offer_msg = bob_manager_send + .lock() + .await + .send_splice_offer( + &splice_test_params.contract_input, + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(), + &contract_id, + ) + .await + .expect("Send splice offer error"); + + let splice_temporary_contract_id = splice_offer_msg.temporary_contract_id; + + bob_send + .send(Some(Message::Offer(splice_offer_msg))) + .await + .unwrap(); + + assert_contract_state!(bob_manager_send, splice_temporary_contract_id, Offered); + + sync_receive.recv().await.expect("Error synchronizing"); + + assert_contract_state!( + alice_manager_send, + splice_temporary_contract_id, + Offered + ); + + // Accept the splice offer + let (splice_contract_id, _, splice_accept_msg) = alice_manager_send + .lock() + .await + .accept_contract_offer(&splice_temporary_contract_id) + .await + .expect("Error accepting splice offer"); + + assert_contract_state!(alice_manager_send, splice_contract_id, Accepted); + + alice_send + .send(Some(Message::Accept(splice_accept_msg))) + .await + .unwrap(); + + sync_receive.recv().await.expect("Error synchronizing"); + + // The new contract is signed, but not confirmed yet + periodic_check!(bob_manager_send, splice_contract_id, Signed); + // The old contract is pre-closed + assert_contract_state!(bob_manager_send, contract_id, PreClosed); + + sync_receive.recv().await.expect("Error synchronizing"); + + // The new contract is signed, but not confirmed yet + assert_contract_state!(alice_manager_send, splice_contract_id, Signed); + // The old contract is pre-closed + assert_contract_state!(alice_manager_send, contract_id, PreClosed); + + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; + + periodic_check!(bob_manager_send, splice_contract_id, Confirmed); + periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + + if manual_close { + periodic_check!(bob_manager_send, splice_contract_id, Confirmed); + periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + + // Check that the old contract is closed now that the splice contract is confirmed + periodic_check!(bob_manager_send, contract_id, Closed); + periodic_check!(alice_manager_send, contract_id, Closed); + + let attestations = get_attestations(&splice_test_params).await; + let bob_close_contract = bob_manager_send + .lock() + .await + .close_confirmed_contract(&splice_contract_id, attestations) + .await + .expect("Error closing splice contract"); + + let bob_close_contract = match bob_close_contract { + Contract::PreClosed(c) => c, + _ => panic!("Invalid contract state {:?}", bob_close_contract), + }; + + let second_contract = alice_manager_send + .lock() + .await + .get_store() + .get_contract(&splice_contract_id) + .await + .unwrap() + .unwrap(); + + let signed = match second_contract { + Contract::Confirmed(s) => s, + _ => panic!("Invalid contract state: {:?}", second_contract), + }; + + alice_manager_send + .lock() + .await + .on_counterparty_close(&signed, bob_close_contract.signed_cet, 1) + .await + .expect("Error registering counterparty close"); + } else { + periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + periodic_check!(bob_manager_send, splice_contract_id, Confirmed); + + periodic_check!(alice_manager_send, contract_id, Closed); + periodic_check!(bob_manager_send, contract_id, Closed); + + test_utils::set_time(splice_maturity as u64 + 2); + + periodic_check!(alice_manager_send, splice_contract_id, PreClosed); + periodic_check!(bob_manager_send, splice_contract_id, PreClosed); + } + + test_utils::set_time(splice_maturity as u64 + 2); + + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; + + periodic_check!(bob_manager_send, splice_contract_id, Closed); + periodic_check!(alice_manager_send, splice_contract_id, Closed); + + periodic_check!(bob_manager_send, contract_id, Closed); + periodic_check!(alice_manager_send, contract_id, Closed); + + let original_contract = alice_manager_send + .lock() + .await + .get_store() + .get_contract(&contract_id) + .await + .unwrap() + .unwrap(); + let original_cet_txid = original_contract.get_cet_txid().unwrap(); + + let splice_dlc = alice_manager_send + .lock() + .await + .get_store() + .get_contract(&splice_contract_id) + .await + .unwrap() + .unwrap(); + let splice_fund_txid = splice_dlc.get_funding_txid().unwrap(); + + // Assert the the executed txn in the original contract is the same as the funding txn in the splice contract + assert_eq!(original_cet_txid, splice_fund_txid); + } TestPath::Close => { + // Select the first one to close or refund randomly + let (first, second) = if thread_rng().next_u32() % 2 == 0 { + (alice_manager_send, bob_manager_send) + } else { + (bob_manager_send, alice_manager_send) + }; + let case = thread_rng().next_u64() % 3; let blocks: Option = if case == 2 { Some(10) @@ -908,7 +1119,7 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ // mine blocks for the CET to be confirmed if let Some(b) = blocks { - generate_blocks(b as u64).await; + test_utils::generate_blocks(b as u64, electrs.clone(), sink.clone()).await; } alice_wallet.sync().await.unwrap(); @@ -925,6 +1136,12 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ } } TestPath::Refund => { + // Select the first one to close or refund randomly + let (first, second) = if thread_rng().next_u32() % 2 == 0 { + (alice_manager_send, bob_manager_send) + } else { + (bob_manager_send, alice_manager_send) + }; alice_wallet.sync().await.unwrap(); bob_wallet.sync().await.unwrap(); periodic_check!(first, contract_id, Confirmed); @@ -935,7 +1152,7 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ ((EVENT_MATURITY + ddk_manager::manager::REFUND_DELAY) as u64) + 1, ); - generate_blocks(10).await; + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; alice_wallet.sync().await.unwrap(); bob_wallet.sync().await.unwrap(); @@ -944,7 +1161,7 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ // Randomly check with or without having the Refund mined. if thread_rng().next_u32() % 2 == 0 { - generate_blocks(1).await; + test_utils::generate_blocks(1, electrs.clone(), sink.clone()).await; } alice_wallet.sync().await.unwrap(); diff --git a/ddk-manager/tests/splice_execution_tests.rs b/ddk-manager/tests/splice_execution_tests.rs new file mode 100644 index 00000000..2c9d2182 --- /dev/null +++ b/ddk-manager/tests/splice_execution_tests.rs @@ -0,0 +1,452 @@ +extern crate bitcoincore_rpc; +extern crate bitcoincore_rpc_json; +extern crate ddk_manager; + +#[macro_use] +#[allow(dead_code)] +mod test_utils; + +use bitcoin::Amount; +use bitcoincore_rpc::{Client, RpcApi}; +use ddk::chain::EsploraClient; +use ddk::oracle::memory::MemoryOracle; +use ddk::storage::memory::MemoryStorage; +use ddk::wallet::DlcDevKitWallet; +use ddk_manager::contract::Contract; +use ddk_manager::manager::Manager; +use ddk_manager::{Blockchain, CachedContractSignerProvider, Oracle, SimpleSigner, Wallet}; +use ddk_manager::{ContractId, Storage}; +use dlc_messages::Message; +use lightning::util::ser::Writeable; +use secp256k1_zkp::rand::{thread_rng, Fill}; +use secp256k1_zkp::PublicKey; +use std::collections::HashMap; +use std::sync::{ + atomic::{AtomicBool, Ordering}, + Arc, +}; +use test_utils::*; +use tokio::sync::{mpsc::channel, Mutex}; + +type TestManager = Arc< + Mutex< + Manager< + Arc, + Arc, SimpleSigner>>, + Arc, + Arc, + Arc, + Arc, + Arc, + SimpleSigner, + >, + >, +>; + +#[derive(Eq, PartialEq, Clone)] +enum SpliceTestPath { + SpliceIn, + SpliceOut, +} + +pub struct SplicedInput { + pub offer_public_key: PublicKey, + pub accept_public_key: PublicKey, + pub alice_public_key: PublicKey, + pub alice_store: Arc, + pub bob_public_key: PublicKey, + pub bob_store: Arc, + pub contract_id: ContractId, + pub alice_manager: TestManager, + pub bob_manager: TestManager, + pub oracles: MemoryOracle, + pub electrs: Arc, + pub sink_rpc: Client, +} + +async fn generate_blocks(nb_blocks: u64, electrs: &EsploraClient, sink_rpc: &Client) { + let prev_blockchain_height = electrs.get_blockchain_height().await.unwrap(); + + let sink_address = sink_rpc + .get_new_address(None, None) + .expect("RPC Error") + .assume_checked(); + sink_rpc + .generate_to_address(nb_blocks, &sink_address) + .expect("RPC Error"); + + // Wait for electrs to have processed the new blocks + let mut cur_blockchain_height = prev_blockchain_height; + while cur_blockchain_height < prev_blockchain_height + nb_blocks { + std::thread::sleep(std::time::Duration::from_millis(200)); + cur_blockchain_height = electrs.get_blockchain_height().await.unwrap(); + } +} + +async fn create_spliced_input() -> SplicedInput { + env_logger::try_init().ok(); + let clients = init_clients().await; + + let mut alice_oracles = HashMap::with_capacity(1); + let mut bob_oracles = HashMap::with_capacity(1); + let test_params = get_single_funded_test_params(1, 1).await; + for oracle in test_params.oracles.clone() { + let oracle = Arc::new(oracle); + alice_oracles.insert(oracle.get_public_key(), Arc::clone(&oracle)); + bob_oracles.insert(oracle.get_public_key(), Arc::clone(&oracle)); + } + + let alice_store = Arc::new(MemoryStorage::new()); + let bob_store = Arc::new(MemoryStorage::new()); + let mock_time = Arc::new(MockTime {}); + set_time((EVENT_MATURITY as u64) - 1); + + let electrs = + Arc::new(EsploraClient::new("http://localhost:30000", bitcoin::Network::Regtest).unwrap()); + + let mut alice_bytes = [0u8; 32]; + alice_bytes.try_fill(&mut thread_rng()).unwrap(); + + let mut bob_bytes = [0u8; 32]; + bob_bytes.try_fill(&mut thread_rng()).unwrap(); + + let alice_wallet = Arc::new( + DlcDevKitWallet::new( + &alice_bytes, + "http://localhost:30000", + bitcoin::Network::Regtest, + alice_store.clone(), + ) + .await + .unwrap(), + ); + + let bob_wallet = Arc::new( + DlcDevKitWallet::new( + &bob_bytes, + "http://localhost:30000", + bitcoin::Network::Regtest, + bob_store.clone(), + ) + .await + .unwrap(), + ); + + let alice_fund_address = alice_wallet.get_new_address().await.unwrap(); + let bob_fund_address = bob_wallet.get_new_address().await.unwrap(); + + clients + .4 + .send_to_address( + &alice_fund_address, + Amount::from_btc(2.0).unwrap(), + None, + None, + None, + None, + None, + None, + ) + .unwrap(); + + clients + .4 + .send_to_address( + &bob_fund_address, + Amount::from_btc(2.0).unwrap(), + None, + None, + None, + None, + None, + None, + ) + .unwrap(); + + generate_blocks(6, &electrs, &clients.4).await; + + refresh_wallet(&alice_wallet, Amount::from_btc(2.0).unwrap().to_sat()).await; + refresh_wallet(&bob_wallet, Amount::from_btc(2.0).unwrap().to_sat()).await; + + let alice_manager = Arc::new(Mutex::new( + Manager::new( + Arc::clone(&alice_wallet), + Arc::clone(&alice_wallet), + Arc::clone(&electrs), + alice_store.clone(), + alice_oracles, + Arc::clone(&mock_time), + Arc::clone(&electrs), + ) + .await + .unwrap(), + )); + + let bob_manager = Arc::new(Mutex::new( + Manager::new( + Arc::clone(&bob_wallet), + Arc::clone(&bob_wallet), + Arc::clone(&electrs), + bob_store.clone(), + bob_oracles, + Arc::clone(&mock_time), + Arc::clone(&electrs), + ) + .await + .unwrap(), + )); + // Use consistent public keys like in manager execution tests + let alice_pubkey: PublicKey = + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(); + let bob_pubkey: PublicKey = + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(); + + let alice_offer = alice_manager + .lock() + .await + .send_offer(&test_params.contract_input, bob_pubkey) + .await + .expect("error sending offer"); + + let alice_offer_msg = Message::Offer(alice_offer.clone()); + + let _bob_recv_offer = bob_manager + .lock() + .await + .on_dlc_message(&alice_offer_msg, alice_pubkey) + .await + .expect("error receiving offer"); + + let (contract_id, alice_pubkey_from_accept, bob_accept_msg) = bob_manager + .lock() + .await + .accept_contract_offer(&alice_offer.temporary_contract_id) + .await + .unwrap(); + + let bob_accept_msg = Message::Accept(bob_accept_msg); + + let alice_recv_accept = alice_manager + .lock() + .await + .on_dlc_message(&bob_accept_msg, bob_pubkey) + .await + .expect("error receiving accept") + .expect("to create a sign"); + + let _dlc_managerbob_recv_sign = bob_manager + .lock() + .await + .on_dlc_message(&alice_recv_accept, alice_pubkey_from_accept) + .await + .expect("to receive sign message"); + + generate_blocks(10, &electrs, &clients.4).await; + + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + + alice_manager + .lock() + .await + .periodic_check(false) + .await + .expect("alice to update the contract"); + bob_manager + .lock() + .await + .periodic_check(false) + .await + .expect("bob to update the contract"); + + match alice_store + .get_contract(&contract_id.clone()) + .await + .unwrap() + .expect("contract to exist") + { + Contract::Confirmed(_) => (), + _ => panic!("contract to be confirmed"), + }; + + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + + SplicedInput { + offer_public_key: alice_pubkey, + accept_public_key: bob_pubkey, + alice_public_key: alice_pubkey, + bob_public_key: bob_pubkey, + alice_store: Arc::clone(&alice_store), + bob_store: Arc::clone(&bob_store), + contract_id, + alice_manager: alice_manager, + bob_manager: bob_manager, + oracles: test_params.oracles[0].clone(), + electrs: Arc::clone(&electrs), + sink_rpc: clients.4, + } +} + +async fn splice_execution_test(spliced_input: SplicedInput, test_path: SpliceTestPath) { + let (alice_send, mut bob_receive) = channel::>(100); + let (bob_send, mut alice_receive) = channel::>(100); + let (sync_send, mut sync_receive) = channel::<()>(100); + let alice_sync_send = sync_send.clone(); + let bob_sync_send = sync_send; + + let alice_expect_error = Arc::new(AtomicBool::new(false)); + let bob_expect_error = Arc::new(AtomicBool::new(false)); + + let alice_expect_error_loop = alice_expect_error.clone(); + let bob_expect_error_loop = bob_expect_error.clone(); + + let alice_manager_loop = Arc::clone(&spliced_input.alice_manager); + let alice_manager_send = Arc::clone(&spliced_input.alice_manager); + let bob_manager_loop = Arc::clone(&spliced_input.bob_manager); + let bob_manager_send = Arc::clone(&spliced_input.bob_manager); + + let alice_send_loop = alice_send.clone(); + let bob_send_loop = bob_send.clone(); + + let msg_callback = |_msg: &Message| {}; + + let alice_handle = receive_loop!( + alice_receive, + alice_manager_loop, + alice_send_loop, + alice_expect_error_loop, + alice_sync_send, + Some, + msg_callback + ); + + let bob_handle = receive_loop!( + bob_receive, + bob_manager_loop, + bob_send_loop, + bob_expect_error_loop, + bob_sync_send, + Some, + msg_callback + ); + + let test_params = match test_path { + SpliceTestPath::SpliceIn => { + get_splice_in_test_params(vec![spliced_input.oracles.clone()]).await + } + SpliceTestPath::SpliceOut => { + get_splice_out_test_params(vec![spliced_input.oracles.clone()]).await + } + }; + + let alice_splice_offer = alice_manager_send + .lock() + .await + .send_splice_offer( + &test_params.contract_input, + spliced_input.bob_public_key, + &spliced_input.contract_id, + ) + .await + .expect("error sending splice offer"); + + let temporary_contract_id = alice_splice_offer.temporary_contract_id; + alice_send + .send(Some(Message::Offer(alice_splice_offer.clone()))) + .await + .unwrap(); + + assert_contract_state!(alice_manager_send, temporary_contract_id, Offered); + + sync_receive.recv().await.expect("Error synchronizing"); + + assert_contract_state!(bob_manager_send, temporary_contract_id, Offered); + + let (contract_id, _, accept_msg) = bob_manager_send + .lock() + .await + .accept_contract_offer(&temporary_contract_id) + .await + .expect("error accepting splice offer"); + + assert_contract_state!(bob_manager_send, contract_id, Accepted); + + bob_send + .send(Some(Message::Accept(accept_msg))) + .await + .unwrap(); + + sync_receive.recv().await.expect("Error synchronizing"); + + assert_contract_state!(alice_manager_send, contract_id, Signed); + + sync_receive.recv().await.expect("Error synchronizing"); + + assert_contract_state!(bob_manager_send, contract_id, Signed); + + generate_blocks(10, &spliced_input.electrs, &spliced_input.sink_rpc).await; + + // Sync wallets before periodic checks + // alice_wallet.sync().await.unwrap(); + // bob_wallet.sync().await.unwrap(); + + alice_manager_send + .lock() + .await + .periodic_check(false) + .await + .expect("alice to update the contract"); + bob_manager_send + .lock() + .await + .periodic_check(false) + .await + .expect("bob to update the contract"); + + assert_contract_state!(alice_manager_send, contract_id, Confirmed); + assert_contract_state!(bob_manager_send, contract_id, Confirmed); + + let contract = match spliced_input + .alice_store + .get_contract(&contract_id) + .await + .unwrap() + .expect("contract to exist") + { + Contract::Confirmed(c) => c, + _ => panic!("contract should be in a confirmed state"), + }; + + let fund_tx = contract.accepted_contract.dlc_transactions.fund.clone(); + + let _tx = spliced_input + .electrs + .get_transaction(&fund_tx.compute_txid()) + .await + .expect("to have fund tx"); + + alice_send.send(None).await.unwrap(); + bob_send.send(None).await.unwrap(); + + alice_handle.await.unwrap(); + bob_handle.await.unwrap(); +} + +#[tokio::test] +#[ignore] +async fn splice_in_test() { + let spliced_input = create_spliced_input().await; + splice_execution_test(spliced_input, SpliceTestPath::SpliceIn).await; +} + +#[tokio::test] +#[ignore] +async fn splice_out_test() { + let spliced_input = create_spliced_input().await; + splice_execution_test(spliced_input, SpliceTestPath::SpliceOut).await; +} diff --git a/ddk-manager/tests/test_utils.rs b/ddk-manager/tests/test_utils.rs index 412f5161..d32354f4 100644 --- a/ddk-manager/tests/test_utils.rs +++ b/ddk-manager/tests/test_utils.rs @@ -6,7 +6,7 @@ use bitcoin::{ }; use bitcoincore_rpc::{Auth, Client, RpcApi}; use bitcoincore_rpc_json::AddressType; -use ddk::wallet::DlcDevKitWallet; +use ddk::{chain::EsploraClient, wallet::DlcDevKitWallet}; use ddk::{oracle::memory::MemoryOracle, storage::memory::MemoryStorage}; use ddk_manager::payout_curve::{ PayoutFunction, PayoutFunctionPiece, PayoutPoint, PolynomialPayoutCurvePiece, RoundingInterval, @@ -317,6 +317,223 @@ pub async fn get_enum_test_params( } } +pub fn get_splice_in_enum_contract_descriptor() -> ContractDescriptor { + let outcome_payouts: Vec<_> = enum_outcomes() + .iter() + .enumerate() + .map(|(i, x)| { + let payout = if i % 2 == 0 { + Payout { + offer: TOTAL_COLLATERAL + Amount::from_sat(50_000_000), + accept: Amount::ZERO, + } + } else { + Payout { + offer: Amount::ZERO, + accept: TOTAL_COLLATERAL + Amount::from_sat(50_000_000), + } + }; + EnumerationPayout { + outcome: x.to_owned(), + payout, + } + }) + .collect(); + ContractDescriptor::Enum(EnumDescriptor { outcome_payouts }) +} + +pub fn get_splice_out_enum_contract_descriptor() -> ContractDescriptor { + let outcome_payouts: Vec<_> = enum_outcomes() + .iter() + .enumerate() + .map(|(i, x)| { + let payout = if i % 2 == 0 { + Payout { + offer: TOTAL_COLLATERAL - Amount::from_sat(50_000_000), + accept: Amount::ZERO, + } + } else { + Payout { + offer: Amount::ZERO, + accept: TOTAL_COLLATERAL - Amount::from_sat(50_000_000), + } + }; + EnumerationPayout { + outcome: x.to_owned(), + payout, + } + }) + .collect(); + ContractDescriptor::Enum(EnumDescriptor { outcome_payouts }) +} + +pub async fn get_splice_in_test_params(oracles: Vec) -> TestParams { + // Default to a maturity time shortly in the future + let current_time = MOCK_TIME.with(|f| *f.borrow()); + let splice_maturity = (current_time + 60) as u32; // 60 seconds in the future + get_splice_in_test_params_with_maturity(oracles, splice_maturity).await +} + +pub async fn get_splice_in_test_params_with_maturity( + oracles: Vec, + maturity: u32, +) -> TestParams { + let splice_event_id = format!("{}-splice-in", EVENT_ID); + + // Create enum announcements for the splice event with future maturity + for oracle in &oracles { + oracle + .oracle + .create_enum_event(splice_event_id.clone(), enum_outcomes(), maturity) + .await + .unwrap(); + } + + // Sign the splice enum events (similar to get_enum_oracles) + let active_oracles = select_active_oracles(oracles.len(), 1); // threshold = 1 for splice + let outcomes = enum_outcomes(); + let outcome = outcomes[(thread_rng().next_u32() as usize) % outcomes.len()].clone(); + for index in active_oracles { + oracles + .get(index) + .unwrap() + .oracle + .sign_enum_event(splice_event_id.clone(), outcome.clone()) + .await + .unwrap(); + } + + let contract_descriptor = get_splice_in_enum_contract_descriptor(); + let contract_info = ContractInputInfo { + contract_descriptor, + oracles: OracleInput { + public_keys: oracles.iter().map(|x| x.get_public_key()).collect(), + event_id: splice_event_id, + threshold: 1, + }, + }; + + let contract_input = ContractInput { + offer_collateral: TOTAL_COLLATERAL + Amount::from_sat(50_000_000), + accept_collateral: Amount::ZERO, + fee_rate: 2, + contract_infos: vec![contract_info], + }; + + TestParams { + oracles, + contract_input, + } +} + +pub async fn get_splice_out_test_params(oracles: Vec) -> TestParams { + // Default to a maturity time shortly in the future + let current_time = MOCK_TIME.with(|f| *f.borrow()); + let splice_maturity = (current_time + 60) as u32; // 60 seconds in the future + get_splice_out_test_params_with_maturity(oracles, splice_maturity).await +} + +pub async fn get_splice_out_test_params_with_maturity( + oracles: Vec, + maturity: u32, +) -> TestParams { + let splice_event_id = format!("{}-splice-out", EVENT_ID); + + // Create enum announcements for the splice event with future maturity + for oracle in &oracles { + oracle + .oracle + .create_enum_event(splice_event_id.clone(), enum_outcomes(), maturity) + .await + .unwrap(); + } + + // Sign the splice enum events (similar to get_enum_oracles) + let active_oracles = select_active_oracles(oracles.len(), 1); // threshold = 1 for splice + let outcomes = enum_outcomes(); + let outcome = outcomes[(thread_rng().next_u32() as usize) % outcomes.len()].clone(); + for index in active_oracles { + oracles + .get(index) + .unwrap() + .oracle + .sign_enum_event(splice_event_id.clone(), outcome.clone()) + .await + .unwrap(); + } + + let contract_descriptor = get_splice_out_enum_contract_descriptor(); + let contract_info = ContractInputInfo { + contract_descriptor, + oracles: OracleInput { + public_keys: oracles.iter().map(|x| x.get_public_key()).collect(), + event_id: splice_event_id, + threshold: 1, + }, + }; + + let contract_input = ContractInput { + offer_collateral: TOTAL_COLLATERAL - Amount::from_sat(50_000_000), + accept_collateral: Amount::ZERO, + fee_rate: 2, + contract_infos: vec![contract_info], + }; + + TestParams { + oracles, + contract_input, + } +} + +pub fn new_oracle_test_params(oracles: Vec) -> TestParams { + let contract_descriptor = get_splice_in_enum_contract_descriptor(); + let contract_info = ContractInputInfo { + contract_descriptor, + oracles: OracleInput { + public_keys: oracles.iter().map(|x| x.get_public_key()).collect(), + event_id: EVENT_ID.to_owned(), + threshold: 1, + }, + }; + + let contract_input = ContractInput { + offer_collateral: TOTAL_COLLATERAL + Amount::from_sat(50_000_000), + accept_collateral: Amount::ZERO, + fee_rate: 2, + contract_infos: vec![contract_info], + }; + + TestParams { + oracles, + contract_input, + } +} + +pub async fn get_single_funded_test_params(nb_oracles: usize, threshold: usize) -> TestParams { + let oracles = get_enum_oracles(nb_oracles, threshold).await; + let contract_descriptor = get_enum_contract_descriptor(); + let contract_info = ContractInputInfo { + contract_descriptor, + oracles: OracleInput { + public_keys: oracles.iter().map(|x| x.get_public_key()).collect(), + event_id: EVENT_ID.to_owned(), + threshold: 1, + }, + }; + + let contract_input = ContractInput { + offer_collateral: TOTAL_COLLATERAL, + accept_collateral: Amount::ZERO, + fee_rate: 5, + contract_infos: vec![contract_info], + }; + + TestParams { + oracles, + contract_input, + } +} + pub fn get_polynomial_payout_curve_pieces(min_nb_digits: usize) -> Vec { vec![ PayoutFunctionPiece::PolynomialPayoutCurvePiece( @@ -673,6 +890,24 @@ pub async fn create_and_fund_wallet() -> (DlcDevKitWallet, Arc) { (wallet, memory_storage) } +pub async fn generate_blocks(nb_blocks: u64, electrs: Arc, sink: Arc) { + let sink_clone = sink.clone(); + let prev_blockchain_height = electrs.async_client.get_height().await.unwrap(); + let sink_address = sink_clone + .get_new_address(None, None) + .expect("RPC Error") + .assume_checked(); + sink_clone + .generate_to_address(nb_blocks, &sink_address) + .expect("RPC Error"); + // Wait for electrs to have processed the new blocks + let mut cur_blockchain_height = prev_blockchain_height; + while cur_blockchain_height < prev_blockchain_height + nb_blocks as u32 { + tokio::time::sleep(std::time::Duration::from_millis(200)).await; + cur_blockchain_height = electrs.async_client.get_height().await.unwrap(); + } +} + /// Utility function used to parse hex into a target u8 buffer. Returns /// the number of bytes converted or an error if it encounters an invalid /// character or unexpected end of string. From 4603b903f1039ab13d7c4ea799c0c2e527eb04e5 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Tue, 29 Jul 2025 08:13:19 -0400 Subject: [PATCH 3/9] dep: add kormir to workspace --- Cargo.lock | 93 +---- Cargo.toml | 2 +- ddk/Cargo.toml | 4 +- ddk/src/oracle/p2p_derivatives.rs | 25 -- dlc-trie/src/digit_trie.rs | 6 +- dlc-trie/src/multi_trie.rs | 4 +- kormir/.gitignore | 2 + kormir/CHANGELOG.md | 27 ++ kormir/Cargo.toml | 29 ++ kormir/src/error.rs | 33 ++ kormir/src/lib.rs | 667 ++++++++++++++++++++++++++++++ kormir/src/nostr_events.rs | 30 ++ kormir/src/storage.rs | 147 +++++++ 13 files changed, 959 insertions(+), 110 deletions(-) create mode 100644 kormir/.gitignore create mode 100644 kormir/CHANGELOG.md create mode 100644 kormir/Cargo.toml create mode 100644 kormir/src/error.rs create mode 100644 kormir/src/lib.rs create mode 100644 kormir/src/nostr_events.rs create mode 100644 kormir/src/storage.rs diff --git a/Cargo.lock b/Cargo.lock index 05385437..0161a528 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -963,9 +963,9 @@ dependencies = [ "chrono", "ddk-manager", "ddk-payouts", - "dlc 0.7.1", - "dlc-messages 0.7.1", - "dlc-trie 0.7.1", + "dlc", + "dlc-messages", + "dlc-trie", "hex", "hmac", "kormir", @@ -998,9 +998,9 @@ dependencies = [ "bitcoincore-rpc-json", "criterion", "ddk", - "dlc 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", - "dlc-messages 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", - "dlc-trie 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", + "dlc", + "dlc-messages", + "dlc-trie", "env_logger 0.9.3", "futures", "hex-conservative 0.1.2", @@ -1024,8 +1024,8 @@ dependencies = [ "ddk", "ddk-manager", "ddk-payouts", - "dlc 0.7.1", - "dlc-messages 0.7.1", + "dlc", + "dlc-messages", "hex", "homedir", "inquire", @@ -1047,9 +1047,9 @@ dependencies = [ "anyhow", "bitcoin", "ddk-manager", - "dlc 0.7.1", - "dlc-messages 0.7.1", - "dlc-trie 0.7.1", + "dlc", + "dlc-messages", + "dlc-trie", "serde", "serde_json", "thiserror 2.0.12", @@ -1099,85 +1099,25 @@ dependencies = [ "serde", ] -[[package]] -name = "dlc" -version = "0.7.1" -source = "git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates#1cdefcafc422ed0609327634a75bc00dc67d1fd7" -dependencies = [ - "bitcoin", - "miniscript", - "secp256k1-sys", - "secp256k1-zkp", - "serde", -] - -[[package]] -name = "dlc" -version = "0.7.1" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#d215bc76bcaa14c5662e6a98b6ab14bf27925417" -dependencies = [ - "bitcoin", - "miniscript", - "secp256k1-sys", - "secp256k1-zkp", - "serde", -] - [[package]] name = "dlc-messages" version = "0.7.1" dependencies = [ "bitcoin", - "dlc 0.7.1", - "dlc-messages 0.7.1", + "dlc", + "dlc-messages", "lightning", "secp256k1-zkp", "serde", "serde_json", ] -[[package]] -name = "dlc-messages" -version = "0.7.1" -source = "git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates#1cdefcafc422ed0609327634a75bc00dc67d1fd7" -dependencies = [ - "bitcoin", - "dlc 0.7.1 (git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates)", - "lightning", - "secp256k1-zkp", - "serde", -] - -[[package]] -name = "dlc-messages" -version = "0.7.1" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#d215bc76bcaa14c5662e6a98b6ab14bf27925417" -dependencies = [ - "bitcoin", - "dlc 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", - "lightning", - "secp256k1-zkp", - "serde", -] - [[package]] name = "dlc-trie" version = "0.7.1" dependencies = [ "bitcoin", - "dlc 0.7.1", - "rayon", - "secp256k1-zkp", - "serde", -] - -[[package]] -name = "dlc-trie" -version = "0.7.1" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc#d215bc76bcaa14c5662e6a98b6ab14bf27925417" -dependencies = [ - "bitcoin", - "dlc 0.7.1 (git+https://github.com/bennyhodl/rust-dlc?branch=single-funded-dlc)", + "dlc", "rayon", "secp256k1-zkp", "serde", @@ -2067,14 +2007,15 @@ version = "0.4.4" dependencies = [ "base64 0.13.1", "bitcoin", - "dlc 0.7.1 (git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates)", - "dlc-messages 0.7.1 (git+https://github.com/bennyhodl/dlcdevkit?branch=fork-rust-dlc-crates)", + "dlc", + "dlc-messages", "hex", "lightning", "log", "nostr", "secp256k1-zkp", "serde", + "tokio", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e9385222..14dd03b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "2" -members = ["ddk", "dlc", "dlc-messages", "dlc-trie", "payouts", "ddk-node", "ddk-manager"] +members = ["ddk", "dlc", "dlc-messages", "dlc-trie", "payouts", "ddk-node", "ddk-manager", "kormir"] diff --git a/ddk/Cargo.toml b/ddk/Cargo.toml index 8930f916..b69cabfd 100644 --- a/ddk/Cargo.toml +++ b/ddk/Cargo.toml @@ -59,9 +59,7 @@ lightning-net-tokio = { version = "0.0.125", optional = true } # oracle feature reqwest = { version = "0.12.9", features = ["json"], optional = true } -# kormir = "0.4.4" -kormir = { path = "../../kormir/kormir" } -# kormir = { git = "https://github.com/bennyhodl/kormir", branch = "rust-dlc-bitcoin-amount" } +kormir = { path = "../kormir" } hmac = "0.12.1" sha2 = "0.10" nostr-database = { version = "0.40.0", optional = true } diff --git a/ddk/src/oracle/p2p_derivatives.rs b/ddk/src/oracle/p2p_derivatives.rs index 728c72a3..3f44239c 100644 --- a/ddk/src/oracle/p2p_derivatives.rs +++ b/ddk/src/oracle/p2p_derivatives.rs @@ -21,31 +21,6 @@ struct PublicKeyResponse { public_key: XOnlyPublicKey, } -#[derive(serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct EventDescriptor { - base: u16, - is_signed: bool, - unit: String, - precision: i32, -} - -#[derive(serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct Event { - nonces: Vec, - event_maturity: DateTime, - event_id: String, - event_descriptor: EventDescriptor, -} - -#[derive(serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "camelCase")] -struct AnnoucementResponse { - oracle_public_key: XOnlyPublicKey, - oracle_event: Event, -} - #[derive(serde::Deserialize, serde::Serialize)] #[serde(rename_all = "camelCase")] struct AttestationResponse { diff --git a/dlc-trie/src/digit_trie.rs b/dlc-trie/src/digit_trie.rs index 6f035a4d..ca657c86 100644 --- a/dlc-trie/src/digit_trie.rs +++ b/dlc-trie/src/digit_trie.rs @@ -395,15 +395,15 @@ impl DigitTrie { } /// Lookup for nodes whose path is either equal or a prefix of `path`. - pub fn look_up(&self, path: &[usize]) -> Option>> { + pub fn look_up(&'_ self, path: &[usize]) -> Option>> { self.look_up_internal(self.root, path) } fn look_up_internal( - &self, + &'_ self, cur_index: Option, path: &[usize], - ) -> Option>> { + ) -> Option>> { match cur_index { None => None, Some(cur_index) => match &self.store[cur_index] { diff --git a/dlc-trie/src/multi_trie.rs b/dlc-trie/src/multi_trie.rs index 41f5f9dc..1383b7be 100644 --- a/dlc-trie/src/multi_trie.rs +++ b/dlc-trie/src/multi_trie.rs @@ -46,14 +46,14 @@ pub(crate) struct MultiTrieIterator<'a, T> { cur_path: Vec<(usize, Vec)>, } -fn create_node_iterator(node: &MultiTrieNode) -> DigitTrieIter> { +fn create_node_iterator(node: &'_ MultiTrieNode) -> DigitTrieIter<'_, Vec> { match node { Node::Node(d_trie) => DigitTrieIter::new(d_trie), _ => unreachable!(), } } -fn create_leaf_iterator(node: &MultiTrieNode) -> DigitTrieIter { +fn create_leaf_iterator(node: &'_ MultiTrieNode) -> DigitTrieIter<'_, T> { match node { Node::Leaf(d_trie) => DigitTrieIter::new(d_trie), _ => unreachable!(), diff --git a/kormir/.gitignore b/kormir/.gitignore new file mode 100644 index 00000000..96ef6c0b --- /dev/null +++ b/kormir/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/kormir/CHANGELOG.md b/kormir/CHANGELOG.md new file mode 100644 index 00000000..14934118 --- /dev/null +++ b/kormir/CHANGELOG.md @@ -0,0 +1,27 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.4.2](https://github.com/bennyhodl/kormir/compare/kormir-v0.4.1...kormir-v0.4.2) - 2025-01-17 + +### Other + +- return the oracle info struct in kormir-server + +## [0.3.2](https://github.com/bennyhodl/kormir/compare/kormir-v0.3.1...kormir-v0.3.2) - 2024-11-27 + +### Other + +- use ddk versions of rust-dlc +- async ddk + +## [0.3.1](https://github.com/bennyhodl/kormir/compare/kormir-v0.3.0...kormir-v0.3.1) - 2024-11-03 + +### Other + +- release plz diff --git a/kormir/Cargo.toml b/kormir/Cargo.toml new file mode 100644 index 00000000..ec81c4b4 --- /dev/null +++ b/kormir/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "kormir" +version = "0.4.4" +edition = "2021" +authors = ["benthecarman ", "benny b "] +description = "Oracle implementation for DLCs" +license = "MIT" +documentation = "https://docs.rs/kormir" +homepage = "https://github.com/bennyhodl/kormir" +repository = "https://github.com/bennyhodl/kormir" + +[features] +default = [] +nostr = ["dep:nostr", "dep:base64"] + +[dependencies] +bitcoin = { version = "0.32.2", features = ["serde"] } +dlc = { path = "../dlc", features = ["use-serde"] } +dlc-messages = { path = "../dlc-messages", features = [ "use-serde"] } +lightning = "0.0.125" +log = "0.4.22" +nostr = { version = "0.40.0", optional = true } +base64 = { version = "0.13.1", optional = true } +serde = "1.0" +secp256k1-zkp = "0.11" +hex = "0.4.3" + +[dev-dependencies] +tokio = { version = "1.11.0", features = ["full"] } diff --git a/kormir/src/error.rs b/kormir/src/error.rs new file mode 100644 index 00000000..162a8e07 --- /dev/null +++ b/kormir/src/error.rs @@ -0,0 +1,33 @@ +use std::fmt::{Display, Formatter}; + +/// Kormir error type +#[derive(Debug, Clone)] +pub enum Error { + /// Invalid argument given + InvalidArgument, + /// Attempted to sign an event that was already signed + EventAlreadySigned, + /// Event data was not found + NotFound, + /// The storage failed to read/save the data + StorageFailure, + /// User gave an invalid outcome + InvalidOutcome, + /// An error that should never happen, if it does it's a bug + Internal, +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + Error::InvalidArgument => write!(f, "Invalid argument given"), + Error::EventAlreadySigned => write!(f, "Event already signed"), + Error::NotFound => write!(f, "Event data not found"), + Error::StorageFailure => write!(f, "Storage failure"), + Error::InvalidOutcome => write!(f, "Invalid outcome"), + Error::Internal => write!(f, "Internal error"), + } + } +} + +impl std::error::Error for Error {} diff --git a/kormir/src/lib.rs b/kormir/src/lib.rs new file mode 100644 index 00000000..61dfa54b --- /dev/null +++ b/kormir/src/lib.rs @@ -0,0 +1,667 @@ +#![allow(async_fn_in_trait)] + +pub mod error; +#[cfg(feature = "nostr")] +pub mod nostr_events; +pub mod storage; + +use crate::error::Error; +use crate::storage::Storage; +use bitcoin::bip32::{ChildNumber, DerivationPath, Xpriv}; +use bitcoin::hashes::{sha256, Hash}; +use bitcoin::key::XOnlyPublicKey; +use bitcoin::secp256k1::{All, Message, Secp256k1, SecretKey}; +use bitcoin::Network; +use secp256k1_zkp::Keypair; +use std::str::FromStr; + +pub use bitcoin; +pub use bitcoin::secp256k1::schnorr::Signature; +use dlc_messages::oracle_msgs::DigitDecompositionEventDescriptor; +pub use dlc_messages::oracle_msgs::{ + EnumEventDescriptor, EventDescriptor, OracleAnnouncement, OracleAttestation, OracleEvent, +}; +pub use lightning; +pub use lightning::util::ser::{Readable, Writeable}; +#[cfg(feature = "nostr")] +pub use nostr; + +// first key for taproot address +const SIGNING_KEY_PATH: &str = "m/86'/0'/0'/0/0"; + +#[derive(Debug, Clone)] +pub struct Oracle { + pub storage: S, + key_pair: Keypair, + nonce_xpriv: Xpriv, + secp: Secp256k1, +} + +impl Oracle { + pub fn new(storage: S, signing_key: SecretKey, nonce_xpriv: Xpriv) -> Self { + let secp = Secp256k1::new(); + Self { + storage, + key_pair: Keypair::from_secret_key(&secp, &signing_key), + nonce_xpriv, + secp, + } + } + + pub fn from_xpriv(storage: S, xpriv: Xpriv) -> Result { + let secp = Secp256k1::new(); + + let signing_key = derive_signing_key(&secp, xpriv)?; + Self::from_signing_key(storage, signing_key) + } + + pub fn from_signing_key(storage: S, signing_key: SecretKey) -> Result { + let secp = Secp256k1::new(); + + let xpriv_bytes = sha256::Hash::hash(&signing_key.secret_bytes()).to_byte_array(); + let nonce_xpriv = + Xpriv::new_master(Network::Bitcoin, &xpriv_bytes).map_err(|_| Error::Internal)?; + + Ok(Self { + storage, + key_pair: Keypair::from_secret_key(&secp, &signing_key), + nonce_xpriv, + secp, + }) + } + + pub fn public_key(&self) -> XOnlyPublicKey { + self.key_pair.x_only_public_key().0 + } + + /// Returns the keys for the oracle, used for Nostr. + #[cfg(feature = "nostr")] + pub fn nostr_keys(&self) -> nostr::Keys { + let sec = nostr::key::SecretKey::from_slice(&self.key_pair.secret_key().secret_bytes()[..]) + .expect("just converting types"); + nostr::Keys::new(sec) + } + + fn get_nonce_key(&self, index: u32) -> SecretKey { + self.nonce_xpriv + .derive_priv( + &self.secp, + &[ChildNumber::from_hardened_idx(index).unwrap()], + ) + .unwrap() + .private_key + } + + pub async fn create_enum_event( + &self, + event_id: String, + outcomes: Vec, + event_maturity_epoch: u32, + ) -> Result { + let indexes = self.storage.get_next_nonce_indexes(1).await?; + let oracle_nonces = indexes + .iter() + .map(|i| { + let nonce_key = self.get_nonce_key(*i); + nonce_key.x_only_public_key(&self.secp).0 + }) + .collect(); + let event_descriptor = EventDescriptor::EnumEvent(EnumEventDescriptor { outcomes }); + let oracle_event = OracleEvent { + oracle_nonces, + event_id, + event_maturity_epoch, + event_descriptor, + }; + oracle_event.validate().map_err(|_| Error::Internal)?; + + // create signature + let mut data = Vec::new(); + oracle_event.write(&mut data).map_err(|_| Error::Internal)?; + let hash = sha256::Hash::hash(&data); + let msg = Message::from_digest(hash.to_byte_array()); + let announcement_signature = self.secp.sign_schnorr_no_aux_rand(&msg, &self.key_pair); + + let ann = OracleAnnouncement { + oracle_event, + oracle_public_key: self.public_key(), + announcement_signature, + }; + ann.validate(&self.secp).map_err(|_| Error::Internal)?; + + let _ = self.storage.save_announcement(ann.clone(), indexes).await?; + + Ok(ann) + } + + pub async fn sign_enum_event( + &self, + event_id: String, + outcome: String, + ) -> Result { + let Some(data) = self.storage.get_event(event_id.clone()).await? else { + return Err(Error::NotFound); + }; + if !data.signatures.is_empty() { + return Err(Error::EventAlreadySigned); + } + if data.indexes.len() != 1 { + return Err(Error::Internal); + } + let descriptor = match &data.announcement.oracle_event.event_descriptor { + EventDescriptor::EnumEvent(desc) => desc, + _ => return Err(Error::Internal), + }; + if !descriptor.outcomes.contains(&outcome) { + return Err(Error::InvalidOutcome); + } + + let nonce_index = data.indexes.first().expect("Already checked length"); + let nonce_key = self.get_nonce_key(*nonce_index); + + let hash = sha256::Hash::hash(outcome.as_bytes()); + let msg = Message::from_digest(hash.to_byte_array()); + + let sig = dlc::secp_utils::schnorrsig_sign_with_nonce( + &self.secp, + &msg, + &self.key_pair, + &nonce_key.secret_bytes(), + ); + + // verify our nonce is the same as the one in the announcement + debug_assert!( + sig.encode()[..32] == data.announcement.oracle_event.oracle_nonces[0].serialize() + ); + + // verify our signature + if self + .secp + .verify_schnorr(&sig, &msg, &self.key_pair.x_only_public_key().0) + .is_err() + { + return Err(Error::Internal); + }; + + let sigs = vec![(outcome.clone(), sig)]; + + self.storage + .save_signatures(event_id.to_string(), sigs) + .await?; + + let attestation = OracleAttestation { + event_id: data.announcement.oracle_event.event_id, + oracle_public_key: self.public_key(), + signatures: vec![sig], + outcomes: vec![outcome], + }; + + Ok(attestation) + } + + pub async fn create_numeric_event( + &self, + event_id: String, + num_digits: u16, + is_signed: bool, + precision: i32, + unit: String, + event_maturity_epoch: u32, + ) -> Result { + if num_digits == 0 { + return Err(Error::InvalidArgument); + } + + let num_nonces = if is_signed { + num_digits as usize + 1 + } else { + num_digits as usize + }; + + let indexes = self.storage.get_next_nonce_indexes(num_nonces).await?; + let oracle_nonces = indexes + .iter() + .map(|i| { + let nonce_key = self.get_nonce_key(*i); + nonce_key.x_only_public_key(&self.secp).0 + }) + .collect(); + let event_descriptor = + EventDescriptor::DigitDecompositionEvent(DigitDecompositionEventDescriptor { + base: 2, + is_signed, + unit, + precision, + nb_digits: num_digits, + }); + let oracle_event = OracleEvent { + oracle_nonces, + event_id, + event_maturity_epoch, + event_descriptor, + }; + oracle_event.validate().map_err(|_| Error::Internal)?; + + // create signature + let mut data = Vec::new(); + oracle_event.write(&mut data).map_err(|_| Error::Internal)?; + let hash = sha256::Hash::hash(&data); + let msg = Message::from_digest(hash.to_byte_array()); + let announcement_signature = self.secp.sign_schnorr_no_aux_rand(&msg, &self.key_pair); + + let ann = OracleAnnouncement { + oracle_event, + oracle_public_key: self.public_key(), + announcement_signature, + }; + ann.validate(&self.secp).map_err(|_| Error::Internal)?; + + let _ = self.storage.save_announcement(ann.clone(), indexes).await?; + + Ok(ann) + } + + pub async fn sign_numeric_event( + &self, + event_id: String, + outcome: i64, + ) -> Result { + let Some(data) = self.storage.get_event(event_id.clone()).await? else { + return Err(Error::NotFound); + }; + if !data.signatures.is_empty() { + return Err(Error::EventAlreadySigned); + } + let descriptor = match &data.announcement.oracle_event.event_descriptor { + EventDescriptor::DigitDecompositionEvent(desc) => desc, + _ => return Err(Error::Internal), + }; + if descriptor.base != 2 { + return Err(Error::Internal); + } + let max_value = (descriptor.base as i64).pow(descriptor.nb_digits as u32) - 1; + let min_value = if descriptor.is_signed { -max_value } else { 0 }; + if outcome < min_value || outcome > max_value { + return Err(Error::InvalidOutcome); + } + + let digits = format!( + "{:0width$b}", + outcome.abs(), + width = descriptor.nb_digits as usize + ) + .chars() + .map(|char| char.to_string()) + .collect::>(); + + let outcomes = if descriptor.is_signed { + let mut sign = vec![if outcome < 0 { + "-".to_string() + } else { + "+".to_string() + }]; + sign.extend(digits); + sign + } else { + digits + }; + + if data.indexes.len() != outcomes.len() { + return Err(Error::Internal); + } + + let nonce_keys = data.indexes.iter().map(|i| self.get_nonce_key(*i)); + + let mut sigs: Vec<(String, Signature)> = vec![]; + + let signatures = outcomes + .iter() + .zip(nonce_keys) + .enumerate() + .map(|(idx, (outcome, nonce_key))| { + let hash = sha256::Hash::hash(outcome.as_bytes()); + let msg = Message::from_digest(hash.to_byte_array()); + let sig = dlc::secp_utils::schnorrsig_sign_with_nonce( + &self.secp, + &msg, + &self.key_pair, + &nonce_key.secret_bytes(), + ); + // verify our nonce is the same as the one in the announcement + debug_assert!( + sig.encode()[..32] + == data.announcement.oracle_event.oracle_nonces[idx].serialize() + ); + // verify our signature + if self + .secp + .verify_schnorr(&sig, &msg, &self.key_pair.x_only_public_key().0) + .is_err() + { + return Err(Error::Internal); + }; + sigs.push((outcome.clone(), sig)); + Ok(sig) + }) + .collect::, Error>>()?; + + self.storage.save_signatures(event_id, sigs).await?; + + let attestation = OracleAttestation { + event_id: data.announcement.oracle_event.event_id, + oracle_public_key: self.public_key(), + signatures, + outcomes, + }; + + Ok(attestation) + } +} + +pub fn derive_signing_key(secp: &Secp256k1, xpriv: Xpriv) -> Result { + let signing_key = xpriv + .derive_priv( + secp, + &DerivationPath::from_str(SIGNING_KEY_PATH).map_err(|_| Error::Internal)?, + ) + .map_err(|_| Error::Internal)? + .private_key; + Ok(signing_key) +} + +#[cfg(test)] +mod test { + use super::*; + use crate::storage::MemoryStorage; + use bitcoin::secp256k1::rand::{thread_rng, Rng}; + + fn create_oracle() -> Oracle { + let mut seed: [u8; 64] = [0; 64]; + thread_rng().fill(&mut seed); + let xpriv = Xpriv::new_master(Network::Regtest, &seed).unwrap(); + Oracle::from_xpriv(MemoryStorage::default(), xpriv).unwrap() + } + + #[tokio::test] + async fn test_create_enum_event() { + let oracle = create_oracle(); + + let event_id = "test".to_string(); + let outcomes = vec!["a".to_string(), "b".to_string()]; + let event_maturity_epoch = 100; + let ann = oracle + .create_enum_event(event_id.clone(), outcomes.clone(), event_maturity_epoch) + .await + .unwrap(); + + assert!(ann.validate(&oracle.secp).is_ok()); + assert_eq!(ann.oracle_event.event_id, event_id); + assert_eq!(ann.oracle_event.event_maturity_epoch, event_maturity_epoch); + assert_eq!( + ann.oracle_event.event_descriptor, + EventDescriptor::EnumEvent(EnumEventDescriptor { outcomes }) + ); + } + + #[tokio::test] + async fn test_sign_enum_event() { + let oracle = create_oracle(); + + let event_id = "test".to_string(); + let outcomes = vec!["a".to_string(), "b".to_string()]; + let event_maturity_epoch = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() as u32 + + 86400; + let ann = oracle + .create_enum_event(event_id.clone(), outcomes.clone(), event_maturity_epoch) + .await + .unwrap(); + + println!("{}", hex::encode(ann.encode())); + + let attestation = oracle + .sign_enum_event(event_id, "a".to_string()) + .await + .unwrap(); + assert!(attestation.outcomes.contains(&"a".to_string())); + assert_eq!(attestation.oracle_public_key, oracle.public_key()); + assert_eq!(attestation.signatures.len(), 1); + assert_eq!(attestation.outcomes.len(), 1); + let sig = attestation.signatures.first().unwrap(); + + // check first 32 bytes of signature is expected nonce + let expected_nonce = ann.oracle_event.oracle_nonces.first().unwrap().serialize(); + let bytes = sig.encode(); + let (rx, _sig) = bytes.split_at(32); + + println!("{}", hex::encode(attestation.encode())); + + assert_eq!(rx, expected_nonce) + } + + #[tokio::test] + async fn test_create_unsigned_numeric_event() { + let oracle = create_oracle(); + + let event_id = "test_unsigned_numeric".to_string(); + let num_digits = 20; + + let event_maturity_epoch = 100; + let ann = oracle + .create_numeric_event( + event_id.clone(), + num_digits, + false, + 0, + "m/s".into(), + event_maturity_epoch, + ) + .await + .unwrap(); + + assert!(ann.validate(&oracle.secp).is_ok()); + assert_eq!(ann.oracle_event.event_id, event_id); + assert_eq!(ann.oracle_event.event_maturity_epoch, event_maturity_epoch); + assert_eq!( + ann.oracle_event.event_descriptor, + EventDescriptor::DigitDecompositionEvent(DigitDecompositionEventDescriptor { + base: 2, + is_signed: false, + unit: "m/s".into(), + precision: 0, + nb_digits: 20, + }) + ); + } + + #[tokio::test] + async fn test_sign_unsigned_numeric_event() { + let oracle = create_oracle(); + + let event_id = "test_unsigned_numeric".to_string(); + let num_digits = 16; + + let event_maturity_epoch = 100; + let ann = oracle + .create_numeric_event( + event_id.clone(), + num_digits, + false, + 0, + "m/s".into(), + event_maturity_epoch, + ) + .await + .unwrap(); + + println!("{}", hex::encode(ann.encode())); + let res = oracle.sign_numeric_event(event_id.clone(), 0x55555).await; + assert!(res.is_err()); + let attestation = oracle + .sign_numeric_event(event_id.clone(), 0x5555) + .await + .unwrap(); + assert_eq!( + attestation.outcomes, + vec!["0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1"] + .iter() + .map(|x| x.to_string()) + .collect::>() + ); + assert_eq!(attestation.oracle_public_key, oracle.public_key()); + assert_eq!(attestation.signatures.len(), 16); + assert_eq!(attestation.outcomes.len(), 16); + + for i in 0..attestation.signatures.len() { + let sig = attestation.signatures[i]; + + // check first 32 bytes of signature is expected nonce + let expected_nonce = ann.oracle_event.oracle_nonces[i].serialize(); + let bytes = sig.encode(); + let (rx, _sig) = bytes.split_at(32); + + assert_eq!(rx, expected_nonce) + } + + println!("{}", hex::encode(attestation.encode())); + } + + #[tokio::test] + async fn test_create_signed_numeric_event() { + let oracle = create_oracle(); + + let event_id = "test_signed_numeric".to_string(); + let num_digits = 20; + + let event_maturity_epoch = 100; + let ann = oracle + .create_numeric_event( + event_id.clone(), + num_digits, + true, + 0, + "m/s".into(), + event_maturity_epoch, + ) + .await + .unwrap(); + + assert!(ann.validate(&oracle.secp).is_ok()); + assert_eq!(ann.oracle_event.event_id, event_id); + assert_eq!(ann.oracle_event.event_maturity_epoch, event_maturity_epoch); + assert_eq!( + ann.oracle_event.event_descriptor, + EventDescriptor::DigitDecompositionEvent(DigitDecompositionEventDescriptor { + base: 2, + is_signed: true, + unit: "m/s".into(), + precision: 0, + nb_digits: 20, + }) + ); + } + + #[tokio::test] + async fn test_sign_signed_positive_numeric_event() { + let oracle = create_oracle(); + + let event_id = "test_signed_numeric".to_string(); + let num_digits = 16; + + let event_maturity_epoch = 100; + let ann = oracle + .create_numeric_event( + event_id.clone(), + num_digits, + true, + 0, + "m/s".into(), + event_maturity_epoch, + ) + .await + .unwrap(); + + println!("{}", hex::encode(ann.encode())); + let res = oracle.sign_numeric_event(event_id.clone(), 0x55555).await; + assert!(res.is_err()); + let attestation = oracle.sign_numeric_event(event_id, 0x5555).await.unwrap(); + assert_eq!( + attestation.outcomes, + vec![ + "+", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1" + ] + .iter() + .map(|x| x.to_string()) + .collect::>() + ); + assert_eq!(attestation.oracle_public_key, oracle.public_key()); + assert_eq!(attestation.signatures.len(), 16 + 1); + assert_eq!(attestation.outcomes.len(), 16 + 1); + + for i in 0..attestation.signatures.len() { + let sig = attestation.signatures[i]; + + // check first 32 bytes of signature is expected nonce + let expected_nonce = ann.oracle_event.oracle_nonces[i].serialize(); + let bytes = sig.encode(); + let (rx, _sig) = bytes.split_at(32); + + assert_eq!(rx, expected_nonce) + } + + println!("{}", hex::encode(attestation.encode())); + } + + #[tokio::test] + async fn test_sign_signed_negative_numeric_event() { + let oracle = create_oracle(); + + let event_id = "test_signed_numeric".to_string(); + let num_digits = 16; + + let event_maturity_epoch = 100; + let ann = oracle + .create_numeric_event( + event_id.clone(), + num_digits, + true, + 0, + "m/s".into(), + event_maturity_epoch, + ) + .await + .unwrap(); + + println!("{}", hex::encode(ann.encode())); + let res = oracle.sign_numeric_event(event_id.clone(), -0x55555).await; + assert!(res.is_err()); + let attestation = oracle.sign_numeric_event(event_id, -0x5555).await.unwrap(); + assert_eq!( + attestation.outcomes, + vec![ + "-", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1", "0", "1" + ] + .iter() + .map(|x| x.to_string()) + .collect::>() + ); + assert_eq!(attestation.oracle_public_key, oracle.public_key()); + assert_eq!(attestation.signatures.len(), 16 + 1); + assert_eq!(attestation.outcomes.len(), 16 + 1); + + for i in 0..attestation.signatures.len() { + let sig = attestation.signatures[i]; + + // check first 32 bytes of signature is expected nonce + let expected_nonce = ann.oracle_event.oracle_nonces[i].serialize(); + let bytes = sig.encode(); + let (rx, _sig) = bytes.split_at(32); + + assert_eq!(rx, expected_nonce) + } + + println!("{}", hex::encode(attestation.encode())); + } +} diff --git a/kormir/src/nostr_events.rs b/kormir/src/nostr_events.rs new file mode 100644 index 00000000..026cd1cd --- /dev/null +++ b/kormir/src/nostr_events.rs @@ -0,0 +1,30 @@ +use dlc_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; +use lightning::util::ser::Writeable; +use nostr::event::Error; +use nostr::{Event, EventBuilder, EventId, Keys, Kind, Tag}; + +/// Creates an Oracle Attestation event for nostr. +pub fn create_announcement_event( + keys: &Keys, + announcement: &OracleAnnouncement, +) -> Result { + let content = announcement.encode(); + let event = EventBuilder::new(Kind::Custom(88), base64::encode(content)) + .build(keys.public_key) + .sign_with_keys(keys)?; + Ok(event) +} + +/// Creates an Oracle Attestation event for nostr. +pub fn create_attestation_event( + keys: &Keys, + attestation: &OracleAttestation, + event_id: EventId, +) -> Result { + let content = attestation.encode(); + let event = EventBuilder::new(Kind::Custom(89), base64::encode(content)) + .tag(Tag::event(event_id)) + .build(keys.public_key) + .sign_with_keys(keys)?; + Ok(event) +} diff --git a/kormir/src/storage.rs b/kormir/src/storage.rs new file mode 100644 index 00000000..dc20e3cd --- /dev/null +++ b/kormir/src/storage.rs @@ -0,0 +1,147 @@ +use crate::error::Error; +use bitcoin::secp256k1::schnorr::Signature; +use dlc_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::sync::atomic::{AtomicU32, Ordering}; +use std::sync::{Arc, RwLock}; + +pub trait Storage { + /// Get the next `num` nonce indexes + async fn get_next_nonce_indexes(&self, num: usize) -> Result, Error>; + + /// Save the announcement and return the identifier + /// for the announcement + async fn save_announcement( + &self, + announcement: OracleAnnouncement, + indexes: Vec, + ) -> Result; + + /// Save signatures and outcomes for a given event + async fn save_signatures( + &self, + event_id: String, + sigs: Vec<(String, Signature)>, + ) -> Result; + + /// Get the announcement data for the given id + async fn get_event(&self, event_id: String) -> Result, Error>; +} + +/// Data saved for an oracle announcement +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OracleEventData { + pub event_id: String, + pub announcement: OracleAnnouncement, + pub indexes: Vec, + pub signatures: Vec<(String, Signature)>, + #[cfg(feature = "nostr")] + pub announcement_event_id: Option, + #[cfg(feature = "nostr")] + pub attestation_event_id: Option, +} + +impl OracleEventData { + pub fn attestation(&self) -> Option { + if self.signatures.is_empty() { + None + } else { + Some(OracleAttestation { + event_id: self.announcement.oracle_event.event_id.clone(), + oracle_public_key: self.announcement.oracle_public_key, + signatures: self.signatures.iter().map(|x| x.1).collect(), + outcomes: self.signatures.iter().map(|x| x.0.clone()).collect(), + }) + } + } +} + +#[derive(Debug, Clone)] +pub struct MemoryStorage { + current_index: Arc, + data: Arc>>, +} + +impl MemoryStorage { + pub fn new() -> Self { + Self { + current_index: Arc::new(AtomicU32::new(0)), + data: Arc::new(RwLock::new(HashMap::new())), + } + } + + pub fn list_events(&self) -> Result, Error> { + let Ok(guard) = self.data.try_read() else { + return Err(Error::Internal); + }; + + Ok(guard.values().cloned().collect()) + } +} + +impl Default for MemoryStorage { + fn default() -> Self { + Self::new() + } +} + +impl Storage for MemoryStorage { + async fn get_next_nonce_indexes(&self, num: usize) -> Result, Error> { + let mut current_index = self.current_index.fetch_add(num as u32, Ordering::Relaxed); + let mut indexes = Vec::with_capacity(num); + for _ in 0..num { + indexes.push(current_index); + current_index += 1; + } + Ok(indexes) + } + + async fn save_announcement( + &self, + announcement: OracleAnnouncement, + indexes: Vec, + ) -> Result { + let event_id = announcement.oracle_event.event_id.clone(); + let event = OracleEventData { + event_id: event_id.clone(), + announcement, + indexes, + signatures: Default::default(), + #[cfg(feature = "nostr")] + announcement_event_id: None, + #[cfg(feature = "nostr")] + attestation_event_id: None, + }; + + let mut data = self.data.try_write().unwrap(); + data.insert(event_id.clone(), event); + + Ok(event_id) + } + + async fn save_signatures( + &self, + id: String, + sigs: Vec<(String, Signature)>, + ) -> Result { + let mut data = self.data.try_write().unwrap(); + let Some(mut event) = data.get(&id).cloned() else { + return Err(Error::NotFound); + }; + + if !event.signatures.is_empty() { + return Err(Error::EventAlreadySigned); + } + + event.signatures = sigs; + data.insert(id, event.clone()); + + Ok(event) + } + + async fn get_event(&self, event_id: String) -> Result, Error> { + let data = self.data.try_read().unwrap(); + Ok(data.get(&event_id).cloned()) + } +} From fde8d7aa7eca0e31f48b2f02f42c00a5e69ac841 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Tue, 29 Jul 2025 10:44:50 -0400 Subject: [PATCH 4/9] tests: regenerate serialized contracts for test --- .gitignore | 1 + contract_binaries/Accepted | Bin 0 -> 1783 bytes contract_binaries/Closed | Bin 0 -> 555 bytes contract_binaries/Confirmed | Bin 0 -> 2282 bytes contract_binaries/Offered | Bin 0 -> 754 bytes contract_binaries/PreClosed | Bin 0 -> 2696 bytes contract_binaries/Signed | Bin 0 -> 2282 bytes ddk-manager/src/contract/accepted_contract.rs | 16 +-- ddk-manager/test_inputs/offer_contract.json | 116 +++++++++++++++++- ddk/src/oracle/nostr.rs | 37 ------ ddk/src/storage/postgres/mod.rs | 12 +- ddk/src/transport/lightning/peer_manager.rs | 93 +++++--------- ddk/tests/balance.rs | 20 ++- ddk/tests/data/contracts/AcceptedContract | Bin 1779 -> 0 bytes ddk/tests/data/contracts/ClosedContract | Bin 555 -> 0 bytes ddk/tests/data/contracts/ConfirmedContract | Bin 2278 -> 0 bytes .../data/contracts/OfferedContract-Offerer | Bin 752 -> 0 bytes ddk/tests/data/contracts/PreClosedContract | Bin 2692 -> 0 bytes ddk/tests/data/contracts/SignedContract | Bin 2278 -> 0 bytes ddk/tests/data/dlc_storage/Accepted | Bin 3435 -> 3739 bytes ddk/tests/data/dlc_storage/AcceptedChannel | Bin 908 -> 908 bytes ddk/tests/data/dlc_storage/Closed | Bin 1112 -> 1113 bytes ddk/tests/data/dlc_storage/Confirmed | Bin 5878 -> 6182 bytes ddk/tests/data/dlc_storage/Confirmed1 | Bin 5878 -> 5882 bytes ddk/tests/data/dlc_storage/Offered | Bin 1138 -> 1290 bytes ddk/tests/data/dlc_storage/OfferedChannel | Bin 235 -> 235 bytes ddk/tests/data/dlc_storage/PreClosed | Bin 6884 -> 6887 bytes ddk/tests/data/dlc_storage/Signed | Bin 5878 -> 5882 bytes ddk/tests/data/dlc_storage/Signed1 | Bin 6028 -> 6328 bytes .../data/dlc_storage/SignedChannelEstablished | Bin 3478 -> 3478 bytes .../data/dlc_storage/SignedChannelSettled | Bin 3496 -> 3496 bytes ddk/tests/enumeration.rs | 51 ++++++++ ddk/tests/nostr.rs | 12 +- .../generate_enumeration_contract_binaries.sh | 44 +++++++ 34 files changed, 274 insertions(+), 128 deletions(-) create mode 100644 contract_binaries/Accepted create mode 100644 contract_binaries/Closed create mode 100644 contract_binaries/Confirmed create mode 100644 contract_binaries/Offered create mode 100644 contract_binaries/PreClosed create mode 100644 contract_binaries/Signed delete mode 100644 ddk/tests/data/contracts/AcceptedContract delete mode 100644 ddk/tests/data/contracts/ClosedContract delete mode 100644 ddk/tests/data/contracts/ConfirmedContract delete mode 100644 ddk/tests/data/contracts/OfferedContract-Offerer delete mode 100644 ddk/tests/data/contracts/PreClosedContract delete mode 100644 ddk/tests/data/contracts/SignedContract create mode 100755 testconfig/scripts/generate_enumeration_contract_binaries.sh diff --git a/.gitignore b/.gitignore index cee1da0a..1a0cff1c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /testconfig/kormir-server /ddk/.env +.env diff --git a/contract_binaries/Accepted b/contract_binaries/Accepted new file mode 100644 index 0000000000000000000000000000000000000000..4b72a8c2bc0832b795f41171b85cc808f755b80d GIT binary patch literal 1783 zcmZRwIyl*8URlB;p=bLW_B~(58D&{wmOT5*{e~U;-GgtwI?ceyz{FBiT3o^a0*q}7 zz%-CxO3#Ne!8A~cv03zf=5`VOl2+CoiuHHaC|mw>>R57qm8A65bx*IoouoZy%Ysnb zjH{nGJn!{9shzavm6YmN z!63#U63-@FdHL8fzPy6ZQ#s%4X5hgU+rS6^g``3GYkispS zf#LT*fr#V2cRRqMY<=Yo5b47KU>X#xFctThKtha+rz<;E57df(F{-LbQ2%gTK(k=| z#^SQ`yQX`^-@I_-P!J3bDl zzFakfN~bGNdo8~`=}$QilaPvadKe(q~pmhjUVOITSR5=GOCrwc8{ErKUYN$Lx6buqP95&WG$PcXBVy3~{`E z(&wkURy$lkfn~I{!X(UByxKaaD(OME?!-5@)*NpyYj3M~qg@J;KPow6 zUyYb$U1r>sMZ6{7mA57-@bQVA?TFZQIhawyYp>P!{FPZ&`X8qUs=awO<8)T){&S@o zc0OKe-}kV60(l4QDF%>FB_BOD(%ia82P}dd{fsafShO$ma<~!5+-vX0pT&EAhMG|R z--KBrY#UWRux@Q;?p)l1h<2oS-6Z{YzR~h37YFW#OEg=<#fl5sEs;`1+q3dD-Fp5x z>wo-pFBRm9h;yDa84~RkWotfLzS^ih@w?o_E}KW5Ap$A!<#+FLS4rmo^Ksf#&7|O+ z#s0MKPGa|j_NB|)e)z2slw8Fv619qX+Y6tB#do$&0Y>|Wg2l zmo&V#zNCJI{iQjV)>}{8J)Hxbq8S+B(ay-kP`>`Ab@RHaIh-Ggzpwanmp6Y$&1N(oFLUobxYy}?X&-K7f8>%w0OgtmQKQy9NaX2NpqB72{|x^40Q zz&8E^I*xHc8^m@TMN|6mjtufm#FpAgH<2meFvw@%!U$XOi6o89!f%X|G8o*06bTmJ KiUf0b&^iDSTi#y) literal 0 HcmV?d00001 diff --git a/contract_binaries/Closed b/contract_binaries/Closed new file mode 100644 index 0000000000000000000000000000000000000000..10fe6d9f335f51c86577239b6a4c737aa1da4225 GIT binary patch literal 555 zcmZQ$WMnBxEiQT6%Cq={ba)+`Emu;q{XUsB1uhe}c1v35`0U_+dWi281LMYLcmKOM zUGQ*jZrp69|9hR*)vzkLBi9m&|DK086W@NU?#inQibPr;V%V3+rF(Sj9(`+VYzmZ zz0Y6Ww)lUHAZ7pl|NqappbgAs5MvPG+*+M{^8b^!j~dS0{`yBT&~TysQx*ny0~aO* z*8T^d5{fp=d;d+MA;0#9WX|rzI~S$TsjyMneDU54*-uOgMOl;TIF~=Z-NkcEw*S-d z@-yNtIvm1&HaoO0+y5w1)no*lQ*<()GxgSl<~HG$7a~3FCbyRC3@CYU#$nQW*Pyoj zlX969D#{dMGwV0y9{v~ld-|jk%4aCC~nHzhTFI_u!kaPBR%Vx8f*IUYs15Kk0a~OXEj5HCH=P YhBMr0`dWo&PBC2}6c4}{00Ns004;+4k^lez literal 0 HcmV?d00001 diff --git a/contract_binaries/Confirmed b/contract_binaries/Confirmed new file mode 100644 index 0000000000000000000000000000000000000000..fd238197248116e6dcb91abf8ede075051a14e33 GIT binary patch literal 2282 zcmbVMdpuO@8lJTV8IEhS)g+E#yKT3&a2S_CN~Y0JLhT(B2DvokGA_BL8KmTrOE{&O zT(X^+aT%M4kR&z|LP)M{Q9`H;XJ+Iae>lI+IqQ%0t@S|GGF8o4$Rky<;mPw|t& zb%o&AEAE$d>AFjEGI=|Wk7Wba!F-=YU|ich~i1R@22I}7X%eet9~^n%}FI&8KEB1)Vd z*uX1DkiBPZxHyaz?%KLBF*g?7{_4{j()Q=O=t(s4;1OI`jwj&VTywCrUE#DC&TdUW z#78vXxPPZV6**K9`Tp34cMq}K>gElBd|elJY_T4W=j{q4k)k)@CL7+$E$h~a5sb!Yj|Wh^zWBN&|vBA7o;j2f7|No&dPV*c%%gU^FR7fcwK?EDD&S za5jZy*qHFWzrsh4&bN((EG_lweS>Cri); zNByXPTX}HDs5%MbKyQ50io+sKW?fuaf{CL*xiFA?RCZ<1aP2+ew#c~!C%ey{Pj9}t zJo~78RWl-Uoe3a8O|^4H_9l;H6LfkJIv!$FrK*QCjol^^c@x7qt=H+}k9eFR5Dw`L z2&X8Jnwnisdk!<8TzZ@b;F#*+nF=g}2MbYxBv+cNEitvl)gtDjtkPkVA0X|*?piM**;;5VD=j)!7Y|HD@4cMdQZ5aPngT7gGS2iU`b0{a2zFMRxOB&HzTs@ zE=d_go_Fe@iUh7Guw3LsMWz0TcYN^TB%p$Mh*}}u_d;oX%(PXSoyuzSBGh*TshD6f zN-MPj3tTxoQ4p?D#MrpDDvPSl+u3eEu!U^dUVt&}w}oCu9~biy>C94+B(m|@aDmbv z=lNN&&;;7Gf7`yz*D`7L9qqy}3sd1Y_f*LaQUQK(2HU!VGDRv$)WrEPR@s(85<-qn zhf>ovZ4U`9Su~g_RZdxvO}T0`W@RVt=1dwM77jxY*Rkeh;h@|xuU(T#L+28c076KN0mE2&ST1ZnV5MknScF)0=^gl5z9{r@0_H`o;0tYU9 zA$62gSEL2HDmaRc?Ugu?8=a2*PD4W^;!)WqoiTC{fBkt7g|9eEx zrirVJH;i@~pWEP_5-tO&o)F6u$nTDCN!CPwrld}?Ub zRFB*cBl+^@BUv&F;B3P1GfMNv&{uM(ku}C|Pu&H5Y27^<705q@ZXx|5>$G20^WUxb zmHfCt{a!};M59&-+7ef+xZ%r?_kvB!V6S>Kr;>M{j>1h{Hbpj#u#w5GzbHFsLL*A3#kj9EHM2@OI zX|Jy7N~gvu`Y%Bb$Jj@uH-D74AJAJ$`vW2(4_MYdkHD^SHdvA_(qMJ_74u=e2VY$9eFL; z!#2v_-}a@$;6BZfn6PMLg`68YrS|~l&XijEyOKsuVxFb)4ejI(Dq$Rf(i%M-jeGwF$0j$L96^`sYBt&e1~OJToGSH`Ll9MbGVDz@jDkh Kj)l}pLH-G+d)Bi6 literal 0 HcmV?d00001 diff --git a/contract_binaries/Offered b/contract_binaries/Offered new file mode 100644 index 0000000000000000000000000000000000000000..f29633f89ae1a0629928e80d9a172bb2a6bbfa61 GIT binary patch literal 754 zcmZRyIyl*8URlB;p=bLW_B~(58D&{wmOT5*{e~U;-GgtwI?ceyz{FBiT3o^a0*q}7 zz%-CxO3#Ne!8A~cv03zf=5`VOl2+CoiuHHaC|mw>>R57qm8A65bx*IoouoZy%Ysnb zjH{nGJn!{9shzavm6YmN z!63#U63-@FdHL8fzPy6ZQ#s%4X5hgU+rS6^g``3GYkispS zf#LT*fr#V2cRRqMY<=Yo5b47KU>X#xFctThKtha+rz<;E57df(F{-LbQ2%gTK(k=| z#^SQ`yQX`^-@I_-P!J3bDl zzFakfN~bGNdo8~`=}$QilaPvadKe(q~pmhjUVOITSR5=GOCrwc8{ErKUYN2LKi8Fev~4 literal 0 HcmV?d00001 diff --git a/contract_binaries/PreClosed b/contract_binaries/PreClosed new file mode 100644 index 0000000000000000000000000000000000000000..c6573db3fe3fb1952517f0640c4999c88e2b3f0c GIT binary patch literal 2696 zcmb_edpK0<8eeM-GTIbot4TD&cH5M;urp*Nl4;x`Wbc?T?i!bA#wC~1j7t(Dmv9id zBzwj^QWQyIBOy&lL~W^rPz+~gs&o9&d7N{ez5ZC=THo(`-rMhe-|rQ~+)dWYrVvIY zCK@9fUKPR}bjaE+nRCx0Ya30hpH8*|AOHyjoC+iZya%M`@>lK)awmQJ*BjgpJ@ z>%HfVw&DmX3K(|6$%;aWzSnetS@*IDfxR6;fE0jm5|Rvle7{iaq~B}`e5xK0BfWaM zN{|<)c~4pLaCmj7OWW$px1*6A&ps}rt$w+J9mk^g9JJ`p^Z>nE>i3j)$RFEeVY4hG z>LV6t?%(B~haRj7e|Px(o7?y`aq|X%rIpS0t!6_p{9U00YUCHV*^)-g*#ze<}^Z16O^V~H>>!u$^$7~H`8!VPrL6m9RYdAIIF9xP$V@$i1)*_SPV44 zSXdTS;Ln6^{T(rKXu5qkXl|}g`z!1&pZaFU4d*61c&Ed(PO`s$hVov>WVaE7k|kZ2Lv%n**(*qXf;F~cJDg>e(l3ifyF25sYi=LQqwE5)m;L?k; zQ+FyCcZH>`l!0hym+FaPTm3t-v6_8IP4`WCinX`%cS`Du=e``uY`ef5yTi8`0Jui4 z0^Fbg_4OMZw-~cvJoC5@$R*X?g8|M%dx|i^RF`}gD-xsC#puijSw&<0AAydIZt6e# zcRYl8N#15ZX|j4o5tmvT4vJxf>B@H%rr59UhSeagwxy1A!uAg}n?j;K)84&Q*!&{K) z4X34a!aW^(^F+xD^3~2LF)^t>W9)A}wg#1Pw=oN(YhD=j4{274Qxoa!Uc|=EQ_A{y zoZ`YQp&6b#e5U}Or^wMU4VCIVHU7?8`oV9=H`)tv1_M^G3t00_UZP#;iV`FaAp;>) z{?oKzbrdW%KmOmeui>>qnvbv>=-lr#EV9v)R>&IyAH~1W8)K8&-rusKZ_x#uElloKK7{ zD55W#mx?1xHXwA=@ZF0KZ%<8Qhz7r_QWF904$!flkT*_*SNwp4$P&0(f%J=lY487$Nw+!d)fZK zON1<&d7kl`(f8Wt8u)t(=Rt-CU~&Y#Zu>^BTj58TAOs0s9GM{mlx4r4-x^5@8$kNh z=hx-AX9elWRX!R{mzja4Vuv2mTRsFoLt%!OS=S%93H#>v^zN)e|0Qx6?HAsl@vKhp zO4aYQdw12Yrl!1XQZL1tSd=KN`m*G_;ICxxaqcY)n&hzvi;1%a*he-w*J0RB_LR4* z$D;GH?t-gAoTKzHN-u?6X!l|?e%E`7+3BkMvK6+K@5hUJY4UkQn0THayxiDgrhi*3 zcC*%5!oH7@!y{!v!S}Uvl@XY5SLk6lht9!^g%s>_#joP@GrB(ozJhnkc`)xLSH~2g zN7U|j)YW&VA{<%}?LA0 zOg)+$*b{OK{L*O<;~8fna22$$KZ|H@S@vdLf54}g+F!CV$mIrQIhq?Flwhw*b+dFD z`$X-QW}?r4#;^NHW!rZbHA?+8dl}WOzaK=y*ro+7QU^lO1$Oh8=wgAe%7>LEh6ra> z^PH3Jhl6fOaj#AO6tLcivHp0Gt$X81zme*0vBk_(-(1}D(7BZzjt;s?Ijh#vv>k56 z0LY)0c;&`b`nQ#^0KmVE*G*egfEObiUNrVB?uYv_7iU_j9b1glgeA@OYE>U&7XuVj zK)#%SHWHl3PK=^Uo_mdmkJe;gt+OPLbQmyL#z*Ll3||NpL_r<*jHvK!UOBpy#&`gG bC%S}*(DGanca7UlxE@CU|E^->wUU1V{!k>%RzU+F*f+67BJ?!)`BI#XXsP9of6S^`-8aQ<(^*+hBBgl_`a5}-;27wxw? zab|n5cqKW^VEl!$e6ilQG@eCb$rO)HdmtbVAf4d5gI+wz7rNlHn1YzC0fb1?0~>f* zQL5*xH3vs9LtI)nCg#Q>+FyNIL)-j(*J#oReej4?SEf7Y*<5q5v|aYJu$Ao^T+mC% z@3?QLZw`8>BJBOK5APo0w$;rO0KTq^IJ8&}$8dMy@sx;7xXGHka>}}OVg%xBfnZxu ztlXo}JxdzFm+%VnEh0)jj8eaV&If5&r-81=jVD0PG1kV$1{6VwhjV_|jDa9i-)f}`zc_op}CT%LVY zzN!|Qwq63FAvNW5g?5IIq+&IDQJO^I9Qmq;xvIMjMYAV{Gh46I#~*Py0|1-!2EZ-~ zP*bzZanE4}j6;w8fNWEV?n&S>bg%%!M{&t@u^}b3xR^zLl#)Me_yf=`;HLhQZ~HT- zhvaGbqb8$!40*G;?uZbEkEYllH#<1p5L$_{*_S%n0W%qHvVa7=<~@6cyt{ANn!Ieq zeO9VhcVg<9P(v|QW}ISaFatI1Ecb-yc?CO<+N&nc4i>jW2Sn2XXO;aqcrz-!?vl7} z*m=jE96|DmEYn$9NJ#vT7>5ThPJ)WqhnN-8eGiQK$21%H*{Sq44?=y1zoH=yE5A|; zU*O2$iUK%FQDfs8O3WM;?#_1m!7XIV_I#{yzYXlV(Q#o9!OnDfF%k=(frOX-IM2(B zg2m=u`?u}ed@Yk;-O(rrHZvA@b5DtCFYf0Pt-Gx&Xj7EpI5jIT#wyF)UzFd$@laCo zrtN_N#f!Q#r3#5FQi)gf$1H3`T%9Px!veu5(mKwxECiB1=CNxse&}3WLUdjMZS{Du zD5^*Rd8PO+dh96J5xfb?CO#2>sc6Oq@jN9W01oOjk>eC8G5NTX?)y{ z2Ec#W4nhEhF`ySk56(i&`>hnN4GWU0F1>?Z%M=DZ4m+EoUOIDB&8}|59)94$7fMHQ zbwx7SO*WyBH##vs6S?|j=2SH&B=kKGxV7SB{jcsS=OFBC`Sq>4v{QRvqc=^J0i^TK z;1|0x54l&%4mo6-@8`LaxeqdF!O9YgFyFNIT6LPA5Pd72x>S5^YI(cc8_~ z-Ag`VmCMDxPW1f=1gcfI-4ArP20@=A4U_gCC2^#kGNB}|L+kY>n4se z?l9VEd~SnxO1KOrxdY}W(BB>3=dTZrA4!*7fM#QdpV68>2ECHTjI1$!d+NsLo!i}`T7mwP{}$ROtWM)qHSgVuU#X89 zRPLpwOf;$&8<|@b$!&NuWIPbllDMnH<|OLw)8STAmyL~{+ur#NX4Ek_>nY{F>b$16 z;wpF5QQ~w!PXIaJ{>|7mwGRQ7mnw2g)(368Ki$wzlg%N(M00!)rH8E+`u4>diD+HM z8+?iw87+YaJ<-xrL}J2Rp=V(%8Ve^BoM+&Q+rS!Tbba=lMs&!y(;JeRF$L&Rl_%}h zHC-t=QF6XZu)~pd;VI1@MeqCd)>Pi?3avXta9u9*e$T^@w;txVT<#+ZAfu5fMK2o9 zGi>~QkJfe6-Tt6uOy!~E6V*Qn1>@VKo8#<-^0O3|5zVvr_)y%kTbA=lk2^~3vag>z~0kdoN`Aq-8 z;978V(jX@@BEzv|)X+Z)sB;VlOOJmb=D)U0Ffz!c#wB+&cR|v;Jub{9iL}9URePEU zUi}(>Ga;4iKTuFF{^#N?=`KSP5Dgo&$ZHlq6oSsPU&cfi@`RQ@D>pYqIx8Q)bAfm) IuvQ%SC!UekvH$=8 literal 0 HcmV?d00001 diff --git a/ddk-manager/src/contract/accepted_contract.rs b/ddk-manager/src/contract/accepted_contract.rs index 883e7bb2..2d388eb9 100644 --- a/ddk-manager/src/contract/accepted_contract.rs +++ b/ddk-manager/src/contract/accepted_contract.rs @@ -101,21 +101,21 @@ impl AcceptedContract { #[cfg(test)] mod tests { - use lightning::io::Cursor; - - use lightning::util::ser::Readable; - use super::*; + use crate::contract::ser::Serializable; #[test] fn pnl_compute_test() { - let buf = include_bytes!("../../test_inputs/Accepted"); - let accepted_contract: AcceptedContract = Readable::read(&mut Cursor::new(&buf)).unwrap(); + let buf = include_bytes!("../../../ddk/tests/data/dlc_storage/Accepted"); + let accepted_contract = AcceptedContract::deserialize(&mut buf.as_slice()).unwrap(); let cets = &accepted_contract.dlc_transactions.cets; - assert_eq!(accepted_contract.compute_pnl(&cets[0]), SignedAmount::ZERO); + assert_eq!( + accepted_contract.compute_pnl(&cets[0]), + SignedAmount::from_sat(90000000) + ); assert_eq!( accepted_contract.compute_pnl(&cets[cets.len() - 1]), - SignedAmount::from_sat(101000000) + SignedAmount::from_sat(-11000000) ); } } diff --git a/ddk-manager/test_inputs/offer_contract.json b/ddk-manager/test_inputs/offer_contract.json index 6a4a5df5..6599e90c 100644 --- a/ddk-manager/test_inputs/offer_contract.json +++ b/ddk-manager/test_inputs/offer_contract.json @@ -1 +1,115 @@ -{"protocolVersion":1,"contractFlags":0,"chainHash":"06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f","temporaryContractId":"f6a1b2841c93db06e94200b227bb4bdea83068efa557d68e14775237cbaab56a","contractInfo":{"singleContractInfo":{"totalCollateral":101000000,"contractInfo":{"contractDescriptor":{"numericOutcomeContractDescriptor":{"numDigits":10,"payoutFunction":{"payoutFunctionPieces":[{"endPoint":{"eventOutcome":0,"outcomePayout":0,"extraPrecision":0},"payoutCurvePiece":{"polynomialPayoutCurvePiece":{"payoutPoints":[{"eventOutcome":3,"outcomePayout":90000000,"extraPrecision":0}]}}},{"endPoint":{"eventOutcome":5,"outcomePayout":101000000,"extraPrecision":0},"payoutCurvePiece":{"polynomialPayoutCurvePiece":{"payoutPoints":[]}}}],"lastEndpoint":{"eventOutcome":1023,"outcomePayout":101000000,"extraPrecision":0}},"roundingIntervals":{"intervals":[{"beginInterval":0,"roundingMod":1}]}}},"oracleInfo":{"single":{"oracleAnnouncement":{"announcementSignature":"18e18de8b3547e210addd32589db9520286f55c0c18510c67bb6f8ea66b05154b84c6ec0075e3623f886b7e2bc623b7df25e1bc25d1cc87c622b28f0ae526664","oraclePublicKey":"1d524d2753a36ebe340af67370f78219b4dbb6f56d2f96b3b21eaabec6f4a114","oracleEvent":{"oracleNonces":["bc927a2c8bf43c9d208e679848ffaf95d178fdbd2e29d1c66668f21dd75149e8","9ed74e19c1d532f5127829b7d9f183e0738ad084485428b53a7fe0c50f2efe5e","f44733d1129d0cd9253124749f8cff2c7e7eecd79888a4a015d3e3ad153ef282","f4f39e5733bfc5ca18530eb444419b31d9dc0ec938502615c33f2b0b7c05ac71","930991374fbf6b9a49e5e16fa3c5c39638af58f5a4c55682a93b2b940502e7bf","e3af3b59907c349d627e3f4f20125bdc1e979cac41ee82ef0a184000c79e904b","0b95d4335713752329a1791b963d526c0a49873bbbfcad9e1c03881508b2a801","48776cc1e3b8f3ff7fd6226ea2df5607787913468a1c0faad4ff315b7cf3b41d","0b39b0e1a14f5f50cb05f0a6d8e7c082f75e9fe386006727af933ce4d273a76f","479a38e13c1622bfd53299ee67680d7a0edd3fed92223e3a878c8d010fcc1a2d"],"eventMaturityEpoch":1623133104,"eventDescriptor":{"digitDecompositionEvent":{"base":2,"isSigned":false,"unit":"sats/sec","precision":0,"nbDigits":10}},"eventId":"Test"}}}}}}},"fundingPubkey":"02556021f6abda2ae7a74d38a4e4a3b00c1dd648db96397dcd8642c3d0b0b139d1","payoutSpk":"0014430af74f2f9dc88729fd02eaeb946fc161e2be1e","payoutSerialId":8165863461276958928,"offerCollateral":90000000,"fundingInputs":[{"inputSerialId":11632658032743242199,"prevTx":"02000000000101e79f7a30bb35206060eb09a99b6956bcdc7a1767b310c8dfde3595c69246a60e0000000000feffffff0200c2eb0b000000001600142a416c1e5f5e78bc6c518294fd1dd86b40eed2d77caf953e000000001600148e56705661334df89b2c1c7c4e41da9cef9eb38e0247304402201491f05ebe196b333420cbab3e7e7f3e431bfe91a42730cef9c6e64b0e8ff62302202c5fc79abbdb0a1c8ad422dbb97a54693feedc580f0cb7a62bdadaecbfc4f9430121035f57172a38f35f29f4357dcc2d24ea8e72638cf43190e4fdcb3f0ace215cfd5602020000","prevTxVout":0,"sequence":4294967295,"maxWitnessLen":107,"redeemScript":""}],"changeSpk":"001441ca183be469eab996f34ed31197a96b57f6050e","changeSerialId":16919534260907952016,"fundOutputSerialId":5054305248376932341,"feeRatePerVb":2,"cetLocktime":1623133103,"refundLocktime":1623737904, "keysId":[16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208]} +{ + "protocolVersion": 1, + "contractFlags": 0, + "chainHash": "06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f", + "temporaryContractId": "f6a1b2841c93db06e94200b227bb4bdea83068efa557d68e14775237cbaab56a", + "contractInfo": { + "singleContractInfo": { + "totalCollateral": 101000000, + "contractInfo": { + "contractDescriptor": { + "numericOutcomeContractDescriptor": { + "numDigits": 10, + "payoutFunction": { + "payoutFunctionPieces": [ + { + "endPoint": { + "eventOutcome": 0, + "outcomePayout": 0, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { + "payoutPoints": [ + { + "eventOutcome": 3, + "outcomePayout": 90000000, + "extraPrecision": 0 + } + ] + } + } + }, + { + "endPoint": { + "eventOutcome": 5, + "outcomePayout": 101000000, + "extraPrecision": 0 + }, + "payoutCurvePiece": { + "polynomialPayoutCurvePiece": { "payoutPoints": [] } + } + } + ], + "lastEndpoint": { + "eventOutcome": 1023, + "outcomePayout": 101000000, + "extraPrecision": 0 + } + }, + "roundingIntervals": { + "intervals": [{ "beginInterval": 0, "roundingMod": 1 }] + } + } + }, + "oracleInfo": { + "single": { + "oracleAnnouncement": { + "announcementSignature": "18e18de8b3547e210addd32589db9520286f55c0c18510c67bb6f8ea66b05154b84c6ec0075e3623f886b7e2bc623b7df25e1bc25d1cc87c622b28f0ae526664", + "oraclePublicKey": "1d524d2753a36ebe340af67370f78219b4dbb6f56d2f96b3b21eaabec6f4a114", + "oracleEvent": { + "oracleNonces": [ + "bc927a2c8bf43c9d208e679848ffaf95d178fdbd2e29d1c66668f21dd75149e8", + "9ed74e19c1d532f5127829b7d9f183e0738ad084485428b53a7fe0c50f2efe5e", + "f44733d1129d0cd9253124749f8cff2c7e7eecd79888a4a015d3e3ad153ef282", + "f4f39e5733bfc5ca18530eb444419b31d9dc0ec938502615c33f2b0b7c05ac71", + "930991374fbf6b9a49e5e16fa3c5c39638af58f5a4c55682a93b2b940502e7bf", + "e3af3b59907c349d627e3f4f20125bdc1e979cac41ee82ef0a184000c79e904b", + "0b95d4335713752329a1791b963d526c0a49873bbbfcad9e1c03881508b2a801", + "48776cc1e3b8f3ff7fd6226ea2df5607787913468a1c0faad4ff315b7cf3b41d", + "0b39b0e1a14f5f50cb05f0a6d8e7c082f75e9fe386006727af933ce4d273a76f", + "479a38e13c1622bfd53299ee67680d7a0edd3fed92223e3a878c8d010fcc1a2d" + ], + "eventMaturityEpoch": 1623133104, + "eventDescriptor": { + "digitDecompositionEvent": { + "base": 2, + "isSigned": false, + "unit": "sats/sec", + "precision": 0, + "nbDigits": 10 + } + }, + "eventId": "Test" + } + } + } + } + } + } + }, + "fundingPubkey": "02556021f6abda2ae7a74d38a4e4a3b00c1dd648db96397dcd8642c3d0b0b139d1", + "payoutSpk": "0014430af74f2f9dc88729fd02eaeb946fc161e2be1e", + "payoutSerialId": 8165863461276958928, + "offerCollateral": 90000000, + "fundingInputs": [ + { + "inputSerialId": 11632658032743242199, + "prevTx": "02000000000101e79f7a30bb35206060eb09a99b6956bcdc7a1767b310c8dfde3595c69246a60e0000000000feffffff0200c2eb0b000000001600142a416c1e5f5e78bc6c518294fd1dd86b40eed2d77caf953e000000001600148e56705661334df89b2c1c7c4e41da9cef9eb38e0247304402201491f05ebe196b333420cbab3e7e7f3e431bfe91a42730cef9c6e64b0e8ff62302202c5fc79abbdb0a1c8ad422dbb97a54693feedc580f0cb7a62bdadaecbfc4f9430121035f57172a38f35f29f4357dcc2d24ea8e72638cf43190e4fdcb3f0ace215cfd5602020000", + "prevTxVout": 0, + "sequence": 4294967295, + "maxWitnessLen": 107, + "redeemScript": "" + } + ], + "changeSpk": "001441ca183be469eab996f34ed31197a96b57f6050e", + "changeSerialId": 16919534260907952016, + "fundOutputSerialId": 5054305248376932341, + "feeRatePerVb": 2, + "cetLocktime": 1623133103, + "refundLocktime": 1623737904, + "keysId": [ + 16, 175, 248, 204, 229, 173, 124, 107, 34, 204, 75, 138, 154, 151, 193, 8, + 142, 116, 180, 156, 90, 229, 80, 251, 77, 5, 215, 234, 70, 117, 68, 208 + ] +} diff --git a/ddk/src/oracle/nostr.rs b/ddk/src/oracle/nostr.rs index cec4d974..56e45d6d 100644 --- a/ddk/src/oracle/nostr.rs +++ b/ddk/src/oracle/nostr.rs @@ -263,9 +263,7 @@ fn decode_base64(content: &str) -> Result { #[cfg(test)] mod tests { use bitcoin::bip32::Xpriv; - use ddk_manager::Oracle; use nostr_rs::event::Event; - use std::sync::Arc; use super::*; @@ -308,39 +306,4 @@ mod tests { let decoded = decode_base64::(&event.content).unwrap(); assert_eq!(announcement, decoded); } - - #[test_log::test(tokio::test)] - async fn nostr_oracle_receives_announcement() { - let nostr_keys = nostr_rs::key::Keys::generate(); - let (stop_signal_sender, stop_signal_receiver) = watch::channel(false); - let nostr_oracle = Arc::new( - NostrOracle::new( - vec!["ws://localhost:8081".to_string()], - None, - nostr_keys.public_key, - ) - .await - .unwrap(), - ); - - let nostr = nostr_oracle.clone(); - tokio::spawn(async move { - let _ = nostr.start(stop_signal_receiver).await; - }); - - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - - let announcement = test_send_announcement(nostr_keys).await; - - tokio::time::sleep(std::time::Duration::from_secs(3)).await; - - let received_announcement = nostr_oracle - .get_announcement(&announcement.1.id.to_string()) - .await - .unwrap(); - - tracing::info!("Received announcement: {:?}", received_announcement); - - let _ = stop_signal_sender.send(true); - } } diff --git a/ddk/src/storage/postgres/mod.rs b/ddk/src/storage/postgres/mod.rs index 5899e403..ac01a565 100644 --- a/ddk/src/storage/postgres/mod.rs +++ b/ddk/src/storage/postgres/mod.rs @@ -965,7 +965,7 @@ mod tests { .await .unwrap(); - let offered = include_bytes!("../../../tests/data/contracts/OfferedContract-Offerer"); + let offered = include_bytes!("../../../../contract_binaries/Offered"); let offered_contract = deserialize_contract(&offered.to_vec()).unwrap(); match offered_contract { Contract::Offered(offered_contract) => { @@ -976,32 +976,32 @@ mod tests { } _ => panic!("Offered contract is not an OfferedContract"), } - let accept = include_bytes!("../../../tests/data/contracts/AcceptedContract"); + let accept = include_bytes!("../../../../contract_binaries/Accepted"); let accepted_contract = deserialize_contract(&accept.to_vec()).unwrap(); store .update_contract(&accepted_contract) .await .expect("Failed to update accepted contract"); - let signed = include_bytes!("../../../tests/data/contracts/SignedContract"); + let signed = include_bytes!("../../../../contract_binaries/Signed"); let signed_contract = deserialize_contract(&signed.to_vec()).unwrap(); store .update_contract(&signed_contract) .await .expect("Failed to update signed contract"); - let confirmed = include_bytes!("../../../tests/data/contracts/ConfirmedContract"); + let confirmed = include_bytes!("../../../../contract_binaries/Confirmed"); let confirmed_contract = deserialize_contract(&confirmed.to_vec()).unwrap(); store .update_contract(&confirmed_contract) .await .expect("Failed to update confirmed contract"); - let preclosed = include_bytes!("../../../tests/data/contracts/PreClosedContract"); + let preclosed = include_bytes!("../../../../contract_binaries/PreClosed"); let preclosed_contract = deserialize_contract(&preclosed.to_vec()).unwrap(); store .update_contract(&preclosed_contract) .await .expect("Failed to update preclosed contract"); - let closed = include_bytes!("../../../tests/data/contracts/ClosedContract"); + let closed = include_bytes!("../../../../contract_binaries/Closed"); let closed_contract = deserialize_contract(&closed.to_vec()).unwrap(); store .update_contract(&closed_contract) diff --git a/ddk/src/transport/lightning/peer_manager.rs b/ddk/src/transport/lightning/peer_manager.rs index 8852070d..17346090 100644 --- a/ddk/src/transport/lightning/peer_manager.rs +++ b/ddk/src/transport/lightning/peer_manager.rs @@ -127,6 +127,7 @@ impl LightningTransport { } }, accept_result = listener.accept() => { + println!("acceptting connection"); match accept_result { Ok((tcp_stream, socket)) => { let peer_mgr = Arc::clone(&peer_manager); @@ -139,6 +140,7 @@ impl LightningTransport { }); } Err(e) => { + println!("error accepting connection: {}", e); tracing::error!("Error accepting connection: {}", e); } } @@ -224,57 +226,39 @@ impl LightningTransport { #[cfg(test)] mod tests { - use bitcoin::Network; - use ddk_manager::Storage; + use crate::Transport; use dlc_messages::{Message, OfferDlc}; - use crate::{ - builder::Builder, oracle::memory::MemoryOracle, storage::memory::MemoryStorage, DlcDevKit, - Transport, - }; - use super::*; fn get_offer() -> OfferDlc { let offer_string = include_str!("../../../../ddk-manager/test_inputs/offer_contract.json"); - let offer: OfferDlc = serde_json::from_str(&offer_string).unwrap(); + let offer: OfferDlc = + serde_json::from_str(&offer_string).expect("to be able to parse offer"); offer } - async fn manager( - listening_port: u16, - ) -> DlcDevKit { + #[tokio::test] + async fn send_offer_test() { let mut seed_bytes = [0u8; 32]; seed_bytes .try_fill(&mut bitcoin::key::rand::thread_rng()) .unwrap(); + let mut bob_seed_bytes = [0u8; 32]; + bob_seed_bytes + .try_fill(&mut bitcoin::key::rand::thread_rng()) + .unwrap(); - let transport = Arc::new(LightningTransport::new(&seed_bytes, listening_port).unwrap()); - let storage = Arc::new(MemoryStorage::new()); - let oracle_client = Arc::new(MemoryOracle::default()); - - let mut builder = Builder::new(); - builder.set_network(Network::Regtest); - builder.set_esplora_host("http://127.0.0.1:30000".to_string()); - builder.set_seed_bytes(seed_bytes); - builder.set_transport(transport.clone()); - builder.set_storage(storage.clone()); - builder.set_oracle(oracle_client.clone()); - builder.finish().await.unwrap() - } + let alice = LightningTransport::new(&seed_bytes, 1776).unwrap(); + let bob = LightningTransport::new(&bob_seed_bytes, 1777).unwrap(); - #[test_log::test(tokio::test)] - async fn send_offer() { - let alice = manager(1776).await; - let alice_pk = alice.transport.public_key(); - let bob = manager(1777).await; - let _bob_pk = bob.transport.public_key(); + let (sender, receiver) = watch::channel(false); + alice.listen(receiver.clone()); + bob.listen(receiver.clone()); - bob.start().unwrap(); - alice.start().unwrap(); + tokio::time::sleep(Duration::from_secs(2)).await; - bob.transport - .connect_outbound(alice_pk, "127.0.0.1:1776") + bob.connect_outbound(alice.public_key(), "127.0.0.1:1776") .await; let mut connected = false; @@ -282,14 +266,12 @@ mod tests { while !connected { if retries > 10 { - bob.stop().unwrap(); - alice.stop().unwrap(); + sender.send(true).unwrap(); panic!("Bob could not connect to alice.") } - if bob - .transport + if alice .peer_manager - .peer_by_node_id(&alice_pk) + .peer_by_node_id(&bob.public_key()) .is_some() { connected = true @@ -299,36 +281,29 @@ mod tests { } let offer = get_offer(); - bob.transport - .send_message(alice_pk, Message::Offer(offer.clone())) + bob.send_message(alice.public_key(), Message::Offer(offer.clone())) .await; - let mut offer_received = false; + let mut received = false; let mut retries = 0; - while !offer_received { - if retries > 15 { - bob.stop().unwrap(); - alice.stop().unwrap(); - panic!("Contract was not offered to alice") + while !received { + if retries > 10 { + sender.send(true).unwrap(); + panic!("Alice did not receive the offer.") } if alice - .storage - .get_contract_offers() - .await - .unwrap() - .iter() - .find(|o| o.id == offer.temporary_contract_id) - .is_some() + .message_handler + .get_and_clear_received_messages() + .len() + > 0 { - offer_received = true + received = true } retries += 1; - tokio::time::sleep(Duration::from_secs(1)).await + tokio::time::sleep(Duration::from_millis(100)).await } - bob.stop().unwrap(); - alice.stop().unwrap(); - assert!(true) + sender.send(true).unwrap(); } } diff --git a/ddk/tests/balance.rs b/ddk/tests/balance.rs index 205642c8..fa26904c 100644 --- a/ddk/tests/balance.rs +++ b/ddk/tests/balance.rs @@ -6,17 +6,19 @@ use bitcoin::key::Secp256k1; use bitcoin::Amount; use bitcoincore_rpc::RpcApi; use ddk::oracle::memory::MemoryOracle; +use ddk::util::ser::deserialize_contract; use ddk_manager::contract::Contract; -use ddk_manager::contract::{ser::Serializable, PreClosedContract}; use ddk_manager::Storage; -use lightning::io::Cursor; use test_util::generate_blocks; #[tokio::test] async fn contract_balance() { - let contract_bytes = include_bytes!("../tests/data/dlc_storage/PreClosed"); - let mut cursor = Cursor::new(contract_bytes); - let preclosed = PreClosedContract::deserialize(&mut cursor).unwrap(); + let contract_bytes = include_bytes!("../../contract_binaries/PreClosed"); + let contract = deserialize_contract(&contract_bytes.to_vec()).unwrap(); + let preclosed = match contract { + Contract::PreClosed(c) => c, + _ => panic!("Contract is not a PreClosedContract"), + }; let secp = Secp256k1::new(); let oracle = Arc::new(MemoryOracle::default()); let bob = test_util::TestSuite::new(&secp, "balance", oracle).await; @@ -45,17 +47,13 @@ async fn contract_balance() { .unwrap(); tokio::time::sleep(std::time::Duration::from_secs(3)).await; - bob.ddk.wallet.sync().await.unwrap(); - let balance = bob.ddk.balance().await.unwrap(); - assert_eq!(balance.foreign_unconfirmed, Amount::ONE_BTC); - assert_eq!(balance.contract_pnl, -11000000); - generate_blocks(2); tokio::time::sleep(std::time::Duration::from_secs(2)).await; + bob.ddk.wallet.sync().await.unwrap(); let balance = bob.ddk.balance().await.unwrap(); assert_eq!(balance.confirmed, Amount::ONE_BTC); assert_eq!(balance.foreign_unconfirmed, Amount::ZERO); - assert_eq!(balance.contract_pnl, -11000000); + assert_eq!(balance.contract_pnl, -50000); } diff --git a/ddk/tests/data/contracts/AcceptedContract b/ddk/tests/data/contracts/AcceptedContract deleted file mode 100644 index 4d0768faca620692586da2b046b01a14d880f1fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1779 zcmZSTs$sq^bYxfD-ZhzBQyf;Wc%VMBe9`RZ#o|w9pPM`Jd?5oP0~1S8X>kby2r#xS z0MkH%DLo&?1k*q%Mnk60*XDXSnmn&6$nR-)->zK!VA;Zr>#x1IZ}<4^(q)gL*yeII ze|}tc#CMTTX!Gtb`nTSxeE!JJYa8QzRAtB0-d6BX5Xe*C;eS;KC5NJ z6MNCxFJG&do$md6L&=hXao^8-yL3AqX_&d36?Xh^udRbyTx_%DK8@Kj);r&yGJ2e$ zogx1B1{)XD;XsG7l%zsE0Q3S=$&GJkO1{r>I2_=_ArO8vPf2OXvn=lvmR%ArOZco6 z6&S=AL^ipwyq10_BK5#aBsg^WTE$=6YDKQw?c*1|HzOV-|7x$ZSK`z7y&Wr-Oq|UZ zT5955JKbd3@(;HJJ)9VW9hdCZ7P!Q*P1muLHTa9fo}&F5ZW~t%#x57$)adqLIWW8! zp<$QJ!0_Sfla9me6<#0_w!ZQPh|J*tFbxV-n1XvuAR$IZ%XOOHd&TBQ+|m8guXFgd zvaIQuh{P!xb=e$h$7LH|8H3IK`~UxcrWqM4SwVV$4i?*fP;K)2-6i?o72b1}Y`^~C z-tx~4<$Y{W=@ynI4d%CBO*FrBR{sdxQQ4vW?Glr_feVvDm8qI*Qc~N*mu*UEZt1=D zt5+UUXt;17;HAKu8(U}J(_&Jv`slNy=+g<-35UenPSmEBOcRp2_JT2{y2Eg;SiGgF zE~6rIxWd!)Su?%MXF65i2-!O2*I_4v`=Y%D&pECxZ8`g}SX-YNk@`I0a5w z=>MsG$}PvKpL**PHb_i5-nMYI>e1WJm6;z!T<=(3_$PQW)3eoFPREw-Ugw>HQCf%7QxyO3-hR@4Y=3m$MjEX%4 zl9#M``Nz)lI{)&jOS1Fge4fiQa53p!vY+!L@8=gr)36}^%l^h|328A%KQFD0wjVQ`HV0LSfnp^T;46f%((chvDl1N z5_gL%YPNo2BQ@>zXbF9o|Ka1QizU1*DouZ$GEVn@ z`!k~;W}-3^hwB2GEMNS;)OFPLK-Iye56?B5na+}&qA)vn_IyS~rtkhM zx5maU^?q~Y)b(BSX3bv4d&lKv*R{*bWj!{Z3;vLW9_frs3@Im1O1UT0ODE1|eil2Y zw6ZPyd~5V!W&@ccrRD6~mnY^3=)7y{Ke&Ly`j z_wCASc0qE*PuHpZ$YFdLEp#3faZDgzFm9B1`(L3oG3#=|I}d4dnb)!j?Qyo^zNY7j z4tJ|?tg#<63vvx218D*pJh z=}eo-^dD=br>taPWGN~wF8Rx-&%^)(jEoy4-u_o;P0YHS@XkZpT;{cGLVKL8xUcEC zqC=nMzlLgqmHqqw|3Bk`Hb#&Z1~CSaS9_hk5}(HJ?O3s7;%vUqQWNjm=`0NH1};nr zR>v<$2=dSBUwrK(U+mUq$ya7-EGj3^2Szh*s`%0*=XNtScm&u2; zjZ~QwoEvYyv(G!WwmQFh#lsfsdowu7ouyChzg@L4M=C^9`;&E<4#`RJ<;vXO=IT{k&NG$?S7;C!Q~4mKAe<`R3&9_Yo`n7X~kxVq0`o bqc{8Aw2HS2TATu>Ec7Q755O1z0-Fs0^d|!> diff --git a/ddk/tests/data/contracts/ConfirmedContract b/ddk/tests/data/contracts/ConfirmedContract deleted file mode 100644 index 4cafe5934892960c7c240b04cf9b91adbe682ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2278 zcmbVNc{E#T8_&J5(~4cGk*KO&jKqvmCO)mLP7PJNQVgRlhNN~y2-RXtGoxfe#ulnn ztsOg|RkgG_BxBdsT3aVHw8fXCe5dC-&guES`^SCneSYtK?(=(=-^-I44W)~BHh47O z`!SXHU0KQ0iR`d^(p;#_Yf?WsbKoZcfPg$9xKJ#Fa{&YjcV*u|zo7j`?#hM$U646U zw!om~B7=i&C7ahDi<&C_5Xoi_Pr9q^6oIwLE}%(wi9 zPPtk4Nd+&4Ljohf2*Xf{W=OyOJEGyGZOTAEV&!WSshIVRsN$z-+YBWG2+*=M(V&&` zQdQrqPXesS67{xaJPKB2w9*@5z4efJ2kDS%kUyIw3S z=R2CMsQ}EeD^N+Pa5li&ho?by0ejdG0f$IKB&*DL-pEf&%1v2G+B;Co5%23_BtYflJzfspl#4Jn!drV=Y25eBEP78B`*M42L zDWtV>R4+=*ohnfke`box&KIzkyUP&B+R*D18h^MI$HJE$7WWCE*>YD-R`)kdfE*J5 z7*wdS(xmg8#+DWH3uyojo?mjzTFE5tAAaeZ&^?(Twj{7ZQ`->?Igu5VYl zz1oNkV!>AhvGw$+2`V!#ES+x;PUJ~Yg)VQP)YflAZGQhSB1PlfAZU&>1L2WqmD86l z5i%DDNC*;7{G9lAP)W%Y4^4T^gvBHy& zz>XG5Z0z{mpkEAAyK*NuxvCihbi@^tC__8HjO89_GAyfPQkC=QI+iZ(JskW<^ukAD zOS&jEa!?`HYUVLC5*e^O2L%j)u0tJ0~(s%C4j)#03Z6#)tW1wCB zq3dVM$alxNF1bZN+N&kbd1D9K*rk!vv6AgpqN9sP7g#dftgE{}D|)GZ^I~nVqF;G2 zVi9jg7$39FBYi5mvzl>}y7*e&+S{Jz*h7iR2_I*GtaHm-{=sgUCP}ac5FR9QDtNlW zHo;(icQCcmwvcrjH?aZw-O?l-cwc z63>Z;iTb0O3}!T$w3^06a536bn6<{#9tnc%5T7?}G{G zREn97R?}8r={_DC=&xI@1;c!@{Zjvx1A-J1{Y)kgFq?1$$ zEsSR6==5kIKC^ZPMOz#6PoBt`dtR6KB0*=}f5$}-90!tIX;9?RPFxs& zJ=N<9Omih6qn#pP_+B=Dw#IUj5SD`Z%%9~e!1y}I_ zPWOWx7Qh49V}tGw>0l~uIB0Mcb%)IYpb$Q}XHU&R z+AhFWp#R_FL4xtWdjxH19A@0fJ}Ab|;Ddgcm5=g=nA;(~c>W>2D3W#+kW0?d1F(*} zp_{v-ux?Qjsdf`l)j7%c^|uPdI7Wr>l-iEUqpsCAqpj-K!r1+0Cl*Ekquexn2XIy{jL#wj^;nDIqR5R<>V5JgN zn#bv>>2_>1Jdvo&9TEY2=l+g8f)=lwoG?mf JU8x~L{tf>azNG*F diff --git a/ddk/tests/data/contracts/OfferedContract-Offerer b/ddk/tests/data/contracts/OfferedContract-Offerer deleted file mode 100644 index 8e0c1c364c996113728bbf173da8f22a2433253f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmZSVs$sq^bYxfD-ZhzBQyf;Wc%VMBe9`RZ#o|w9pPM`Jd?6zv0~1S8X>kby2r#xS z0MkH%DLo&?1k*q%Mnk60*XDXSnmn&6$nR-)->zK!VA;Zr>#x1IZ}<4^(q)gL*yeII ze|}tc#CMTTX!Gtb`nTSxeE!JJYa8QzRAtB0-d6BX5Xe*C;eS;KC5NJ z6MNCxFJG&do$md6L&=hXao^8-yL3AqX_&d36?Xh^udRbyTx_%DK8@Kj);r&yGJ2e$ zogx1B1{)XD;XsG7l%zsE0Q3S=$&GJkO1{r>I2_=_ArO8vPf2OXvn=lvmR%ArOZco6 z6&S=AL^ipwyq10_BK5#aBsg^WTE$=6YDKQw?c*1|HzOV-|7x$ZSK`z7y&Wr-Oq|UZ zT5955JKbd3@(;HJJ)9VW9hdCZ7P!Q*P1muLHTa9fo}&F5ZW~t%#x57$)adqLIWW8! zp<$QJ!0_Sfla9me6<#0_w!ZQPh|J*tFbxV-n1XvuAR$IZ%XOOHd&TBQ+|m8guXFgd zvaIQuh{P!xb=e$h$7LH|8H3IK`~UxcrWqM4SwVV$4i?*fP;K)2-6i?o72b1}Y`^~C z-tx~4<$Y{W=@ynI4d%CBO*FrBR{sdxQQ4vW?Glr_feVvDm8qI*Qc~N*mu*UEZt1=D zt5+UUXt;17;HAKu8(U}J(_&Jv`slNy=+g<-35UenPSmEBOcRp2_JT2{y2Eg;SiGgF zE~6rIxWd!)Su?%MXF65i2-!O2*I_4v`=Y%D&pECxZ8`g}SX-YNAa9lPDft^%&Ukguv|#sQDcBj1Rs_RASBFNGHmYwW%@H}9YGXY4XfTp0lC7W=E@ zqTWj%(eBu#Io(f);u1iXD%VMqL{y(nwIBN6B=@U(9) z@Czx&DW+O*-cwDk;^JAKE*Uy-RG~)kJ5@1g015DyXmflK9^w}oJi%{nK`y|2ueiof zRj=dO)t_{Zr5~&P?S$RObG1>qSqY?_7G7AxYj?4C$kTK_eJ#*jGpkyb_cgpiPV@Q} z^Ep(F$Ft&|!~T5MZu5pr^LsE2)G1g@N6%3M25Y?C_2uPg!{w%MSo# zI=uogb3*TN@WN0^ZP`+$oCzu137dHrCW_P>9dGNIvdlHPZ=OXw=Fue`>pXeq>O@Ak z*6+moCNq&ly5{Yf*dW_t)U6i6ebU~ho)HPydrN8*`O1=cBJ?SLyH+!~I?piG=(#0d zmP#|!P?r%H*!R%wmTGiUT0bjSWxb$0LM$Sq>*uZBG{G9x{Nh=%WI9#e;EZ)UOD`BO zx}e^ju-TnmdC=+9~OcGra^6if0e_~5!?9dxoLIffSoKIk}%OnQjw^H2&n!DpPJ ze6Zk0(@g`vZ+qD$*`SNOkVCNEn2uIA$)+?+CR^poD~9177|^T?OIv>dJ?}{ESh>5H zV?hpPEX<71*K3$gS_S>IjC##}#B}=f*Y>~gJHjPHmp+1bO(qtd+^rHcB6zDHv>W#^ z_n|`5Q031nucMoEp8M5j4|Rqe!KDZi(Ij(HI*5T5O!CUDt+Nfs8{4T>X(^j$(I4j9^F1!aO zL*wf+;HuwI!3S>?m^nntoNgTP3VZdj%v&?5ki`&aGy1X9&#JV|p!&~7n00CFI#V_( zj$hOpHI5UJtB8vO=q(GpD)j^18ER(<&I)Q=J-*%QW_vt87D_T)z|pgamn`5QRutf4 z)Wixp!tT-=+ev-lqat5KZ6j@t2^ix#JsM`k<}GB|&EO|93NVAPYMu%BMr{esB+vhE zaid!Q-z`F>6jo&HqTI;GU(_4@@NOp73D7gcY}&dpoATSN5QHF=mRBe~o|O0p-EBLq z%fkfe4NnqNI0IfCz1ro@U9mq0mLX2nUyxir31u?*&~{l{jwV^X)pb}@~@`2Xl zc7cb>=|ja8hYD<_`sYW~+P4=g=+4|faOe@W9o{kUnEHVtX8`9F*CM9d2VV?Al+>Q> z%BJxlgXSk9V`-_TuC_`mb<#ybP0dASBQ??YJW_T(k+at-3cm4-b7vh5GA>9si9)7{ z`R~gw4B;A8dlwY&{pK|*t-nglF5BaHen5%)1ZFQIYl84K!7Vx{=1ib#Rw9C1+^o&p z!}r{_vlklPbJ9S&x7+94V+eWDVtio0?yydLgg|%W&w;W_pMBkG8T6mR;`LMXK&fR~UGsJrz@zLE8B4K|z z;3aRvLr=y^4{s|EiB!(Olr#=(J)|T`45k&T56b+MYHphP((`P;w~(--8d>bLpN_cN z9wInv@+QJzQ6F5JE@cW_Bs1>oF!uwsXF6)_s`)kPPE%G4$@rl64wMRG2pu5og{@t< z?Jk~+jkVGF^SmWC2FLTb{^`F186hApi^`lXXpF($Y{iE8slf;dF+ zK)+htf=d~ZIWt#J0Gk{yHa}X#P0lDSPaT$MMm$PtZWc{36E46omP%d_B=0f`go$|o z$UZBvxe5Mr6y^ZfqjG0M0Qv{X)aXeHL0JRIq(wzKtP@lTqqX8xc~x%yRvVfU(o&|cV$C>F321v zTVPOgk-_B<2zIz1N6hJKFT`!iE z^Bv9BQ~>7K6{w_CI2&N?!_y$UfIV!8fJ3Aql2v9rZ{(*X<)*A8?H#D)i1&3dl62!1 zQHhB=7diN1^S`XTW-d0TloV!?4m;pb)-hSA->7RNViu-=J*Kcx12!m7r-iw}Yrihr z6w+Ebsuv~ZPL-&NKQl#T=L^`&-DL=5ZRm9hjX&IqW8q5=i~EGoY`H5ZtNR-!K#mCj z3@X%EY0`O4V_NGOnzT2^6wtj+UPRT{%K|Eo72+55xW2b{cXz=%{-wN}Z`c7#*SD+O zUTwq%vEZwM*n0ZZ1eF;Vmd>{aC-NkyLYFsCYU?+mHot!uk)rW#5Hv@cf$&JQ%IQm& z2$>56r611trJ0nKcEIDFwb?GfmKe3933U*D^6lBekbk;)f9{YWbjSE&e-oD*o(J5b zQgq4E7Y)!_00Qa=pYhAdwhqfSjbfayCBCPbA}6KNkaGeK?a8&W?d*~Y_@nZ(py6Wwbe3+BE3f)w{V}MPfDF-BL-FV8!8QtC2)g3m zkC$LXuEMXo2D$v6C`6LR2enULutYGbK2`D~k$SmDV> zU`GojHg^1O&@YCmUAYsST-A&LI^v2+l%btp#&VA|8J1NtsmghD9ZMJY9u9sadf}t7 zC0&#nIjE59adu7-A_Qs=n*9DcaBCevFP|Yb37&+QNGGIC$6ZCjSEqEOx)YoPgUV_g z`!CdSXztNs6Wv)e?g?all;v1HFFvpj>=&Jiq27c+fr36g={t92$3wo2wi2_+G0-mm z(Dk!r^|6sRFlO$LJ2oDlD6+B&G zn_w`%JDA#ax-GK3Xu2P-kIp$lgp=$^c>n@rohz+%cQ3MD>g=I6~Eqz=EJ zDp*wa+ph)uchLb50HNUp7JS)Sm96ce-*~WaHr)Z~CFlL&^$`*z)5nmzw}wD`%4~WJ ziRZ+_MEy}s1~ZyWT1{ibU>>?%=%C+*mS?ni@D+9M0=i>;*9TjPUb6FFpt8|Y4_dNZSPxcKsCd z7Dlsjbb7Q9pIJMDqOA`n8uZ?y%f~#i5-sw*XrWQ@+>4bs8GU#tim5Jn3-{r1 zYq7MhanO7f?0e)kvMAQ@%))rO_%k=3Cr{+eJ+I4qk)X5gzvChZjsr=qG$`_DCoYV? zp6Yc4rn!=k(M}OCd@mcPeXHEgCsob4a}I}pHdAvAbEkqMGvJprjN8MUas5)i|7RoA zy*h1QZVsBT&)|d9*DCqb*eF5Zye!zs_Q_$2kt^Xc(nxqTV%XU3tI(MW<;^R=f~)ud zr~5$;3*dq5@-95dE8vCaiiP|)N8c!TCVQNcu|fBTbTAb+95lF!y2EAxPzaygv!~`D zZ5LoG(Eso8Ai?YU{J`dbBJ9HYW`N^M8wQP=95(N^_qa`JvgR7K~=(@I8P5dr48 z7fC)_7Qo)=QiBvG*@@hM25UCE^fh}mN@7O*SKT(1Gp@h%q1D-d@Mw7)s+sj`uu=&s z&Exb_UnkT}wCIEOKfPl&;{kLboqf8%5the`bUQX0o=DW?4v7H1bAQJkL5o*TP8g-L JuGA1A{|5FlzN7#E diff --git a/ddk/tests/data/dlc_storage/Accepted b/ddk/tests/data/dlc_storage/Accepted index b1ed9642e2b1f882724a843b5d7bbc15fa204d79..5da3853949f253579ddc427c243ee5e9a2c3daa2 100644 GIT binary patch literal 3739 zcmb_fdpJ~U7vFmigBixS)DRsb6(Ppya$ItY6hbjclfr`#EOS%2qu^08bdslYM#Bt>T5QG2(u-GF&#P`{eg$m;Q8B$!sf;T|? zIqwmb2?Pi(f0)$*1(La!@Ed|>C{WvP=NapUY<-6lh|Pwp+I+6mc7a;Bu7I`4J51BI z4>H16EpKOZBQo0ZO$$qCpFV#G4A&jAKet&4KmaIi~IH=b`N^LE$H`r%P zd2;Su@PU*Y6_6|b+l>np%ia+U+JOLKvQA>D9%f19vO8ZcEaQ-yn4de0`kZxE)vuC>r0+=|4<~ zsQTQx9dnmql1K_H3Htn>A-}(^Qxf?25Ei&_AtskgdQLi=JE@YWIduk|W1`wGj(U~? z*2FTYPDfddR$*vbsY+g6Q`(Me(C-KBR3;P#tFJU{;jIL&u0sIO7o$wrNatn=)`$Lh zUogT|&971r)?kCj1Vs%({V{Yo}lE@?1pkW{+&4KC(>?l_ zWp$+pT8gTz3`a8T~U0=y~s)WqVz3tx|-A=x8J*U1A+Dfp7@cYjmZg$tl z?r&kNf00?!-PWe8r$Vh8$n>JFLHy#^wj080n)JFUZ|nbUuV;q&c$@6O%E^l8YHp*g z>*e&eN4XMjL3QYk2SUaB@hVR<4G+_D`|Jmn`eYYs-FW?xE-i+>ZT!bsSB}p*hI{HE zeHL*wA-U^lI48hhr}Nie33od)to<^LK*xK)jNpdpFn+Af@=-vEv30QdBdf-Vx3tqmgl^2-l@siFOUAIn>Ul z{%16R-us#B+}tuYoYl6?ZO;;ONSiXZVzdWW1XOuH2!=*fZ>&xbtC}*!RUV<>bIP`D z&{b<;)tWVj$h#z(&^q{eInu3=_Hu$4Z&)z8++0*u%%eULKn? zh@`WaG|ewFs6OY(#=LFVY-|VYYSlEh)h_T$I37788V#xng{HoziYdDvEktENNu^s=-}jH*r0} z1DJMsVqpLEeSV$52EQ1k)Ouw62b5k}M|JdiMh}~)=~6Gtr}}JZ>dc5W?}}^`DncUF zHpwUPAFYV9 zFU~M4DNooXaROai6#=RvradiOlu7kVd_M(bJZuRW?lJ} z-IMI|#7wiU-p1TDAIV>CgxRBb?ahbC-V^`!kJ@zy!mIfoe_cX(QR!4nJ&GFykTokU zWuFcuko-#A93r(>-{iRpFIwWgs`+rtUMsS#1g}HLudyGFyy* zuoyu=1%%HL!PfC#a{?g-i$n#m3;>0VPDllXif{{^(-Cnn#}vXyAro%e2-p#C6i(-u zLRehL6#E{E7_2TD)ErX?OADFb_XiM%nIb+#;*@}4sd-E!42dv#R}ff=f+y&COrcQ` zrif2Tm?<-lDTEegVqm81Jf;*3EzHEiu-rVRFp!0r@-S0j9uo~i3o{jAc*#7bGz=}w zTnfXuc}y7?;*WFLP=dwE@MPKd(t*nsmd_;+095R9JW{+hKCv8_!t+V4}xl6?Q1nIy{zcD$z%cmwWmzlapP)>Z?&_6m$`M=X2 z-2?tQ#%@zET+9?|Hvv8StW=WRWl?1AZGgw>?^Yg^|pnU~&M z!L4|qj?f;KEU?5o92dI9@SPy}QGk*|Eqy(x@Pa>$X}(v{e{c(~d?h*Gg=}w3m#@#Q zrp^9@IlRSz78i}hu)-9Ev2^%EUx&UWiXA|y{w|6GTnRq>OO^n*?L!Ilzi8oYt6 R&gwtBOR4|xFMxB&e*sZr$%Oy_ literal 3435 zcmdlV%wS*rRPg(O6FSn*I`WRIZ#DjUG*4%lt*8%I25U_Y10y3712Y3I0G45m^=g1C zUsa?y%S zot4Y|r$3##ac#A(t>H6?b$7$L9HpwaEt`E!y6*ko8%lo}6B)Pyw|zY3+xdI$vK}3s zNiW!Xd&#q)+HISkvF7@+n-<2@#(&*a+pqk5*4d+FBBkzA^4{r} zz76U%l>B8cp;;%G#~I?kMk+E*?XvQv`8@j)l^PFTmSI%dQWmY`DSe=_@zD9Vw<4Nx?1~CQ^{&0;I5@}u~o~O;8d>^$?qjAYQG*gG zBTT_PaEfMR)cZa==0(`0d3O}%TF9%NvSH4co%Td{{Vk3f|JU_9>(_uy`1}9=f2NxC zQ|&-Jpo6!wWbo!a|MG74%q!-mt-BUv_oz8A9D2{yiDtq^)=TbLxE2MwXEE2 zAL^Oh4P2NMB;-u~-Mn%$Zs+Eg9{TC?Hd_9?Y4Trtqsn^Tw`L3?(X*HoGz4#KjpdlU zA?HhV>-L7I-O~Jlicbz@1s2QHB)n3(wuDiU$@-Vs>dCjY_OR}a;FypYX?^IcA)m^u zTkBH}@Ne|E_3A1oB(pLC9sQpH7$&Og^55S%eOnRi6<}5dM(z596K)1f5-s74-wcoR z%S`8dWH5=XmaVzoU=`1W5U&&M|0dqOn8y9e=F+4UbLYz(dZoU;I&RaU!^Ue=a`ft4 zCRlL(oVM^6bJ|jc2eARFwvms!gni_a(!04#jx0XkTCKM#==Q46Y)w#D72Ghm9oFZ6 zeb(f&od=^bDl7C|C$N5z{_P>QybC1%_jG=d+;@|0?WUHWt}xm@n)_nvp|tM335Q#E z|6+V6>$dM;$iDd7*I&9ZO4x{23#<-hc-IuSf4NL@O6bPhP%nWfphxcrDSDTbY?A;nJ*doh(p~u)vf9`EVveCtR8bt`l5w0adfYlmlrP6UnvgFfmRH zoop~EB%Q!26(-6BV{l{Wgd2*a6Uj~vm`+{{op34aI{9Ea`7v~I!lbb46o5$!V(5f> z1iMZlm`-5~o!l@f>^enY(xMnTd0K1Ip=@b=KHjwX> z7!c0lB wSa5koMGMtA@ml!%H+3yUP8C#&Bm#j#AV>||P9!k62PqP4uqqO4)dZ~r04>WKzW@LL diff --git a/ddk/tests/data/dlc_storage/AcceptedChannel b/ddk/tests/data/dlc_storage/AcceptedChannel index f42724d12152911aaa55e635eeaeb1ba6adc7745..08c16c59286f318ac3c66694c8892459907e3749 100644 GIT binary patch delta 904 zcmV;319$w42aE@Qo#*HZvD}1;k?S#Wc|a?0o!$pQy~_{8|S@dEl#gWbf@=P5+Y0qH1-A*4BbqN_49NW9eb zfb+n|GsOZD(f=;O{G(%#tuowQn76u(JI3zy%hQb7Mp(UnWv&gR15_IwN5dwL6Cin! zP;p{xuS>-J?SsR{L5O~xVrmDw2?A;cC;79(OUVVV<@RcN*W+5C2ZaCPsK|l<)jim7 zO;Q7dUAIBW)5I-JT?CQ*Ah~YpHpE+a`%_J{LQ|Sn7w#kin)<-QXBN<(61QpN$9y$d zre)9mK7E6KObG5p?beoPX98!z5#bkmsYE1iz4&;|jKnwnvq|q>7nu|t1U5a%hRXr~ z00032LF~_16Se)Y5Y>;YSZ94jgAL)P0oe`{GK$&|)`56h9N?$q>X%VAvgOYVMuXkojjuCEKfU;yAD0w$m-ZPtd5 zbM|I>NFreM8#Z$TNgy3L5=-@$dBJ43yvTKi0cWcu+h^=<16pF;?JDYdp0LC}~9jjUYdzo%ynTTh0 zsT4|o(wF|Mkvb>nXJ1?MV51~Q9_B8Ht#+vt)K+-LGv8L4-y}f2a=z-3H)F4Hh^=<1 z6e9d(MpNfCzxz3m)cB}#XygrPEr@7mAp&7hEE1{@Z?zPKok{h6OuT${45TPEke)Oy zKyR58s4Hl!2H9a?ywi=Ib7BcEYC_`_;%M)GbfRcHwAbTq+0S3ZW->6jPheTUjeWZa ziHlEQQJ)XD*e$&*1S(d2fdI3GX9J-^!i)IS#{17a#${cb;g;z#x`G57$YUGTZ-ug2 zfw=-@9}XG*7KpxSOpX5h2}wB2q4`buG3+{KU9IX_N+ zkgTwx*24WKqGtRanzsh%1#T~k&mlDHXIg||5+MVbiU5IA+4L}r-3GS}FsqRWHiLbc z)rfFwUPKxLCds+&EhGfJr|mLJ^~MStg98u1Tn5FOGs7_{o{me8hWdl? e-)Gd|Fe0@%xdIr3SAq61#E%@83F0u5c>@#OLb(0_ delta 904 zcmV;319$w42aE@QM5Stjr^|>|;SlXiL|G35*NzO)xVi(_11cJc=y5@A0*Gn5qyOQM z+BvD7{bwfd!`b72k7jLjLCe=Y+wJ0B8w1Hi0(_#tVSm|mx+}Faz`zaSd`We+SPnP3 zkze@Ek`e-svUrj6IPYiJDeyw?I^r%x>)f#i4Zz}2U`X!0xw!IGN8!QbIh6w z5DuBXuKaSFb7Ny4)NPx>D8v{>mIKKT@Bh4LAd_`wh?bJ`u6>56PatPMAy48UW+;Ug zQRo8J&lSCt7vT~vpeU<~5&HVRwF@ye_3g3A465~zaY2Ctg#e_3PP3}bIw(l=18;dM z*NttpZp=x4`u7NR+6+%@dIDJLfU_bK#^N#voBR$I*tgChXW#+= z0004@p~vA>$@?$(g%L#SmCMq(uX(Y4GhcEW_J2UEx}aeI00000{{R2~0hA;K1^@s6 z03rY&`5esCBnrV#Y{rlOhd8!#moRU(bavKyjaTn~GUcQD46h5nU;yAD0?`iWW+82+ z(LR{la7z1af{gtKL4PEFLyHo^9=KP?z^r6rcBvE|#UrtK?@Q5$ix(C}{n!hJ(-)+O zt#+vtISCJR1d22{)=mMgtJei>KI{w_h^=<16s8P{ZR_p{;|=U^d(ChtvFmK09*Adl zsT2r*!O=<~Dt`kYj0HqINIsSK6)drct#+vt9jRRlHnq^Lb+}lTX~RtUXMP-Y^-E|`FpzO?k}gVLe+vX`SU@T8v@3d0VyV< z0`K;be7@zosH?~T diff --git a/ddk/tests/data/dlc_storage/Closed b/ddk/tests/data/dlc_storage/Closed index 25937dc01b718aae0b6925988054132bba473ed9..1273ea6cc2a56667e6bc8df3a65c5a384ccfeed8 100644 GIT binary patch delta 1098 zcmV-Q1hxCv2-ygK0RaS5Wpi{gWNRBE5cYV$yHjc!u9mP?k^AP*^F7`1YT)NC@eOvwKla`^!cqsm^~=|CxWce1t?~opCnHOrV<8C_RZD(pUE_Qs|%>& zz_FN+Z;sMb7tYC3-~NQKG=gU*>sdG*YevLFs|FY4Z-KTtSG~-fBlR~Tq?u@^3nqV)`cW*0p`M}5)C4YZIWth zo+#T%+lg*STs})}uEvW-Oy@~?qX`|_y#V{EUebMEAP$g9HihA|g3C^ISePtuaW$Un zA)>hP$%e={+Qzr1`my475gz6WKxdx#=>k?{x*JP>NQz-HgNRTHO+c1tw=%adzTAVw z=crpp-G4_xl(&tb#tn!g+K-xN^=2>%!;C-X;tnKE0!~7e1;P}`r*A82{gG0L=L$-Xw1X(su09 zg!k$HDRQ{Z>=E?>AX9sg>u^e9?`x*gOTOIoqYI2ap7f-7(uaNngyI5Fb^%8)L;@gH zTpeq%sIEX7j_0+&6vYkuq?9~{i9APt@s2g5&|IWE0w5eWpa_ZfQM?6N?h;MCx%xv3 z(l|noHLN(-@o4(u+P48mQXvCKk)djk&64+R&{HZg%dugXeS_mX5j-gil>Afc$X_BM z1DTf^4*8o~AjPPT;%bbhFN;tlo~FbgP&xbrX@#wZlv1v*3%_8%PtQPo6WS3tw%LO) zU$r7|IRrRbDBtHD?1hm7{3EIT6a5v;vGPut{ro#e(+c&bK*Rv51bhkRI+BEo%Bhj7 QlP?4z2><{8|NmGgKn~~x7XSbN delta 1097 zcmV-P1h)Ix2-paJ0RaS5Wpi|P5o%NGWb;qfn1dM8*o#V1LTzA|Yc#6Q3VmDJ4_M6r z3P{T~>AP@?3uRz~Wom!I>{i#=DOvY1s6Jr`-S8Kdxjw>0qOfs9S>iQI530pCy+=2a zCe=0OFdOHf9|udD+59fqRiW&OfNtvG9*CIg#@fb6h?Ql3HQcyJ6ofyVC1Z(Z<~f=f zgH+$G(rG+$V*M^2@+}x;-B2@{*PEov4-R6~767ht6F47HM`M0KQ)6BK1Sz!iEuH6r zjk6gXf3=09nh5}E3*tM)Nn-B$e&SlJX=^$g$#EzDV4mCz0m6NxMpk4eSc*29Z}hf^ z`)ZklP^LA1QNIoqih63&n8O|mKQQtoGSi{_ONZ(3Zu>&~xi&y>o=-1PWNmkjVkalw z#X4w}NOAG1mcXkw=xI7)oS)Ll4WF8^h!zY5vtGQV;Fj4goHNAZr+T&gA~h%KCv7fN zfJH?=Zj|UR=I7T$g52Zas<-%{S$qRk5cpcKtWMT{!R8mCP&EJw@*}Db4sRgRzKu__hj4RuT}1v4RO6r3ktAknZHmo5Y482{#KV4Vf>Ljmy>urE z0J?X7ti+FBWK=&t9ubsS;tSPrGJ)eZo-+p8@lDZ}2{`@&Y!y=`^d7GSaaOD{NnpvnK`dH-*I#u^+@#Mlh*rx20d`d`tbd|e*T|287BV06? zP@gfRp=cwzNM`~dEQntB;f!*{xy4&CI)9U8h9`X`>hg#&P@!L&-7|7D0Y@-I0w8Xz zMGi{b@-m-2=?gMuT@H{*%^XBCjvv^6J)8tBd_NrmAV5g&o=`mxq+jKr%FW0vDa~{t z?IAu<<(%Ul%D4z5Z~;eBAp)P8gZ%qFaS2av_MK@3yk2((Arb8{HGDYTpE-eccK;y) z*}i^YGcK>3WP;b+;zY2#>I@6e&m;uL=Lp-hF|Dd^Qm(HHzhF0jG!Q{U;af^K0rFc3 z;)-nK-!);y>6A#HYzAd9OE_Fw8Ces3Es|#DaU|`r;1c$hoHMRnEVQie4OdKT?}m<( PFa#k8000000H@f%4O{i_ diff --git a/ddk/tests/data/dlc_storage/Confirmed b/ddk/tests/data/dlc_storage/Confirmed index 7daa5dff6cc7a80e03edc6a45b377701bc7e1067..7ba97a37f4bfa1e941252d68aeea1a9974d2d965 100644 GIT binary patch literal 6182 zcmb_gXIN8PvrcyCU3%|LrFRt#HAqnqDJq7JARQxzE>%E4x^z@JNJl`5^bR5*0+9|% zjdY}!573~`qvxJ`zkBwNz1E(0-Zhyu^JJ|Ve#7%=hm+P?IohVpSZk;ZD4k_*AC$o$ko#5DPuj03)-Fm<|!kpp*V%Ri#Z0Y z+Kd!el9Xvj&EBG@V3{K^2@L`_%?j5XOjpk-lRF4%_eqY)=6p)TmeIPkk@aJ39d^SnVYc043n6+J&SGa z5t5~9uG(456AE8V0s}BsL#f(JD)Lt-yFzbw66Jml7X^TB<~#;c<@mZ5X%NwSEjM$z zHi9`bPQ!$E9#;7fZ(8WOflf4EwNO5p7=wTdg(S_T_i3Kkts_fS7G6WFv;A`-3fbCkf za*QXxTVUbBo(=(NB7TK_4SvBs5|8vK@;C^ChX{UziP1@9@h~(@5D$L@84N@xMlSiv z6L_J>hgeFYlv z4V{J=GLvI`10UBTNAjA+r6OqDZDAPnooqBz zR~5AZdA(!|+ha+1oR}6Z*Ex#L`Syl<{Q@BM*;510)7)^bd;dZJBG{)fI9)BG<^=UD^O@Y0h zl>d3BRXQqZ;DT+A(=WLy@E|+JIk41d&&OLEF6CNY9>HV&Jwq;z7aA;VG8w`=61bcj ziT%$n@Kt%;MQUAVe<;xDL8%TfOH#Ir9!7y^%88X|uEb}Iw5HM4GE$uJT)XXE%foR` z@hBOm(hhFTcIWH?+=nn%2N#ROdePWsnpI>J=5;WsYS{VjrWoU+2snAK#&;s^yP6R^ za=J^4)R=fKE*Db@b~0R6Dgb7shT#3nV~6oKi+Sj=-f;P|m@VfzjNsE`1cT_n=#ZUk-SO+E z;1olPeifi)An@rycS=1vb$={}K0<%${9@oI^AyH9Wugyl2zsfb@pSr=c?x5mGBJMG z#z3q8>eNr>DNJz6JUQr(v@y}lUu^#3CpH?!{f&u*hJIllT|v-NJoE(rH|FW0zc7EX ziGyYm{>D6o{>&soGl_p=;-aBHGfB|!nctYFj{KQPie{4i#>7WMe`b=SVT#|F1Ze2b zOiDCN^&68A4IPg^qd|=p)1W7`KT-#swrKg!0D{0okl=Jl`KT4#>(5$jcna6f6>Uj~ zd+JY_#iHys$jbRcogv;KBIRorLQqU{pQo?E5-w+2%i67!sAVQ!(xx=GR?3`t2#qw; zjwwh}G?Xq86?)6?L?&WU^G;YaNl%-!j;|=8aEEe|Rn%i?u}mLIVU;E4c;7c8{x4KQ zpDNfar4YGO9P}(|5E2RDE4HY4;5b+JJx-_r8{B-<6XV$7)@Tq4tcgrubIf^fUusR- zyLSD8^T=zazB7aZmFH5L;a*kzmH=jEsuWh*QzA-xSLh__rNtf<7M+y*`~1+dxxuSF zaPL8)&UMTCePxp7mu&8{UYEw=U%V$}3v+1Ord?bRKG$ht_||P6nfyXxV5`wzh(CQB z_j3kAoll;MZcKN-ozGde#ji8k>@(f>BO5Qf;5o<1&Nwd&PL=JJ2W#29yJ~s}%)&#S zywrWElaM<-^IG_#-9dru0iLH@u+ zMd?(!pwXI+a_~etkm5&4xc3Db_wGP0 zhf}z~QFK$5jP3Y-lX$7h#<$>IxYh*p*l!3w#%lB#Cn&#T^NT1NoBeVbV5EwRFq{!B z-{=80;lbLhc`jpasalqCQn<)aD7BdH4V4ZDH?A0#Cd^kUNRuJDMlN}8 z@|W_?lu_Xc0H6FXGRbh6CDMyIq(2&*^mV^70biO%nwdWsRd79kq99dbF&x~%kb0}9 z{uBukva!y##xYQ>(P4uZv(|9{1(nqAf|p1iN( z5~W4a;>vc*c|F@t@CD9}h8mS?y!`mqbLr;nu;d7-UH3g1)ty%rZ!7Y+Qn~hLq-At) zwk_zt?1rctvMFM_#eNV4jKw`iqX&19rkUgA_bBd>W0(8|) zpzBlB9LHfQhI~$vNYo#33KJxW#uke*FZi?~lQIrH z=xZXW)sDRPY9+JHhin=VaB<+wc!~9xK~q~%FJSNz$S#TE3(Z^gGtJofi>Q!qH$Gr} z1WZ(f7e$u5TL|&W*Ulyk|0~eZtaq(iXlg6bNP|25JT7OYrgz<^pwQruvq+4he5|2s ziC?FLFbs2(7pDS)+7N;bK{XSYQmZvAsS|D3SWL_7P23HF-QPxQ8z?2BjqXS2P>Q&G zit`~Qud%0-9E9SBE}P}pEXgQf_g7rWTJgH2@7_HTbS2RTLRYR_iG>w~*>N3ZpQe!l zr5H*n=usgptEg|{e1k8jngrP08tRIUyNRl{|;YefT7ph`4R@yyKb%`gKVM^;adZByKH z6!7UIqM_KZ*&bwAA;tPm1I3Y~f1rEH66 zcJnhl?_;PDo8E9A( zRxga^6S9tY`IR~)nUD{bq=t~C-C7?x|5c0B{FT+W%LI5dDPS*VCzAXm8rJDM5U_i^@Mc^>4Eeo~c^SQ( z=K(1R-$WN{`QSmF{tawSgcz6h3Z}I5oJU}N4$h)Uuhwp9rt0j#tZom5i55#%8!NBY z_%`uyzkgB-3aktel~1N#S5ChAB&B0j4G7K{&Um)zN6FM>LBexa{sMy_FE!grI5e|8 z%pd^Bqe2x5k@lQp6f+m^U2uzEXKJ^fKH&R!h)o~oQ+p^2fMee=4yPrmi)n&n3Yt3@ znm#!$SJQt>9@+~Ns@Ht2n6C5aLG(nTw*OuJnP#2!>5gYMqwHCPJq|UpFZ?o+w*|NM zXK$YUs&W6!IZ4>3c?kK}i=Q&|3S=VLsH<0BLA<<|&W=K$#RU7(2h3fGleAfpW|$F_ z!mM0@`fqCepPE7T`r4EQD#gd9W5BG`v9%2Q`!JH%d?vyKAZ*?{E0lteieZIdBc*4& zb~17N6>S!K*~4a{JBS6t*$#rswO{X58LmVXr=VtWGc0CehgujUWY}{HmR#kCwpVXy zdbgD@dwwQqSai=Ta9&}`ZDMR1;1G3HmvByq>x_=xx6x-f8`7j`lwt4Jt(Qp_xYDZt zge4le&zYv0>Tj1jQ@{JN3818SI7Z$Yv^FM8hdGuXRMPq2bLx4x4beUA{?@PDfC;&! zh(EUK(M|&StKPh799g$^{YxhwLV}!xbT{R3+)YD(rhjasq#a(D!5SHTHZB3R_+s93 zg&fHgh(j>jyh2t}IyN@EeonP>FI~F&_B+mTF-Src!LvkqO_4u4bk4UoJ z!{=s-OzL{OZ#XI|pvG`cKP{DaB07oA?+(QALmu7frAYJ}k!@UY&@|&M9ZJSwSq!tk zliz(wF7q6`VDZu7jW8@0GeNcXGOCNNxzc_MTsxZP&jzKdk1tNZ|Eha&T!j2nMR{`l zI#z@X+6SLh(nsaopBgK1GqUK`!=FmrNOsHq7l9Esfm7EMe!JP#9B@Xn2V+RfZcg*3Hh7 zJL197j{{4weP8}>3g~?N8vXyiZOo|H|0V-Q3( zd=iU)&!C4A{G{6Y8-umTjN?fBT~Fe_*iw((-T%=b*GaqJ-!u4YR{SZ3|BVa(uRRlh zwd#Wu)LH(qQN;3({Y~{e5VDREd{3@rs)y#(<*V z+-8msW)w}gj}I{R0GQbyKvV4GI@Z98^vq6+XWoCl$klY-NUL~s&sevgcE10p??F|b j(0|!K+nTv1dsEU>EM8^CACs&I=`qj+t(A=>mID0;%aKV6 literal 5878 zcmb_gby$>5*WaK^8YBc(LPB6c5m9<2rCXW>K|va61SF+Jnw4%8kd!V3K_sP-kQJ5? z5TxS;9v8hXeZJ>=-|M;m*g5z4o!>b#b7pq#Gs=^}BEWO>HXZWut2!ZGi39qtuX3%s zeME7qK`H9gvw=V$2ml8B-E)dy>dSeb8DO4BSeO^ZjvLU4eEj^XJ5_*>PMW{0fTxvy#XYkXVo)HmjjHRK7?3WO~^ zIv9o=0F427HvA!^P03RddDkKV9o@c}=SVe%Eqe%U4iRz*+d+;s>IgDR(gVC%lI0_Y zjhXquiqESVy2V2tLF`xLrX^wn}#g+&7#$E*`((RiCE z<>rtm&rY38Qd%BYUaDX@ZSE>|i=Yao&(|n?R`|u$j;}Ej@0qPHsTZs<8mU^9+;~uO zNk4~t5nsjDuvM#!TUqF(ocH|B1>;fyRaJLfQ0BK9`mDmv2-|c8OYQQf(7{((#&ODBTv7-ZzgBkoZvv?TlW)6-&k_-d| zMj%T+`(C(5)l?Ov&Q50T!u=*qI{Q;Jak+3~0zpp(fD%AX5*g0My!8S(39}{t{Q4&C zh9c}Cp9<@?m13#l3BCYn_UvT!ddu#C(D+cdb{Obmkl)r-E#^ql%L@$g_i{iP1WF~+ zF$s&~=kH6|XAHn`jj%T&2B80wM)awn$hEP&K>YEhq#046Fuf7HiIdpJSjgqlb-v>uWM<837KAIDM z#~tRWdf(l)9i7kJfF-LtP1RNIommNJUc~nIT>V}TYWb0o!_ zAT#lW(mPZEQcf8<0Z4XTAQLzlYCu+p&<>qcvZGF-L|H)6w;j0+|v)BBcGuC4IU9{K(aGB}k3#yZ zL@NjEPw?DqBa>jA%uLD31Llu2@ATN>n8H|{$K+DK4ITj7AN9vQpvTb8uzo+?f((1! zZy&1-wUELy`~Y}5dz1kEF{G2`c%VpinBXmCLaCEibn*c?!;L^RfKEE|)?F^0!Z|*z zTl@EAlc#}el}TXusOLNXihF(0q#ln>8~{#}{!3Oxz{<<%AH22Wh_Q@I%8(agw{k3Q zuBo3tu{|D#pXoxm1(UF7*S?xjmXo>pQ`6qXzmjgkyu+ZhK+l*BtyLi(0hu*^bIv=b zci9BKhze@S!Q%iiDn$9}0jyDsF>O#>E-!-g;kD(CRv)9Hz?)y~D--e7fJ`7`wTm4b zuGrK*$nL=&nsMZ%H3(wWHR07g9x;z2NBQ|5Ne7^l4g}Bw(fi`0ho{d^#TkZH{i;Cg z0Kl_9?z261e2V;VhCUL0+Wg#!zc9~WtTQJ15CWrJ9k*xV&zNU0<{1;?M{EqV`SJUi z_>*}C6Pz(m53XZtOtkrNixz+BEjC(*`x_Gr4gJDAK2p(IJhXuS8}rQRFU((J;-Hy? zzcJ6CKQoEY%yYjnanaD9nZ#(Ao}mMKj5MW8$NsKQqbEFvV|70yOkzCM6oC z`i)75hECd_*`P+N&!dIY|L$WO^s+_key;+NVWQYx@VdfuA zc?w~m45BSknwZ=MyNCrnZU%pd$!$%B?+=v()0uHR^sSq4I(P6X{^hGYt z7vo})-doyEH(I@`q|O!+>yUHj+g>jZfdC^7p-X#8nWo$lR)y^EIP^-0eMq9y9~R=u z@QSaql0LoVVzGR9-Q}$|PaEC(W?VLHh78V74jzSpazwgF8LPxOFB7Iz$U%UamSu8s zoej-iWO&A|nOSU1xZ#@69Vy2v z4}ktscRQS#czZrnNNIhV)7NyrDPi`4(CZqpOJg3a`0^VPEc={@J)ikNr#Bz%Ag(*X zrsFvB?KnaF^|pMgeqfdKf~qOeCaZOiTUTaMZ`yipfOpNg{lM~%%S2azpMeSC)}JjSjm=d(I@k(irR1x_ls-Z+OV}(w*6#P_OeNA-vk3_HNadQ~G`!PZ@Oq$ zpZw|3DkG%G6|f6LA^hKv+tt0d6^1b2a!ktL5-bglXEHS2f+tdi3%-xun}^^LY1Zil%{b>7*hQu;n}s{RBuGEb}4mk7T>q&#+*-h{aIaSz;W^KzMOWn&Cm;n~{`2lJ(5M2h*ZILiEFU2_z+E2i*S5%=R=Mpn!3 zO86On@#AS4s&qbiKH%#%HcE-X#r zonez(uc33dX=nEnr&*(Y_Q%IZCdM?P&pUbm5j<_ObF;6W+3%w`4H8}#tak>e%XLT+ z4cW5wQ#)uM_zH(+QECSehJ1ZlYrUHb0?kD8b-q-)YU@bX+atm6JIdroRYoT^IAwUB zq)gna-Vc;e!f6&mDri+^;iLS*Mx1av*1fXl;T2SUy9EJG%XoK_w~(oFRMNMl_d{Y* zITVZ5u~RzhoP*t^6F^Ne`>iK*E>TsIkY=s!X9+Z685qN6-*FkFT>$!Z(9N~&;u!zpH;0z;=1Io4_d8sHVm!s)7JSdo6KLZ4TU#2KQTO_-R~Oj}7~P4Gl; z^PY{^%@%Ya$Kn#pK5N;vj~v*&(%YKW*=l%v{<|#BGEIf6L^7xgn;vPb`r6%8iELI> z_*GFQwk)3g3!WQl5g7KeL|(h#v3wob;Iu6HiVGkwR!bf({!dCDbYgJaC|%2Z36MBg ztw$*?ZOAxWw|CvKk~!B2woT}JGwA*A3JNCmdn~v1nJ%N`&GH?MRE&doFOV#I^fqF0 z7NJ(+uQ?3ivp9WYqmJ-zmG&_I%m-^8Z>6#vU-vdr061kgW9?ORV*qjkKr{UjyRmZN z-?&+%%yjE-Gl(HfpG)(y_C_Yp!tkp(?t|qYS^2_=RGToJk#Nu0x{i2GPg2d;6zww5 zj*-FFJ9jZBHoxvqbA9Uf9U0K=Du)a%=V$dOnC9DaOsO)^>nP5+8H-XzYVfMZ?k#d% z0>clfN-4Tro|OUbllfT!G*cs5D=A_}EAa-J9!q9j^(G4eDOW2vW*`jDo+b`c=K1>+ z>8`bVQihKej0C%~Mw4mZ#b(JkKlIbinGV(v^7VwOtnQ9s)z*!3#Y#QQ^NC9{EuXxc z53Rj(H5YVF_g0Mn0U_VJC|@9{%+=jhr|6<)?+_Sa6B#c56n6-SFP3qM-#4zn%u0=Z zlb=l%>0BNb+}+YukX22sUh8OCH{Z}*rqduqSvSv#e=SH7tCVFETg-t`*T&cQZTM#a z+qbENhk`G*vU^m_GCKp})BE1JY1NGyhgqhqQ1~Jg%Qi&t*}EqdhcK11goZ>N_R@>u z!isQRGlMC~8O^PR!B#{>>Phbbu_K=-9Oj}o)aTE8e$%?`6zaIQ-4f*#AP;7P>)ATP z)x@5EaGRZ`i}^@kFiF2JyrV@zmA`Bw?h{z%zf>?oH)X8e9lAjIZId-FhN4(Ho{vqT z?NY*kcvVLEWum^84~iIV`nAs+6ufZfblYV75(9TIUOy8wPi-Qm6)DTGMTE>a@xeBC%dsobVW zoRdVC;D4$*Pl8~bi~`u~itmsY$t1Ga0yCTfHm}*SPw9@(aNSa$*V2dS!`e?rad_N0 zpxDK~qW?{yT7=(V^xt^|c@Jit)<1vavGKOy=@;rT{HJS?{~;iNZ2WXQe-luQnEkY> z`u74h4(FUq_1_iu-g5e<#n`_XkPY|$47j)V?*{yJRs2gy`iDvRhbiTiYBvH%t1|uL zg$&a_-q)$V1US8{oA8k6wlwJUf0NgDkHt65{<&i)Up8KgHPKb)LKN}bzR!pt=>YLa zH4LD&Hi^q!DidkD&>O;Fft8|%-~s-1?SUhsyg6(zHDFXy4%>J;<|$IO8#7V~WC9_RR}$$2i!anQB&yz}0DXaCsUyT1Cmy1HuZ?&`s^HS9Gd!4XCkD`Xw{y#k|`)W}xp z0pek1$1ZwK76ULC41ge@zkARKwwX%Mi30X<4+on~`ltbp`$x~OGPD4KI&S{b0;45A zUnk!Hrbhs_ik8=EAU7Hd2~F>wad1uGhi47z;3ea~IRpLbHJ-(KU2uHUJv|`aBv}^( zu_2k1_YOg=%c<)vPIIB9;xsD|?`xjAHV zk$q%LR-2-#on4C$qM}Vo%w`$pdPizGUts_B2sAGhelzvEmv0iw;~^aoD|vWMUfj$_ zjhHKMPywVL)>6BJ3-$!}IQfxy&(^-nlg>)?k&3||6wX0lc1*jp^l$a(XF*srfsdS) zhprNMc**cCsaJiI#QjSB>X{thVKc3B$K9_uG6@n7XSDV;f|Y`47kyG#eHipqhHuj& zXsflg5+%Be8~lX&vTX+?9DGAJJqa&5#Jnre>B*khGZ>azQnnNro2D7C^$~yR3ct@f zM0nHvUJ#URjlG>@XW1z)I-bk|LHOcefPmsC@^~KCJUyTu*4NRICBV|P_VD}>WH6+| zF|XsYP0W|V=_MS_#)eI2k5r;XeR>*R+7$a8qCjB~4Tx$HVb4ae6M4bE&R*NMjDh|w zZ*$~8wxrps9Ztq${CP~0U=NawQCE9dkNWNq;j}vvO zkv(X|meIIJ(SK8Pg{+6b9;>Oc+3IJyfgC{~3lSZ1{5j|bT1vQ3k8UwpeVnCWjK(NB zrNLlL2G5Gs2Zkm>?pW`W-$#mXkm3!q)U!6=KbhwjUayHkk8prOp#V_*0^#x3(Tvp^ zg@Z2Uc8qMD@nfI_q|e~2s~Cu#wI}`oU&L8krOI%4%w2bP4ayk%>FNy@TR@Rd4qy&M zZoNqjvGMSFhb5+rO4QBt zpOJ}g3wDy&Z)KNz2xb9fi%J?sh&kYsU5l-PZanO?n z9Zec_yeJ@3OW|-~Tn+ob#30}(xNr-k0v|vZW)Qr|-x$M?j6ca2kK>OM8pu~f^j=p5 z8F3gl^1&v`Ewb|SYVbFRPFsn^fF}5mJn33qUBMg{lg4Q12mJ-Wx-;Ex{P5Ddg-Z3Z zYwQHuyWP}#ak9}%aj|nium0rMf~yKD24fy2tkI00rAZEwUw!4QvUG993q=v7*s?3qN&!G4PXl0^^)8F&hyCGt^Og(*4Oifw51RSU+rIVbp(h>L>FACOToF zH?JdYYz*@ko4@#pi-GZfW8z?-UzkVRDn?3x=@92FMY4D@Fv83rc*jd|k8pP3XGCgpETLJah0CKU#z{*6h5f&R>-!N9b?F^MtIar-kG zbQtj|Oy~5E)WM`JM*cH^ATSBw-xHO>LUq401y^Y`-KhX;J|pMW;DnNJ@s!_bQ#O!Gse|U71<)ur z_1cp#e@o?3;wP$iIP)6Kqq@6|#`SEo0z67&?*x2xWbI&)VkNY>lr&>k%Iq?+Zv0l= zzp_hxnSaK|x!!BJ(M9VCL+B-yPtmhYklR2$i8ybu?D-y#p>;=VJIm@+wkhUEXT*r4 z;haK|%IhXTuo)h!LqbSSHIa-7Ju#aLMZ^a9u#|L?seGHFKtT6hsmucv-P3_zG_}7+ zCed^jNzLmX-XqaYtec$akv6y%exZZAtu9}*)L;6!j&{c2KA&eFi|&-6AQwIs!cNI3 z!8*`U>!A!KUVyB>(}Pqo-&Z=?y<@uWLz$mn+4 zCUqJrdCRE&n)9{QOr`Uz(8DgmnU(T)^+B6fQZ_-9c8_iy2+D66=-eqDyNKJA^i`AU+d{xeNqz*PLsRtEJDuYwb+D2osmMZvoT>hY-6jq$YH27Zs^L zvn3HUh)>L%ry6)`nZxL3w$RG3K<^J^!#(pj^{|b;s}VW+uB5Bp;TCTQ%XS!UYJ`N#3^`>t8HVPZ~S+P`kq~LrSLEFxph~G{mm3 zB6?u3Fe2l1i0SNMr%Fvuky1H*%3Y=q&9m3bXtRJIz>whrEMsd<%($AaYj!D0JQXir zV=H!DtLO$P4b_&7E7EUk;dRyh@k{+>SeZVpB7L+HZ(eF-dakKnIINtgnpGmR^kXYa z+hu=l48MWXy5O zi_(IHz=4lO&-*r$$&{oTL1Ew!6wYf!B}r@(W^-A7m4G9A7r3W>Ikp1kw6ZhDW$*df zRzh-+P>8P?OKHES{_VJN6xk{4w4jNo^#tgc?TXm_X{;MU5}p*Sw4-C(#sQ(+eu*)w zwIj-D6)y#gZ(px`$UjY~Eb=wT*;!CR*K_ z(>i)hWw9dkv-B7QC>0}l5F*Vk2Zl#52LUQV z3N+t*=D{VI?;Q3$F1OEzPF`Cr4G`Oo6twQMu_->!v#Vk;hO*9ciAhWzp;+;+q7sS0 zAKtAKK}=1Cd0uUEfQs2@o#lm{nOZoPV$qds?l!A(->t~~(>LKPA<=W|mz_TB`GyF3 zs7;x&VJ*j~fL{cM!^<}`rSZ7R>Bz7lbXStDjAg&&~iMY2*WShu@}@ zfn8wJJdmiL^aj_OBy8h_$|H*R&+n#lsbF1HZ+<0u¬6gZ3L-rl8_j2@m4R$^~T^ zkZadU-)fpu_nnt)?T$^O?K?B=c4YpW%3k-E`tCko(@P>J4>QB^il(Ju>z=sI;|*tA z{jhHzDlHs0XMX-#i^AyP$G%?Q>z~Z2QLB%``1`eV03RXI_)1xZ;pMhh5TlleDL;W} zBwcsxVAG}32rqmQOMoM!A{$1?<&JgRl_ZYbrR%-W27gbT!SxaENY0sa6TQMXnQjSH z9lj!C=bjJ4@Mx!!zRqod*m{>TozI&}B4no4*2N28sb?}y<0g0HmtiJrc!+vs&lad$ZOo?RR1*2 zPwKA?@w38@FAbNQsV^dCiOL@~u~^&^tG*c*Hf?k{UpXBy9Co14A6bk>wPe^ke2J0 z3qROf2vL}A7c3hLBd(2LduQI#@`a}BeDov;cR4Smcd)Qopi)zmafb=zHx;_vRSV5S zP3(IvzZ4$P?lDy|yYcA(*B8~Y)RegPojW(~)!%c9NaSD^sm*XSii(WDlX%cqb54u-h-`|u_Dl6=T95zS#Wb&0ML zzl~r1A(fS%O26;ghT|-369H8^rf^9!AST2{8)iYDQbi>yF^T@;554Z>LRFu?ri_!c~o# zdz-RU($mv{b8_F+(|MqWhH$l~Zac-6#>t}UVYyElgG7uol^q;4fw>aIf;$??y=fbXtlxr)|xjGYS464DU9)nef8Egh-Gzra033RBtxI7j*F20Rq1}L2zfj!iz%)D zR4pc+#YUI3tRUtRE$$sDSwY9TVKd*CR^j^t^4w>5Y(1ffY(x3Wv3u4-Hy@x?kE*pl zT{|2f0CA4J02_SLZ27pT=V3Epil;zU0E!^l_tza!o>7xzq{4Rdn@4+bcr-b%G}~X+ z|E5%h6Cy1BZzBS=YFE)m(4!ImboUYT=_$HA`u7Yt}Y|1Xv_Xm9U-G{}zs?;89yEB+M2|Hg&?*P8JuAT2n8dViTM$Ed12?p;o#k literal 5878 zcmb_gc|6qJ_n*Z!jD3yBR+bh-7-Si;CM7Yl?@N}fF-3OCmNh$L--%=!BC;kV>w|3B zDcjh>4^N|B-|F{#f4|rB`D5<+ocDR(bMHOpGxwg`PV+h^UcxY?nSDk<{8M-PLWyXV zE3DP3T4__{IgL;c5C{YTz<@tJ#|W;DqQ{8=?vaFt%O-i)fR5zD=V#rq0(@}P{A~q1 z*8KQ6c?V%7LLe=<^8n*hGX9=+%|&m^oWXZyFQvR7+>iV=Y12tCMv<8>zr5%baV)$J zVGR^{ju?(_%2> z!)LlTz`6%C01$2^m!bD`Ovw&x8J0S=3S_z1E?66j@v21UhMt2vT~I(r z4qQz&d9xI<^8noyb-$cgc{{VT+X$VL680e~YP3EHJbTcAYP}|=G62?bqUm)4AV{v` zI8(*l<*|6XP9~>?tbwuas+Tn1EJFBG@^TgT0fcHMkPSmMpJGLxNQxZ1nV|W`EjX=f z8ih)+Jp+ebUHGdG#nkkAaJwf7$-TvwuF+m|JF0h1Ddc9Lj(;rBW>4s)s1AcIyb7ra zCF~Fqk|IJ9>hi1}IOxS!D#C3RNvtP- zID;5`fQpJyYrk}a7k(yi8tGvkLw$^uSP5R_&#@J!3A8guFbr8#UoVj}k2L~X)n+2ky{tgFR zmD56K;aBXKys#zR#wcpN=GLJn%x*#a9sbMDh)94*Zs)9dgl$&9#jmEfmZw2-yfPqW z#w?^}D(-o)n`$WMtpaMl+1XGRGtmZx=<>nQ5VQN~f?E^8;ziE=zKIhF?@}or=LS6c*F7B@Vp=M=0dyF z6kGiF!$!JIU7VAdl2`7}C@U%TtiUrINPTRX^YE4OLZwnC^ddAT!B2Sv;&!XH*%_n; zMt!@t)U_&#AAU(TzE^0^du=`@UFB%4&eaDr5ht>O=X<&mV>tTht!@|4n%WJ|JHVq0 zkML=Y(g>-XsiG~Zw81z(5;{cA7_mzL$#h7I+-2ZOLECt2F!@VbGd2%Vw4jjuEKH1B>aG*4gmidbWWZ*1)Xhl6syjc^BH-a&lsA*7*2=3#5=M* zoJa6!8xCOgsup}=|GrF(Wr!@$@Y3Hw7pgeB8d>UWZ6SH8emJQbY z7i^SLUv%|bE4N#=Si&_Gy@Bj6gr2YiKyziA*dqbA&w>~OTJ<9QXL)55l<1NiOuG?! z^I=|rWRNefE-p8NAb-A0+3s2}OXj!sTXQYWwImHT=kI6^m(JA+)-b=IP@1j??kDCp zTl#kUUc5#xYA{N_y|iup(`!C}z(Uu!HbxlST-YaU4ge&TBn5u_sD#cS540=P6k-GD zSy)&pTqr33pW@I+F6LlT+llYP(J^G8iiq#ai=i(b=BOh3;=O14nxAlDiA{v;;c3eW zZPI0j>Wi2urS)FA+tExc`zQ&{XYZ$*XeW(dic5A{6oLndjB^OhRim{mH)ku#kVvt8 zR?bV743oVU)-+nC1xA(T6Ke3f^h7W6mi2Jci;O_ARdCu$-e^g7+9kv88ZqIR4nT>z zD9d8Lg}usE4n)xN+&S=G$%c+!BJ|a}0h^RNKEh)iFO*YCaa1`i%5_3*JX;jFv}aGX zp2slgW@PL=F%N$io0_1mBFAsJ`!b#;AeUyJ%;{6^Gb_FKYb2X%<-H3}=^Wt^7*mnU z=ig33)JTY~zv?p6S!9TzXu7pSxVwG2HZ@@V_NX_Rww?h)>L5 zgOdw#Ms=xX-r(Dco)87#o+dssbOc5<} zd8}6aj?!%~r?c;AR)8sm&*S++)_%jtngUBO5^kq=O;>{ zH2w91T`CZZuVX{|<}I1|n|E0d`ZFq5PFu$=>!)4xu!-ObwM$icG~#l$#OoC`SVtYK zuqTw-lOpMt;wL~o6%^xq*DhlIx*-$k@x<0u z^0|DpV={h~9cuPH|BwJr?h`-9ZDc^9J@A2g6V;}87hR5seCcA?H<8erNmfE4oGsO$ zn{U>@QCh_x9I4%hV0g_bZw0hLn`$@^{?^emk8eYvUJKnAAA+T;bBY#ic!@Fm?j@joDtla9> z^EDltpo%ZrmWnJid$`5~VxaCbY5hRH_0Q0PJ4-9DJ_iPTPKRDgc+Mhxo3&x_HW&Dr za8C9Mq)JlbCEA+}m86Id1YRQippd(Xz+nlsR*ttflCz)d6=3oby^N!6LJeX5wK;{h z3fz|}ykdN~P%29-xdhdOHHpqh=6E+I(WuMqlgUc$(k{gj z-SHdh`Kyt>&m4SBwTJZi-CR7tOIfh49^rLczfnT!t4dl{Ee%?^_PI;is})~MqNYx5 zQth~aj${X;UB=_hM54A!> ztU~LTB-6PN^2Q~V;_}G{7r+q8+C10VOoI{nY9)Iww%M&}2mO}lvZ{vs={O4dT}7i6 zlbO~0>!CzRv7bY3YOFYmUndc6y7zSw@AEmRKFl#PS=o>NUG~Z{?Naic$J}q-8Jv{o zHWkoZA7j?`Dg@U$_gPri_F4n(5+f;Gm_J8Md~PP`leKNeVOpi}@p@GN4%RP-vA_80 zz46-w1EP>j(QBVF-l7Q6U#B)5ID#2dg29|G+x?-$MY(ZREF+1rADkic2-b6=-)eUv z&h8kiHncFN)d3Xk)12s^d98-yKiC8N;y1iXODL)myP(B@cQwDbY6M*_;!7-k#YNg> zjE{1QajeU``{60C#I^jfMfcb0-7D2RRE#bXQsvifEwn}T!}uu4D<=2syHfkS)9&ek zt$AcCWMFBfT6W`xS>g)*kAdVN4ZzTcggI=Ttw!&1YLNOuO1w1(XAM# zer3^;%-nIkv7)TbR_Nvcm055QREei<_J#T)ftXu6Pgwnz&IF4NU-X?~?^2uIYz-^U zaxFuhi)|p@>e^LKllu&Y^9B3DhAO}EfwXn57OW)j=B+#W;9{O-wXMt*(jbG!*Vd<9nAf&G(hxu@Pl zf^kKpZpl}588kz8f@D&%lCl`on^?%-G~Jqy-WH8)Ym{!~sxBO0DXM;wm(QD2oBxRT zE6!H}c&HVTjeG0lc*fZTLCc2_^FYh+LGq)66X?Gx$c_rn|Eg?1G6WAfgA1>c#9#MPb-S4Bm`k*25xhxZLoFGF2Wdq6HpvbO6LV zngx)e(JQRkjhQ zt^a@P5#-UAaa{lWp~t%GddJ=m;on`0{68E5D2I>Fx_@veNyc?tRsDMo>jtupmikY{ zy@#UCaWVEUI^=--uMT&2|6PYaXT`r1q<>hHe^^pp*%p0(oGQyd-o~-~Ba4vxjLqO22*#0mFMYge_r0(UkOgcrf47VliE>zt>D-bIM!4gT#5FJX QaGpm$PmhyF@_+Fz^;P4O`2!ksyYDc&#jG z88ND?u9s^Y^~JrQZev2i-No8^HT2zk&-LsD{n#S?0bu|N^CeCD z+c8(wC`i=!go12mt5hKFYu`S1Ix#(u_rMBWJwiSUnt`kr!a4LwFW&7+Yg(ha+= zYTeN&M7L>^P68-@GLR5Jgq}d&H;yjAm^uWUly5p1!g=f;vz391!Y@x#02Tlg5S94~ z^#>lFV>OBaIE1$LFV16+(r0h9TuQ=502Tlg$h+X7ODs=a_8ei&@Jy=ZCJ+cfkogPL zThL@Q0SSGv_48osS)cHxQV6&5aNk-DoF-uj3NVN)v@s+Zczgf=00961000000BZmM z5{iN%0)r9n0Fw;^8GjOrf+7Ng5%2v0asmJV00033TB_F{^T24wcCO$ll#7Nwuaf_w zUtxOM8-1oVl3h#?000000R8{}|F_%g_xynZ`YEW}T^N)@xw9-(jtXwo0tl4*lBI&q z1^@s6008~}|NjCQbqoRk0000M02HTE;z0%$6WJJ3f4}78&VP+Ll*8Tt!s`nF0000M z02JU9zFq*fp6A8FX=d^mC@)7}gmD5#Fhl|%Qd=?V)bRixtG}fegR75@TqJHBmChW} zL%KQG$CwN10w7!NClkL!YLGpAu|5FLJD~-8?&lE%k$%YfV0*j>0QdnR10EFItsX6X z>8-e6oQ!f@K7aIqi1_`*s$xtP8akGO7Bk48lK{V delta 922 zcmV;L17-Y*3i1db#fQ7o@gX3l+JI}d*rzz^lFzV`9Y)$bRRi1wsBMvuksyYD+>Z#( z`B{!euBo`QXCdH~a#%YPxW{T*w#)FcH+yuj@j8FKN=5H);^_iaNP#KJ{$UD?KobgS z#DtO%)U9Uht9s@%*(cy5M0;glUZuz_#M`L|H2qmkEjo$^otC_d{n#S?0bu|NX%*mW zoN;Y7py5;yekEw5SzY+@CIw1=Q3=3DC!;koNBzzX)g4LCZbpN!>oAS=tmm}hD~ z9cQp0d6-eomk5Xk=!DfFixe8o=Wjlr=~&8#d|j<~(fdCGaXT%caLkK?JEhIoa(m|# zWHnGhoH}_jo0nH2VDJG=!chIMb_10PM=gYV8avjjH)qUVH6BT}c^pQ6#)5m#IxJAf zI;*M%ISZ(0Qw`9{m&N?<^gJ0IjOL;)77BGt*1iLkW2CBtUOM)tdvtxu!y-0i!f%?GQK&5#84mye00961000000BZmM zKx&fQ;aSGolMVwJe?V%I+~HZq+TH>H000010R*gs<`mS_2iLWVi6saghaWY6(BC46 z>FbWv4pnCxg8={l008~}|NjDb;;AwK0000M02GOR38UerzuDyS5wG9^$k3EW#1H_& z>k9w?000&M6gzi~|HOBqIA6u(6(E<{r=J>5-U3H3L;@gdf5DyTsFMhZ-i&`bG?qJ0 ztXSO=GsF{Wf2O@Sg<>*f0w7B9U+lBe;9mPSiN6SoVZXhLq2~?f<>T77?2i#xN<;x6 z0=mN7m)Al4%jAVe%I=AvcJ&j5+9#TDW}t<8le`2jARR}if-YJ=oM2Zu2*-WZcZ$-_mFC2fG8OSNdyx2_El>Qhwg3PC diff --git a/ddk/tests/data/dlc_storage/OfferedChannel b/ddk/tests/data/dlc_storage/OfferedChannel index a1d9f688728f3a0fcddc0ade07a1c917f51b4ba8..96ef3b7ced95127158f47aeded83ca4143095d7a 100644 GIT binary patch delta 205 zcmV;;05bpU0qX&Osg@88eDEw^stIvGf|mm1K`8U;NQlsIl3kYK*|0(vGyi&MWC<9UOy89_NVr3rkZs_~eWHL5AD{h8sR H8j-{&G(l&T delta 205 zcmV;;05bpU0qX&Owupnlqic0jpx#P1^e6Rzn^nwr9f}dr^*k`?UJee%fmAJ@TFqT{ z*>{9C4wdalF?G@nDWIM(`FFoAdBlH80{2k5hAg~L-qMCqdvv!Mq;bcLgTl5qGmSF# zfAr%i+X4*#X`b|$`Ytm^C3IpBB>^UJD8BliF3hnP(s_eLVbA#?b-Urhf$*vc)2R@=Antz6{W^R Hw2{Ood`o1_ diff --git a/ddk/tests/data/dlc_storage/PreClosed b/ddk/tests/data/dlc_storage/PreClosed index c3bc0276fb6b152370873009c9e094fb81e6b91d..dad8bb55b6d9767b46a78145cd6cca7cffe87b6e 100644 GIT binary patch literal 6887 zcmb_g2UJr_w@!fo2}MfiNT{N4B_Ps!2c;-gdX;8CdH_KLQ4j=CTBy=RKtV+irE}?3 zX@)Aj2q;pe{g8WuuBG?!-v4gSTA4Zfn{V&gXU{n^dsFYi+lp5-F}phwDj%S0IkNSD zrvx`hro|uL4sXee&Iba4AOINfPd^+&XsRA~G=T812O;E;J!n9O{e$1nGMoUsf7tvr z3W$^Z_&d4>;d@XZ+u9w)tq$oNpD&QGsE;`xE$djq6Smh;<(;o^D!IBMmewjJ?W8bExNy>%`KUg>K}-o{U!) zCp>V8G(3?l#dWKgu#svus-g!mJY7HHN~hvbVb_~xriJ#La7yJFR2vL)RyC2nfO^&t zu6%Ju%_ozD1zQ2w&NF-OpZmRd+?(>`G*s3ub#o4+Z&S{6LG_-cU~s55R6{n-zAi#$ zdYqh76Qn60OISmcrza|>n;y;W63J|$el<&bCD z%cYS?R2!gDUc&ukKdyr;ym&OBIPisvL_TucZh)mOJJI1IAq-*jrsY)vZz%=1T_(y{ zpV2#JI>cdqE z#E%%kEomUoM)C$D;0aA-Nrel~kU5Ej<0p9DAAKGR{IWuqNFKPG;WX^-@9%>ozv?m^ z-W|-?-m!~l=|pJe2}R#VLEQznS|2eMKWE}Yr;tvVF ziF``hrK{d_cQ1Ol`|9K6{uSx)KFezyRq-2{BhqELNSJ=B1)}){vCF}QP_b1CLsRZ!1;6d_d{@m;YB|S z@G=1K=;M7vJ=jV9R)^mfevJ9azz^mT3^`)rHzF`z)j@mI{lPqf36Gcrf7>R&5C7Sz zAIu||^oWVuybeYa;+a3${K-!uJWTQn6M~0+VjgU(cqtU$f&IcfQu-6~C!550CfP5{ zBk1=`ay*mb7bXcF`aSam9;W<-dF06NnN)Zt^)E~q9{N3#1`or3VUpsZ-!p0PFx@Xq zGCXwH{)h%WUd({+F#f%C@XHo2{}Dg{kQ}5|W6YVWjk#CuXRJPy9J%3OEQnTRXY#l_ ztD$S?=eiGm=A{uGs8v2rb0^5mwnb8pQ%2$?YJ7^B@$oy=pro(mi!_O_4hF%!t=)NV zza~jSAyh?(%;@+fbnPv;s25MFPVL^@3B}I-aQkJrH@scpRsyoSxE+~nYE?nur zW82TiP!J|LUM(4M5aURC)sCOPnQ`EiKScp4L-cn@UBt8flv)(RzIn%%Jo@4rgo@<@ zH0Yb}x2>Jjp3XGs;JB_wKob8cex_asFwxki83ol%TP}=|khnpd5P08lUTJRi1=qx$ z2*#TN!7b!`rNeZRcVNYCRk)yF`T@*>N*EHt*DF`-*0$sGY7w-1(zwAdo>^OfHqtuT zF<0MryDvRu8X?_0Pd`vQb>=QON15Zj8=3E1c2Fu+&v99$#mqe+5M*T^1)Uz`76$xhIqpgX12gm8;wpf!Mw_+Aabs1E`OHui2e5;N@*UZ!(U&FQ{I22kIMR*2p zN7XNHv2H=CL*>m1pIbACPFQAMlkjS>RTy*)pLEITvkkYra>gQ5d3wc2t1B)`m_*tM}QB~ z?SN+3A4r_;g3FqBe(E^~;SGKjfRv(oMxOQdGh2|K;i@f=v#UUW8e&NKR-7@!^JTeA zR{mNmWrAGlGMA69E5*kki&Knj%Ke^OclKeMbLr7Z$CX%rf0Nl(32`AV|D4=gREZHrlz1Al**UZips_=&|5+& z9c3&;vUXcVN!OeoUc}PiRz77C3j(j1ISuLZEyiRKzuI?OOjM*ygIYq2xhNJlXfF>; zDmweNb`XT;@oDyhZ6!KWBGhgW%)L&d-%lK5{a4yxb3eW?Asfx?qi>Ky|=a`GW zi6By&5(pm3q>FUFNC9gMb>C}f0h2OYjHh}5#|r`Ej5#4w`^+VN8R&=XAhpgdw|mmz zZs0Z=@~3W2x$S;Ss#hUMQs)>l3ypg*yYZ3+4{c|z`dI*nCb(YJR+hJ-VH1pwq1T$^ znHJibG)mrgqDyMGVMdn+g@;+B{6mVGCqr0(T$a;Yh!a|O`|p${2?a3xF-GXJ?dK-7 zu(sjY8k#{AJ|46aUr4lgRiq9)=;aoJda(o!VD879QoaE})%bs;KDBjUu|SWeg^G|- zY18o=O$I?O*zRg?umME)R${;~7${l<`}RB^RPwZ1%!9kprk_L&VXmS6!nev(^a}`v zJ!kbybZX^YZSr+6rb$p%&A>+rJu2M-L3hG?OPEzRug|u=j3yIqkX_tqeXpBA z784H35$SlGe0kKrc`*X3vC+wyAOhv`GOEc(lAS7E`MTubx?UM&N|aQ=*zD21Fc|W9 z+e-L4oGLYg*QMHs~vW)tT(s ztRyL9x0Qnzc)v+e68Ihw5v8R-KXi>qgVs;rj?;$@qSP=|n<pV#?JJFldS>ZPy@c^u3oVaZR6wGdW-9>h9Y?YQGDXH|SCQQ|BLZIuQgm!mk zdl?S)CrgMvayxW8tu3aPn0G;qD+y&08rS;_G}7WvPBe7yqIS2>{q8T@YK_~Az=jD- zb;QSlwr;WgH?rY6t@LgmsPc`C`bG&@BkOW6xD)a+gzSz7R=&21M3!pQnCj7eQb7@2 zFC0w#OqQRL_C4Jz<3i@yMqy4;6SwKjX`i}p`YU-GE7J8)jq#LsonmdRW~R|3fhN7q zG3}tr5}_9r=(soCLzA{N{x{X#(Kg2Aquh^+tF+42g&mf`z82v_U34E%&Y0_P*>oPq z{OPLX=FTj+^xnIK!e#Ni78;18XOr*>5yfTw_0CPLS;zDn(;_7S>?jX}tUp~W5u-eM zU7TF3`+2Qov#T#(sHAy;PkonddaKz-rMk}!l4~@U8Q57#>F3-7V|pmb2o9GsBU3t8 zVngZX;i7YfApX42(YmkX4z~u-ja-wk;wV-+qoB|__*qQ;yRe+%OwbUA>QG0|gaV6d zSTXwP40qCZ74EQ%0L!@4?6FNjc^mOf$l$>|I`iJePn2=aOL&J(y$rx9=V z>{j#n?sXAYI}@5xA}7gIQ5#pFOh%i7TuoaLkbr%9{TZ0Xs>v1MWYP#q;jG1qm9el3 ztBR*2r}uP+BAbIef|AAAWEet}9pf3Z3p}Yr9%*#cK-{}I0$qF3NZncgpvRtNC}C4{ zGUWbbI4u#Y8Z7*f=eG#qp>FckG@Gj%J5E}ETEdu-E1MZBtcQ84iEXQB! z{~=X<4y&^Gzi9+jUo^+5KhXHQ+DBktHZDE-_YBIOIE_o2{=p!CdI%Sbf6ri`x+yN( z`Uiv61G$Hh_^0guzj&m9+uQ%6!BZsvuEC#I#qVPH-?;GqdS*!FCJTVdWwv80a%{&I zZ7x3pST29F3E?i3SpsiOMBl5>3Z9V)Hj4l;*=-Y-t+jnk0k-!UvxZpA!8Ll!cV2|& zJf)c!(c)HX-*wN6N_3g(2ZEH53Lu0VC?0%uu%(;hI+u3@l6>OI+IFIjJocTuM$d_b z>GG!_RtBOOL(dorhLav^9TnEfFBiwEndR96Ie5M=JBd*m98|k1Ox)#QUNV-;U}Ul` zT7VkvBG+KEWn?F(2rV)-P?Z7zfw+?7ah2iYYr;#VhNLyr?-b;3L<>YtkeSyG>}fdD zcb;7rU^6LibMQZ|W=w06X%zr?;hIUk*4pn@R$FwYa0NVhisM3>H5&=t6zaH|@_Svn zj%JdrggD%#T%!HVxr4mS%j|(Xsl1CYOi^3FVmk zsY=xo*fN2W;}`QP=Zi2U^UF-5@x@gIAcR)dC7-c(>rO?(b}3>`ipWve<59|+qlDN+ zqw5iL%X>goq!Ne?aO}Ylp|JkpqpwL#PB@Vy^Fx_>jsoGCs8I9uZ(uKiFRQ@7dEmeG JSvvfv{s%d8#JK28yslqwc5Z5%yM$L5 zY7?Gi_)Jd@5I#Hr1OR~`02uI3*Aaq`*7819z(4E};Ik_nG@!%&!S$=`NC4hHZ2r~) z9!Y-w9p8g+Jz^j}3FC4kyKbuk(fm{D7IDKR$+(V<8`ZI~X#ul>KvRxfov^@?g_k1m zvgA1sQu21dwXuFPPqKML#Ch6NEM*cz$t>>K!v&UXs6^ASQLc`n*q()teidHnlcAR)LmzzOSJ zyQ5Y3VII)06%l$D@0&CSq{MW`TNtkbEJxZZp_&BMZqKP#{HnnXW2{>ad7Rh3zGAH72*eLIbKc(-G0HiQ5rE*{_(Pk$r$&!%*fy;C83k{3KJsgU6ip2 zr7RNi;d_HqsZme+Ot>d>fnm}%#Dsy3>B~qcRaoWY=3Qa?o(jn8p^OOz+8)1C7r2a{ zFv(So$-^2)F>}-!BON@uK!`%E&kbxlO zc(f-U6b->lUgjPq+3T2JBBs|f)Dx}Wtw*{^oohI96St@j7by^@ zFnYA2fxto%Kruq%2~FK+k16vQwDk2leLQb>cwe^ilbCeBty$k;SsvOWT2mKFx-uLN>l1-0>(P)OTjtQOtHf5F%q>fMl zu~N7BkNFjyxiH|~uE#SUGSf-UypbD4G8WElm(;N!x(#Brr{fvV5qjzV)XeRYAlVP@ z=p6Y9N?w4C`m0vd&A-M=fNUU{ZSlOvLwwcvH7H1gwW&<^<#lJ02g$ISBZ0@q0NK| z@nwweD6-K>U5Hs@RA} zo`o^;hq?#jh(sm?A$XdF!Xz56o`QC~$aj9r@psUTrS`qB(-5mYP!8+<%ByzkN@E3w zN&Opv_%Qcuh7L~I;G)7qFPcM8-b?0Np&`tP6va6tzG7=XBaap>XE^;2++;Y7a* za54b!IB_5EG2pQx?nwBl^K&Qu!aRlvj+wYa2#hmy&>nYx+B}BwkD31&BmfVmelV=# z?oZ}1OmfUTI=BwB@p0-0Ew1~Ew}dzu(Qixw9P|tG;7G+uiE$n1Z_ML|{=)plCIrVM z{f&7H{h3LIW0L>IB*H;|W>VnbQ@=5f2l8hoC5}n;8xx9y{>(g$gJHihNpR4gnbbI# z<~JrO4mxaqMuQe7ro(mUk9NS%HyND#X8-{J@p~k@e>FJX-uPa;v>_AzT=R@_mZ3g> z>MJ{5z?ig5HdQjptHL7_Pe>|BIVaXEGgpW`(L07o>H2Azd;;T#3x`_*^nc1(huid| zlkLdELq+hQTNuHi`v+;}PiJW~2mTQZ2e7&~d3Uhyi4(EB>q?%z$NA~;Srb=*O#`Kc zv6ouw9fV#9UzKsE)SnXbp%H?^Q2_f%+Fr-)I<)VvZR-iztw)>!Dg>tAzt`NiAnS<9 z9QZp9dk4+|71;l_{tvml5L##T|9c|HyYJaiiui{oVs$K!a?b($r#FZH!XSWZ_-L~K z!Jq;K?@{9U_Y7kDvks^FpUyvTE%Z^o`WFpy6aB9ScXs|=gTJnde3(- zVn0wQM+16ecmNYb(hUrch;Ur*vnnu7Yc$G6db4(m#upmnhtBR;!I(uP-J@?0?u_0V z7Txol&OEK4Ov~gPO{U^owdz3Vs0Py_&dpJUeuyn}r?Y5P(^8n>yNSj=DGhz- z4xc5Ge`lXY)aXs|)%VeE8)~=KY#sc4t>?N$?d^hz_~aE!VSAz^UDg%q>c&X?ML-Js zs!b#qZhwWLHaJIF)p~GqWP4>xe2|BK%zFOp-uvw?ggQs8NdF6o`wF2yMk^Omsv1Uu zAZebf^%6nXoEJo9ZnT99ncPB9M1BhCf%p#eRPbs(Q-$zYB#09a&(_RbKW7us(8PcN42IIQ_n-0n z(%fp6Z3i42ZzzPaR7!J8ifVeg5mt$PrE$p^$h7fSa!eEn(+8L~BCcUy!O}lGQ4f?( zOm?AYlGUkNV2R=-%;MdPRl@t0!eJ1J@$d`^$}t+QuWAN^`pBpiqwXX2=CO+HUrK^x zJMsLMlG0{2i;+ALIwe9NzJ5wUp0ze7OW}>wfwdu#SfNJAA*_4e){B;V(T~EI^Y^ly z5~7p3VlIayzSOI6%9T%bOeuFAK8G=V+o>oRm;Hm)-NbOM`2EK%5~4+#h>y${r)n`9 zX8zR|c!d+-6d%P`^vW%%G^7*5>0Q{YJ+||xesD%S=n`=vCkuKVYXB~f*E&xQ&DwhK zx~88kI2cBiBCd>D;-2NXIcr|{NLm}5VNAbl(XnUyZYZ5+(Ce)Jq+!-u&&TETVz78>7ASef%;bHQiN4#NZ6mTkg|6;Xs-;_e)+}!M#olUo zk8M*C0elO=dlm$#PAi7Rucfc#;ulra1a%oL2yA5xSFsqmE&J*Acjta*YbPhP0C~e( zKzfoyr<$>IVkWSd`^M^(XPCEapXE;*4Bt|Ul?2a_F`5?o-z&GcNN8i-?Q^ockyZ zHh__C0pzrU7Fsg^j;@wO^Rkpy=eh}*q_*&szbXXXUWP;w1Zo8$xJT0Z1JY%bYwj{h ztvvv_{U8pE8w1gaPJm>6+J(=k5e*kBT@G>CER&Fm2CrQOo33g_S%c}d!`4LaxZlAh zHL`D)qsCEKz8#G8^WBoh^D;{0k2C^O8SV}&`Qz?RFri*)5wOO%hiDw^$kc64n4&qesBFsUl3!K_Nmap1v+A*)aw8VM-> z?RJ#n+oiK3!L((vbR536E*Sr|>ePwj z-l*yGa@@YFahO1-WEkASMqV}=kI`sZT}u&m7CNjXlT9r&@W2I4`R$(Eb8Q0YEZF2z zY(rN%mMhIDZ~fgRl1Yjuw(eBG4xNrm=W-DgoiFbsD|S|L*e5YQc#K!LKbT>@Wv6Nh zMau>-HGycgZ=vVvvIdtf*S}*!+k=%E8nAHieC)>?bGt>g9@k1!1V=LH*=HQ&VB+F>2ouQo}P~N+1{jD zjT_jKpij;33cr{OHEgyNxL?e7M^5zVZNg%&RnWcoI8isUXJ?eVNMT=!C~dTR#ZOJa z%KGOuNnF_d7Z*Ei4CM)S=!hKBklkD8o${iUwaS*jsvnzZ20CTcqr?F9KYUK&37M)Plbr4r5jIQshl{UoW=$y{!Z`ls450b4qx z=ryV<)Tg)2iN)e|G`HAi&aJb+{BIO^biDk0gHgo*tq+E^3_1!ZA_f{vYlsK={9D~c z%;;aNzR3B)440@542H@Spf8jRB@DG(SoYXqv+%PLY){t$pWc^A+XkN#n+o}>b5-Rnv31;+(RTOqM3|Mf7=qn&4r6%hyfT z-&a`w+Le8XMWHsqiA<_gVbNSUQddYRtjWo2Sra#>v!k3{dE=w#1xG;y+OaXCW223< zob;^#V~1|xfF8)@=dfP*hXtul2vQX^k>^3;^G+YN$PIo{A79{yAAwH3Ef7R}|04V^ zaVhf=@69B|IQ&mdfY#i{+~g7CqDJ;4dLJSjnR&)P3A=MmrI+scHhJ|dTeBTyGty+n3zcYEoWN<0NDyYGyX1J09ufwio@Isw_fVJVpVq@fco(4BhA@5llWi4^6rlS*^Y-+h_v}MJs2B zEEU)L;0}JS)PzpUU1oI-59A>-Tn6XweeJyIA3{ns9-&cgXThary1u{^Rsfisp+{)t zt4TBL@g(ucD>s}`r9FLt4fuE2LykMN*MMqp^LD(J1#{~DopmHva#;@@;o>Y`5M~Fi z3u2WOASt$W@^gV~?g;u<=su6E^Rv|OqMM?H?9}STMvrbNA<{)%EBiXgg*zFUblUD^98+5e=ZHS}c~JzpN=ER(fXc~U`novY9@ ztEJnnjMz!Yz+3sc1EyJ7+O=l5f9<2O^&aQ_lM2oT-jvtuIPmSf?POv|ouztpUYIp` zAWU2D)u1#9)7 z(igiE4`iGKBu`ONH!oatJ8P(br!%q~zTW!??Ed(qg0|+w8{Mar@0jRNQ0Oub_SFzG{H;c!uA8P;s49@J3%)U0toKxrd>t!eWcC^KQZoK*E3*lo}h{VhA+`rIQNc zGZDp6H6bI+^rfaL_dtd&QH=R)OyBAzrI=HRI`0^$oK!IPr1@g)mn18BmHEs!BE~$t z59n1L*Y-YJk#GG&x1%(L0mMKdAmaEZbaW?l^dSrU@4mMG^j(Dq&_Jky*Z?Oc8CEJH zi$bkhbJJS*su2eZ*TW!gJI!e%v4lg4Ke|xdgA{mFur_9R)|yDFiJ0(lMd@SJUCTy$ z9)Yivb_a=Z+{<~S<_}^$5Bc(ASZ-BtO;;qW&P86f0Kv9AwHmBVCylyZO_-}o5 I9e&sU5Bt5A{r~^~ diff --git a/ddk/tests/data/dlc_storage/Signed b/ddk/tests/data/dlc_storage/Signed index 9575f80e1c21394b7473da26dee6529c5a771782..d5f5d977333e7daa9bac0646407da5b465463a93 100644 GIT binary patch literal 5882 zcmb_=c|6oz*#69S?913D*&kysM0Sy7?3Ct`Fm0NLFi zzI%ZQmLG2ip8?{G3JmU6xA*%nYkkT=-!xS7*scCfC!^V*p-}rv1DTFy-S?v@WL;IE z=iM6|R^QDmyQ+HNOOrnT)zYHgCY>F~fO&u(61nH~;uz|q<`Ef@?DBJIq)c5a)L&hW z3yYFg3^5dL5AbY*?Lk!J<2HFY`bvY$2FKahqq8^BX0ST$4%zd&&lvWbd_c=Z&X9Xlu{^LXk50YsX-_YC|w4&%Y z>{>?Dd;h-BvI_=fl<@Rt$<v3e#1={q(_yRKqt$pKq-K)LrZ`)}UwlFNbeXDxLz*f-^=?kze zc}rehY1#gGp|3!%*zGvNu)`0T(P4pd&4EF%IUpCEJl+6?%hwjCf(GU1p!r*8{xU*R zu&ty}%=wt0hs1_gM2GD^V6%>uG$7GW?CPnDw+E;g_mrnV+WRBLkWP*SWvNI^oRI$i zhzy4Ctyu2teDh%W^fuK}@%3)s4Wy5jMf7>gMlp|B3Led2~9S0p)`lO33WL#nen z-C=_E&Qj)*1BP+&39K7k>*=C2ChTr^`u_Znas#=8Kwr=W5$eY7Y6L6wd?R5bR`q_B zf{7kugpvk><>sXWV-(n2Zt#FYOC9}C>Vn6^p)cO9n9?rV-PjHABCN2zySod38t19^ zKke<)g04YwTT_vFo|j!#j?b0$AGkG|2E)DJ{E5BPugwN=q*2JqrUlRv zR|mN1Q6RtCAvd$0KrKTb=jnyMck7=~h&LCe-dd8$0F^U=!b4 zMY{VIZFS(^Ti8NB?a-Q`G)Bv_A>{0vaS`DW7 zmd8Hs+FRJ0exape$&I;wv+>TU$V%*m;l)>ax?VssScJAQ4mT^(xxzAjQz9-jsT2nL z+p3!7sVi#vy~tIoi+e{RHkZAVj#M3qdh_L73gMtc`9V1Y4PYWdlsz}raMxcve_RCg z*3M`^jLbFa810j@GArd?YOt$8=qkdZ1lfPml{;0SuZ|?z7W#4eevDtjg0e^QrJt(e z)o>v6TT+S-e`GyO)UQZgc9^d0yX;hF!A#*$p{j+uDdr~?iX50sicp=oJ-eJ=kC`Y) zm_`8H=lir1?prI0W zA25m6!VjO{G7n&~119kzg8U}t-bF>U9>AmrOp;OuAo~ltk$F zOnM^B@C)D=Ra-#x)FLnbKIFNe+97w_#y# z64onAToT0nAJHIUDHd5&BYQ!V?hmIOFYK=k{9D%|1m6Fi{(s$W`;L$VK2pN>n+L?b zsi<(L*prfnpBlxSwo&sEQGX*Sjx9$kd#=LSRr%c9P(Td9^$%BX%8c5Tzi;jj-Momp z-tK?5A`sf2MQ9O!Sh3-hEkVRR_;*ha|A&AerV)ZFe+Z~Te}vF@{=0w;1382Q{vlwf zt_`7I{f7YsDgU1VzkT~}1O8kU|B*=ll9Yc*skmmV9Z1Uv{;y9h@PB=*H7W!{A@bLD z^fywhzUEBpX!ccOL-ZT?YkR8P*$K={0ZG>}4{T2HxJmS4UOL3^ykBnh(7@J&__^T~1@1hpg8Sn<&d)y$JSj(g zi}C@Igwx3Srh4aWZ1^vX`}n5SoIuN~+%WM&!4Dw18L>dLL^7e1b@Ja^7+fh?G=y-NIy*5|$xR17?Yh`$tW4t2!kl&&MQ zkvm;2?7~fxk@eQ9xl$WOB{4jcU82Q8F}Vo$%B}n%!L>Q#J^|kkSLRHo`kzsln+;xN zX}0)FFQfTh3AU!1#fb(&%DFrSoN&}RS=+9uH0;M)z1>%P>YY`-MYou&PW0kUfS*yL zgITGh5J@SpN_p5+JTxjQMk?#d-F0ofmuD3#b9?AL<}S%z#z`){0-4QkZSzpye|l@| z^0V}|Eum6g51rwT?Ns*{48>>Yt|DHlKEbO^4Er1{UCvs=D;Z-d6tr-)0-IJJxKF0m zFev05c|L%<+Neh^v67KB^5nj-2~{U#+Ch}!aS^vH{&c0c|CE%TML6dbPQ!R*wHGPa z1=bJ_0Q#oGNB3rblefa4UX}ldQmb^c7*zjF=7*&?8P>;mn$3vtHegGw_rtDq!Hg$s z@L}mvovCY8<_uY~V}Y>2(1(i+{O@iwf#bZ&Hl+QJUq6&> z-i>SeRH5B}`%s9p?WIf4{R<77M-@uA+i};?Tn5r+0{%=PCm_icYb=GG1$G&H-ZnGn z=-ASFobt7V%S|g+hHdXL_mDv#Yo8MmuO@#$x;a?sZX_OlDfw{$6kiy*gUao?Tt$KP zaX7A(8vFEay@>nMizT8_XO#S3R9OYZvD56vx=EOLD5GssD-F~*slg7dL z9&-(vaeW=G6H2HW=;+j@jt%fr)f@F}^lhFrwn^caVUHa!|shVK=zj6)e8lX!*dRXmRW5b7iq} zP;Lm=>RcUurttAac@vea7d$V`&4dbJu6Znq`)to`4CDxBGG4|D>#w`w%kzfl1F;(Dme`z2nxpd-YTFo}e-cRwEp!gHBrWs9a z?nAsV)+hy-QHCnNlvvic_i=2D0hci(5~gG}JWG_0X8My!@n^$LZaZ{poZQY2HBAvu z9`&xUV`&~UCG;h*TmQOTgg_(>J-!N=n_Bd2vLslQa2 zuNNf?1(X&&`Uogrq=nGVH3VWs>eqb=%4sIn)CX=MZ(+&5CM0@|se8P5F)_v&U4_Zi?#7+UF2+x+L9IWw3BycUiT9+L z+o=`;%gIt5UuVG-m+-xVz>d9M(XK-x2WT8<;{tac0or+~OCxN(j-H7$$PX`^6Izx2 zn~&3VhTC!(FldM_u7$LKgU!(aEKPy$uKQY0gGZveo!8%68(q3XAxd@j0qH;>>hdK2 zD0`in_ip|>t7|L)pM)vx0-MA~E4-s0UM8O@h^aJ8f+$zC-Zfo6lzlT=Gk$q$yxI#h z*m-@%wjUC}5oxiiJGy?V(c`ThJ^zyJ$E}q<#*+m|DpJ~%B0XEDpL2iCRKme*W;Ds8l99pRBwPN7-qoF~e53ryt1$h z-~aaze~+(|f2#A#*weAR^78Ag@nhM3$KISJkgF20;fv!>1 Gfc^)Pq5lQ| literal 5878 zcmb_gcRbbY`#-}u#zDrRLpVmm$SRwVRY}Rp9w&Q~lM!`{NR+LtV?|aGAw*`f5+XBu zk0V)!j4yhQdj0D8J+I&Q_k8|1_jq6L`?|0DeSPlh^Eyj%V2b8)gQvcz3_~ zVFf&x`T27=1`&E>zzgT9oP(Q+9bh(cpvTM)ns`F$E6VGILd+zXTN2Nh$wI4{eXZ4K zVY`oqu`q}9!1!?=%-G`f7^led>hd(7LUOfv9FT0+h0FLfET|OPZ!P65L-FD)lWzm6 zU47|O3b%XMw}B`CS!|A??z570)AWcj8cQiY@mLCNwoc>skBdzFMl%F_4^p{{34e%n5&Z6S+qZ`SV>KA2qrdOG*2)l zsw73SQi|VNb?+T!XRHCA;?d-b5FZ#-J|7O@tbfV6{rZtMU)JPMQDIB*m8AF(rNPkZ zuPX~YtK~{_0uPS?%tYR9xCk_gZgJfNZ^b=hs7m`59MH4#(%}ZWT-Q!^hMVcACOq;! zZq7NY?Q9xlq(r7TIxDc^)->fT*ABepl_Bip%G_A_{DdM#jix0z z-rB0ld?M;Cm`86(J?3AqGe|t?q=M~zv2dbk|E$bt_&YOvzE@ec+c7o|>&3k%PYq<* zc~z=6Zsos^tGP=ipW4jUmwle|WM~FQ11mztW{(Be2$j}10Ye>L#J1cC!K}qlpsh;r zHsr6aSi3|L>pmW}Wo@7eo8JrR7xB%x%ogCZv@H9962u2&^i%-}073Ld|0JDPR#!3D z%9ONHT_|?C-D7aE&VewC@}Y_BQGnZ1p_h-uc^8+os{fl5{p* z&o8L{BD&A>%3IowwlnV?m={mlxdT6zW@P>l-B>tFusKOholC1pj9%KadF}ML@>hI) z^%$pBTM~Y`9K>qk9}uj28v;_InYa9!=Aq3j+9(+ivtdPf(fq-K`!qNOC{Li!6>k+WS_OSDd8SwDp zK0IdNA(K!Ne%kzzc?d%fnS>$){)5lGB1M=zgdvAaqQ62RBG~MW54%5^hcNje^Pq6; zSwjfsdo7_0_{k(D%#r@agc6`%n7{0ni~z%aV;(O03-cGBBm^eKZ_GpJ&rC`J^T=;Z zQUdg6CKUmu{*8GU$e)=s1SaioOc(+BGZRjL>3(C96QDmc=?U=B-aoB9OxC55?%8iw_wuKu~EKH~1`)h;#>CQTEyni?UQ)N3e1jkLu6Kcz! zuG6UFkb}y^4q(0Mj=9BfrknKh`ySFm2MlyY|peHwUwPCvLo{ym4XR9pu)%ilNz&<-4g`|mmQRyI7ikp9MD zRZqsg5`R}7|BEB_{{H=cb$E*O-*xzFR{TlB|0ab0*O>_@HJAV{sI&d!2P@k@e$}Yw z0x3am-7^`^=G5|vymmJ@^HptKYi>bHww90;=8PE36Ot~FW&bTHXzDvn-Y)`As^JY+ z`hqGD6M74BNnve6iVOHIJtbt~FjM~Z*cZc>7Zk2}q{aaxV!OA#3*OG3D~L9`uS{8K zSd;an?nDZgX9Eeg)aIr0g+k{B%OW$U)LlWDnyITt(05w41tB>s43W=yWSS!y@CsdF z5Z=+nVEwYEE#n#;_vd((Cj6 zCh@q8)J|R>iT6Q0Ig8p@^OdtPk=IaOPTd{}=Ds#4qi~blc5LeQphWe}H&ty6$2+_G z>uS55=)E4;1PoutrAgP6SY6E5p#QwwaP#65hhv?{_lreka#^!Z)0Ssc6hb$X1Jl@v%7eEeQN^ z(EDj(9TmQ)_ny#vL#;v+RM@QEu*}juHEy*vB2xuFh-lJ^RoWJfYI1BbG1@w-I$Hdgk4oWZ?9Q;&813So zIyJow0x8V&TU+-rvsc(c>*}5uZN0N+RF!bAxX4u;ITAxbdKb?E#wn=lN{TbAcl$Z> zCT|NDd^ux*xOVee$rM8Xsi*kS0KXQ5)j$lVM1rRU1$S>+X3Sl`Q>WH)l~3mpUkBeF zUWUn^V2w6lm9chccP>$57vJqWdJ=M;flanal}r?5$L^n@$hJeItkbLKu{{9ITOQw$ zuFeBberu#MKL?)&&)zMahDB&gBjU5EpqjI3D?ap2Bd26pw4>oR@mvAuB4u0B;Z=%3WV{G8MJ!1M^r$iL* zz0;29!7vU%7$7qYgLoZMx~$Bo%9mPEl+~~Ml6tcD4FwN++|lV$Ppm@bK$)S@Q5OL& zZQp06Zy#^h%7}&zkm(BFos;G~cBJKEDyvwwr-|6{!T0L(y2a1oP*J?>9WY(%uHJ~H zevjPvYA@iCX*s?3b6K?kW?Gx3;rX+|b}66%~FLj}qeAvf}(TYmyIMt{N zAbT9|P1WOe43GK%99Q+38%S>^<#Kfx%EDa%&FDv~8DP#pBzk8<=%aj0sX@B%a6C$R z+|yy0Tu(rp$vAsl_t3Yc zyfHLPbZd^s)rhpBM%9o1rQDWeLs_AVR^I36*m#^z)|CHBi?7O#L@zcId*-a)iQ}kK zerXxAUnM})l;4?xtEN388fzg3x$CHaG}xLRWr<#S`!LBX zvl)NHeBHdw-9Oz&L9dy(Rg9q_y3>VpLv5vRb)vAuS%Pd$tdTp}$=Gu)xiVF4!6^NK zV$MnW)M-Spp_P#|(o!L~i>B%l{6_7FP6!Fg$vU*|LZsxo(P0mE zv246QA&-F6XQ);P?m6 zA@3x#I{OyWfC$qwOGlo|S14!KwKlYLNulP6Wwas_!F?{)US=x;9xJ=!q%zU;Fk$R^ zew~4T5Uhb)qDRh^1Eg;?&|t;urEww6jkk>Q>BhM$cogSpM}XHby*5Xp<7oU-qZpdk z#<&cAsQMdf9T8F8?nPeSDX?y*Hy^+l`Q%p0F}Xslm|~&PxKIJ_8Z=ReaO-v+KfI zoNrm9L(Ux07vt6E2rX|8BBl_z3w|1?yT}u8)ZTyvkgJ(@${r*Y>)%Bqcf0f4fT(Hk zngQo`EuH*fCo=7M^EioN${r?oyCGMv4~IN$OtaI%$LxeeWq09MHzCRJ=vZf766h4y zC9!53=3tBnvM)7vg+a3RTWCJD%-M^#dWE$dEJ!-)WaOGm?r~$gL5}w_ttLfOk!wWu z+Uu7C3juC27?PB!;Wd)7a^1{IGO6W>M!VY`w=$h6VQY$!8pkLvi@Ci#i_3T?i@}}% z)8cqH!c%}h{`NSLvK!Z7v7Jq;HOSFnfHJkNvI~ZK_miubtRdru8$cjdsxs<&8P(Jm zMXGtlx80{#8d*t}?oYir=922Qt0Wh<3S`QhbW63rM+4r?#Fzb`o8O(Kc4%3&hPxrdCq;#eV%)s+R6;K3rcl^@yMY&MNwYgH9ps@ zejoc(OP5Wa!pvGF3<84z5CrsZzheYTU*7#h0qbZ6#iAEK9Dt+w;qSEUSO7sE4L`KN z$C96ylY0O&!v*7OBFx!R7gTr~UW6-aL?qP(_O@zkEio}s@M5Wj%v51_GE@wz22_jF zALub=?71lyT3z?d#np|ZsU8u7+dGpQP&ve>9VA&oLe}7aXPx&=Hkq&8;@XxqrK`KI zoNKW^@Yg=r2!u;Jb#0QV=H?RJyLD4AL|##5J;VewHotw%Suqa~C=0(uP8_ zUsS8T2>5P7X}e7O(B|w@|4Y^yS2*{A1o>8D6@{H+K!aH`14LGE))aQsFsir`-qPB> z9%j#R<^nX&gC@71yVPZ>ug%f0eziaM;Yui5-~Kk1s06?tDTBK>+f>ynZ9zh$#i7BE zbETC>VI*456_M~jVDl?q{;Op1WW!p>8eG>N$+sIz9Ub>AqXn8Pz0|czaQAr+Yy7}1(?GNA*A7&oM&In=0X=iGDoLSs68m4xLf07Ia z;>PbVqR6r%ulOrzO1>Fn^hp~fA}XDKjNh`Yc-irAEyzKn--jd=iZ6K!HPP2{l{Yoz zd|Cu~F9KPrPt_jJ9N`hZcoTI>LqS3poNS~Yr=l;t?lHb6>~MwcjASQR)63AQ;}JY1 z7Rv)wZ2+J zV>I@G*yExGpBaDeN#teQi_UrAu=aFTGy~EgGgkYISIJuRd+=3@k|vW)LRZPrq`4io@fQ^@0a_KQ`md82-lX_F5_^O_ z$%#1ERTL4)LZQwGzMZD6eJGd?QlY{ayqU-xQUPEE5V&xALvY{G#Q{Om?lIkDzE-c+Wd8L~<~aPR$R{KCtk`Dl{#@m$AEv@^rtI zZ}u#UI^T8c0jQ;|pB%bV4yFU%zb@7rL|t~fx|(y(Yj*tcoN--ul;VB~V_U?qXF;pp z4_EksOcf&w8agGz(vB{;t&};ec`xU{GNxKyK}zE2VJm=E8+Z$J!|85wWXDmuueENa z66KXdCr%oA4L@i89Eo5%j4DQ8Se-#QT%sB=Hk{`w$j9XwEXR+cY$PxN&k3iIywSxz zPBi$i;LxDMk_PROXj)7|{c(@QhpqT<+4tL)x%4IDFGe;XK``^%R4u?^ksnZpkU(%@%$>M%nQX)!_UOk`|~ey$2H-kY(G(wEiBQ@I(e)est_k zIcoO^ch`*}-ApOMdf+zXx zcm|R7B~n7k8wK_PBSnWHo!Y#Xwk1^{)(i2+fnqi3wtaTBxO+=8v>9wgj)S_`LQc#8>O0(2mwi?k7|= zgFRpt%pjV($l=Tb(8>ymOMiZ_V3|`?2~ zFprNOhuT;e<|&`2;>5FB{wWs!VvdSj_@VyACl z-p{{lsDt)F(4*)MyVUOvOA(i`j^V#Rw9W#=m)5+R%d&;@(rD(&JZQe44c8g6-ad)4 zo=g(DFMDJKdK3lNG)yqbH~Ju9n>exXhB%#0>l5|D#2u;IjZ*4BX5DSt<7GTJi~=l9 z|HJ&hbn`sCYQz7VMZmoudE6rY#bS+u!Lj#4_;+W&|A#{m$VJC!y36Yy_pATV;T72b>TqxGzjb)JD*mG+{b5o5u%uivEruYt8r>iNa?t(p zT%(o?CIBGntPi5IZY3G>*zNXxn+jFf(nxJ^E!ljdL7^AebUg*K#unr0U2oKcl|19K z<}zExo+b+qKDWn4fPznknifzxn-WBX1=b6ha9fr^=gsjHM_2M%No_{`AHE`!l&FmlYXuopxWY= zGtr?e)^BZGB*kKgAR9u}%5cf^^C5K;5Fso89!AiHJrq%d2w+k~MbW!NK`4B&uT`++ zuNN;~5Y8hu2xZTsar;QhmwVnhevG$XGh>(LedfTBM>>l^&KvqxEr{fWSt)IDCZf^{7viRMi)Pw)n~u9oMfKjJ!n%6)g`02UGO9*-=pzE z^ev7MC62#acyT_~I!G)g*!$u`K2VpzO)r}uOz)i8H74p8*`49>*a?k`h>X7;5SQBM z4_F3#lVMe;juUintt8&9jZUz+$dBY=w(v1|K3|KNpR%1#SqY?C$&+D?1ucDf8s9yYY%r? zQZx5fI%y#!A&}ri<}hxz2yLorm{CyUx&Wl5CDz&cUIJHH&UME^wZ@UN%x|BR;^L_^ zH@|YdGf4XcqN*HWGc~T8Mnu=VFk$dM=P_%%y6VF=3#ZT#B+(;ziXAn=6hluc$u{Y1 z`Ulek(K9dhHV!74c5IUxB3@ZJ(_LX5I$ze|=RZ#3ZIiYTZQuQTjU6wB+M>_tVVF~o zZHNv|0XFZB4y?PYy1?h&!;>q%n3VF7w>KDGC2bu&&CJ}0YK#Vcgv z1EP`VlZaHHM-HjrxZpt!s+T3tYV-};f3Z}_<*V7scE*J)~R(}VVE%hkda`3HM`jS*#Gw?UxMk1>?0c=IV5_r?sGJzvHXMsSUrD;q_{TxJt2Jt~0CCAPdDYHRrgVl7 zTDgx4`>+Hx*}D~p%?2J$O&cGsc)%A=?8AKY)Mdi?9tD=KS;*lHmK*o<#>jOwBDxor zGbxAOwNeOT;k^?ThEEL2Ar@9_4IX%V?iYNJa%@}J!{!{blGKcim8NpZVELG3vkSW0 zZLe2!jhP=Wu$XA zkxI9@4c}6Nw_e~~q>b^uTRi*ry)E*3 za}ANGAer29&y>$9WWwU4r7SK>Z6p^!wfY1TD~9LhH}_`mDP%V;dhilroj<^WZVd#d zLP>yx?@_6c4#LHpt;rT9qqX!ZJY+czL!dmu!g)(iRa8Jyj>{hkXkHVx+;XH;c$Jzd z2)bp}zd%(H=$5qKmh(QcStyY7Z&Hr5f|YSRD(=zXjb(Q810|f@$y-cH9Ej#3siBF6 zDi_(OgvB$n?_y=f2FVfH?5uU@+wg>YA~Q{`st0-|qe{C7m%Cn<->(@NSCHPTL5uA9 zmIrMN?78K@Y(sJ0szBVO61%=l3q-;qR38Qw$(j4GdqIpj->+*9N4QEQmXkuZDTeKs zmCveqQbC9CSe?;4sO5{Tgeb+v7c_pX%R`RIwzbsi>P8uxHdm-&4%|1KlR5+YO-K#% z647z#M*dT&+on1PfKt$-FF74unY%GtMY=Dcg+m`q8PaVfo#Nt$y~Eohv_6ApE6)`e z`3-2kFOcgcDc^J6K{m8bg}Ot5rit4{*owvDV{VcY`;+~e`sQyogJ7gh(sILz5->Xn z2+}idmBEO7%Z%uX6TG9%w*WPPF5Ba`}WYjE&Y^GV6 z{~JFsow9*FF;FSA{eAR0J)N>$_U)y4-E}^bj{$}0yK!VKU`HH}<@J}_aRpBlglKcx zajKurT^58r=QcnjehQ}8oNvFM>4PZj=csTU)(+eU^vUjM->rNmsH!BPql4@3u1t>i z*xF2`wyZCpdCdfm8{pn$Okq0!!@AiL0zb=dms;8$XpC3M$+doSvBRn=7s}gyE0`siM8$m}<9piN@9F z(VL3# z5I%PP*2wrO@|*~Cfo>Sz84i3d7yVr1SikQ=*l=EM{k*g=k)da=I_R&i^Lv8RXSrXX ztg)9mY~Nay1YIfTS*0 zOwzuopfkHhh<`rRBbGeKKryY$@9GvBmvS+0R+51t9{*}1Lyz67e$QZV^*a2CLu$#6 zyL(5u82HC`56#*1FYD%hXh3D9mEa)itHRE<9)rf6esvxG;^B5HQh=7ZAA2rTk@pj}p%SSsf MiDwtCSN4Mb2aG_oKL7v# literal 6028 zcmb_gc|28Z*FKYDKAC4SB!rCV;7KxO&Xjq`Ode&so8Cd#!!1`?n|go$Fv8J5d2mXP$_2Fc|{GsBRL! zq-LTc&^JLF2Q&bHKo9^7_|tWa;20_TpD5rQ&7e4Jl7|E6XnuJ8EISr}F-OBUE#R@_ z$L-`9gq;xpp`!y98}wP1pPhdGewi~HGgbdO;T;M2f+KQ|?b0yhdU>M@?k(o=-0C_&~?3cNTawV$yaoFb)q}^)#I73Mndr{>w(#ssEC-Cu?&(B zC$Bsc-1VCV*IEj07Y$z8XiRQE@oUI^RZL1~geyOraT6T3eqgTZ#?H;((*hRg;YmO$~iwxFcL`AQV6Mgl5L-SzQk~5WD z_!(3wYStW&ftYsF|E_48nmk&t^dS#(JWHCa!<^Gl_<52m+Zw& zqx27-r%;lo+FP}bpCF*|2k4k8*IgDhrVNYU`?~*RZW?E zW*L8R^}cjxRl9eO^c^m{+`Jp|ruBp+`~3uDhndH7zTx7`=WJYU}|902ur>zcI3<3KhRE^sD-xAqnhfC@n2)0Pt)9!$;Zh+}F>^+}cZ zrCjlviB6r1mQ1|G5xy8L3m3;Vn~E8l4k=smzZWiICuK%PrSq_p%@9a37AIE>_h@}% z7yD{_ad=ZDd#6}So$(F03&3!Wx!}@|as%8101n2-t$RA3Uq6x(E;Jp3*rGlvQXp1g zkHKI-fTjh)qo>0c zmQ`wAed02Fk@fXNL~7s#PxaXpXm?41#CKT6%k}{pAT*m~Y>Nay%TEPB7I1JjnSO7exwV`DcbQHrCmsFxX;NWh=X!b93XG%*0dn^H zM}GLyn4>jO)iZl2Z*Px04(0GuK1?mrv|WxLL=&VFuqDtE&5(pY!5;_pfd=~V7ZP=A zDYl0m#15ma;s*?r5yw)u5aDnd};u$ zpUkc4;tn}oswASLO2Iy-Zj)v9$cO#N1mGy`NNwRB4h{xyj_`p?n|D^z={jUOD1dY$ zA7hi$!fzziohbfXAMEo5H~bjKO~+*6Io5l=U#%LdifLSlj(s17>`9EzC9YH#){+Gg zEP1kMK9^=D@~uA9d=&y&_5~6nN|7ui7w2Bw?;4Fy%rIqqu;+*I%@!^gwJcI9|D<+YiABh86uRz{&u?lXh}K1)eA#ukoSLA38rd_`y7Z zp(jjiYXoB*9gZi{AIuXN=Y$FQ9ts4j{&P@2m?tpN3G=v}9%|!YnLqjbDNbB0jQcT&jeIw z-L}x%S}0%7ch21;5d}dHNFAC)ZEApWrv_Z3j#Ur$#^0S4j;uhBq5yu~VJ`n9r^cc! zcwiZOwy**JqNtCwu9h#s)=Fe5E-(6c`3??W4k*d?&HEoZ43e0pvr+;r??D{S}RlH>5u}Z0OHB%EX_V_J6UY{=2*X zt3wX_f7ap8Rq?wV{x>1~zt)UjuH6(Mufg(fPf{%Z_Molt6bJ*QJwj}(!cG(3rk!Mu zaN~^a)K>fAs)+u=00tYk={dE4HvrVJ``cVZj{7W0JA}2?`r49Py2+OE+EZCKY~2al zt}2#lGJjHgel_d0`np(;;aYO9fI5AI=mnMiS&$Y>Ixq3k%vY$YI8d;TEsSrwB_$jZ zGr&k#4*~noPG~T7TwsT)}E}1&g*l>3i3sbsR_rcH{KtP+R&E z{9Uw~}MX;j_eiz9qSgHcRiJ{k&g?lj*u5u=@2uiBX_=?Tg`$q^!fv};wEVq9)w zNtYo3PbO@{#L*~(1IHZpy3(fvePh$Tx7FpELXhgGb|3C1#ayTG=4mV#~TN zYI@b-PzC`Qa(w5sXB_T?qC|*dfIc)@xu=L05OgOxa-uVwD`YiNFi71sqY zliR`zR+pfPpgna0He1U~Z(mv?Jl0*ZNWsX#B3bH|kzz0X>L$Tb(!Dn;LsvW_ zeHP~eZvI_f9s;J1%NI*fu8XCJ;8Zbgd*8!BfOB{3R*m#&y86}F>U>A=rS$vMnn-Il zS?LVk6w0&UY?s)(8-W_zAyrh2CKD|xpS9KJ%cNKpGhQ!Fr@le#UK6E)$ggsktzWd( z$WJCWcJ@jbX&y>)<0;YnQmz>Okb>^KKAcwqCcnvA0QVYcaWYkSi{3(4#p8BY#sKKM zCF-p_z|G94gG%S{)hin%V31b^im_8r^4Vw4Tc7iF>^BE1Y=R`jTL-pQlj_Vn89)oE z1FVa7qP@X=WEyMm!Fk;_MhVB1Vx~L$7kUFapQTWEylo~qEuJ#7tL$(on}i#I;L@4y zdv*O&j)7379UI;jhZn(CE~DYK+`@)ypBV=GSwrKU_GW4cmR*P?YAjsm^}_1seEYiX z-#R-F=2v{Kh=N4YP@cS#4QI1PEFgLWN4sCGAkITIHUe4W)q;kKx%rgIs+Y&Y<+S z_5LW}D%Z+!St5|YDW_>~vJ({Z$(llX9ia#q>8TDrpr)c?w(&n)7J>P)lTerfRj z-5xRxeI2jk)qOMr|7Cb(#h2xPy6Lbh3||z)D&4^Jx+W4SO15m9ULCJ#)b%KYDkp?S z6Q6J|F%5M}HQ$v07f7Ft6D%?z`2b^l&YWZ}0cF?OuQE}`iTLyk!~ZS}W0lgFo)xmD ziqYyVj{g+N!l^Obalj{t8S^C1{Rqw2zr;15 zl2$mN8-q;b=uBCrGe$BIFTB-U6j9!x6>%}NqOf_GvnWe33w{;d5_kXJx!8?vN1zUP(OIgc&w$m({jW>S(*>fCyO44kE@(?{sRNq z9V>Hv46&;6<(V_S>N$DMkAj1$;TcPrS3FH)-3FpBYF+yK7JYPkG965%A|&}js_aM1 z2QF92n~7&&W#R2ZP@TcK37NH9hKOvz@^$pSk)5kUBco=*-YwMgQbjf?93lT`vpg^y zQy|OQWw0<1D+%U#piQU}Fsdr~qK%%iXWP{Tp!ghYY(u62e=3I`S|g%XG#4?SLA8 zb_gFxZEI@QV7#`ao)b{y`*B^p^Q9;HtR>v|>r#y*nACeD&5WXO0#%rLEF*^0;$?Y{W6TCZ~ zwGRYtKmU|bFtY2I*5kIg=$!=g=!Lt{!xpVH#Gj6enkuZAY-Zg5;{M=`-C*xnZ(ZbP zvsw~rdNVTq`F1dFGao-fT%l@+BHFIho-WwqE*)T8Gzna~x)xVPUk^U=J zIFpZThz+d8_`(56#$>vZG zW{s#ClS+%8ar#Rx&1>?7M+Z1<-=(IG$pg{y_Kg!pBx|?FugJ;V_FX}*DRYYuSso7v zg!kOfz}yKFDB^DvYCz6#stl42ZH%Fxtd^pu28qc$a_c5Ae@(4)W7qy;&!ay07wY(X z%f%lPw`c{GR`j&o@cK1C{yAQy>)c)fV?!MW&k#LU%9DI+Bi98iRxZ_tX;x&bq3Mv7 zm2a1hJpiE#F& zqugX9pRs8Kf9$T4q9*5+<%ud02Qgowig}7+bKzAg`n*;%>D1;3A)J0BlR|lA7$(?P rpe_Vt0hLE;67s$Zyp(k?0Bm1h&~Xf_q>x$B|0L@7`n_tF6(!(bjk^s# diff --git a/ddk/tests/data/dlc_storage/SignedChannelEstablished b/ddk/tests/data/dlc_storage/SignedChannelEstablished index 009890e9917560ada9c5a2ab5c9f13af008d5d29..36bd38ff53e4c47330fcc38b8340e81e6574f690 100644 GIT binary patch literal 3478 zcmZSPIdDsJx?pq7{nOt*luZv1c9=Y;*frw0WZlXOyRzyfm?T=l8^0MI>6e+#`N&`r zTP<62y}>G;3n5-7+W$?wdoit2^4`ko$Zrij`q`U94T?UrZN1{IysI$sL2ATvSN2Oy z3{b#iZ?oRCA-?+7YmvWy=O>B$CKEQ{m^G|8MVJ>7Q@ht*so@7YFn!Bhletor7 zx+rY=xy*klucCjlJII~4FKlS;o@aMtnf+g;^Foum<@f8~y!U%z>4Ngj_c=?~Px`*# zew{=&Z_Mh@9c9c8(|hI~R1#u|*dcXzW8Af@&h{CG{(m$ce*Mq+`_0bP*O+2f|4Giz zDDo}RNnEYSo+GX^Y_ekJ_kGGi8++Xg=by;K_q|~_bp5njt+>Ic4O@`RpRS)=# za(JV^JiJwVTj-}t&o^s77nhf7r!a1vC*5J48oWy(W8t1nKTa%LsQjmKQQi`PlQEy% zJ2V%E6>WJt&vl~HTDiHK8KOR$EUKJowuMPnG$K9f zvY@QCKo@=ydSKRT)n~ zzI{u!d%pUx^!ROu$?MK+{vxt7L|dPFEYtMudqZDjJFqH3{s_l)X| zIvV?RMDMCux4hZ=J2QBi(1OTij$#r`Y|Ll$Rr%!4PvGk~R?}^8&us66E0wu^HM6JK zL>_;4_kwdR^QJf3H&6GS_H=gb`ONt31_xi{@N_<2ttvS4l-ROl7p0EbUW`@?Z%1Bv zr{f?Y^H4t|Bdf;5_WsT}h0)A&=54-mVDrm~pKfL}+~JY%*f{4%UqGHgp0+OMn{JKV znXmZ;Z~Mtf?VH?Q`S?~+)tWX}lLy9;oX)#t?lCsAZdmKs)O7t56EM&jXRXcsZ~jsG z=RVE<0k_@1PF?WSZK>;m4iQDJ2Rag-Poe(Efkk)s;& zK*A%|WKU5+(AwF>hG{?d`%jtjuu*wlpwN2m{RtqY3~a2*4u`7`?zy2PVcgZ+Z>Fra z)2nkD!^=lmEn(9?O0HeC;K@1$2B7Ic0CEl!p}Yvrh#=KOr8AI1<}@|9yH)4y&UeZ* zJy9$ay|5v1f$Bx`tvww)zqKFdWf(kD{@!rnsWUgo**HoRj*>ob2;j&gAe{{EL5c)3 znIge5EodDB^Mo~x{U!~H`WGwyCcNU`ljm@2!r7J2=a&Sy_UV@BSUG{M!$-ghEqrP~ ma--_7htO!ajE2i-{=l9FM#E(^TwozET28`30+mJ!7bXBcEvvEs literal 3478 zcmeyr>~CUm__aG1_HUJzvVOIYQ9{e9ozbSdk*`E*YZ6}+lSE5+<2S=2{W8-z9~n$y zt7U7hH(14UA;jxM`@e~IFQ&2QtUfBSLRb6y0u|Gr>opa668AKoYAmfjyzBGoQ@j71 zWq<%C<~+=)Lfmp53(>f8#heO`FK*GgLcSBW8Wtx9jxg00CROt<9? zUQd0~@8ec5>rdG(*^0>5cXwJWtzeRrn30pUcEgI7^;fLESHy3U&}ZAbXW?RRvE%af zuGts0nHYK9x4np+dB@FWc6iK$1qDag6MuS^RqJM~y}YQcI-`U^j6ozUTGKeVc-if@ zZeAPjOq*rqdsO3iO7Z3?ljZjaf#exFx8<$b%erRk68*(So?a(qi*zR~(A@Q5@|L_A zjPI=yZ*X2Z9MyCysA|v8d`Z3&hZ7&Ec^?z?x}&mf#_B0RzcNBSoXx<%U3FW{$kx0X zB*Ojr5JY16jRQyp7q1zP8HksFdhQ=eeQ%qnP8oIFsA^V4=nD z_pM%YXlK>eokv^mZ+D+ut`~jd>z<-Tx_LJknO**BeBTtdY?)ZOh)AX0*$LLi=eewn z5e{0jYJJYEHBO1lRcHKECYl_`@>Mi`$jtovNn5&fQO_xZ5}&}13a$fH*O_kCeBl<# zzI^fK>V5eKFE8G*P5y51ALfZcI}iQdaOde#OXfsI-;yoH(?1D%1T~#lqBU{d(G7kt z=QTJk?ru|f>Td1`3ar@YuNCkAxBvf#;pPJG_hL>q5!TJCx?UaN`fYm)ByYdK_MY10 z+2`jh`k3~9W0cALqnQ(aoN`*0HOHrlQO7Ye+|NV7{9NXfCyl%6mtErJIn?B2-?+Qp z z?2FxtGMB~sYa~DS+4uLYI3l9;?~b^7U{US~Mz4UG^)W*03;dpXUzEE3Kl6-KcgiPQ zuB(SuimAWI{>2;WlDF{q!hM|PEB~xwwzpEvEcH#Z>S}ZC^R?ZuV$Q)g(PcaT&AZh9 z+WeNfZ5Y!Jx9`{2#NR2e?vr)dUUDnpyrJ$y`RC2*!93|tcIl_N_x2oaJ=0+y`SbSX zxmP^CirzfS=)qxNb|GccPGQz{<+*{S+PAKq+vfK4_^&OG{OV2}PgQ%UX|iimz^NsU zcclvi7tPdCZm#$B@JpE=ykYTz{1*a}Z>tZU;oqPWvA}5)A0HDaE~b9ES--J;i_-_s z2H(TeDtj9bPkF32QC|J~@Bi6L!cP4FDPs8d|Nno+DJraNAdV7)!u@NDPHy-=-7kEF z@AJA@zqp%B(%$W|JN+}!e|z&P0lBR8-1`$iN*UN#l^qJdt#XoOu{X$^bl_&knRjXK zG5>t?W#;%F?SK6Ju>O?o3=BZifdFI^6QR5aPCFpggwh#YA@hl+&fFlk;3y_IO8UUw z!jbUP)Zo7MIn>vEey6dNPJVTf8`Byu*^QCv_gOMz^(q=Rd^zd&7-R{9dypc*5=)U_ zHVj(Fz}$M8-z(v=`?fbsi`V$;=9cwbys6Fb*_C7W)b@bI%`Zd1*5M;y`3#>Lkld&` j>>)H7E~DWxnm@3ofzfao4HsAljFywIkU*u;!i5O{drh$K diff --git a/ddk/tests/data/dlc_storage/SignedChannelSettled b/ddk/tests/data/dlc_storage/SignedChannelSettled index 7b2c0b627ebffb0a0f57f8fadb6953f59728eae3..173d55c763c152bb1f0c8445106f9fbe5bf0229e 100644 GIT binary patch literal 3496 zcmdlvKj~EX1&s|-_l6e+#`N&`r zTP<62y}>G;3n5-7+W$?wdoiu{+U2chN++`QJ?nSSBHQ}9U zECUoUSx0wtzG<4YCxU;`G~=hi7wb+g?+}`l8zJO8!@VhSS_$(EwkoNetF~10JbpKI zbK{DKGC$ipdF%IGIGX>&xjQjElX+)QT$$}0+Y^(n`)%pTewZ5UEWg zTxW@AE{gqqv3^EFe(SU;j4n$Oqq0hSHbr!L8?U_cZT@HJ*3%4P3?i?Urnq^W2zFhm zT>Vtd=k-g2S(~)px&2t19A^9qBwzJ^hvBN1Y&p|qH>&)fp5SmG+f!LR(q8Z1Wse%h zzuYGEAIM_Tu9#Ta?}sm#R@)2A}phrQxb_{Q>X_Y#AQM<%>h=Ax%K zCmlP>-6<2tlyF_OvhcgIfvS4X=3QauCs=jn|2k@PbMF!Z&YS}eubg0Vyr$CrWrujx z&WSsvzqQ;A)pGj9wEEp&JxxIscJbzgQOxT?&n8}b)+4apd)f4z?GcV1NfX%@?mo4{ zQ-%G*%Jp-?L4g$}o$ER$M66=DbD!0DxnSq0RJV|fjZ@xj>zVQoB)|Hn-XDFpl9|6> zHLb}O-nei2v=*j2n>a(C99vw(xb>y)%oX1~s`uWUU7Iy|r|3Jc%?BmleE;w$>sn99 zv9rvO@B)*-z!VI*YPx-Aa~X&a3ryBnuLf2opa5fS;?=nZ7xw<=No+ZO-aCZ*zzZMk z(v3g&MSc%17uo4~1Z>KGAYcmej%5Y$lo%8w^L4*lzY$Wn^~mPO^;yoT{}zje?ChlaWk3{9CPrCLkJZZ-K9bCyb?Q%fs zm?i!BvOlfMJNevBOsqP6&MKGWHJ{oX@+EiApBsBcvEdzaiD!Z1KDVFcndTq%e~w`( zR|GWCvJu#2Pr`8tqS?f<^mOx3tPsUf1BAl^C{mW#@iz6*09Z-_u%^M z7&|#tDG|SLo{zULdtLp`+&t-_3;UF`gh{>`8a5jZGM6r6b$$4I_Tu}`D?VTBKdZ#F z#ioDK%7j&K-o@sv6TbPmK5wbWypn0@r$soTGra%TUU(AV`Z=4UR`e*}|tw$CR9V)x7xd2d$jlkM1zA zzL(+oCu>L}g=;Lgq9zRyL4ZfJs20 z#IftCPSX72{$_9GxrN;O?!C+x+3Xk-Fe&8FiU&dWIZFD#N^xY16HlGFK_&sEu@yle zDF*i-MS^9RBEgIqw2p!4OYYVFaZEV$Irt6 literal 3496 zcmaD>a7FCEmb={BJ}>E2YyTkYJ7M!SC*fH61SNA-<1?IcOcE{Ojo%E9^vg`=d}J_* zt(L91-e48ag%Gb3?f)j;y_gpJTr1_oFXJoxJ&jf3JvmpyE>F}q`@8n!!&V9YidjYZ z3=qJ?WXr&O^Oo4zya%Bx4E-kjNSc4l?@Cxr@27?SuTL)e>ZQrV&GBGC;;!wp_2P}C z_}*PUC}X+*_cLZgx!{(tKzR@GZOqFT=wCA1xk*KE);xj#vu<4rip+PMvb9fjZvFhv zVn-i-VCK}b+jHr=V6)47g~@)m3@>jqzf$)@C^B7J)!%4>?}JkeVhkcX#n+uJJ+)mw z{%-%}CbN)-wbax-9XF*gp0|V>4yWu4Z*PRA& zxnCawQ4FlHUJcCbaomk>>Nhbm-PkyL!iDL5>!w+k$rq(ooV$MSN$rhuwagM~D=z$Q zxu!KE@8#BYH^W6H+&u1L;l4U&QNXi|r)*!dm`a6oPTx9nm@zapFMh#Jy9Awo2Om88 z@FGriS8#?4UydYGMdOYq*}86Fp;tankNdaezG}O$ma)Y*-TG-;+!w-O<*jPUwkxJeg0+%C#jin z5kkuk-|?F8*1FLb6j%|N7nPJ*-HVd^u57i~ed+gwx`b1v+_U!tNat+@$;)Z1i~P_L z@iqCbsOnSo?sGp)_qcxEcAi7|?y@RI@dt~S{V~tUbgywP@8c^AwrPI6uKASe;?Aj!UUxtuu)t(ke&YZu6G&Zgb(pu7{_@6aAKsPBRC1O+ zF^AjmyK4Q;`|tcXivCUC4N}DL9|)L&ykl8G93=*YG}TxMnH{fZE;(L2oAKsVmXc3d z7iM(-kZ3Istz2+*ZQ`Vx%RwqZO5bg$EMf?;-+X%alGbWlI$wp0r4!k?UU# z(@_b&Ua^U8ZMUW`zYy7%opJZjUxyj*gGDyw9}mCq{CjPgV!G<}oT@4Ja{3x4-1sKe z9^94AYL+R@-aXOqjcrkCs%WD(^O|k{W9!aoo={%lv&3gpYfWNk>#h#n`O>%U7%Y}y z{b<5;r2f9*_Nu-|`xP=iy3H=@$-YoiEmGl={yXre!3z#wW^SfRo=n#-S&TXPWd5}b9xCV96_-PqCi=tNmq2vcXrLM zuKrgfIv9J@TweunRq-lSvt*Y_ydXyt z3y!qTQPRf-mBv=Cq^YrjrGW{^gEpa*_!EJJQR{ diff --git a/ddk/tests/enumeration.rs b/ddk/tests/enumeration.rs index e4774e0d..cf72aff7 100644 --- a/ddk/tests/enumeration.rs +++ b/ddk/tests/enumeration.rs @@ -1,6 +1,7 @@ mod test_util; use bitcoin::Amount; use chrono::{Local, TimeDelta}; +use ddk::util::ser::serialize_contract; use ddk::Transport; use ddk_manager::contract::Contract; use ddk_manager::Storage; @@ -10,6 +11,33 @@ use std::time::{Duration, SystemTime, UNIX_EPOCH}; use test_util::{generate_blocks, test_ddk}; use tokio::time::sleep; +#[macro_export] +macro_rules! write_contract { + ($contract: ident, $state: ident) => { + match &$contract { + Contract::$state(_) => { + let serialized = + serialize_contract(&$contract).expect("to be able to serialize the contract."); + let dest_path = format!("{}", stringify!($state)); + std::fs::write(dest_path, serialized) + .expect("to be able to save the contract to file."); + } + _ => {} + } + }; +} + +#[macro_export] +macro_rules! assert_contract_state_and_serialize { + ($storage:expr, $id:expr, $state:ident) => { + let contract = $storage.get_contract(&$id).await.unwrap().unwrap(); + assert!(matches!(contract, Contract::$state(_))); + if std::env::var("GENERATE_SERIALIZED_CONTRACT").is_ok() { + write_contract!(contract, $state); + } + }; +} + #[test_log::test(tokio::test)] async fn enumeration_contract() { let (alice, bob, oracle) = test_ddk().await; @@ -68,6 +96,9 @@ async fn enumeration_contract() { let alice_pubkey = alice.ddk.transport.public_key(); let bob_pubkey = bob.ddk.transport.public_key(); + // Serialize Offered state + assert_contract_state_and_serialize!(alice.ddk.storage, contract_id, Offered); + let bob_receives_offer = bob .ddk .manager @@ -77,6 +108,9 @@ async fn enumeration_contract() { let bob_receive_offer = bob_receives_offer.expect("bob did not receive the offer"); assert!(bob_receive_offer.is_none()); + // Serialize Offered state from Bob's perspective + assert_contract_state_and_serialize!(bob.ddk.storage, contract_id, Offered); + let bob_accept_offer = bob .ddk .manager @@ -95,6 +129,9 @@ async fn enumeration_contract() { assert!(alice_receive_accept.is_some()); + // Serialize Accepted state + assert_contract_state_and_serialize!(bob.ddk.storage, contract_id, Accepted); + let alice_sign_message = alice_receive_accept.unwrap(); bob.ddk .manager @@ -102,6 +139,10 @@ async fn enumeration_contract() { .await .expect("bob did not receive sign message"); + // Serialize Signed state + assert_contract_state_and_serialize!(alice.ddk.storage, contract_id, Signed); + assert_contract_state_and_serialize!(bob.ddk.storage, contract_id, Signed); + generate_blocks(10); alice @@ -120,6 +161,10 @@ async fn enumeration_contract() { let contract = alice.ddk.storage.get_contract(&contract_id).await.unwrap(); assert!(matches!(contract.unwrap(), Contract::Confirmed(_))); + // Serialize Confirmed state + assert_contract_state_and_serialize!(alice.ddk.storage, contract_id, Confirmed); + assert_contract_state_and_serialize!(bob.ddk.storage, contract_id, Confirmed); + bob.ddk.wallet.sync().await.unwrap(); alice.ddk.wallet.sync().await.unwrap(); @@ -186,6 +231,9 @@ async fn enumeration_contract() { .unwrap(); assert!(matches!(contract, Contract::PreClosed(_))); + // Serialize PreClosed state + assert_contract_state_and_serialize!(bob.ddk.storage, contract_id, PreClosed); + generate_blocks(10); bob.ddk.manager.periodic_check(false).await.unwrap(); @@ -198,4 +246,7 @@ async fn enumeration_contract() { .unwrap() .unwrap(); assert!(matches!(contract, Contract::Closed(_))); + + // Serialize Closed state + assert_contract_state_and_serialize!(bob.ddk.storage, contract_id, Closed); } diff --git a/ddk/tests/nostr.rs b/ddk/tests/nostr.rs index e24a645d..9507888f 100644 --- a/ddk/tests/nostr.rs +++ b/ddk/tests/nostr.rs @@ -23,7 +23,7 @@ mod nostr_test { let esplora_host = "http://127.0.0.1:30000".to_string(); let transport = Arc::new( - NostrDlc::new(&seed, "wss://nostr.dlcdevkit.com", Network::Regtest) + NostrDlc::new(&seed, "ws://127.0.0.1:8081", Network::Regtest) .await .unwrap(), ); @@ -51,13 +51,13 @@ mod nostr_test { let alice = nostr_ddk("alice-nostr", oracle.clone()).await; let bob = nostr_ddk("bob-nostr", oracle.clone()).await; - alice.start().unwrap(); - bob.start().unwrap(); - let alice_address = alice.wallet.new_external_address().await.unwrap().address; let bob_address = bob.wallet.new_external_address().await.unwrap().address; test_util::fund_addresses(&alice_address, &bob_address); + alice.wallet.sync().await.unwrap(); + bob.wallet.sync().await.unwrap(); + let expiry = TimeDelta::seconds(15); let timestamp: u32 = Local::now() .checked_add_signed(expiry) @@ -81,7 +81,7 @@ mod nostr_test { EnumerationPayout { outcome: "cat".to_string(), payout: Payout { - offer: Amount::ONE_BTC, + offer: Amount::from_btc(2.0).unwrap(), accept: Amount::ZERO, }, }, @@ -89,7 +89,7 @@ mod nostr_test { outcome: "ctv".to_string(), payout: Payout { offer: Amount::ZERO, - accept: Amount::ONE_BTC, + accept: Amount::from_btc(2.0).unwrap(), }, }, ], diff --git a/testconfig/scripts/generate_enumeration_contract_binaries.sh b/testconfig/scripts/generate_enumeration_contract_binaries.sh new file mode 100755 index 00000000..b86cc637 --- /dev/null +++ b/testconfig/scripts/generate_enumeration_contract_binaries.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -e + +# Contract states we want to capture from the enumeration test +CONTRACT_STATES=("OfferedContract" "AcceptedContract" "SignedContract" "ConfirmedContract" "PreClosedContract" "ClosedContract") + +# Destination folder at top level +DEST=${PWD}/contract_binaries/ + +# Create the destination directory if it doesn't exist +mkdir -p ${DEST} + +echo "Starting enumeration contract binary generation..." + +# Start Docker services +docker-compose up -d +./testconfig/scripts/wait_for_electrs.sh + +# Run the enumeration test with serialization enabled +echo "Running enumeration test with contract serialization..." +GENERATE_SERIALIZED_CONTRACT=1 cargo test -p ddk --test enumeration enumeration_contract + +# Check that generated files are in the contract_binaries folder +echo "Checking generated contract files in ${DEST}..." + +for STATE in "${CONTRACT_STATES[@]}" +do + # The generated files should be directly in contract_binaries with state names + FILE_NAME=${STATE/Contract/} + if [ -f "${DEST}${FILE_NAME}" ]; then + echo "✓ Found ${FILE_NAME} in contract_binaries" + # Rename to include "Contract" suffix for consistency + mv "${DEST}${FILE_NAME}" "${DEST}${STATE}" + echo "✓ Renamed to ${STATE}" + else + echo "⚠ Warning: ${FILE_NAME} not found in contract_binaries" + fi +done + +# Stop Docker services +docker-compose down -v + +echo "Contract binary generation complete! Files saved to ${DEST}" \ No newline at end of file From cf26aefccf48bc30231c84f49b572d1c35d5905f Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Tue, 29 Jul 2025 10:53:25 -0400 Subject: [PATCH 5/9] fix: clippy warnings --- ddk-manager/src/channel_updater.rs | 1 + ddk-manager/src/dlc_input.rs | 4 ++-- ddk-manager/src/utils.rs | 1 + dlc-messages/src/contract_msgs.rs | 1 + dlc-messages/src/lib.rs | 1 + dlc-messages/src/segmentation/mod.rs | 2 +- dlc-trie/src/lib.rs | 4 ++++ dlc-trie/src/multi_oracle_trie.rs | 2 +- dlc-trie/src/utils.rs | 2 +- dlc/src/channel/mod.rs | 6 ++++++ dlc/src/lib.rs | 5 +++++ dlc/src/util.rs | 1 + 12 files changed, 25 insertions(+), 5 deletions(-) diff --git a/ddk-manager/src/channel_updater.rs b/ddk-manager/src/channel_updater.rs index 29328596..4f315e9d 100644 --- a/ddk-manager/src/channel_updater.rs +++ b/ddk-manager/src/channel_updater.rs @@ -466,6 +466,7 @@ where /// Verify that the given [`SignChannel`] message is valid with respect to the /// given [`AcceptedChannel`] and [`AcceptedContract`], transforming them /// to a [`SignedChannel`] and [`SignedContract`], and returning them. +#[allow(clippy::too_many_arguments)] pub async fn verify_signed_channel( secp: &Secp256k1, accepted_channel: &AcceptedChannel, diff --git a/ddk-manager/src/dlc_input.rs b/ddk-manager/src/dlc_input.rs index a697fa35..c39e609a 100644 --- a/ddk-manager/src/dlc_input.rs +++ b/ddk-manager/src/dlc_input.rs @@ -38,7 +38,7 @@ where let dlc_input_info: DlcInputInfo = funding_input.into(); let contract = storage - .get_contract(&contract_id) + .get_contract(contract_id) .await? .ok_or(Error::StorageError( "Contract not found to sign DLC input.".to_string(), @@ -60,5 +60,5 @@ where &dlc_input_info, &dlc_input_signer.get_secret_key()?, ) - .map_err(|e| Error::DlcError(e)) + .map_err(Error::DlcError) } diff --git a/ddk-manager/src/utils.rs b/ddk-manager/src/utils.rs index 5f565155..d3690d77 100644 --- a/ddk-manager/src/utils.rs +++ b/ddk-manager/src/utils.rs @@ -89,6 +89,7 @@ pub(crate) fn compute_id( res } +#[allow(clippy::too_many_arguments)] pub(crate) async fn get_party_params( secp: &Secp256k1, own_collateral: Amount, diff --git a/dlc-messages/src/contract_msgs.rs b/dlc-messages/src/contract_msgs.rs index 8347444f..f0bee574 100644 --- a/dlc-messages/src/contract_msgs.rs +++ b/dlc-messages/src/contract_msgs.rs @@ -29,6 +29,7 @@ impl_dlc_writeable!(ContractOutcome, {(outcome, string), (offer_payout, writeabl serde(rename_all = "camelCase") )] /// Contains information about the contract outcomes, payouts and oracles. +#[allow(clippy::large_enum_variant)] pub enum ContractInfo { /// A contract that is based on a single event. SingleContractInfo(SingleContractInfo), diff --git a/dlc-messages/src/lib.rs b/dlc-messages/src/lib.rs index 543df452..4c670544 100644 --- a/dlc-messages/src/lib.rs +++ b/dlc-messages/src/lib.rs @@ -607,6 +607,7 @@ impl_type_writeable_for_enum!(Message, #[derive(Debug, Clone)] /// Wrapper for DLC related message and segmentation related messages. +#[allow(clippy::large_enum_variant)] pub enum WireMessage { /// Message related to establishment of a DLC contract. Message(Message), diff --git a/dlc-messages/src/segmentation/mod.rs b/dlc-messages/src/segmentation/mod.rs index 85ce7a01..024ca324 100644 --- a/dlc-messages/src/segmentation/mod.rs +++ b/dlc-messages/src/segmentation/mod.rs @@ -77,7 +77,7 @@ pub fn get_segments(mut data: Vec, msg_type: u16) -> (SegmentStart, Vec> { fn iter(&'a self) -> TrieIterator; /// Generate the trie while verifying the provided adaptor signatures. + #[allow(clippy::too_many_arguments)] fn generate_verify( &'a mut self, secp: &Secp256k1, @@ -145,6 +146,7 @@ pub trait DlcTrie<'a, TrieIterator: Iterator> { } /// Generate the trie while creating the set of adaptor signatures. + #[allow(clippy::too_many_arguments)] fn generate_sign( &'a mut self, secp: &Secp256k1, @@ -170,6 +172,7 @@ pub trait DlcTrie<'a, TrieIterator: Iterator> { /// Verify that the provided signatures are valid with respect to the /// information stored in the trie. + #[allow(clippy::too_many_arguments)] fn verify( &'a self, secp: &Secp256k1, @@ -290,6 +293,7 @@ fn sign_helper>( } #[cfg(not(feature = "parallel"))] +#[allow(clippy::too_many_arguments)] fn verify_helper>( secp: &Secp256k1, cets: &[Transaction], diff --git a/dlc-trie/src/multi_oracle_trie.rs b/dlc-trie/src/multi_oracle_trie.rs index d8bdb774..c71fedd2 100644 --- a/dlc-trie/src/multi_oracle_trie.rs +++ b/dlc-trie/src/multi_oracle_trie.rs @@ -333,7 +333,7 @@ impl Iterator for MultiOracleTrieIter<'_> { } }; let min_nb_digits = self.oracle_numeric_infos.get_min_nb_digits(); - let paths = &std::iter::repeat(res.path.clone()) + let paths = &std::iter::repeat_n(res.path.clone(), indexes.len()) .take(indexes.len()) .zip(indexes.iter()) .map(|(x, i)| { diff --git a/dlc-trie/src/utils.rs b/dlc-trie/src/utils.rs index e559fcff..5a1bd635 100644 --- a/dlc-trie/src/utils.rs +++ b/dlc-trie/src/utils.rs @@ -91,7 +91,7 @@ pub(crate) fn get_max_covering_paths( .map(|(x, i)| { // For oracles with `min_nb_digits` we just generate the max value. let p = if *x == 0 { - std::iter::repeat(1).take(min_nb_digits).collect() + std::iter::repeat_n(1, min_nb_digits).collect() } else { // For others we generate the prefix based on their current // counter value. We insert `counter - 1` zero and then a 1. diff --git a/dlc/src/channel/mod.rs b/dlc/src/channel/mod.rs index 8eb3bd16..070de410 100644 --- a/dlc/src/channel/mod.rs +++ b/dlc/src/channel/mod.rs @@ -169,6 +169,7 @@ pub fn verify_tx_adaptor_signature( } /// Returns a settle transaction. +#[allow(clippy::too_many_arguments)] pub fn create_settle_transaction( fund_tx_in: &TxIn, offer_revoke_params: &RevokeParams, @@ -229,6 +230,7 @@ pub fn create_settle_transaction( } /// Returns the transactions necessary to establish a DLC channel. +#[allow(clippy::too_many_arguments)] pub fn create_channel_transactions( offer_params: &PartyParams, accept_params: &PartyParams, @@ -270,6 +272,7 @@ pub fn create_channel_transactions( /// Returns the transactions necessary to renew the contract of a DLC /// channel. +#[allow(clippy::too_many_arguments)] pub fn create_renewal_channel_transactions( offer_params: &PartyParams, accept_params: &PartyParams, @@ -339,6 +342,7 @@ pub fn create_renewal_channel_transactions( } /// Sign a CET within a DLC channel. +#[allow(clippy::too_many_arguments)] pub fn sign_cet( secp: &Secp256k1, cet: &mut Transaction, @@ -393,6 +397,7 @@ pub fn sign_cet( /// Returns a signed transaction to punish the publication of a revoked buffer /// transaction. +#[allow(clippy::too_many_arguments)] pub fn create_and_sign_punish_buffer_transaction( secp: &Secp256k1, offer_params: &RevokeParams, @@ -471,6 +476,7 @@ pub fn create_and_sign_punish_buffer_transaction( } /// Create and sign a punishment transaction for a revoked settle transaction. +#[allow(clippy::too_many_arguments)] pub fn create_and_sign_punish_settle_transaction( secp: &Secp256k1, offer_params: &RevokeParams, diff --git a/dlc/src/lib.rs b/dlc/src/lib.rs index 422b888f..a0a5a38a 100644 --- a/dlc/src/lib.rs +++ b/dlc/src/lib.rs @@ -405,6 +405,7 @@ impl PartyParams { /// Create the transactions for a DLC contract based on the provided parameters /// This function is used to create the transactions for a DLC contract when the /// offer and accept parameters are spliced together. +#[allow(clippy::too_many_arguments)] pub fn create_spliced_dlc_transactions( offer_params: &PartyParams, accept_params: &PartyParams, @@ -466,6 +467,7 @@ pub fn create_spliced_dlc_transactions( } /// Create the transactions for a DLC contract based on the provided parameters +#[allow(clippy::too_many_arguments)] pub fn create_dlc_transactions( offer_params: &PartyParams, accept_params: &PartyParams, @@ -701,6 +703,7 @@ pub fn create_cets( } /// Create a funding transaction +#[allow(clippy::too_many_arguments)] pub fn create_funding_transaction( funding_script_pubkey: &Script, output_amount: Amount, @@ -935,6 +938,7 @@ fn signatures_to_secret(signatures: &[Vec]) -> Result( secp: &secp256k1_zkp::Secp256k1, cet: &mut Transaction, @@ -980,6 +984,7 @@ pub fn verify_cet_adaptor_sig_from_point( /// Verify that a given adaptor signature for a given cet is valid with respect /// to an oracle public key, nonce and a given message. +#[allow(clippy::too_many_arguments)] pub fn verify_cet_adaptor_sig_from_oracle_info( secp: &Secp256k1, adaptor_sig: &EcdsaAdaptorSignature, diff --git a/dlc/src/util.rs b/dlc/src/util.rs index 48e07548..6fd4f882 100644 --- a/dlc/src/util.rs +++ b/dlc/src/util.rs @@ -157,6 +157,7 @@ pub fn get_witness_for_p2wpkh_input( /// key and info, and places the generated and provided signatures on the input's /// witness stack, ordering the signatures based on the ordering of the associated /// public keys. +#[allow(clippy::too_many_arguments)] pub fn sign_multi_sig_input( secp: &Secp256k1, transaction: &mut Transaction, From 79e9ee9b0aae739229bc47c445467bdb1c8c8400 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Tue, 29 Jul 2025 18:05:04 -0400 Subject: [PATCH 6/9] serde dlc transactions and serilization error type --- ddk/src/util/ser.rs | 4 ++-- dlc/src/lib.rs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ddk/src/util/ser.rs b/ddk/src/util/ser.rs index e292d6b2..a23858ef 100644 --- a/ddk/src/util/ser.rs +++ b/ddk/src/util/ser.rs @@ -133,7 +133,7 @@ convertible_enum!( SignedChannelStateType ); -pub fn serialize_contract(contract: &Contract) -> Result, ::lightning::io::Error> { +pub fn serialize_contract(contract: &Contract) -> Result, Error> { let serialized = match contract { Contract::Offered(o) | Contract::Rejected(o) => o.serialize(), Contract::Accepted(o) => o.serialize(), @@ -143,7 +143,7 @@ pub fn serialize_contract(contract: &Contract) -> Result, ::lightning::i Contract::PreClosed(c) => c.serialize(), Contract::Closed(c) => c.serialize(), }; - let mut serialized = serialized?; + let mut serialized = serialized.map_err(to_storage_error)?; let mut res = Vec::with_capacity(serialized.len() + 1); res.push(ContractPrefix::get_prefix(contract)); res.append(&mut serialized); diff --git a/dlc/src/lib.rs b/dlc/src/lib.rs index a0a5a38a..e0700c19 100644 --- a/dlc/src/lib.rs +++ b/dlc/src/lib.rs @@ -122,6 +122,7 @@ pub struct EnumerationPayout { /// Contains the necessary transactions for establishing a DLC #[derive(Clone)] +#[cfg_attr(feature = "use-serde", derive(Serialize, Deserialize))] pub struct DlcTransactions { /// The fund transaction locking both parties collaterals pub fund: Transaction, From be6e4375be933fedf22901cf73246faebe02f132 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Tue, 29 Jul 2025 18:08:04 -0400 Subject: [PATCH 7/9] update Cargo.toml for dlc, dlc-messages, dlc-trie --- dlc-messages/Cargo.toml | 7 ++++--- dlc-trie/Cargo.toml | 7 ++++--- dlc/Cargo.toml | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/dlc-messages/Cargo.toml b/dlc-messages/Cargo.toml index a2346c65..41bdf8ae 100644 --- a/dlc-messages/Cargo.toml +++ b/dlc-messages/Cargo.toml @@ -1,11 +1,12 @@ [package] -authors = ["Crypto Garage"] +authors = ["benny b ", "Crypto Garage"] description = "Structs and serialization for the Discreet Log Contract (DLC) protocol." -homepage = "https://github.com/p2pderivatives/rust-dlc" +homepage = "https://github.com/bennyhodl/dlcdevkit" license-file = "../LICENSE" name = "dlc-messages" -repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/dlc-messages" +repository = "https://github.com/bennyhodl/dlcdevkit/tree/master/dlc-messages" version = "0.7.1" +edition = "2015" [features] default = ["std"] diff --git a/dlc-trie/Cargo.toml b/dlc-trie/Cargo.toml index 139390c7..11901516 100644 --- a/dlc-trie/Cargo.toml +++ b/dlc-trie/Cargo.toml @@ -1,11 +1,12 @@ [package] -authors = ["Crypto Garage"] +authors = ["benny b ", "Crypto Garage"] description = "Data structures for storage and retrival of numerical Discreet Log Contracts (DLC)." -homepage = "https://github.com/p2pderivatives/rust-dlc" +homepage = "https://github.com/bennyhodl/dlcdevkit" license-file = "../LICENSE" name = "dlc-trie" -repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/dlc-trie" +repository = "https://github.com/bennyhodl/dlcdevkit/tree/master/dlc-trie" version = "0.7.1" +edition = "2015" [features] default = ["std"] diff --git a/dlc/Cargo.toml b/dlc/Cargo.toml index 820632bd..f74d8704 100644 --- a/dlc/Cargo.toml +++ b/dlc/Cargo.toml @@ -1,11 +1,12 @@ [package] -authors = ["Crypto Garage"] +authors = ["benny b ", "Crypto Garage"] description = "Creation, signing and verification of Discreet Log Contracts (DLC) transactions." -homepage = "https://github.com/p2pderivatives/rust-dlc" +homepage = "https://github.com/bennyhodl/dlcdevkit" license-file = "../LICENSE" name = "dlc" -repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/dlc" +repository = "https://github.com/bennyhodl/dlcdevkit/tree/master/dlc" version = "0.7.1" +edition = "2015" [dependencies] bitcoin = { version = "0.32.2", default-features = false } From ed5744b09b2bb30e5ff59e09d1f3d7c47c197eee Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Fri, 1 Aug 2025 08:59:22 -0400 Subject: [PATCH 8/9] fix: run splice tests in their own job --- .github/workflows/rust.yml | 36 ++++++++++++++++++++ ddk-manager/tests/manager_execution_tests.rs | 29 ++++++++++++++++ testconfig/scripts/get_test_list.sh | 4 +-- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 1aca5cac..a6a9321c 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -162,3 +162,39 @@ jobs: run: RUST_BACKTRACE=1 RUST_MIN_STACK=4194304 ${{ matrix.tests }} --ignored - name: Stop bitcoin node run: docker compose down -v + + test_splicing: + name: test splicing + runs-on: ubuntu-latest + timeout-minutes: 30 + services: + postgres: + image: postgres:latest + env: + POSTGRES_DB: testdb + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + env: + DATABASE_URL: postgresql://postgres:postgres@localhost:5432/testdb + steps: + - uses: actions/checkout@v4 + - name: Start bitcoin node + run: docker compose up -d + - name: Wait for container to run + run: | + chmod +x ./testconfig/scripts/wait_for_container.sh + ./testconfig/scripts/wait_for_container.sh bitcoin + - name: Wait for electrs to be ready + run: | + chmod +x ./testconfig/scripts/wait_for_electrs.sh + ./testconfig/scripts/wait_for_electrs.sh + - name: Run test + run: RUST_MIN_STACK=4194304 cargo test -p ddk-manager single_oracle_numerical_splice_test -- --ignored --nocapture + - name: Stop bitcoin node + run: docker compose down -v diff --git a/ddk-manager/tests/manager_execution_tests.rs b/ddk-manager/tests/manager_execution_tests.rs index 7939b79a..52871fd4 100644 --- a/ddk-manager/tests/manager_execution_tests.rs +++ b/ddk-manager/tests/manager_execution_tests.rs @@ -883,6 +883,7 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ bob_wallet.sync().await.unwrap(); match path { TestPath::Splice => { + println!("Starting the splicing test."); // Create splice DLC with maturity just in the future (1 second from current time) // Original DLC stays far in the future, splice DLC can be closer let splice_maturity = (EVENT_MATURITY + 1) as u32; // 1 second in the future @@ -901,6 +902,7 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ .await }; + println!("Sending splice offer."); // Send splice offer using the current confirmed contract (Bob as original offeror) let splice_offer_msg = bob_manager_send .lock() @@ -915,6 +917,8 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ .await .expect("Send splice offer error"); + println!("Splice offer sent."); + let splice_temporary_contract_id = splice_offer_msg.temporary_contract_id; bob_send @@ -932,6 +936,8 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ Offered ); + println!("Splice offer accepted."); + // Accept the splice offer let (splice_contract_id, _, splice_accept_msg) = alice_manager_send .lock() @@ -942,11 +948,15 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ assert_contract_state!(alice_manager_send, splice_contract_id, Accepted); + println!("Sending splice accept."); + alice_send .send(Some(Message::Accept(splice_accept_msg))) .await .unwrap(); + println!("Splice accept sent."); + sync_receive.recv().await.expect("Error synchronizing"); // The new contract is signed, but not confirmed yet @@ -954,6 +964,8 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ // The old contract is pre-closed assert_contract_state!(bob_manager_send, contract_id, PreClosed); + println!("Splice contract signed."); + sync_receive.recv().await.expect("Error synchronizing"); // The new contract is signed, but not confirmed yet @@ -961,6 +973,8 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ // The old contract is pre-closed assert_contract_state!(alice_manager_send, contract_id, PreClosed); + println!("Splice contract confirmed."); + alice_wallet.sync().await.unwrap(); bob_wallet.sync().await.unwrap(); @@ -969,7 +983,10 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ periodic_check!(bob_manager_send, splice_contract_id, Confirmed); periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + println!("Splice contract confirmed."); + if manual_close { + println!("Manual close."); periodic_check!(bob_manager_send, splice_contract_id, Confirmed); periodic_check!(alice_manager_send, splice_contract_id, Confirmed); @@ -977,7 +994,12 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ periodic_check!(bob_manager_send, contract_id, Closed); periodic_check!(alice_manager_send, contract_id, Closed); + println!("Getting attestations."); + let attestations = get_attestations(&splice_test_params).await; + + println!("Closing splice contract."); + let bob_close_contract = bob_manager_send .lock() .await @@ -985,11 +1007,15 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ .await .expect("Error closing splice contract"); + println!("Splice contract closed."); + let bob_close_contract = match bob_close_contract { Contract::PreClosed(c) => c, _ => panic!("Invalid contract state {:?}", bob_close_contract), }; + println!("Registering counterparty close."); + let second_contract = alice_manager_send .lock() .await @@ -1010,7 +1036,10 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ .on_counterparty_close(&signed, bob_close_contract.signed_cet, 1) .await .expect("Error registering counterparty close"); + + println!("Counterparty close registered."); } else { + println!("Automatic close."); periodic_check!(alice_manager_send, splice_contract_id, Confirmed); periodic_check!(bob_manager_send, splice_contract_id, Confirmed); diff --git a/testconfig/scripts/get_test_list.sh b/testconfig/scripts/get_test_list.sh index 6bfe48d2..13e979c6 100755 --- a/testconfig/scripts/get_test_list.sh +++ b/testconfig/scripts/get_test_list.sh @@ -6,9 +6,9 @@ for TEST_PREFIX in "$@"; do TEST_BIN=$(ls ./target/debug/deps/${TEST_PREFIX}* | grep -v '\.d\|\.o') if [ "$OS" = "Darwin" ]; then # macOS - LIST=$(${TEST_BIN} --list --format=terse | sed 's/: test$/,/' | sed "s|\([^,]*\)|\"${TEST_BIN} \1\"|g") + LIST=$(${TEST_BIN} --list --format=terse | grep -v splice | sed 's/: test$/,/' | sed "s|\([^,]*\)|\"${TEST_BIN} \1\"|g") else # Linux - LIST=$(${TEST_BIN} --list --format=terse | sed 's/\: test$/,/' | sed 's@[^[:space:],]\+@"'${TEST_BIN}' &"@g') + LIST=$(${TEST_BIN} --list --format=terse | grep -v splice | sed 's/\: test$/,/' | sed 's@[^[:space:],]\+@"'${TEST_BIN}' &"@g') fi RES+=(${LIST}) From 20295bd1e7ee1bf77c2c5a97db84e6e1e8b357fb Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Sat, 2 Aug 2025 10:38:50 -0400 Subject: [PATCH 9/9] tests: add edge cases for splices --- ddk-manager/tests/manager_execution_tests.rs | 680 ++++++++++--------- ddk-manager/tests/splice_execution_tests.rs | 452 ------------ ddk-manager/tests/test_utils.rs | 34 +- 3 files changed, 372 insertions(+), 794 deletions(-) delete mode 100644 ddk-manager/tests/splice_execution_tests.rs diff --git a/ddk-manager/tests/manager_execution_tests.rs b/ddk-manager/tests/manager_execution_tests.rs index 52871fd4..cf5bfa43 100644 --- a/ddk-manager/tests/manager_execution_tests.rs +++ b/ddk-manager/tests/manager_execution_tests.rs @@ -816,392 +816,420 @@ async fn manager_execution_test(test_params: TestParams, path: TestPath, manual_ assert_contract_state!(alice_manager_send, contract_id, Accepted); - match path { - TestPath::BadAcceptCetSignature | TestPath::BadAcceptRefundSignature => { - match path { - TestPath::BadAcceptCetSignature => { - alter_adaptor_sig(&mut accept_msg.cet_adaptor_signatures) - } - TestPath::BadAcceptRefundSignature => { - accept_msg.refund_signature = alter_refund_sig(&accept_msg.refund_signature); - } - _ => {} - }; - bob_expect_error.store(true, Ordering::Relaxed); - alice_send - .send(Some(Message::Accept(accept_msg))) - .await - .unwrap(); - sync_receive.recv().await.expect("Error synchronizing"); - assert_contract_state!(bob_manager_send, temporary_contract_id, FailedAccept); - } - TestPath::BadSignCetSignature | TestPath::BadSignRefundSignature => { - alice_expect_error.store(true, Ordering::Relaxed); - alice_send - .send(Some(Message::Accept(accept_msg))) - .await - .unwrap(); - // Bob receives accept message - sync_receive.recv().await.expect("Error synchronizing"); - // Alice receives sign message - sync_receive.recv().await.expect("Error synchronizing"); - assert_contract_state!(alice_manager_send, contract_id, FailedSign); - } - TestPath::Close | TestPath::Refund | TestPath::Splice => { - alice_send - .send(Some(Message::Accept(accept_msg))) - .await - .unwrap(); - sync_receive.recv().await.expect("Error synchronizing"); + (|| async { + match path { + TestPath::BadAcceptCetSignature | TestPath::BadAcceptRefundSignature => { + match path { + TestPath::BadAcceptCetSignature => { + alter_adaptor_sig(&mut accept_msg.cet_adaptor_signatures) + } + TestPath::BadAcceptRefundSignature => { + accept_msg.refund_signature = + alter_refund_sig(&accept_msg.refund_signature); + } + _ => {} + }; + bob_expect_error.store(true, Ordering::Relaxed); + alice_send + .send(Some(Message::Accept(accept_msg))) + .await + .unwrap(); + sync_receive.recv().await.expect("Error synchronizing"); + assert_contract_state!(bob_manager_send, temporary_contract_id, FailedAccept); + } + TestPath::BadSignCetSignature | TestPath::BadSignRefundSignature => { + alice_expect_error.store(true, Ordering::Relaxed); + alice_send + .send(Some(Message::Accept(accept_msg))) + .await + .unwrap(); + // Bob receives accept message + sync_receive.recv().await.expect("Error synchronizing"); + // Alice receives sign message + sync_receive.recv().await.expect("Error synchronizing"); + assert_contract_state!(alice_manager_send, contract_id, FailedSign); + } + TestPath::Close | TestPath::Refund | TestPath::Splice => { + alice_send + .send(Some(Message::Accept(accept_msg))) + .await + .unwrap(); + sync_receive.recv().await.expect("Error synchronizing"); - assert_contract_state!(bob_manager_send, contract_id, Signed); + assert_contract_state!(bob_manager_send, contract_id, Signed); - // Should not change state and should not error - periodic_check!(bob_manager_send, contract_id, Signed); + // Should not change state and should not error + periodic_check!(bob_manager_send, contract_id, Signed); - sync_receive.recv().await.expect("Error synchronizing"); + sync_receive.recv().await.expect("Error synchronizing"); - assert_contract_state!(alice_manager_send, contract_id, Signed); + assert_contract_state!(alice_manager_send, contract_id, Signed); - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); - test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; - periodic_check!(alice_manager_send, contract_id, Confirmed); - periodic_check!(bob_manager_send, contract_id, Confirmed); + periodic_check!(alice_manager_send, contract_id, Confirmed); + periodic_check!(bob_manager_send, contract_id, Confirmed); - if !manual_close { - // For splice tests, don't advance time (keep original DLC valid) - // For other tests, advance past maturity to allow close/refund - if path != TestPath::Splice { - test_utils::set_time((EVENT_MATURITY as u64) + 1); + if !manual_close { + // For splice tests, don't advance time (keep original DLC valid) + // For other tests, advance past maturity to allow close/refund + if path != TestPath::Splice { + test_utils::set_time((EVENT_MATURITY as u64) + 1); + } } - } - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); - match path { - TestPath::Splice => { - println!("Starting the splicing test."); - // Create splice DLC with maturity just in the future (1 second from current time) - // Original DLC stays far in the future, splice DLC can be closer - let splice_maturity = (EVENT_MATURITY + 1) as u32; // 1 second in the future - - let splice_test_params = if thread_rng().next_u32() % 2 == 0 { - get_splice_in_test_params_with_maturity( - test_params.oracles.clone(), - splice_maturity, - ) - .await - } else { - get_splice_out_test_params_with_maturity( - test_params.oracles.clone(), - splice_maturity, - ) - .await - }; - - println!("Sending splice offer."); - // Send splice offer using the current confirmed contract (Bob as original offeror) - let splice_offer_msg = bob_manager_send - .lock() - .await - .send_splice_offer( - &splice_test_params.contract_input, - "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" - .parse() - .unwrap(), - &contract_id, - ) - .await - .expect("Send splice offer error"); - - println!("Splice offer sent."); - - let splice_temporary_contract_id = splice_offer_msg.temporary_contract_id; - - bob_send - .send(Some(Message::Offer(splice_offer_msg))) - .await - .unwrap(); - - assert_contract_state!(bob_manager_send, splice_temporary_contract_id, Offered); - - sync_receive.recv().await.expect("Error synchronizing"); - - assert_contract_state!( - alice_manager_send, - splice_temporary_contract_id, - Offered - ); - - println!("Splice offer accepted."); - - // Accept the splice offer - let (splice_contract_id, _, splice_accept_msg) = alice_manager_send - .lock() - .await - .accept_contract_offer(&splice_temporary_contract_id) - .await - .expect("Error accepting splice offer"); - - assert_contract_state!(alice_manager_send, splice_contract_id, Accepted); - - println!("Sending splice accept."); - - alice_send - .send(Some(Message::Accept(splice_accept_msg))) - .await - .unwrap(); - - println!("Splice accept sent."); - - sync_receive.recv().await.expect("Error synchronizing"); - - // The new contract is signed, but not confirmed yet - periodic_check!(bob_manager_send, splice_contract_id, Signed); - // The old contract is pre-closed - assert_contract_state!(bob_manager_send, contract_id, PreClosed); - - println!("Splice contract signed."); - - sync_receive.recv().await.expect("Error synchronizing"); - - // The new contract is signed, but not confirmed yet - assert_contract_state!(alice_manager_send, splice_contract_id, Signed); - // The old contract is pre-closed - assert_contract_state!(alice_manager_send, contract_id, PreClosed); - - println!("Splice contract confirmed."); - - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); - - test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; - - periodic_check!(bob_manager_send, splice_contract_id, Confirmed); - periodic_check!(alice_manager_send, splice_contract_id, Confirmed); - - println!("Splice contract confirmed."); + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + match path { + TestPath::Splice => { + // Create splice DLC with maturity just in the future (1 second from current time) + // Original DLC stays far in the future, splice DLC can be closer + let splice_maturity = (EVENT_MATURITY + 1) as u32; // 1 second in the future + + let dust = thread_rng().next_u32() % 2 == 0; + let splice_test_params = if thread_rng().next_u32() % 2 == 0 { + get_splice_in_test_params_with_maturity( + test_params.oracles.clone(), + splice_maturity, + dust, + ) + .await + } else { + get_splice_out_test_params_with_maturity( + test_params.oracles.clone(), + splice_maturity, + dust, + ) + .await + }; - if manual_close { - println!("Manual close."); - periodic_check!(bob_manager_send, splice_contract_id, Confirmed); - periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + // First test that sending a splice offer with a fake contract id fails + let _fake_splice_offer_message = { + let fake_contract_id = [0u8;32]; + let should_fail = bob_manager_send + .lock() + .await + .send_splice_offer( + &splice_test_params.contract_input, + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(), + &fake_contract_id, + ) + .await; + assert!(matches!(should_fail.err().unwrap(), ddk_manager::error::Error::InvalidParameters(_))); + }; - // Check that the old contract is closed now that the splice contract is confirmed - periodic_check!(bob_manager_send, contract_id, Closed); - periodic_check!(alice_manager_send, contract_id, Closed); + // Send splice offer using the current confirmed contract (Bob as original offeror) + let splice_offer_msg = if dust { + let should_fail_dust = bob_manager_send + .lock() + .await + .send_splice_offer( + &splice_test_params.contract_input, + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(), + &contract_id, + ) + .await; + assert!(matches!(should_fail_dust.err().unwrap(), ddk_manager::error::Error::InvalidParameters(_))); + return (); + } else { + bob_manager_send + .lock() + .await + .send_splice_offer( + &splice_test_params.contract_input, + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(), + &contract_id, + ) + .await + .expect("Send splice offer error") + }; - println!("Getting attestations."); + let splice_temporary_contract_id = splice_offer_msg.temporary_contract_id; - let attestations = get_attestations(&splice_test_params).await; + bob_send + .send(Some(Message::Offer(splice_offer_msg))) + .await + .unwrap(); - println!("Closing splice contract."); + assert_contract_state!( + bob_manager_send, + splice_temporary_contract_id, + Offered + ); - let bob_close_contract = bob_manager_send + sync_receive.recv().await.expect("Error synchronizing"); + + assert_contract_state!( + alice_manager_send, + splice_temporary_contract_id, + Offered + ); + + // Accept the splice offer + let (splice_contract_id, _, splice_accept_msg) = alice_manager_send .lock() .await - .close_confirmed_contract(&splice_contract_id, attestations) + .accept_contract_offer(&splice_temporary_contract_id) + .await + .expect("Error accepting splice offer"); + + assert_contract_state!(alice_manager_send, splice_contract_id, Accepted); + + alice_send + .send(Some(Message::Accept(splice_accept_msg))) .await - .expect("Error closing splice contract"); + .unwrap(); + + sync_receive.recv().await.expect("Error synchronizing"); + + // The new contract is signed, but not confirmed yet + periodic_check!(bob_manager_send, splice_contract_id, Signed); + // The old contract is pre-closed + assert_contract_state!(bob_manager_send, contract_id, PreClosed); + + sync_receive.recv().await.expect("Error synchronizing"); - println!("Splice contract closed."); + // The new contract is signed, but not confirmed yet + assert_contract_state!(alice_manager_send, splice_contract_id, Signed); + // The old contract is pre-closed + assert_contract_state!(alice_manager_send, contract_id, PreClosed); - let bob_close_contract = match bob_close_contract { - Contract::PreClosed(c) => c, - _ => panic!("Invalid contract state {:?}", bob_close_contract), + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; + + periodic_check!(bob_manager_send, splice_contract_id, Confirmed); + periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + + let _try_to_splice_twice = { + let should_fail = bob_manager_send.lock().await.send_splice_offer( + &splice_test_params.contract_input, + "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" + .parse() + .unwrap(), + &contract_id, + ).await; + assert!(matches!(should_fail.err().unwrap(), ddk_manager::error::Error::InvalidState(_))); }; - println!("Registering counterparty close."); + if manual_close { + periodic_check!(bob_manager_send, splice_contract_id, Confirmed); + periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + + // Check that the old contract is closed now that the splice contract is confirmed + periodic_check!(bob_manager_send, contract_id, Closed); + periodic_check!(alice_manager_send, contract_id, Closed); - let second_contract = alice_manager_send + let attestations = get_attestations(&splice_test_params).await; + + let bob_close_contract = bob_manager_send + .lock() + .await + .close_confirmed_contract(&splice_contract_id, attestations) + .await + .expect("Error closing splice contract"); + + let bob_close_contract = match bob_close_contract { + Contract::PreClosed(c) => c, + _ => panic!("Invalid contract state {:?}", bob_close_contract), + }; + + let second_contract = alice_manager_send + .lock() + .await + .get_store() + .get_contract(&splice_contract_id) + .await + .unwrap() + .unwrap(); + + let signed = match second_contract { + Contract::Confirmed(s) => s, + _ => panic!("Invalid contract state: {:?}", second_contract), + }; + + alice_manager_send + .lock() + .await + .on_counterparty_close(&signed, bob_close_contract.signed_cet, 1) + .await + .expect("Error registering counterparty close"); + } else { + periodic_check!(alice_manager_send, splice_contract_id, Confirmed); + periodic_check!(bob_manager_send, splice_contract_id, Confirmed); + + periodic_check!(alice_manager_send, contract_id, Closed); + periodic_check!(bob_manager_send, contract_id, Closed); + + test_utils::set_time(splice_maturity as u64 + 2); + + periodic_check!(alice_manager_send, splice_contract_id, PreClosed); + periodic_check!(bob_manager_send, splice_contract_id, PreClosed); + } + + test_utils::set_time(splice_maturity as u64 + 2); + + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; + + periodic_check!(bob_manager_send, splice_contract_id, Closed); + periodic_check!(alice_manager_send, splice_contract_id, Closed); + + periodic_check!(bob_manager_send, contract_id, Closed); + periodic_check!(alice_manager_send, contract_id, Closed); + + let original_contract = alice_manager_send .lock() .await .get_store() - .get_contract(&splice_contract_id) + .get_contract(&contract_id) .await .unwrap() .unwrap(); + let original_cet_txid = original_contract.get_cet_txid().unwrap(); - let signed = match second_contract { - Contract::Confirmed(s) => s, - _ => panic!("Invalid contract state: {:?}", second_contract), - }; - - alice_manager_send + let splice_dlc = alice_manager_send .lock() .await - .on_counterparty_close(&signed, bob_close_contract.signed_cet, 1) + .get_store() + .get_contract(&splice_contract_id) .await - .expect("Error registering counterparty close"); - - println!("Counterparty close registered."); - } else { - println!("Automatic close."); - periodic_check!(alice_manager_send, splice_contract_id, Confirmed); - periodic_check!(bob_manager_send, splice_contract_id, Confirmed); - - periodic_check!(alice_manager_send, contract_id, Closed); - periodic_check!(bob_manager_send, contract_id, Closed); - - test_utils::set_time(splice_maturity as u64 + 2); + .unwrap() + .unwrap(); + let splice_fund_txid = splice_dlc.get_funding_txid().unwrap(); - periodic_check!(alice_manager_send, splice_contract_id, PreClosed); - periodic_check!(bob_manager_send, splice_contract_id, PreClosed); + // Assert the the executed txn in the original contract is the same as the funding txn in the splice contract + assert_eq!(original_cet_txid, splice_fund_txid); } + TestPath::Close => { + // Select the first one to close or refund randomly + let (first, second) = if thread_rng().next_u32() % 2 == 0 { + (alice_manager_send, bob_manager_send) + } else { + (bob_manager_send, alice_manager_send) + }; - test_utils::set_time(splice_maturity as u64 + 2); - - test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; - - periodic_check!(bob_manager_send, splice_contract_id, Closed); - periodic_check!(alice_manager_send, splice_contract_id, Closed); - - periodic_check!(bob_manager_send, contract_id, Closed); - periodic_check!(alice_manager_send, contract_id, Closed); - - let original_contract = alice_manager_send - .lock() - .await - .get_store() - .get_contract(&contract_id) - .await - .unwrap() - .unwrap(); - let original_cet_txid = original_contract.get_cet_txid().unwrap(); - - let splice_dlc = alice_manager_send - .lock() - .await - .get_store() - .get_contract(&splice_contract_id) - .await - .unwrap() - .unwrap(); - let splice_fund_txid = splice_dlc.get_funding_txid().unwrap(); - - // Assert the the executed txn in the original contract is the same as the funding txn in the splice contract - assert_eq!(original_cet_txid, splice_fund_txid); - } - TestPath::Close => { - // Select the first one to close or refund randomly - let (first, second) = if thread_rng().next_u32() % 2 == 0 { - (alice_manager_send, bob_manager_send) - } else { - (bob_manager_send, alice_manager_send) - }; - - let case = thread_rng().next_u64() % 3; - let blocks: Option = if case == 2 { - Some(10) - } else if case == 1 { - Some(1) - } else { - None - }; - - if manual_close { - periodic_check!(first, contract_id, Confirmed); - - let attestations = get_attestations(&test_params).await; + let case = thread_rng().next_u64() % 3; + let blocks: Option = if case == 2 { + Some(10) + } else if case == 1 { + Some(1) + } else { + None + }; - let f = first.lock().await; - let contract = f - .close_confirmed_contract(&contract_id, attestations) - .await - .expect("Error closing contract"); + if manual_close { + periodic_check!(first, contract_id, Confirmed); - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); + let attestations = get_attestations(&test_params).await; - if let Contract::PreClosed(contract) = contract { - let mut s = second.lock().await; - let second_contract = s - .get_store() - .get_contract(&contract_id) - .await - .unwrap() - .unwrap(); - if let Contract::Confirmed(signed) = second_contract { - s.on_counterparty_close( - &signed, - contract.signed_cet, - blocks.unwrap_or(0), - ) + let f = first.lock().await; + let contract = f + .close_confirmed_contract(&contract_id, attestations) .await - .expect("Error registering counterparty close"); - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); + .expect("Error closing contract"); + + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + + if let Contract::PreClosed(contract) = contract { + let mut s = second.lock().await; + let second_contract = s + .get_store() + .get_contract(&contract_id) + .await + .unwrap() + .unwrap(); + if let Contract::Confirmed(signed) = second_contract { + s.on_counterparty_close( + &signed, + contract.signed_cet, + blocks.unwrap_or(0), + ) + .await + .expect("Error registering counterparty close"); + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + } else { + panic!("Invalid contract state: {:?}", second_contract); + } } else { - panic!("Invalid contract state: {:?}", second_contract); + panic!("Invalid contract state {:?}", contract); } } else { - panic!("Invalid contract state {:?}", contract); + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + periodic_check!(first, contract_id, PreClosed); + } + + // mine blocks for the CET to be confirmed + if let Some(b) = blocks { + test_utils::generate_blocks(b as u64, electrs.clone(), sink.clone()) + .await; } - } else { + alice_wallet.sync().await.unwrap(); bob_wallet.sync().await.unwrap(); - periodic_check!(first, contract_id, PreClosed); - } - - // mine blocks for the CET to be confirmed - if let Some(b) = blocks { - test_utils::generate_blocks(b as u64, electrs.clone(), sink.clone()).await; - } - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); - - // Randomly check with or without having the CET mined - if case == 2 { - // cet becomes fully confirmed to blockchain - periodic_check!(first, contract_id, Closed); - periodic_check!(second, contract_id, Closed); - } else { - periodic_check!(first, contract_id, PreClosed); - periodic_check!(second, contract_id, PreClosed); + // Randomly check with or without having the CET mined + if case == 2 { + // cet becomes fully confirmed to blockchain + periodic_check!(first, contract_id, Closed); + periodic_check!(second, contract_id, Closed); + } else { + periodic_check!(first, contract_id, PreClosed); + periodic_check!(second, contract_id, PreClosed); + } } - } - TestPath::Refund => { - // Select the first one to close or refund randomly - let (first, second) = if thread_rng().next_u32() % 2 == 0 { - (alice_manager_send, bob_manager_send) - } else { - (bob_manager_send, alice_manager_send) - }; - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); - periodic_check!(first, contract_id, Confirmed); + TestPath::Refund => { + // Select the first one to close or refund randomly + let (first, second) = if thread_rng().next_u32() % 2 == 0 { + (alice_manager_send, bob_manager_send) + } else { + (bob_manager_send, alice_manager_send) + }; + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); + periodic_check!(first, contract_id, Confirmed); - periodic_check!(second, contract_id, Confirmed); + periodic_check!(second, contract_id, Confirmed); - test_utils::set_time( - ((EVENT_MATURITY + ddk_manager::manager::REFUND_DELAY) as u64) + 1, - ); + test_utils::set_time( + ((EVENT_MATURITY + ddk_manager::manager::REFUND_DELAY) as u64) + 1, + ); - test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; + test_utils::generate_blocks(10, electrs.clone(), sink.clone()).await; - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); - periodic_check!(first, contract_id, Refunded); + periodic_check!(first, contract_id, Refunded); - // Randomly check with or without having the Refund mined. - if thread_rng().next_u32() % 2 == 0 { - test_utils::generate_blocks(1, electrs.clone(), sink.clone()).await; - } + // Randomly check with or without having the Refund mined. + if thread_rng().next_u32() % 2 == 0 { + test_utils::generate_blocks(1, electrs.clone(), sink.clone()).await; + } - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); + alice_wallet.sync().await.unwrap(); + bob_wallet.sync().await.unwrap(); - periodic_check!(second, contract_id, Refunded); + periodic_check!(second, contract_id, Refunded); + } + _ => unreachable!(), } - _ => unreachable!(), } } - } + })() + .await; alice_send.send(None).await.unwrap(); bob_send.send(None).await.unwrap(); diff --git a/ddk-manager/tests/splice_execution_tests.rs b/ddk-manager/tests/splice_execution_tests.rs deleted file mode 100644 index 2c9d2182..00000000 --- a/ddk-manager/tests/splice_execution_tests.rs +++ /dev/null @@ -1,452 +0,0 @@ -extern crate bitcoincore_rpc; -extern crate bitcoincore_rpc_json; -extern crate ddk_manager; - -#[macro_use] -#[allow(dead_code)] -mod test_utils; - -use bitcoin::Amount; -use bitcoincore_rpc::{Client, RpcApi}; -use ddk::chain::EsploraClient; -use ddk::oracle::memory::MemoryOracle; -use ddk::storage::memory::MemoryStorage; -use ddk::wallet::DlcDevKitWallet; -use ddk_manager::contract::Contract; -use ddk_manager::manager::Manager; -use ddk_manager::{Blockchain, CachedContractSignerProvider, Oracle, SimpleSigner, Wallet}; -use ddk_manager::{ContractId, Storage}; -use dlc_messages::Message; -use lightning::util::ser::Writeable; -use secp256k1_zkp::rand::{thread_rng, Fill}; -use secp256k1_zkp::PublicKey; -use std::collections::HashMap; -use std::sync::{ - atomic::{AtomicBool, Ordering}, - Arc, -}; -use test_utils::*; -use tokio::sync::{mpsc::channel, Mutex}; - -type TestManager = Arc< - Mutex< - Manager< - Arc, - Arc, SimpleSigner>>, - Arc, - Arc, - Arc, - Arc, - Arc, - SimpleSigner, - >, - >, ->; - -#[derive(Eq, PartialEq, Clone)] -enum SpliceTestPath { - SpliceIn, - SpliceOut, -} - -pub struct SplicedInput { - pub offer_public_key: PublicKey, - pub accept_public_key: PublicKey, - pub alice_public_key: PublicKey, - pub alice_store: Arc, - pub bob_public_key: PublicKey, - pub bob_store: Arc, - pub contract_id: ContractId, - pub alice_manager: TestManager, - pub bob_manager: TestManager, - pub oracles: MemoryOracle, - pub electrs: Arc, - pub sink_rpc: Client, -} - -async fn generate_blocks(nb_blocks: u64, electrs: &EsploraClient, sink_rpc: &Client) { - let prev_blockchain_height = electrs.get_blockchain_height().await.unwrap(); - - let sink_address = sink_rpc - .get_new_address(None, None) - .expect("RPC Error") - .assume_checked(); - sink_rpc - .generate_to_address(nb_blocks, &sink_address) - .expect("RPC Error"); - - // Wait for electrs to have processed the new blocks - let mut cur_blockchain_height = prev_blockchain_height; - while cur_blockchain_height < prev_blockchain_height + nb_blocks { - std::thread::sleep(std::time::Duration::from_millis(200)); - cur_blockchain_height = electrs.get_blockchain_height().await.unwrap(); - } -} - -async fn create_spliced_input() -> SplicedInput { - env_logger::try_init().ok(); - let clients = init_clients().await; - - let mut alice_oracles = HashMap::with_capacity(1); - let mut bob_oracles = HashMap::with_capacity(1); - let test_params = get_single_funded_test_params(1, 1).await; - for oracle in test_params.oracles.clone() { - let oracle = Arc::new(oracle); - alice_oracles.insert(oracle.get_public_key(), Arc::clone(&oracle)); - bob_oracles.insert(oracle.get_public_key(), Arc::clone(&oracle)); - } - - let alice_store = Arc::new(MemoryStorage::new()); - let bob_store = Arc::new(MemoryStorage::new()); - let mock_time = Arc::new(MockTime {}); - set_time((EVENT_MATURITY as u64) - 1); - - let electrs = - Arc::new(EsploraClient::new("http://localhost:30000", bitcoin::Network::Regtest).unwrap()); - - let mut alice_bytes = [0u8; 32]; - alice_bytes.try_fill(&mut thread_rng()).unwrap(); - - let mut bob_bytes = [0u8; 32]; - bob_bytes.try_fill(&mut thread_rng()).unwrap(); - - let alice_wallet = Arc::new( - DlcDevKitWallet::new( - &alice_bytes, - "http://localhost:30000", - bitcoin::Network::Regtest, - alice_store.clone(), - ) - .await - .unwrap(), - ); - - let bob_wallet = Arc::new( - DlcDevKitWallet::new( - &bob_bytes, - "http://localhost:30000", - bitcoin::Network::Regtest, - bob_store.clone(), - ) - .await - .unwrap(), - ); - - let alice_fund_address = alice_wallet.get_new_address().await.unwrap(); - let bob_fund_address = bob_wallet.get_new_address().await.unwrap(); - - clients - .4 - .send_to_address( - &alice_fund_address, - Amount::from_btc(2.0).unwrap(), - None, - None, - None, - None, - None, - None, - ) - .unwrap(); - - clients - .4 - .send_to_address( - &bob_fund_address, - Amount::from_btc(2.0).unwrap(), - None, - None, - None, - None, - None, - None, - ) - .unwrap(); - - generate_blocks(6, &electrs, &clients.4).await; - - refresh_wallet(&alice_wallet, Amount::from_btc(2.0).unwrap().to_sat()).await; - refresh_wallet(&bob_wallet, Amount::from_btc(2.0).unwrap().to_sat()).await; - - let alice_manager = Arc::new(Mutex::new( - Manager::new( - Arc::clone(&alice_wallet), - Arc::clone(&alice_wallet), - Arc::clone(&electrs), - alice_store.clone(), - alice_oracles, - Arc::clone(&mock_time), - Arc::clone(&electrs), - ) - .await - .unwrap(), - )); - - let bob_manager = Arc::new(Mutex::new( - Manager::new( - Arc::clone(&bob_wallet), - Arc::clone(&bob_wallet), - Arc::clone(&electrs), - bob_store.clone(), - bob_oracles, - Arc::clone(&mock_time), - Arc::clone(&electrs), - ) - .await - .unwrap(), - )); - // Use consistent public keys like in manager execution tests - let alice_pubkey: PublicKey = - "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" - .parse() - .unwrap(); - let bob_pubkey: PublicKey = - "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" - .parse() - .unwrap(); - - let alice_offer = alice_manager - .lock() - .await - .send_offer(&test_params.contract_input, bob_pubkey) - .await - .expect("error sending offer"); - - let alice_offer_msg = Message::Offer(alice_offer.clone()); - - let _bob_recv_offer = bob_manager - .lock() - .await - .on_dlc_message(&alice_offer_msg, alice_pubkey) - .await - .expect("error receiving offer"); - - let (contract_id, alice_pubkey_from_accept, bob_accept_msg) = bob_manager - .lock() - .await - .accept_contract_offer(&alice_offer.temporary_contract_id) - .await - .unwrap(); - - let bob_accept_msg = Message::Accept(bob_accept_msg); - - let alice_recv_accept = alice_manager - .lock() - .await - .on_dlc_message(&bob_accept_msg, bob_pubkey) - .await - .expect("error receiving accept") - .expect("to create a sign"); - - let _dlc_managerbob_recv_sign = bob_manager - .lock() - .await - .on_dlc_message(&alice_recv_accept, alice_pubkey_from_accept) - .await - .expect("to receive sign message"); - - generate_blocks(10, &electrs, &clients.4).await; - - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); - - alice_manager - .lock() - .await - .periodic_check(false) - .await - .expect("alice to update the contract"); - bob_manager - .lock() - .await - .periodic_check(false) - .await - .expect("bob to update the contract"); - - match alice_store - .get_contract(&contract_id.clone()) - .await - .unwrap() - .expect("contract to exist") - { - Contract::Confirmed(_) => (), - _ => panic!("contract to be confirmed"), - }; - - alice_wallet.sync().await.unwrap(); - bob_wallet.sync().await.unwrap(); - - SplicedInput { - offer_public_key: alice_pubkey, - accept_public_key: bob_pubkey, - alice_public_key: alice_pubkey, - bob_public_key: bob_pubkey, - alice_store: Arc::clone(&alice_store), - bob_store: Arc::clone(&bob_store), - contract_id, - alice_manager: alice_manager, - bob_manager: bob_manager, - oracles: test_params.oracles[0].clone(), - electrs: Arc::clone(&electrs), - sink_rpc: clients.4, - } -} - -async fn splice_execution_test(spliced_input: SplicedInput, test_path: SpliceTestPath) { - let (alice_send, mut bob_receive) = channel::>(100); - let (bob_send, mut alice_receive) = channel::>(100); - let (sync_send, mut sync_receive) = channel::<()>(100); - let alice_sync_send = sync_send.clone(); - let bob_sync_send = sync_send; - - let alice_expect_error = Arc::new(AtomicBool::new(false)); - let bob_expect_error = Arc::new(AtomicBool::new(false)); - - let alice_expect_error_loop = alice_expect_error.clone(); - let bob_expect_error_loop = bob_expect_error.clone(); - - let alice_manager_loop = Arc::clone(&spliced_input.alice_manager); - let alice_manager_send = Arc::clone(&spliced_input.alice_manager); - let bob_manager_loop = Arc::clone(&spliced_input.bob_manager); - let bob_manager_send = Arc::clone(&spliced_input.bob_manager); - - let alice_send_loop = alice_send.clone(); - let bob_send_loop = bob_send.clone(); - - let msg_callback = |_msg: &Message| {}; - - let alice_handle = receive_loop!( - alice_receive, - alice_manager_loop, - alice_send_loop, - alice_expect_error_loop, - alice_sync_send, - Some, - msg_callback - ); - - let bob_handle = receive_loop!( - bob_receive, - bob_manager_loop, - bob_send_loop, - bob_expect_error_loop, - bob_sync_send, - Some, - msg_callback - ); - - let test_params = match test_path { - SpliceTestPath::SpliceIn => { - get_splice_in_test_params(vec![spliced_input.oracles.clone()]).await - } - SpliceTestPath::SpliceOut => { - get_splice_out_test_params(vec![spliced_input.oracles.clone()]).await - } - }; - - let alice_splice_offer = alice_manager_send - .lock() - .await - .send_splice_offer( - &test_params.contract_input, - spliced_input.bob_public_key, - &spliced_input.contract_id, - ) - .await - .expect("error sending splice offer"); - - let temporary_contract_id = alice_splice_offer.temporary_contract_id; - alice_send - .send(Some(Message::Offer(alice_splice_offer.clone()))) - .await - .unwrap(); - - assert_contract_state!(alice_manager_send, temporary_contract_id, Offered); - - sync_receive.recv().await.expect("Error synchronizing"); - - assert_contract_state!(bob_manager_send, temporary_contract_id, Offered); - - let (contract_id, _, accept_msg) = bob_manager_send - .lock() - .await - .accept_contract_offer(&temporary_contract_id) - .await - .expect("error accepting splice offer"); - - assert_contract_state!(bob_manager_send, contract_id, Accepted); - - bob_send - .send(Some(Message::Accept(accept_msg))) - .await - .unwrap(); - - sync_receive.recv().await.expect("Error synchronizing"); - - assert_contract_state!(alice_manager_send, contract_id, Signed); - - sync_receive.recv().await.expect("Error synchronizing"); - - assert_contract_state!(bob_manager_send, contract_id, Signed); - - generate_blocks(10, &spliced_input.electrs, &spliced_input.sink_rpc).await; - - // Sync wallets before periodic checks - // alice_wallet.sync().await.unwrap(); - // bob_wallet.sync().await.unwrap(); - - alice_manager_send - .lock() - .await - .periodic_check(false) - .await - .expect("alice to update the contract"); - bob_manager_send - .lock() - .await - .periodic_check(false) - .await - .expect("bob to update the contract"); - - assert_contract_state!(alice_manager_send, contract_id, Confirmed); - assert_contract_state!(bob_manager_send, contract_id, Confirmed); - - let contract = match spliced_input - .alice_store - .get_contract(&contract_id) - .await - .unwrap() - .expect("contract to exist") - { - Contract::Confirmed(c) => c, - _ => panic!("contract should be in a confirmed state"), - }; - - let fund_tx = contract.accepted_contract.dlc_transactions.fund.clone(); - - let _tx = spliced_input - .electrs - .get_transaction(&fund_tx.compute_txid()) - .await - .expect("to have fund tx"); - - alice_send.send(None).await.unwrap(); - bob_send.send(None).await.unwrap(); - - alice_handle.await.unwrap(); - bob_handle.await.unwrap(); -} - -#[tokio::test] -#[ignore] -async fn splice_in_test() { - let spliced_input = create_spliced_input().await; - splice_execution_test(spliced_input, SpliceTestPath::SpliceIn).await; -} - -#[tokio::test] -#[ignore] -async fn splice_out_test() { - let spliced_input = create_spliced_input().await; - splice_execution_test(spliced_input, SpliceTestPath::SpliceOut).await; -} diff --git a/ddk-manager/tests/test_utils.rs b/ddk-manager/tests/test_utils.rs index d32354f4..fcd1d5a7 100644 --- a/ddk-manager/tests/test_utils.rs +++ b/ddk-manager/tests/test_utils.rs @@ -367,16 +367,10 @@ pub fn get_splice_out_enum_contract_descriptor() -> ContractDescriptor { ContractDescriptor::Enum(EnumDescriptor { outcome_payouts }) } -pub async fn get_splice_in_test_params(oracles: Vec) -> TestParams { - // Default to a maturity time shortly in the future - let current_time = MOCK_TIME.with(|f| *f.borrow()); - let splice_maturity = (current_time + 60) as u32; // 60 seconds in the future - get_splice_in_test_params_with_maturity(oracles, splice_maturity).await -} - pub async fn get_splice_in_test_params_with_maturity( oracles: Vec, maturity: u32, + dust: bool, ) -> TestParams { let splice_event_id = format!("{}-splice-in", EVENT_ID); @@ -413,8 +407,15 @@ pub async fn get_splice_in_test_params_with_maturity( }, }; + let offer_collateral = TOTAL_COLLATERAL + + if dust { + Amount::from_sat(500) + } else { + Amount::from_sat(50_000_000) + }; + let contract_input = ContractInput { - offer_collateral: TOTAL_COLLATERAL + Amount::from_sat(50_000_000), + offer_collateral, accept_collateral: Amount::ZERO, fee_rate: 2, contract_infos: vec![contract_info], @@ -426,16 +427,10 @@ pub async fn get_splice_in_test_params_with_maturity( } } -pub async fn get_splice_out_test_params(oracles: Vec) -> TestParams { - // Default to a maturity time shortly in the future - let current_time = MOCK_TIME.with(|f| *f.borrow()); - let splice_maturity = (current_time + 60) as u32; // 60 seconds in the future - get_splice_out_test_params_with_maturity(oracles, splice_maturity).await -} - pub async fn get_splice_out_test_params_with_maturity( oracles: Vec, maturity: u32, + dust: bool, ) -> TestParams { let splice_event_id = format!("{}-splice-out", EVENT_ID); @@ -472,8 +467,15 @@ pub async fn get_splice_out_test_params_with_maturity( }, }; + let offer_collateral = TOTAL_COLLATERAL + - if dust { + TOTAL_COLLATERAL - Amount::from_sat(500) + } else { + Amount::from_sat(50000) + }; + let contract_input = ContractInput { - offer_collateral: TOTAL_COLLATERAL - Amount::from_sat(50_000_000), + offer_collateral, accept_collateral: Amount::ZERO, fee_rate: 2, contract_infos: vec![contract_info],